注解
给容器中注册方式:
1) 通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
2)@Bean 导入第三方包里面的组件
3)@Import:快速给容器中导入一个组件
【1】@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;
【2】ImportSelector:返回需要导入的 组件的全类名数组;
【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中
一、注册组件
给容器中注册组件有以下几种方式:
(1)通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
(2)@Bean (适用于导入第三方包里面的组件)
(3)@Import:快速给容器中导入一个组件
二、@Import 注解快速导入
在配置类上面使用 @Import 注解可以快速给容器中导入组件:
@Import(value = {Color.class, Red.class}) //快速导入多个组件
@Configuration
public class MainConfig4 {
@Bean(name = "person")
public Person person01() {
return new Person("李四", 20);
}
}
注意:
(1)配置类只能有一个 @Import 注解,不能出现多个;
(2)导入的组件的 id 默认是组件的全类名
三、@ImportSelector
ImportSelect 是一个接口,里面提供了一个方法 selectImports,用于返回要导入的组件的全类名数组。
自定义一个 MyImportSelect 类,实现 ImportSelect 接口
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
/**
* 返回值,就是要导入到容器中组件全类名
* AnnotationMetadata:当前标注 @Import 注解的类的所有注解信息
* @param importingClassMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//方法不要返回 null 值,可以返回空数组
return new String[]{"com.njf.bean.Yellow", "com.njf.bean.Blue"};
}
}
在配置类上进行应用:
@Import(value = {Color.class, Red.class, MyImportSelector.class})
@Configuration
public class MainConfig4 {
@Bean(name = "person")
public Person person01() {
return new Person("李四", 20);
}
}
四、@ImportBeanDefinitionRegistrar
ImportBeanDefinitionRegistrar 是一个接口,它里面有一个registerBeanDefinition方法,用于向容器中注册一个组件。
自定义一个MyImportBeanDefinitionRegistrar 类:
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:Bean定义的注册类
* 把所有需要添加到容器中的 bean,调用registerBeanDefinition方法进行手工注册
* BeanDefinitionRegistry.registerBeanDefinition
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition1 = registry.containsBeanDefinition("com.njf.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.njf.bean.Blue");
if (definition1 && definition2) {
//beanDefinition 指定bean的类型,bean的定义信息,如类型,scope等信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个bean,指定bean的名字
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
在配置类上应用:
@Import(value = {Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MainConfig4 {
@Bean(name = "person")
public Person person01() {
return new Person("李四", 20);
}
}
测试结果: