给容器注册bean的几种方式:
1.包扫描:ComponentScan+bean注解(@Controller,@Service,@Repository,@Component,Bean):
2.条件注入:@Conditional按条件选择注入
3.@Import快速给容器中导入一个组件
4.FactoryBean注册
@Import提供三种方式注册bean到容器中,
- Import直接引入bean
- 实现ImportSelector接口注册bean
- 实现ImportBeanDefinitionRegistrar接口注册bean
@Import注解源码查看
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
唯一的参数为Class,因此,为我们提供了多种灵活的注册方式。
1.Import直接引入bean
@Configuration
@Import({ Car.class })
public class ImportConfig {
}
直接引入Car,便将Car注册到了容器中,
根据打印出的bean列表,可以看出,@Import注册的bean在容器的名称为该类的全路径限定名,引用的时候需要用全路径限定名引用。
2.实现ImportSelector接口注册bean
先上实现类
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] { "com.ddc.fw.spring.annotation.demo.importplug.Blue" };
}
}
@Configuration
@Import({ MyImportSelector.class, MyImportBeanDefinitionRegistrar.class })
public class ImportConfig {
}
通过@Import MyImportSelector 实现bean注册
注意:在MyImportSelector 返回的数组中,用全路径限定名。
3.实现ImportBeanDefinitionRegistrar接口注册bean
首先实现ImportBeanDefinitionRegistrar接口,
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean flag = registry.containsBeanDefinition("com.ddc.fw.spring.annotation.demo.importplug.Blue");
if (flag) {
BeanDefinition beanDefinition = new RootBeanDefinition(Yellow.class);
registry.registerBeanDefinition("yellow", beanDefinition);
}
}
}
通过代码可知,ImportBeanDefinitionRegistrar注册的bean的名称,可以自定义id/name名称,比起ImportSelector的全路径类名简单些。同时可以通过BeanDefinitionRegistry做一些其他的判断,更灵活。
@Configuration
@Import({ MyImportSelector.class, MyImportBeanDefinitionRegistrar.class })
public class ImportConfig {
}
@Import注册bean,是springboot的实现原理,了解了@Import,可以更好的了解springboot的源码。