Spring注解05|Spring注解05 @Import 给容器快速导入一个组件
给容器中注册组件:
一、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
二、@Bean[导入的第三方包里面的组件]
三、*@Import[快速给容器中导入一个组件]
1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
2)、ImportSelector:返回需要导入的组件的全类名数组;
3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
四、**使用Spring提供的 FactoryBean(工厂Bean);
1)、默认获取到的是工厂bean调用getObject创建的对象
2)、要获取工厂Bean本身,我们需要给id前面加一个&&colorFactoryBean
配置类 MainConfigImport .java
@Configuration
@ComponentScan(value = "https://www.it610.com/article/com.tommy", useDefaultFilters = false)
@Import({MyImportSelector.class, MyImportBeanDefinitionRegistrar.class, Yellow.class})
public class MainConfigImport {
//设置FacotryBean,只能通过这个方式注入,其他的方式会有问题
@Bean
public MyBlackFactoryBean myBlackFactoryBean(){
returnnew MyBlackFactoryBean();
}
}
MyImportSelector.java
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.tommy.bean.Tomcat", "com.tommy.bean.Tomdog"};
}
}
MyImportBeanDefinitionRegistrar.java
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
final boolean b = registry.containsBeanDefinition("com.tommy.bean.Blue");
final boolean b2 = registry.containsBeanDefinition("com.tommy.bean.Tomcat");
if (!b && b2) {
final BeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(Blue.class);
registry.registerBeanDefinition("blue", beanDefinition);
}
}
}
MyBlackFactoryBean.java
public class MyBlackFactoryBean implements FactoryBean {
@Override
public Black getObject() throws Exception {
System.out.println("MyBlackFactoryBean start new Black() ");
return new Black();
}
@Override
public Class> getObjectType() {
return Black.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
【Spring注解05|Spring注解05 @Import 给容器快速导入一个组件】测试类
public class IOCTestImport {
@Test
public void testImport() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigImport.class);
printDefindName(applicationContext);
final Object blackFactoryBean = applicationContext.getBean("myBlackFactoryBean");
System.out.println("blackFactoryBean class: " + blackFactoryBean.getClass());
final Object blackFactoryBean2 = applicationContext.getBean("myBlackFactoryBean");
System.out.println("blackFactoryBean == blackFactoryBean2: " + (blackFactoryBean == blackFactoryBean2));
final Object bean3 = applicationContext.getBean("myBlackFactoryBean");
System.out.println("bean3: "+bean3.getClass());
}
private void printDefindName(ApplicationContext applicationContext) {
final String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
System.out.println(name);
}
}
}
测试结果:
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
mainConfigImport
com.tommy.bean.Tomcat
com.tommy.bean.Tomdog
com.tommy.bean.Yellow
myBlackFactoryBean
blue
MyBlackFactoryBean start new Black()
blackFactoryBean class: class com.tommy.bean.Black
blackFactoryBean == blackFactoryBean2: true
bean3: class com.tommy.bean.BlackProcess finished with exit code 0
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- spring|spring boot项目启动websocket
- 生活与游戏日记(第182篇)(〔成长瞬间〕关注解决问题2019.10)
- Spring|Spring Boot 整合 Activiti6.0.0
- Spring集成|Spring集成 Mina
- springboot使用redis缓存
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了