Spring高级-容器接口-初识BeanFactory

一 容器接口

ConfigurableApplicationContext

1、代码

package com.mangoubiubiu.show;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@Slf4j
@SpringBootApplication
public class ShowApplication {

    public static void main(String[] args) {
        //返回的结果是Spring 容器
        ConfigurableApplicationContext run = SpringApplication.run(ShowApplication.class, args);
        log.info("sys is okkkk");
    }

}

从这里可以看出 ApplicationContext 间接的继承了BeanFactory

2、到底什么是BeanFactory

它是ApplicationContext 的父接口

它才是Spring的核心容器,主要的ApplicationContext 实现都组合了他的功能

3、联系

 

上面有点像适配器模式

4、BeanFactory能干点啥

- 表面上只有 getBean

- 实际上控制反正、基本的依赖注入、直至Bean的生命周期的各种功能,都由它的实现类提供

 

DefaultSingletonBeanRegistry 通过反射打印单列的Bean

 

  //返回的结果是Spring 容器
        ConfigurableApplicationContext run = SpringApplication.run(ShowApplication.class, args);

        Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
        singletonObjects.setAccessible(true);
        ConfigurableListableBeanFactory beanFactory= run.getBeanFactory();
        Map<String,Object> map = (Map<String,Object>)singletonObjects.get(beanFactory);

        map.forEach((k,v)->{
            System.out.println(k + "=------->>>>." + v);
        });

        //用stream 流 过滤 名称 前缀为comp的 单列Bean
        map.entrySet().stream().filter((e->e.getKey().startsWith("comp")))
                .forEach(e->{
                    System.out.println(e.getKey()+"="+e.getValue());
                });

        log.info("sys is okkkk");

 

 

 

 

posted @ 2022-03-24 22:42  KwFruit  阅读(59)  评论(0编辑  收藏  举报