关于Spring注解@Import
以下内容仅供参考
@Import的用途
@Import通过快速导入的方式实现把实例加入spring的IOC容器中。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration @Configuration}, {@link ImportSelector},
* {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
*/
Class<?>[] value();
}
注解用于类上,用于快速导入一个类
@Import的使用方式
1.类字面常量
- 直接写类字面常量,可以多个
//实体类1
package bean;
public class Bean01 {
public Bean01(){
System.out.println("Bean01构造器被调用");
}
}
//实体类2
package bean;
public class Bean02 {
public Bean02(){
System.out.println("Bean02构造器被调用");
}
}
- 配置类 使用@Import导入Bean01和Bean02
package configuration;
import bean.Bean01;
import bean.Bean02;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({Bean01.class,Bean02.class})
public class Configuration01 {
public Configuration01(){
System.out.println("Configuration01构造器被调用");
}
}
- 测试
package test;
import configuration.Configuration01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test01 {
public static void main(String[] args) {
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Configuration01.class);
for(String s:applicationContext.getBeanDefinitionNames()){
System.out.println(s);
}
}
}
//输出结果
Configuration01构造器被调用
Bean01构造器被调用
Bean02构造器被调用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configuration01
bean.Bean01
bean.Bean02
可以看到这样导入成功了,Bean01和Bean02被Spring管理了
2.实现ImportSelector接口导入
- 创建一个类实现ImportSelector接口,实现selectImports方法,该方法返回一个字符串数组,当使用@Import导入该类的时候,实际上是注册了这个方法返回字符串的类.
- ImportSelectorImp01的selectImports方法返回Bean01和Bean02两个类
package bean;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class ImportSelectorImp01 implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"bean.Bean01","bean.Bean02"};
}
}
- @Import导入实现类ImportSelector接口的类
package configuration;
import bean.Bean01;
import bean.Bean02;
import bean.ImportSelectorImp01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(ImportSelectorImp01.class)
public class Configuration01 {
public Configuration01(){
System.out.println("Configuration01构造器被调用");
}
}
- 测试
package test;
import configuration.Configuration01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test01 {
public static void main(String[] args) {
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Configuration01.class);
for(String s:applicationContext.getBeanDefinitionNames()){
System.out.println(s);
}
}
}
//运行结果
Configuration01构造器被调用
Bean01构造器被调用
Bean02构造器被调用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configuration01
bean.Bean01
bean.Bean02
3.实现ImportBeanDefinitionRegistrar接口导入
- 创建一个类实现ImportBeanDefinitionRegistrar接口并实现方法registerBeanDefinitions在方法里进行bean注册
package bean;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class ImportBeanDefinitionRegistrarImp01 implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Bean01.class);
registry.registerBeanDefinition("bean01",rootBeanDefinition);
}
}
package configuration;
import bean.ImportBeanDefinitionRegistrarImp01;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(ImportBeanDefinitionRegistrarImp01.class)
public class Configuration01 {
public Configuration01(){
System.out.println("Configuration01构造器被调用");
}
}
package test;
import configuration.Configuration01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test01 {
public static void main(String[] args) {
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Configuration01.class);
for(String s:applicationContext.getBeanDefinitionNames()){
System.out.println(s);
}
}
}
//测试结果
Configuration01构造器被调用
Bean01构造器被调用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configuration01
bean01