最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

SpringBoot——自定義自動(dòng)配置與起步依賴

2023-03-20 10:23 作者:Cpp程序員  | 我要投稿

SpringBoot為我們提供了靈活強(qiáng)大的自動(dòng)配置與起步依賴功能,接下來(lái)我們參考其實(shí)現(xiàn)原理,實(shí)現(xiàn)專屬于我們自己的自動(dòng)配置與起步依賴。
不僅如此,我們對(duì)其稍作修改,讓它適用于非SpringBoot環(huán)境,甚至是低版本的Spring Framework環(huán)境

1自動(dòng)配置

在編寫自己的自動(dòng)配置之前,我們先來(lái)看一下SpringBoot自動(dòng)配置類的實(shí)現(xiàn)原理。

SpringBoot可以根據(jù)CLASSPATH、配置項(xiàng)等條件自動(dòng)進(jìn)行常規(guī)配置,省去了我們自己手動(dòng)把一模一樣的配置復(fù)制來(lái)復(fù)制去的麻煩。這樣大大提升了開發(fā)效率!
在這之前,我們已經(jīng)看到過(guò)@SpringBootApplication注解了,查看這個(gè)注解,可以發(fā)現(xiàn)它上面添加了一個(gè)@EnableAutoConfiguration,基于這個(gè)注解就可以開啟自動(dòng)配置功能。
這兩個(gè)注解上都有exclude屬性,我們可以在其中排除一些不想啟用的自動(dòng)配置類。
如果不想啟用自動(dòng)配置功能,也可以在配置文件中配置spring.boot.enableautoconfiguration=false,關(guān)閉該功能。

1.1自動(dòng)配置的實(shí)現(xiàn)原理

自動(dòng)配置類其實(shí)就是添加了@Configuration的普通Java配置類,它利用Spring Framework 4.0加入的條件注解@Conditional來(lái)實(shí)現(xiàn)“根據(jù)特定條件啟用相關(guān)配置類”,注解中傳入的Condition類就是不同條件的判斷邏輯。SpringBoot內(nèi)置了很多條件注解,如下表所示:

條件注解生效條件@ConditionalOnBean存在特定名稱、特定類型、特定泛型參數(shù)或帶有特定注解的Bean@ConditionalOnMissingBean與前者相反,不存在特定的Bean@ConditionalOnClass存在特定的類@ConditionalOnMissingClass與前者相反,不存在特定類@ConditionalOnCloudPlatform運(yùn)行在特定的云平臺(tái)上,截止2.6.3版本,代表云平臺(tái)的枚舉類支持無(wú)云平臺(tái),可以通過(guò)spring.main.cloud-platform配置強(qiáng)制使用的云平臺(tái)@ConditionalOnExpression指定的SpEL表達(dá)式為真@ConditionalOnJava運(yùn)行在滿足條件的Java上,可以比指定版本新,也可以比指定版本舊@ConditionalOnJndi指定的JNDI位置必須存在一個(gè),如沒(méi)有指定,則需要存在InitalContext@ConditionalOnProperty屬性值滿足特定條件,比如給定的屬性值都不能為false@ConditionalOnResource存在特定資源@ConditionalOnSingleCandidate當(dāng)前上下文中,特定類型的Bean有且僅有一個(gè)@ConditionalOnWarDeployment應(yīng)用程序是通過(guò)傳統(tǒng)的War方式部署的,而非內(nèi)嵌容器@ConditionalOnWebApplication應(yīng)用程序是一個(gè)Web應(yīng)用程序@ConditionalOnNotWebApplication與前者相反,應(yīng)用程序不是一個(gè)Web應(yīng)用程序

??更多如圖所示,就不一一列舉了:

以@ConditionalOnClass注解為例,它的定義如下所示,@Target指明該注解可用于類型和方法定義,@Retention指明注解的信息在運(yùn)行時(shí)也能獲取到,而其中最關(guān)鍵的就是OnClassCondition條件類,里面是具體的條件計(jì)算邏輯:

@Target({ ElementType.TYPE, ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)@Documented@Conditional(OnClassCondition.class)public @interface ConditionalOnClass { /** * The classes that must be present. Since this annotation is parsed by loading class * bytecode, it is safe to specify classes here that may ultimately not be on the * classpath, only if this annotation is directly on the affected component and * <b>not</b> if this annotation is used as a composed, meta-annotation. In order to * use this annotation as a meta-annotation, only use the {@link #name} attribute. * @return the classes that must be present */ Class<?>[] value() default {}; /** * The classes names that must be present. * @return the class names that must be present. */ String[] name() default {};}

了解了條件注解后,再來(lái)看看它們是如何與配置類結(jié)合使用的。以JdbcTemplateAutoConfiguration為例:

@AutoConfiguration(after = DataSourceAutoConfiguration.class)@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })@ConditionalOnSingleCandidate(DataSource.class)@EnableConfigurationProperties(JdbcProperties.class)@Import({ DatabaseInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })public class JdbcTemplateAutoConfiguration {}

可以看到這個(gè)配置類的生效條件是存在DataSource和JdbcTemplate類,且在上下文中只能有一個(gè)DataSource。此外,這個(gè)自動(dòng)配置需要在DataSourceAutoConfiguration之后再配置(可以用@AutoConfigureBefore、@AutoConfigureAfter和@AutoConfigureOrder來(lái)控制自動(dòng)配置的順序)

2編寫自已的自動(dòng)配置

根據(jù)上面的描述,我們很容易想到,要編寫自己的自動(dòng)配置,只需要以下三個(gè)步驟:
(1)編寫常規(guī)的配置類
(2)為配置類增加生效條件與順序
(3)在/META-INF/spring.factories文件中添加自動(dòng)配置類

2.1創(chuàng)建項(xiàng)目

在Spring Initializr中,創(chuàng)建一個(gè)Maven工程,添加如下依賴:

<dependencies><!-- ? ?添加自動(dòng)配置所使用的包 ? ?--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!-- ? ?用戶在寫配置文件時(shí),會(huì)有提示效果 ? ?--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2.2編寫一個(gè)簡(jiǎn)單的MyAutoConfigure類和配置類Bean

編寫一個(gè)簡(jiǎn)單的MyAutoConfigure類,上面增加了@Configuration注解,表示這是一個(gè)配置類,這個(gè)配置類的生效條件是myconfig.ready屬性的值為true,除此之外的值或者不存在該屬性時(shí)MyAutoConfigure都不會(huì)生效。

/** * TODO 1、編寫配置類并指定文件 * * @author ss_419 * @version 1.0 * @date 2023/3/17 21:24 */@Configuration@EnableConfigurationProperties(CommonBean.class)@ConditionalOnProperty(name = "myconfig.ready",havingValue = "true")public class MyAutoConfigure {}/** * TODO 2、創(chuàng)建配置類Bean * * @author ss_419 * @version 1.0 * @date 2023/3/17 22:40 */@ConfigurationProperties("myconfigbean")@Datapublic class MyConfigBean {private boolean ready;private String info;}

2.3配置spring.factories文件

為了讓SpringBoot能找到我們寫的這個(gè)配置類,我們需要在src/resources目錄中創(chuàng)建META-INF/spring.factories文件,其內(nèi)容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.pp.myspringbootstart.beans.MyAutoConfigure

2.4測(cè)試自動(dòng)配置是否生效

@SpringBootTestpublic class MyConfigurationEnableTest {@Autowiredprivate ApplicationContext applicationContext;@Testvoid testPropertiesBeanAvailableTest() throws Exception {assertNotNull(applicationContext.getBean(MyConfigBean.class));assertTrue(applicationContext.containsBean("org.pp.myspringbootstart.beans.MyConfigBean"));}@Testvoid testPropertyValues(){MyConfigBean bean = applicationContext.getBean(MyConfigBean.class);assertTrue(bean.isReady());assertEquals("hello", bean.getInfo());}}


SpringBoot——自定義自動(dòng)配置與起步依賴的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
肥乡县| 中牟县| 全南县| 连城县| 扶余县| 荣昌县| 孙吴县| 郸城县| 察哈| 西和县| 大安市| 搜索| 建始县| 宣武区| 平乡县| 阳高县| 江口县| 宁波市| 彝良县| 宜兰市| 兴隆县| 阿瓦提县| 海伦市| 海淀区| 汉阴县| 巴马| 宁河县| 临泽县| 永康市| 柘荣县| 华蓥市| 工布江达县| 浦北县| 平舆县| 黄石市| 阳泉市| 临湘市| 武穴市| 渝中区| 赤壁市| 呼玛县|