@Import的使用

作用:
1)@Import:源码的注释中已经表明,它的功能等于@bean,。可以引入一个类(这个类可以是普通类,也可以是@Configuraion/Component修饰的类),并且加入到Spring容器中,程序中可以直接@autowired注入
2)前两种方式加入容器时,bean id为全限定类名,第三种方式可以自定义id
第三种方式的优点在于可以自定义创建bean的过程。
1.直接引入对应类的Class对象,

//MyImportSelector,MyImportBeanDefinitionRegistrar分别实现了两个接口 @Import({TestA.class,TestB.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) public class SpringConfig {}public class TestA {public TestA() { System.out.println("执行testA的无参构造方法"); }public void funTestA() { System.out.println("执行testA中的funTestA方法"); }} public class TestB {public TestB() { System.out.println("执行TestB的无参构造方法"); }public void funTestB() { System.out.println("执行TestB中的funTestB方法"); }}

2.实现ImportSelector接口
1)可以返回空数组,但是不能返回null,否则会报空指针异常
/** * 实现ImportSelector,重写方法selectImports,返回需要引入的类,并创建实例,加入spring容器 */ public class MyImportSelector implements ImportSelector {public MyImportSelector() { System.out.println("MyImportSelector构造方法"); }@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"com.lagou.edu.testimport.TestC"}; }}

3.实现ImportBeanDefinitionRegistrar接口
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {public MyImportBeanDefinitionRegistrar() { System.out.println("执行MyImportBeanDefinitionRegistrar的构造方法"); }@Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { //指定要注册的bean信息 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestD.class); //注册bean,并指定bean的id registry.registerBeanDefinition("testD", rootBeanDefinition); } }

【@Import的使用】测试案例
@Test public void test3() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); TestA testA =(TestA) ac.getBean("com.lagou.edu.testimport.TestA"); testA.funTestA(); TestB testB =(TestB) ac.getBean("com.lagou.edu.testimport.TestB"); testB.funTestB(); TestC testC =(TestC) ac.getBean("com.lagou.edu.testimport.TestC"); testC.funTestC(); //注册bean时指定了bean的id, TestD testD =(TestD) ac.getBean("testD"); testD.funTestD(); }

    推荐阅读