@Import注解

欣喜 SpringBoot 发布时间:2024-04-28 15:40:18 阅读数:10833 1
下文笔者讲述@import注解的功能简介说明,如下所示

@Import注解的功能

@Import注解是Spring中java注解
@Import注解拥有@Bean注解的功能
               是一个配置类@Configuration类的权限

功能1:引入其他@Configuration

 
  //假设有如下接口和两个实现类:
  package com.test
  interface ServiceInterface {
      void test();
  }
  
  class ServiceA implements ServiceInterface {
  
      @Override
     public void test() {
         System.out.println("ServiceA");
     }
 }
 
 class ServiceB implements ServiceInterface {
 
     @Override
     public void test() {
         System.out.println("ServiceB");
     }
 }

 //两个@Configuration,其中ConfigA``@Import``ConfigB:
 
 package com.test
 @Import(ConfigB.class)
 @Configuration
 class ConfigA {
     @Bean
     @ConditionalOnMissingBean
     public ServiceInterface getServiceA() {
         return new ServiceA();
     }
 }

 
 @Configuration
 class ConfigB {
     @Bean
     @ConditionalOnMissingBean
     public ServiceInterface getServiceB() {
         return new ServiceB();
     }
 }

 //通过ConfigA创建AnnotationConfigApplicationContext,获取ServiceInterface,看是哪种实现:
 
 public static void main(String[] args) {
     ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigA.class);
     ServiceInterface bean = ctx.getBean(ServiceInterface.class);
     bean.test();
 }

 //输出为:ServiceB.证明@Import的优先于本身的的类定义加载。

直接初始化其他类Bean

Spring 4.2之后
   @Import可以直接指定实体类到context中
  
将上面代码中ConfigA
   @Import修改为@Import(ServiceB.class)
  就会生成ServiceB的Bean到容器上下文中
   输出:
     ServiceB.证明@Import优先于本身的的类定义加载 
package com.test;
  class ServiceImportSelector implements ImportSelector {
       @Override
       public String[] selectImports(AnnotationMetadata importingClassMetadata) {
           //可以是@Configuration注解修饰的类,也可以是具体的Bean类的全限定名称
           return new String[]{"com.test.ConfigB"};
       }
   }

 
 @Import(ServiceImportSelector.class)
 @Configuration
class ConfigA {
    @Bean
     @ConditionalOnMissingBean
    public ServiceInterface getServiceA() {
         return new ServiceA();
     }
 }

package com.test;
 
 @Retention(RetentionPolicy.Runtime)
 @Documented
@Target(ElementType.TYPE)
@Import(ServiceImportSelector.class)
@interface EnableService {
 String name();
}
 
class ServiceImportSelector implements ImportSelector {
     @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
         //这里的importingClassMetadata针对的是使用@EnableService的非注解类
         //因为`AnnotationMetadata`是`Import`注解所在的类属性,如果所在类是注解类,则延伸至应用这个注解类的非注解类为止
         Map<String , Object> map = importingClassMetadata.getAnnotationAttributes(EnableService.class.getName(), true);
         String name = (String) map.get("name");
         if (Objects.equals(name, "B")) {
             return new String[]{"com.test.ConfigB"};
         }
         return new String[0];
     }
 }


//在ConfigA中增加注解@EnableService(name = "B")
 
 package com.test;
 @EnableService(name = "B")
 @Configuration
class ConfigA {
     @Bean
     @ConditionalOnMissingBean
     public ServiceInterface getServiceA() {
        return new ServiceA();
     }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202404/8119.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者