021 使用@Import注解完成Bean的注册

一 . 概述

在之前我们使用@Bean或者组件扫描器加上组件标记注解向容器中注册组件.

在spring之中,也提供了另外一种方式帮助我们注册组件.

这个组件就是@Import的方式,

使用这种方式的原因就是我们希望在一定程度上可以控制如何注入Bean.


 二 .注解的测试

组件类:

public class Person {

}

配置类:

@Configuration
@Import({Person.class})
public class ImportConfig {
    
}

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ImportConfig.class)
public class ImportTest {
    
    @Autowired
    private ApplicationContext context;
    
    @Test
    public void test() {
        System.out.println(context.getBean(Person.class));
    }
} 

我们现在可以使用@Import的方式直接将组件注册到IOC容器之中.

此时注册的组件仅仅是一个含有无参构造函数的POJO类,且id为全类名.

另外@Import支持更加强大的注册功能.

上面演示的是直接引入一个Bean的形式.


 三 .组件类实现ImportSelector接口.

在@Import之中,还可以导入实现了ImportSelector接口的类.

  这个类中的方法表示需要导入的类的全类名.

public class MyImportSelector implements ImportSelector{

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[] {"com.trek.springConfig.importTest.Person"};
    }

}

该实现类需要返回一组类的全类名.


 四 .实现ImportBeanDefinitionRegistrar接口

我们可以通过这个接口的实现类完成自定义的Bean的注册.

public class ImportRegister implements ImportBeanDefinitionRegistrar{

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinition BeanDefinition = new RootBeanDefinition(Person.class);
        //使用注册器完成对象的注册
        registry.registerBeanDefinition("person", BeanDefinition );
    }

}

我们现在需要注意的就是,这些注解式spring底层完成Bean的注册时进行使用的方式.

原文地址:https://www.cnblogs.com/trekxu/p/9094871.html