SpringBoot中的@EnableAutoConfiguration原理
自動配置好像是魔術。其實,它就是將檢查類路徑classpath中的依賴關係,並且在某些情況下它會配置某些東西,比如當它檢測到資料庫驅動程式時,就會配置資料庫。
比如我們在pom.xml中配置:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>
h2是一個記憶體資料庫,然後我們希望通過JPA使用它,再配置一下JPA:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
然後你宣告一個介面類,注意是介面,不是普通類:
public interface ApplicantRepository extends JpaRepository<Applicant, Long> { }
這樣,你就可以通過下面save命令儲存資料到H2中。
applicantRepository.save(applicant);
首先,Spring Boot會類路徑中搜索帶@Configuration註釋的類,也就是說,pom.xml配置的JPA和H2這兩個Jar包中帶有@Configuration註釋。
所以,使用@EnableAutoConfiguration就像使用@Configuration註釋一樣。它根據我們在@Configuration註釋的配置類中定義的@Bean方法配置進行自動wire配對(依賴注入配對)。
Spring Boot對於每個找到的類,它會使用各種註釋進行評估,如@Conditional,如果特定配置應該被包含,那麼將其新增到Spring Context中。
@EnableAutoConfiguration還執行其他配置,包括配置/呼叫幫助程式元件(如Web應用程式中的嵌入式tomcat)。此機制基於類路徑中可用的jar依賴項工作。jar通常通過啟動器依賴項提供(前面pom.xml中JPA和H2配置的就是這兩個元件的啟動器starter) ,但這不是絕對的要求。這兩件事(啟動器和自動配置)並不依賴於彼此。
我們可以為我們自己的庫使用相同的機制,即所謂的啟動器Starter ,為你的lib提供了一個配置類,負責設定你的東西,並使用條件註釋來決定何時應該包含它。
下面看看@Configuration具體應用:
@Configuration public class EnabledAutoConfigExample { @Bean public MyBean myBean () { return new MyBean(); } }
在這個配置類裡面,我們生成了兩個@Bean,MyBean的例項在其他地方會需要,我們在這裡準備好,以供別人通過@autowired使用它,因為配置類本身被註冊為Spring容器的bean。
這段等同於:
<bean name="myBean" class="spring.example.MyBean"/>
配置類所有方法都會在多次呼叫時返回相同的例項(如果它們是單例作用域,這是預設作用域)。