日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Spring Enable annotation – writing a custom Enable annotation

發布時間:2025/4/5 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Enable annotation – writing a custom Enable annotation 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:https://www.javacodegeeks.com/2015/04/spring-enable-annotation-writing-a-custom-enable-annotation.html

Spring provides a range of annotations with names starting with?Enable*, these annotations in essence enable certain Spring managed features to be activated. One good example of such an annotation is?EnableWebMvcwhich brings in all the beans needed to support a MVC flow in Spring based applications. Another good example is the?EnableAsync?annotation to activate beans to support async functionality in Spring based applications.

I was curious about how such annotations work and wanted to document my understanding. The way these annotations are supported can be considered part of the SPI and so may break if the internal implementation changes in future.

Simple Enable* Annotations

One way to think about these custom annotations is that they add a set of new beans into the Spring’s application context. Let us start by defining one such custom annotation:

1@Retention(RetentionPolicy.RUNTIME)
2@Target(ElementType.TYPE)
3@interface?EnableSomeBeans {}

and apply this annotation on a Spring @Configuration class:

1@Configuration
2@EnableSomeBeans
3public?static?class?SpringConfig {}

So now to bring in a set of beans when this annotation is applied is as simple as adding the set of beans to bring in using @Import annotation this way:

1@Retention(RetentionPolicy.RUNTIME)
2@Target(ElementType.TYPE)
3@Import(SomeBeanConfiguration.class)
4@interface?EnableSomeBeans {}

That is essentially it, if this imported @Configuration class defines any beans, they would now be part of the Application context:

01@Configuration
02class?SomeBeanConfiguration {
03?
04????@Bean
05????public?String aBean1() {
06????????return?"aBean1";
07????}
08?
09????@Bean
10????public?String aBean2() {
11????????return?"aBean2";
12????}
13}

Here is a?gist?with a working sample.

Enable* Annotations with Selectors

Enable annotations can be far more complex though, they can activate a different family of beans based on the context around them. An example of such an annotation is?EnableCaching?which activates configuration based on different caching implementations available in the classpath.

Writing such Enable* annotations is a little more involved than the simpler example earlier. As before start with a custom annotation:

1@Retention(RetentionPolicy.RUNTIME)
2@Target(ElementType.TYPE)
3@Import(SomeBeanConfigurationSelector.class)
4public?@interface?EnableSomeBeansSelector {
5????String criteria()?default?"default";
6}

Note that in this case the custom annotation has a sample field called criteria, what I want to do is to activate two different set of beans based on this criteria. This can be achieved using a @Configuration selector which can return different @Configuration file based on the context(in this instance the value of the criteria field). This selector has a simple signature and this is a sample implementation:

01import?org.springframework.context.annotation.ImportSelector;
02import?org.springframework.core.annotation.AnnotationAttributes;
03import?org.springframework.core.type.AnnotationMetadata;
04?
05public?class?SomeBeanConfigurationSelector?implements?ImportSelector {
06????@Override
07????public?String[] selectImports(AnnotationMetadata importingClassMetadata) {
08????????AnnotationAttributes attributes =
09????????????????AnnotationAttributes.fromMap(
10????????????????????????importingClassMetadata.getAnnotationAttributes
11(EnableSomeBeansSelector.class.getName(),?false));
12????????String criteria = attributes.getString("criteria");
13????????if?(criteria.equals("default")) {
14????????????return?new?String[]{"enableannot.selector.SomeBeanConfigurationDefault"};
15????????}else?{
16????????????return?new?String[]{"enableannot.selector.SomeBeanConfigurationType1"};
17????????}
18????}
19}
20?
21@Configuration
22class?SomeBeanConfigurationType1 {
23?
24????@Bean
25????public?String aBean() {
26????????return?"Type1";
27????}
28?
29}
30?
31@Configuration
32class?SomeBeanConfigurationDefault {
33?
34????@Bean
35????public?String aBean() {
36????????return?"Default";
37????}
38?
39}

So if the criteria field is “default”, the beans in “SomeBeanConfigurationDefault” gets added in, else the one in “SomeBeanConfigurationType1”

  • Here is a?gist?with a working sample.

Conclusion

I hope this gives an appreciation for how Spring internally implements the @Enable* annotations, as an application developer you may not need to create such annotations yourself, a simpler mechanism will be to use @Configuration classes and Spring bean profiles to compose applications.

轉載于:https://www.cnblogs.com/davidwang456/p/6245751.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Spring Enable annotation – writing a custom Enable annotation的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。