前幾個月和隔壁組的老王閒聊,他說項目的供應商離職率居高不下,最近還有開發剛接手ESB訂閱發佈接口才兩週就提出離職,而他能作的就只有苦笑和默默地接過這個爛攤子了。
而然幸福的家庭老是類似的,而不幸的我卻因業務變革走上了和老王同樣的道路。單單是接口的開發竟然能迫使一位開發毅然決然地離職,我既不相信是人性的扭曲,更不信是道德的淪喪。
拋開這個富有色彩的故事而言,我發現原來的項目存在以下問題:html
針對前兩個問題,咱們只需梳理出必須的依賴項並加入Maven或Gradle管理,而後託管到Git便可。
然後二者則能夠經過spring-boot-starter將必選依賴項和配置統一管理,並附上相關技術文檔;而後經過模板模式和註解簡化開發流程,提供Demo下降入門難度。
最後就能夠把具體的業務功能開發交給供應商處理,咱們專心作好過程管理和驗收便可。web
本文將着重分享spring-boot-starter開發的事項,請坐好扶穩!spring
在自定義starter前咱們總要思考如何命名咱們的starter,而官方提供以下的命名規範:apache
經過Spring Initializr或Spring Boot CLI建立項目結構後,將pom.xml的相關項目修改成以下內容json
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifacId> <version>2.3.1.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 下面爲自定義Starter的依賴項 --> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <executions> <execution> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
在starter中咱們會定義SpringBean的註冊配置和屬性配置,如ESB訂閱服務的配置項目爲mybatis
@Configuration @EnableConfigurationProperties({EsbServerProperties.class}) public class EsbServerConfiguration { @Bean public SpringBus springBus(){ return new SpringBus(); } @Bean public LoggingFeature loggingFeature(){ return new LoggingFeature(); } @Bean public List<JMSConfigFeature> jmsConfigFeatures(EsbServerProperties props) throws JMSException { List<JMSConfigFeature> features = new ArrayList<>(); /** * 這裏會使用EsbServerProperties的屬性構建Bean實例 */ return features; } }
屬性配置項app
// 從application.yml等配置文件中讀取並綁定esb.server.destination等屬性值 @Data @ConfigurationProperties("esb.server") public class EsbServerProperties { String destination; int currConsumers = 1; String channel; int ccsid = 1205; int transportType = 1; List<String> connectionNameLists; boolean replyError = false; String replySuccessText = "Success"; String replyErrorText = "Failure"; }
到這裏咱們已經完成一個基本的starter的功能框架
@ConfigurationProperties
定義該starter註冊bean時須要的屬性集合@Configuration
定義該starter註冊的bean但引用該starter的項目要如何啓用配置呢?其實有兩種方式,分別爲手動和自動,其中咱們會着重講解自動啓用配置。maven
所謂手動啓用配置其實就是在SpringBoot入口類上添加啓用配置用的自定義註解,針對上面的EsbServerConfiguration咱們能夠自定義EnableESBSrv註解spring-boot
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import({EsbServerConfiguration.class}) public @interface EnableEsbSrv { }
而後入口類的@SpringBootApplication
註解先後添加@EnableEsbSrv
便可。
自動啓用配置即只需在pom.xml中引入所依賴的starter,而後啓用應用便可自動啓用該starter的@Configuration
所註解的類從而註冊Bean和讀取屬性配置。
而這一切都是由AutoConfigurationImportSelector
來操刀,而咱們能夠經過@EnableAutoConfiguration
或@SpringBootApplication
等實例化AutoConfigurationImportSelector
類,配合菜譜resources/META-INF/spring.factories實現自動化配置的功能。
具體手法就是:將EsbServerConfiguration的全限類名稱寫在resources/META-INF/spring.factories的org.springframework.boot.autoconfigure.EnableAutoConfiguration
下, 若存在多個則用逗號分隔。
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \ com.john.starter.EsbServerConfiguration,\ com.john.starter.OtherConfiguration
應用啓動時會將application.yml中對應的配置項綁定到@ConfigurationProperties
標註的類實例上,那麼對於應用開發人員而言平常工做就是修改application.yml的配置項。但IDE又缺乏配置項的智能提示,那就很低效了。幸好Spring Boot早就爲咱們提供好解決方案,分爲手工和自動兩種。爲了效率固然是能夠自動就不用手動的了。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
mvn compile
時會生成target/classes/META-INF/spring-configuration-metadata.json;<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
spring-boot-starter很是適合用於團隊的技術積累和沉澱,不過想恰到好處地應用起來,不只要須要深刻Spring內部原理還要梳理清楚業務邏輯。後續咱們再深刻探討Spring內核的事情吧!
轉載請註明來自:https://www.cnblogs.com/fsjoh... —— ^_^肥仔John