天天看點

SpringBoot編寫自定義的starter

mybatis中的autoconfigure子產品中使用了一個叫做MybatisAutoConfiguration的自動化配置類。

這個MybatisAutoConfiguration需要在這些Condition條件下才會執行:

@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })。需要SqlSessionFactory和SqlSessionFactoryBean在classpath中都存在

@ConditionalOnBean(DataSource.class)。 spring factory中需要存在一個DataSource的bean

@AutoConfigureAfter(DataSourceAutoConfiguration.class)。需要在DataSourceAutoConfiguration自動化配置之後進行配置,因為mybatis需要資料源的支援

同時在META-INF目錄下有個spring.factories這個properties檔案,而且它的key為org.springframework.boot.autoconfigure.EnableAutoConfiguration,這樣才會被springboot加載:

有了這些東西之後,mybatis相關的配置會被自動加入到spring container中,隻要在maven中加入starter即可:

接下來,我們來編寫自定義的starter:log-starter。

這個starter内部定義了一個注解,使用這個注解修飾方法之後,該方法的調用會在日志中被列印并且還會列印出方法的耗時。starter支援exclude配置,在exclude中出現的方法不會進行計算。

pom檔案:

定義修飾方法的注解@Log:

然後是配置類:

接下來是AutoConfiguration:

由于計算方法調用的時候需要使用aop相關的lib,是以我們的AutoConfiguration繼承了AbstractPointcutAdvisor。這樣就有了Pointcut和Advice。Pointcut是一個支援注解的修飾方法的Pointcut,Advice則自己實作:

最後resources/META-INF/spring.factories中加入這個AutoConfiguration:

我們在項目中使用這個log-starter:

使用配置:

然後編寫一個簡單的Service:

使用單元測試分别調用這3個方法,由于work方法沒有加上@Log注解,core方法雖然加上了@Log注解,但是在配置中被exclude了,隻有test方法可以正常計算耗時:

總結:

自定義springboot的starter,注意這兩點。

如果自動化配置類需要在程式啟動的時候就加載,可以在META-INF/spring.factories檔案中定義。如果本次加載還需要其他一些lib的話,可以使用ConditionalOnClass注解協助

如果自動化配置類要在使用自定義注解後才加載,可以使用自定義注解+@Import注解或@ImportSelector注解完成

參考:

<a href="http://www.jianshu.com/p/85460c1d835a" target="_blank">http://www.jianshu.com/p/85460c1d835a</a>

<a href="http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html" target="_blank">http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html</a>

http://fangjian0423.github.io/2016/11/16/springboot-custom-starter/