zoukankan      html  css  js  c++  java
  • 注册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。

     
     


  • 相关阅读:
    MFC中动态控件的创建与响应
    fseek函数
    fullPage.js插件用法(转发)
    二级联动
    ajax_异步交互-get/post方式
    02_数据类型转换-小结
    01_创建对象的三种方法
    分布式与集群
    FSM
    开发一个第三方库的一般性和团队特定规则
  • 原文地址:https://www.cnblogs.com/mayang2465/p/12088046.html
Copyright © 2011-2022 走看看