1. 程式人生 > >SpringBoot自動配置

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上,然後我們增加自動配置