spring给容器中注册组件的几种方式,1.包扫描+组件标注注解2.@bean(导入的第三方)3.@import,4.spring提供的FactoryBean

      
       给容器中注册组件;
       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);
    }

}

猜你喜欢

转载自blog.csdn.net/sinat_36572927/article/details/85162023