程序员的知识教程库

网站首页 > 教程分享 正文

Springboot中常见的@Import注解的三种使用方式详解

henian88 2024-09-09 03:45:24 教程分享 7 ℃ 0 评论

环境:springboot2.3.9.RELEASE


三种方法说明

  1. 直接导入普通数组的方式
  2. 导入ImportSelector类方式
  3. 导入ImportBeanDefinitionRegistrar方式

被导入的类加入到Spring IOC容器中。

直接导入普通数组的方式

public class A {
  @Bean
  public B b() {
    return new B() ;
  }
}
@Import({A.class})
@Configuration
public class ImportConfig {
}

这样A,B都被Spring IOC容器管理了。这里可以导入多个类。

注意:在Spring4.2之前的版本中被导入的类必须是配置类也就是类上有@Configuration注解,4.2后的版本随意一个普通类也可以。

测试:

@Resource
private A a ;
@Resource
private B b ;
	
@Test
public void testImport() {
  System.out.println("a = " + a) ;
  System.out.println("b = " + b) ;
}

导入ImportSelector类方式

通过实现ImportSelector接口

public class E {
  @Bean
  public G g() {
    return new G() ;
  }
}
public class F {
}
public class G {
}

@Import({C.class, A.class})
@Configuration
public class ImportConfig {
}
public class C implements ImportSelector {

  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    return new String[] {"com.pack.import_annotation.E", "com.pack.import_annotation.F"};
  }

}

这里的返回值中必须是完整的包名+类名

注意:这里可以返回空的String数组(length = 0),但是不能返回null。实现ImportSelector该接口的这个本身是不会被注册为Bean的。

测试:

@Resource
private E e ;
@Resource
private F f ;
@Resource
private G g ;
	
@Test
public void testImport() {
  System.out.println("e = " + e) ;
  System.out.println("f = " + f) ;
  System.out.println("g = " + g) ;
}

导入ImportBeanDefinitionRegistrar方式

public class H implements ImportBeanDefinitionRegistrar {

  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    GenericBeanDefinition beanDefinition = new GenericBeanDefinition() ;
    beanDefinition.setBeanClass(X.class) ;
    beanDefinition.getPropertyValues().addPropertyValue("name", "张三") ;
    registry.registerBeanDefinition("x", beanDefinition) ;
	}

}
public class X {
	
  private String name ;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
	
}
@Import({C.class, A.class, H.class})
@Configuration
public class ImportConfig {
}

测试:

注意:实现ImportBeanDefinitionRegistrar该接口本身这个类是不会被注册为Bean的。

完毕!!!

给个关注+转发呗谢谢

SpringBoot邮件发送示例

Springboot面试题整理附答案

使用Spring Boot Admin实时监控你的系统

Spring Boot Security防重登录及在线总数

SpringBoot配置文件你了解多少?

SpringBoot多数据源配置详解

Springboot项目使用docker部署

SpringBoot整合Quartz实现任务调度

SpringBoot2 整合 OAuth2 资源认证(保护)

SpringBoot开发自己的@Enable功能

SpringBoot项目中Redis之管道技术

SpringBoot接口防范CSRF攻击

SpringBoot2 整合OAuth2实现统一认证

SpringBoot中使用Cache及JSR107的使用

Springboot中接口参数校验N种方法你会几个?

公众:Springboot实战案例锦集

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表