SpringBoot自動配置
- 介紹下開發環境
- JDK版本1.8
- springboot版本是1.5.2
- 開發工具為 intellij idea(2018.2)
- 開發環境為 15款MacBook Pro
結束語
增加自動配置
使用自動配置,我們需要配置的東西很少,也就新增下檔案
自動配置官方文件地址如下: 自動配置官方文件
我們需要在 resources
下建立一個目錄名叫 META-INF
接著在裡面建立一個叫 spring.factories
的檔案,裡面內容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ // 配置你需要自動配置的檔案路徑,如果多個檔案,用 ,\ 分割 com.example.AutoConfiguration.TestAutoConfiguration
理論上我們還需要在啟動類上面配置註解 @EnableAutoConfiguration
但是註解 @SpringBootApplication
已經包含了該註解,所以我們不需要配置該註解 @SpringBootApplication
註解原始碼如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration //已經包含了開啟自動配置註解 @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { ......
然後,我們啟動專案,檢視日誌,發現列印了應該列印的日誌,說明自動配置成功
2018-10-18 00:30:22.616 WARN 636 --- [ main] c.e.A.TestAutoConfiguration : 建立 TestAutoConfiguration 成功 2018-10-18 00:30:22.780 INFO 636 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2018-10-18 00:30:22.834 INFO 636 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2018-10-18 00:30:22.838 INFO 636 --- [ main] d.SpringbootAutoConfigurationApplication : testAutoConfiguration 2018-10-18 00:30:22.842 INFO 636 --- [ main] d.SpringbootAutoConfigurationApplication : Started SpringbootAutoConfigurationApplication in 1.93 seconds (JVM running for 2.42)
前言
很多時候,我們在公司用springboot作為基礎框架開發專案的時候,會遇見依賴jar的時候,別的jar裡面需要建立一些bean,往往不是很方便,我們需要通過
@ComponentScan
註解來掃描,才能建立上,這時候,自動配置就派上用場了,官方文件上有介紹(需要細細看才能找到),估計很多朋友還不知道,這邊寫個教程,給各位作參考
如何弄自動配置呢?
這次,我們只在同一個專案內配置,只做演示自動配置,如果是jar,依葫蘆畫瓢,然後上傳到maven私服,普通springboot專案依賴該jar即可
我們先建立一個普通的spring-boot專案,記得新增web依賴,否則,專案不會後臺執行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
建立一個測試自動配置的類(不跟啟動類一個目錄下,最好單獨建立一個目錄)
@Configuration(value = "testAutoConfiguration")
public class TestAutoConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(TestAutoConfiguration.class);
public TestAutoConfiguration() {
LOGGER.warn("建立 TestAutoConfiguration 成功");
}
}
然後我們在啟動類配置下,檢視是否會列印建立 TestAutoConfiguration
Bean的日誌記錄
@SpringBootApplication
// 實現介面 CommandLineRunner 實現 run 方法,這樣,專案一啟動就會執行run方法內容
public class SpringbootAutoConfigurationApplication implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringbootAutoConfigurationApplication.class);
@Autowired
private ApplicationContext context;
public static void main(String[] args) {
SpringApplication.run(SpringbootAutoConfigurationApplication.class, args);
}
@Override
public void run(String... strings) throws Exception {
for (String name : context.getBeanDefinitionNames()) {
// 如果存在Bean名稱為 testAutoConfiguration 則列印Bean的名稱
if("testAutoConfiguration".equals(name)){
LOGGER.info(name);
}
}
}
}
接下來,我們啟動專案,檢視日誌列印,會發現,並沒有列印建立 TestAutoConfiguration
跟列印Bean名稱的日誌,表示沒有 TestAutoConfiguration
並沒有註冊到IOC上,然後我們增加自動配置