一 . 概述
在之前我们使用@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的注册时进行使用的方式.