javascript
Spring Enable批注–编写自定义的Enable批注
Spring提供了一系列名稱(chēng)以Enable *開(kāi)頭的注釋,這些注釋本質(zhì)上使某些Spring管理的功能可以被激活。 這樣的注釋的一個(gè)很好的例子是EnableWebMvc ,它引入了在基于Spring的應(yīng)用程序中支持MVC流所需的所有bean。 另一個(gè)很好的例子是EnableAsync注釋,用于在基于Spring的應(yīng)用程序中激活bean以支持異步功能。
我對(duì)這樣的注釋如何工作感到好奇,并希望記錄下我的理解。 支持這些注釋的方式可以視為SPI的一部分,因此,如果將來(lái)內(nèi)部實(shí)現(xiàn)發(fā)生更改,則可能會(huì)中斷。
簡(jiǎn)單的啟用*注釋
考慮這些自定義注釋的一種方法是,它們將一組新bean添加到Spring的應(yīng)用程序上下文中。 讓我們首先定義一個(gè)這樣的自定義注釋:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface EnableSomeBeans {}并將此注釋?xiě)?yīng)用于Spring @Configuration類(lèi):
@Configuration @EnableSomeBeans public static class SpringConfig {}因此,現(xiàn)在在應(yīng)用此批注時(shí)引入一組bean就像添加通過(guò)@Import批注以這種方式引入的bean組一樣簡(jiǎn)單:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(SomeBeanConfiguration.class) @interface EnableSomeBeans {}本質(zhì)上就是這樣,如果此導(dǎo)入的@Configuration類(lèi)定義了任何bean,則它們現(xiàn)在將成為Application上下文的一部分:
@Configuration class SomeBeanConfiguration {@Beanpublic String aBean1() {return "aBean1";}@Beanpublic String aBean2() {return "aBean2";} }這是一個(gè)具有工作樣本的要點(diǎn) 。
使用選擇器啟用*注釋
啟用注釋可能要復(fù)雜得多,它們可以根據(jù)周?chē)纳舷挛膩?lái)激活不同的Bean系列。 這樣的注釋的一個(gè)示例是EnableCaching ,它基于類(lèi)路徑中可用的不同緩存實(shí)現(xiàn)來(lái)激活配置。
與之前的簡(jiǎn)單示例相比,編寫(xiě)此類(lèi)Enable *注釋要花費(fèi)更多的精力。 與之前一樣,從一個(gè)自定義注釋開(kāi)始:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(SomeBeanConfigurationSelector.class) public @interface EnableSomeBeansSelector {String criteria() default "default"; }請(qǐng)注意,在這種情況下,自定義注釋具有一個(gè)稱(chēng)為標(biāo)準(zhǔn)的示例字段,我要做的是根據(jù)此標(biāo)準(zhǔn)激活兩組不同的bean。 這可以通過(guò)使用@Configuration選擇器來(lái)實(shí)現(xiàn),該選擇器可以根據(jù)上下文返回不同的@Configuration文件(在此示例中,criteria字段的值)。 該選擇器具有一個(gè)簡(jiǎn)單的簽名,這是一個(gè)示例實(shí)現(xiàn):
import org.springframework.context.annotation.ImportSelector; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata;public class SomeBeanConfigurationSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {AnnotationAttributes attributes =AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes (EnableSomeBeansSelector.class.getName(), false));String criteria = attributes.getString("criteria");if (criteria.equals("default")) {return new String[]{"enableannot.selector.SomeBeanConfigurationDefault"};}else {return new String[]{"enableannot.selector.SomeBeanConfigurationType1"};}} }@Configuration class SomeBeanConfigurationType1 {@Beanpublic String aBean() {return "Type1";}}@Configuration class SomeBeanConfigurationDefault {@Beanpublic String aBean() {return "Default";}}因此,如果條件字段為“默認(rèn)”,則添加“ SomeBeanConfigurationDefault”中的bean,否則添加“ SomeBeanConfigurationType1”中的bean
- 這是一個(gè)具有工作樣本的要點(diǎn) 。
結(jié)論
我希望這能對(duì)Spring如何在內(nèi)部實(shí)現(xiàn)@ Enable *注釋有所了解,作為應(yīng)用程序開(kāi)發(fā)人員,您可能不需要自己創(chuàng)建此類(lèi)注釋,一種更簡(jiǎn)單的機(jī)制是使用@Configuration類(lèi)和Spring Bean配置文件來(lái)組成應(yīng)用程序。
翻譯自: https://www.javacodegeeks.com/2015/04/spring-enable-annotation-writing-a-custom-enable-annotation.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Spring Enable批注–编写自定义的Enable批注的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 挂载分区(挂载linux分区
- 下一篇: 在运行时更新代码(已Spring解密)