【博学谷学习记录】超强总结,用心分享|狂野架构Spring核心组件补充

Bean组件

Bean组件定义在Spring的org.springframework.beans包下:是典型的工厂模式(BeanFactory)

这个包下的所有类主要解决了三件事:

  • Bean的定义:
  • Bean的创建:
  • Bean的赋值及初始化:

例子

使用@Configuration 或@Bean注解

1.BeanDefinition(Bean定义对象) 将id、class等值进行封装

2.通过反射创建Bean对象(半成品,未赋值)user{id="",name=""}

3.赋值(解决循环依赖),初始化操作(扩展点)------完整的bean对象-----存放在IOC容器

Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory。

BeanFactory.getBean("key")

BeanFactory是基础容器对象:可以创建并管理bean的生命周期

IOC容器:map(SingLeTonObjects):单例池

两者关系:IOC是BeanFactory的一个属性。

Bean定义:BeanDefinition

这里的 BeanDefinition 就是我们所说的 Spring 的 Bean,我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); 
}   

BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。

Context组件

Context在Spring的org.springframework.context包下

Context模块构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法.Context模块继承了Beans的特性,为Spring核心提供了大量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的支持

ApplicationContext是Context的顶级父类

ApplicationContext 的子类主要包含两个方面:

  1. ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息
  2. WebApplicationContext 顾名思义,就是为 web 准备的 Context 他可以直接访问到 ServletContext,通常情况下,这个接口使用少

再往下分就是按照构建 Context 的文件类型,接着就是访问 Context 的方式。这样一级一级构成了完整的 Context 等级层次。

总体来说 ApplicationContext 必须要完成以下几件事:

  • 标识一个应用环境
  • 利用 BeanFactory 创建 Bean 对象
  • 保存对象关系表
  • 能够捕获各种事件

区别:

ApplicationContext是高级容器对象:在构建时会创建所有非懒加载单例bean

BeanFactory是基础容器对象:懒加载

//懒加载
XMLBeanFactory beanFactory= new XMLBeanFactory();
beanFactory.getBean();

new ClassPathXMLApplicationContext();

面试扩展:简述Spring后置处理器

后置处理器是一种拓展机制,贯穿Spring Bean的生命周期

后置处理器分为两类:

BeanFactory后置处理器:BeanFactoryPostProcessor

实现该接口,可以在spring的bean创建之前,修改bean的定义属性

public interface BeanFactoryPostProcessor {

    /*
     *  该接口只有一个方法postProcessBeanFactory,方法参数是ConfigurableListableBeanFactory,通过该
        参数,可以获取BeanDefinition
    */
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

Bean后置处理器:BeanPostProcessor

BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口

实现该接口,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些处理逻辑

public interface BeanPostProcessor {
    //bean初始化方法调用前被调用
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    //bean初始化方法调用后被调用
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

运行顺序

=Spring IOC容器实例化Bean=

=调用BeanPostProcessor的postProcessBeforeInitialization方法=

=调用bean实例的初始化方法=

=调用BeanPostProcessor的postProcessAfterInitialization方法=

posted @ 2022-11-26 16:37  谢十二♡Lgy  阅读(23)  评论(0编辑  收藏  举报