Spring高级-容器实现-BeanFactory实现的特点

一、DefaultListableBeanFactory

DefaultListableBeanFactory,是 BeanFactory 最重要的实现,像控制反转依赖注入功能,都是它来实现

 

1、需求一:往DefaultListableBeanFactory里面 注册一个组件

复制代码
package com.mangoubiubiu.show;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.logging.Logger;

public class 
{

    public static void main(String[] args) {

        DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();

        //bean 的定义 (class  ,scope , 初始化 ,销毁方法)

        AbstractBeanDefinition beanDefinition
                = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
        beanFactory.registerBeanDefinition("config",beanDefinition);


        for(String name  : beanFactory.getBeanDefinitionNames()){
            System.out.println(name);
        }

    }



    @Configuration
    static class Config{
        @Bean
        public Bean1 bean1(){
            return new Bean1();
        }
        @Bean
        public Bean2 bean2(){
            return new Bean2();
        }
    }

    @Slf4j
    static class Bean1{
        public Bean1(){
            log.info("构造 Bean1");
        }

        @Autowired
        private Bean2 bean2;

        public Bean2 getBean2(){
            return bean2;
        }
    }


    @Slf4j
    static class Bean2{
        public Bean2(){
            log.info("构造 Bean2");
        }

    }







}
复制代码

问题:发现仅仅confi注册进来了,config里面的bean没有注册进来

2、解决Config里面的组件注册不进来的问题:为BeanFactory添加一些常用的后处理器,对BeanFactory 做增强处理,来将Config里面的组件也注册在BeanFactory里面

复制代码
package com.mangoubiubiu.show;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.logging.Logger;

public class TestBeanFactory {

    public static void main(String[] args) {

        DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();

        //bean 的定义 (class  ,scope , 初始化 ,销毁方法)

        AbstractBeanDefinition beanDefinition
                = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
        beanFactory.registerBeanDefinition("config",beanDefinition);

        //给 BeanFactory 添加一些常用的后处理器
        AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);


        //BeanFactory 后处理器主要功能,补充了一些bean的定义 BeanFactoryPostProcessor把所有Bean工厂的后处理器拿到,逐一执行做扩展
       beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor -> {
           beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
       });

        for(String name  : beanFactory.getBeanDefinitionNames()){
            System.out.println(name);
        }
        
        Bean1 bean = beanFactory.getBean(Bean1.class);
        System.out.println(bean.getBean2());

    }

    
    @Configuration
    static class Config{
        @Bean
        public Bean1 bean1(){
            return new Bean1();
        }
        @Bean
        public Bean2 bean2(){
            return new Bean2();
        }
    }

    @Slf4j
    static class Bean1{
        public Bean1(){
            log.info("构造 Bean1");
        }

        @Autowired
        private Bean2 bean2;

        public Bean2 getBean2(){
            return bean2;
        }
    }

    @Slf4j
    static class Bean2{
        public Bean2(){
            log.info("构造 Bean2");
        }

    }

}
复制代码

 

相关Processor作用

org.springframework.context.annotation.internalConfigurationAnnotationProcessor 处理Configuration注解

org.springframework.context.annotation.internalAutowiredAnnotationProcessor 完成对象属性的注入

org.springframework.context.annotation.internalCommonAnnotationProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.context.event.internalEventListenerFactory

3、解决依赖注入不到的问题:添加一些Bean的后处理器针对 bean 的生命周期的各个阶段提供扩展,例如@Autowired @Resource

复制代码
package com.mangoubiubiu.show;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.logging.Logger;

public class TestBeanFactory {

    public static void main(String[] args) {

        DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();

        //bean 的定义 (class  ,scope , 初始化 ,销毁方法)

        AbstractBeanDefinition beanDefinition
                = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
        beanFactory.registerBeanDefinition("config",beanDefinition);

        //给 BeanFactory 添加一些常用的后处理器
        AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);


        //BeanFactory 后处理器主要功能,补充了一些bean的定义
       beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor -> {
           beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
       });

       //Bean后处理器,针对 bean 的生命周期的各个阶段提供扩展,例如@Autowired @Resource
      //  beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);
        beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanPostProcessor -> {
            beanFactory.addBeanPostProcessor(beanPostProcessor);//建立bean工厂与后处理器之间的联系
        });

        for(String name  : beanFactory.getBeanDefinitionNames()){
            System.out.println(name);
        }
        System.out.println("----------------->");

        Bean1 bean = beanFactory.getBean(Bean1.class);
        System.out.println("成功取到Bean2的对象:"+bean.getBean2());
        /**
         * 学到了什么:
         * a. beanFactory 不会做的事
         *   1 。不会主动调用BeanFactory 后处理器
         *   2. 不会主动添加Bean后处理器
         *   3. 不会主动初始化单列
         *   4. 不会解析beanFactory 还不会解析 ${} 与 #{}
         *
         * b. bean 后处理器会有排序逻辑
         */
    }



    @Configuration
    static class Config{
        @Bean
        public Bean1 bean1(){
            return new Bean1();
        }
        @Bean
        public Bean2 bean2(){
            return new Bean2();
        }
    }

    @Slf4j
    static class Bean1{
        public Bean1(){
            log.info("构造 Bean1");
        }

        @Autowired
        private Bean2 bean2;

        public Bean2 getBean2(){
            return bean2;
        }
    }


    @Slf4j
    static class Bean2{
        public Bean2(){
            log.info("构造 Bean2");
        }

    }

}
复制代码

4、利用beanFactory.preInstantiateSingletons()创建所有的单列对象

5、总结

  • a. beanFactory 不会做的事
    *   1. 不会主动调用BeanFactory 后处理器
    *   2. 不会主动添加Bean后处理器
    *   3. 不会主动初始化单列
    *   4. 不会解析beanFactory 还不会解析 ${} 与 #{}

 

 

本文作者:KwFruit

本文链接:https://www.cnblogs.com/mangoubiubiu/p/16079576.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   KwFruit  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起