javascript
Spring Enable* 注解
Spring提供了一系列以Enable開頭的注解,這些注解本質(zhì)上是激活Spring的某些管理功能。比如,EnableWebMvc。 這個(gè)注解引入了MVC框架在Spring 應(yīng)用中需要用到的所有bean。另外一個(gè)注解式EnableAsync, 它讓Bean在spring 應(yīng)用中支持異步功能。
我很好奇這些注解是怎樣工作的,并把我的理解寫下來。這些注解的工作原理可以理解為SPI的一部分,如果將來實(shí)現(xiàn)有變化可以切換。
?
簡單的Enable*注解
我們可以把這些簡單的注解理解為為spring 上下文引入一組bean。 我們開始來定義一些這樣的注解:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface EnableSomeBeans {}并把這個(gè)注解應(yīng)用到spring 配置類上:
@Configuration @EnableSomeBeans public static class SpringConfig {}如果希望引入一組新的bean, 只需要簡單的使用@Import注解,如下:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(SomeBeanConfiguration.class) @interface EnableSomeBeans {}如果被引入的@Configuration定義了Bean, 那么這么bean就會被引入到spring 上下文。
@Configuration class SomeBeanConfiguration {@Beanpublic String aBean1() {return "aBean1";}@Beanpublic String aBean2() {return "aBean2";} }完整代碼可以從這里下載:https://gist.github.com/bijukunjummen/847456b55ae2340fff65
?
帶Selector的Enable注解
?當(dāng)然,Enable注解可以更加復(fù)雜,可以根據(jù)所在上下文來激活不同類型的bean。比如:EnableCaching,可以根據(jù)類路徑上的不同實(shí)現(xiàn)來激活對應(yīng)的緩存。
?這樣的注解比前面的例子復(fù)雜些:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(SomeBeanConfigurationSelector.class) public @interface EnableSomeBeansSelector {String criteria() default "default"; }?
上面的注解有一個(gè)叫criteria的屬性,我想根據(jù)這個(gè)屬性來激活不同的bean。這可以通過定義一個(gè)@Configuration Selector返回不同的@Configuration來實(shí)現(xiàn)。樣板代碼如下:
mport 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";}}
所以,如果criteria是detaul,?SomeBeanConfigurationDefault被加入,反之,加入SomeBeanConfigurationType1。
原文地址:http://www.java-allandsundry.com/2015/04/spring-enable-annotation-writing-custom.html
轉(zhuǎn)載于:https://www.cnblogs.com/lzmrex/p/9915877.html
總結(jié)
以上是生活随笔為你收集整理的Spring Enable* 注解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报表导出测试点
- 下一篇: redhat rpmforge e