注册Bean

《spring源码深度解析》笔记

1、给容器中注册组件

    (1)、包扫描+组件注解;

 (2)、@Bean(导入第三方包里面的组件);

 (3)、@Import给容器中快速的导入一个组件;

2、以下介绍@Import用法:

1)、一次只导入一个组件:@Import(AutoConfigurationImportSelector.class)
一次导入多个组件:@Import({Color.class,Red.class})
2)、使用:ImportSelector,返回需要导入组件的数组:
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
    //返回值,就是到导入到容器中的组件全类名
    //AnnotationMetadata:当前标注@Import注解的类的所有注解信息
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // TODO Auto-generated method stub
        //importingClassMetadata
        //方法不要返回null值
        return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
    }
}
@Import({MyImportSelector.class})

3)、ImportBeanDefinitionRegistrar,

/**
     * AnnotationMetadata:当前类的注解信息
     * BeanDefinitionRegistry:BeanDefinition注册类;
     *         把所有需要添加到容器中的bean;调用
     *         BeanDefinitionRegistry.registerBeanDefinition手工注册进来
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        
        boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
        boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
        if(definition && definition2){
            //指定Bean定义信息;(Bean的类型,Bean。。。)
            RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
            //注册一个Bean,指定bean名
            registry.registerBeanDefinition("rainBow", beanDefinition);
        }
    }
@Import(MyImportBeanDefinitionRegistrar.class)

3、使用Spring提供的FactoryBean(工厂Bean)

    1)、默认获取到的是工厂bean调用getObject创建的对象

    2)、要获取工厂Bean本身,我们需要给id前面加一个&

       &colorFactoryBean
@Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
    //返回一个Color对象,这个对象会添加到容器中
    @Override
    public Color getObject() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("ColorFactoryBean...getObject...");
        return new Color();
    }
    @Override
    public Class<?> getObjectType() {
        // TODO Auto-generated method stub
        return Color.class;
    }
    //是单例?
    //true:这个bean是单实例,在容器中保存一份
    //false:多实例,每次获取都会创建一个新的bean;
    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return false;
    }
}
Object bean2 = applicationContext.getBean("colorFactoryBean");
bean2 每一次返回的都是Color,而不是ColorFactoryBean类的Bean(//工厂Bean获取的是调用getObject创建的对象)。
如果希望获取colorFactoryBean这个Bean的话:
Object bean4 = applicationContext.getBean("&colorFactoryBean");

该种调用方法可以获取ColorFactoryBean的Bean。

 
 


原文地址:https://www.cnblogs.com/mayang2465/p/12088046.html