javascript
Spring Enable批注–编写自定义的Enable批注
Spring提供了一系列名稱以Enable *開頭的注釋,這些注釋本質上使某些Spring管理的功能可以被激活。 這樣的注釋的一個很好的例子是EnableWebMvc ,它引入了在基于Spring的應用程序中支持MVC流所需的所有bean。 另一個很好的例子是EnableAsync注釋,用于在基于Spring的應用程序中激活bean以支持異步功能。
我對這樣的注釋如何工作感到好奇,并希望記錄下我的理解。 支持這些注釋的方式可以視為SPI的一部分,因此,如果將來內部實現發生更改,則可能會中斷。
簡單的啟用*注釋
考慮這些自定義注釋的一種方法是,它們將一組新bean添加到Spring的應用程序上下文中。 讓我們首先定義一個這樣的自定義注釋:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface EnableSomeBeans {}并將此注釋應用于Spring @Configuration類:
@Configuration @EnableSomeBeans public static class SpringConfig {}因此,現在在應用此批注時引入一組bean就像添加通過@Import批注以這種方式引入的bean組一樣簡單:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(SomeBeanConfiguration.class) @interface EnableSomeBeans {}本質上就是這樣,如果此導入的@Configuration類定義了任何bean,則它們現在將成為Application上下文的一部分:
@Configuration class SomeBeanConfiguration {@Beanpublic String aBean1() {return "aBean1";}@Beanpublic String aBean2() {return "aBean2";} }這是一個具有工作樣本的要點 。
使用選擇器啟用*注釋
啟用注釋可能要復雜得多,它們可以根據周圍的上下文來激活不同的Bean系列。 這樣的注釋的一個示例是EnableCaching ,它基于類路徑中可用的不同緩存實現來激活配置。
與之前的簡單示例相比,編寫此類Enable *注釋要花費更多的精力。 與之前一樣,從一個自定義注釋開始:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(SomeBeanConfigurationSelector.class) public @interface EnableSomeBeansSelector {String criteria() default "default"; }請注意,在這種情況下,自定義注釋具有一個稱為標準的示例字段,我要做的是根據此標準激活兩組不同的bean。 這可以通過使用@Configuration選擇器來實現,該選擇器可以根據上下文返回不同的@Configuration文件(在此示例中,criteria字段的值)。 該選擇器具有一個簡單的簽名,這是一個示例實現:
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";}}因此,如果條件字段為“默認”,則添加“ SomeBeanConfigurationDefault”中的bean,否則添加“ SomeBeanConfigurationType1”中的bean
- 這是一個具有工作樣本的要點 。
結論
我希望這能對Spring如何在內部實現@ Enable *注釋有所了解,作為應用程序開發人員,您可能不需要自己創建此類注釋,一種更簡單的機制是使用@Configuration類和Spring Bean配置文件來組成應用程序。
翻譯自: https://www.javacodegeeks.com/2015/04/spring-enable-annotation-writing-a-custom-enable-annotation.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring Enable批注–编写自定义的Enable批注的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 挂载分区(挂载linux分区
- 下一篇: 小学教师备案制和事业编的区别(小学教师备