给容器中注册组件;
1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
2)、@Bean[导入的第三方包里面的组件]
3)、@Import[快速给容器中导入一个组件]
1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
2)、ImportSelector:返回需要导入的组件的全类名数组;
3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
4)、使用Spring提供的 FactoryBean(工厂Bean);
1)、默认获取到的是工厂bean调用getObject创建的对象
2)、要获取工厂Bean本身,我们需要给id前面加一个&
&colorFactoryBean
以下是利用自定义注册器向容器中注册color 这个bean;
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes(); for (String annotationType : annotationTypes) { System.out.println("当前类的注解: " + annotationType); //输出 主配置类上的两个注解@Configuration和@Import } boolean user = registry.containsBeanDefinition("user"); System.out.println("是否有user这个bean:" + user); //向容器重注册Color registry.registerBeanDefinition("color", new RootBeanDefinition(Color.class)); } }
@Configuration //申明这是一个配置类
@Import(value = {MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) //import,向容器中快速导入组件
public class MainConfig2 {
@Bean("bill")
@Conditional(WindowsConditional.class)
public Person person1() {
return new Person("bill gates", 60);
}
@Bean("linus")
@Conditional(LinuxConditional.class)
public Person person2() {
return new Person("linus t", 48);
}
}