目前注册组件的方式有:
注册组件: 1)包扫描+组件标注注解(@Controller @Service @Repository @Component) 2)@Bean[导入的第三方包里的组件]
下面来说第三种方式@Import:
@Import[快速给容器中导入一个组件] 1)@Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名 2)ImportSelector:返回需要导入的组建的全类名数组 3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
@Configuration
//Red Color Blue Yellow RainBow均为被注解修饰 @Import({ Red.class, MyImportSelector.class, MyImportBeanRegister.class}) public class MainConfig2 { /** * 注册组件: * 1)包扫描+组件标注注解(@Controller @Service @Repository @Component) * 2)@Bean[导入的第三方包里的组件] * 3)@Import[快速给容器中导入一个组件] * 1)@Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名 * 2)ImportSelector:返回需要导入的组建的全类名数组 * 3)ImportBeanDefinitionRegistrar:手动注册bean到容器中 */ }
public class MyImportSelector implements ImportSelector { //返回值就是导入到容器中的组件类全类名 //AnnotationMetadata:当前标注@Import注解的类的所有注解信息 @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"Yellow","Blue"}; } }
public class MyImportBeanRegister implements ImportBeanDefinitionRegistrar { /** * @param annotationMetadata 当前类的注解信息 * @param registry BeanDefinition注册类,把所有需要添加到容器中的bean, * 调用BeanDefinitionRegistry.registerBeanDefinition()手工注册进来 */ @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) { boolean red = registry.containsBeanDefinition("Red"); boolean blue = registry.containsBeanDefinition("Blue"); if(red && blue){ RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); registry.registerBeanDefinition("rainBow",beanDefinition); } } }