關於SpringBoot的一點筆記
@SpringBootApplication
/** * @SpringBootApplication 來標註一個主程序類,說明這是一個Spring Boot應用 */ @SpringBootApplication public class HelloWorldMainApplication { public static void main(String[] args) { // Spring應用啟動起來 SpringApplication.run(HelloWorldMainApplication.class,args); } }
? @Configuration:配置類上來標註這個註解;
? 配置類 ----- 配置文件;配置類也是容器中的一個組件;@Component
@EnableAutoConfiguration:開啟自動配置功能;
? 以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量註入配置文件中的屬性 | 一個個指定 |
松散綁定(松散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
復雜類型封裝 | 支持 | 不支持 |
1、配置類@Configuration------>Spring配置文件(表明這是一個配置類)
2、使用@Bean
/** * @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置文件 * * 在配置文件中用<bean><bean/>標簽添加組件 * */ @Configuration public class MyAppConfig { //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名 @Bean public HelloService helloService02(){ System.out.println("配置類@Bean給容器中添加組件了..."); return new HelloService(); } }
–file:./config/ ---當前項目的根路徑下的config文件夾下的配置文件,和src同級的config文件夾下,
–file:./ ---當前項目的根路徑下的配置文件,和src同級的配置文件
–classpath:/config/ ---當前類路徑下的config文件夾下的congfig文件夾下的配置文件,在resource文件夾下的config文件夾中
–classpath:/ ---當前類路徑下的配置文件,也是默認的配置文件位置
優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
SpringBoot會從這四個位置全部加載主配置文件;互補配置;
自動配置原理:
2)、@EnableAutoConfiguration 作用:
-
利用EnableAutoConfigurationImportSelector給容器中導入一些組件?
-
可以查看selectImports()方法的內容;
-
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置
-
SpringFactoriesLoader.loadFactoryNames() 掃描所有jar包類路徑下 META-INF/spring.factories 把掃描到的這些文件的內容包裝成properties對象 從properties中獲取到EnableAutoConfiguration.class類(類名)對應的值,然後把他們添加在容器中
@ConditionalOnMissingBean這個註解比較有意思,這個註解就是判斷當前項目中是否有制定的配置文件,若沒有則使用默認的配置文件,如果有則使用開發人員配置的配置文件(類)
? 1)、SpringBoot啟動會加載大量的自動配置類
? 2)、我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類;
? 3)、我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)
?
給容器中添加組件
xxxxProperties:封裝配置文件中相關屬性;
//使用WebMvcConfigurerAdapter可以來擴展SpringMVC的功能 @Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { // super.addViewControllers(registry); //瀏覽器發送 /atguigu 請求來到 success registry.addViewController("/atguigu").setViewName("success"); } }
? 2)、在做其他自動配置時會導入;@Import(EnableWebMvcConfiguration.class)
@Configuration public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration { private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite(); //從容器中獲取所有的WebMvcConfigurer @Autowired(required = false) public void setConfigurers(List<WebMvcConfigurer> configurers) { if (!CollectionUtils.isEmpty(configurers)) { this.configurers.addWebMvcConfigurers(configurers); //一個參考實現;將所有的WebMvcConfigurer相關配置都來一起調用; @Override // public void addViewControllers(ViewControllerRegistry registry) { // for (WebMvcConfigurer delegate : this.delegates) { // delegate.addViewControllers(registry); // } } } }
? 4)、我們的配置類也會被調用;
? 效果:SpringMVC的自動配置和我們的擴展配置都會起作用;
@EnableWebMvc全面接管SpringMVC,會使自動配置失效
模式:
? 1)、SpringBoot在自動配置很多組件的時候,先看容器中有沒有用戶自己配置的(@Bean、@Component)如果有就用用戶配置的,如果沒有,才自動配置;如果有些組件可以有多個(ViewResolver)將用戶配置的和自己默認的組合起來;
? 2)、在SpringBoot中會有非常多的xxxConfigurer幫助我們進行擴展配置
? 3)、在SpringBoot中會有很多的xxxCustomizer幫助我們進行定制配置
關於SpringBoot的一點筆記