不管是在公司中你想開發本身的一套框架,定製一些東西,或者是在開源網站中分享本身作的一些東西。你可能想要開發屬於本身的Auto-configuration。Auto-configuration的類可以捆綁到外部的jar包中,而且被SpringBoot進行使用。例如咱們常用的@Autowire註解會自動的注入一個實例到Spring的容器中,這時咱們被注入進來的類必須有個註解進行標註,例如:@Service、@Controller等等。可是對於在jar包中的類的話,考慮的須要多一些,例如須要考慮在注入時我會依賴到誰,誰先進行注入等等。java
Auto-configuration一般是和starter聯繫起來的,一個官網提供的小例子展現瞭如何一步一步建立屬於本身的startergit
在底層代碼中,Auto-configured是被@Configuration
註解的類實現的。另外@Conditional
註解被用來限制何時Auto-configured應該被應用。一般來講,Auto-configured的類使用@ConditionalOnClass
和@ConditionalOnMissingBean
這兩個註解,這是爲了確保 auto-configuration 只在一些相關的類生效之後纔會加載@Configuration類。github
你也能夠經過瀏覽SpringBoot-autoConfigure由Spring提供的@Configuration類。web
SpringBoot會檢查全部jar包中的META-INF/spring.factories
文件,在這個文件中應該列出了key是EnableAutoConfiguration
value是想要配置的類,例以下:spring
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\ com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
固然也可使用 @AutoConfigureAfter
和@AutoConfigureBefore
兩個註解進行標識想要哪一個類進行先加載。例如想要提供一個特定的web配置,那麼你的類應該在WebMvcAutoConfiguration
以後加載。數據庫
如何想要auto-configurations的類進行順序的加載,那麼可使用@AutoConfigureOrder註解進行排序。app
Auto-configurations僅僅可以被這種方式進行加載,實際上,他們不會被包掃描進行加載。框架
SpringBoot利用
@Condition
註解來肯定是否是要建立Bean實例ide
在所開發的對外封裝jar包中可能會使用一個或者多個的@Condition註解在自動配置的類中。@ConditionalOnMissingBean
註解會覆蓋掉你的默認配置。spring-boot
SpringBoot包括許多的@Conditional
的註解,你可以重複使用它在類中或者單獨的@Bean
方法上。這些註解包括
舉例以下:
@Configuration public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService() { ... } }
若是對於如何用java實體類進行接受配置文件的屬性不明白的,能夠參考個人文章不學無數——SpringBoot入門Ⅲ,裏面有詳細講解。
@ConfigurationProperties("acme") @Validated public class AcmeProperties { private boolean enabled; @NotNull(message = "不能weikong ") private String remoteAddress; public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled=enabled; } public String getRemoteAddress() { return remoteAddress; } public void setRemoteAddress(String remoteAddress) { this.remoteAddress=remoteAddress; } }
這裏只是簡單的舉個配置屬性的例子: 例如在這裏能夠進行配置數據庫的事務。而後在動態建立數據源的時候能夠判斷這個類是否建立而後建立數據源。
即這個類是一個做爲判斷依據的類
public class AcmeService { private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } @Override public String toString() { return "AcmeService{" + "msg='" + msg + '\'' + '}'; } }
@ConditionalOnClass
該註解在以前已經講過,這裏的意思就是AcmeService
類在路徑中已經存在之後纔會解析配置類。 @ConditionalOnMissingBean
方法上的註解咱們上面也解釋過了,在這的意思就是在容器中沒有AcmeService
對象時纔會實例化此Bean。
@Configuration @ConditionalOnClass(AcmeService.class) @EnableConfigurationProperties(AcmeProperties.class) public class AcmeAutoConfiguration { private final AcmeProperties acmeProperties; public AcmeAutoConfiguration(AcmeProperties acmeProperties) { this.acmeProperties = acmeProperties; } @Bean @ConditionalOnMissingBean(AcmeService.class) public AcmeService getAcmeService(){ AcmeService acmeService=new AcmeService(); acmeService.setMsg(acmeProperties.toString()); return acmeService; } }
在resources-META-INF
文件夾下建立spring.factories
文件,裏面寫入自動配置類的路徑
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.FirstSpringBoot.Configuration.AcmeAutoConfiguration
由於咱們建立的自動配置是要供別人使用的,只對外提供配置的屬性值,因此咱們將咱們寫的自動配置的一系列類進行打jar包,另外一個項目引用事後只須要在配置文件中配置咱們對外提供的配置屬性進行配置之後就可使用咱們自動配置類提供的功能了。這也正符合了SpringBoot的開箱即用的觀點。