ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BeanFactory与ApplicationContext的实现

2022-03-31 01:31:57  阅读:186  来源: 互联网

标签:ApplicationContext beanFactory 实现 BeanFactory public Bean Bean2 class 处理器


本文为学习笔记

BeanFactory和ApplicationContext 的实现

1、@Bean注解是BeanFactory 的后处理器的Buff
2、@AutoWire、@Resource是Bean的后处理器,bean 的后处理器是针对Bean的生命周期的扩展
3、beanFactory默认情况下读到@bean、@autowired 是不会创建对象的,而只是保留一个名字,getBean()时才会创建对象。可以使用beanfactory.preInstantiateSignletons()来初始化单例对象
4、不会主动解析 ${} 和 #{}

1、BeanFactory 的实现

1、最重要的实现:DefaultListBeanFactory 
要创建bean,首先要定义Bean,(class、scope(单例、多例)、初始化、销毁等信息)
2、首先使用BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition()创建一个单例的Config beanDefinition 。在使用Beanfactory 创建一个指定名字和Beanfinition 的类。注意:BeanFactory默认情况下不会读取注解,即不会创建Config 里面的@Bean声明的对象
3、解决BeanFactory 不能做到的事:
AnnotationConfigUtils.registerAnnotationConfigProfessor
添加后处理器

源码:

public class TestConfig {
    public static void main(String[] args) {
        //创建工厂,之前说过这个类可以创建众多类型的 Bean 如何实现:
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        //创建类的定义
        AbstractBeanDefinition beanDefinition
                = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class).setScope("singleton").getBeanDefinition();
        //把类的定义交给工厂创建一个 bean :config
        beanFactory.registerBeanDefinition("config",beanDefinition);
        //遍历:在这里还没有给 beanFactory 加Buff 它只能创建config 而不能创建 bean1 和 bean2
        System.out.println("解析之前==================================");
        for (int i = 0; i < beanFactory.getBeanDefinitionNames().length; i++) {
            System.out.println(beanFactory.getBeanDefinitionNames()[i]);
        }

        //给 beanFactory 加一些后处理器
        AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
        //使这些处理器生效,根据type 获取后处理器 依次执行
        beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach((pro->{
            pro.postProcessBeanFactory(beanFactory);
        }));

        System.out.println("解析之后==================================");
        for (int i = 0; i < beanFactory.getBeanDefinitionNames().length; i++) {
            System.out.println(beanFactory.getBeanDefinitionNames()[i]);
        }
        //添加Bean的后处理器,使 @autowired 、@resource 生效
        beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);
        //调用 getBean()之前
        beanFactory.preInstantiateSingletons();
        System.out.println("调用 getBean()之前>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        System.out.println(beanFactory.getBean(Bean1.class).getBean2());
    }

    @Configuration
    static class MyConfig{
        @Bean
        public Bean1 bean1(){
            return new Bean1();
        }
        @Bean
        public Bean2 bean2(){
            return new Bean2();
        }
    }
    static class Bean1{
        private Logger logger  = LoggerFactory.getLogger(Bean1.class);
        public Bean1(){
            logger.debug("bean1 create  ---");
        }
        @Autowired
        private Bean2 bean2;
        public Bean2 getBean2(){return bean2;};

    }
    static class Bean2{
        private Logger logger  = LoggerFactory.getLogger(Bean2.class);
        public Bean2(){
            logger.debug("bean2 create  ---");
        }
    }
}

结果:

1、添加BeanFactoryPostProcessor

2、添加BeanPostProcessor

3、添加preInstantiateSignletons()

标签:ApplicationContext,beanFactory,实现,BeanFactory,public,Bean,Bean2,class,处理器
来源: https://www.cnblogs.com/AN-KATG/p/16079982.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有