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

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

时间:2022-11-26 16:44:55浏览次数:45  
标签:BeanFactory Spring 狂野 Bean bean Context 超强 BeanDefinition

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方法=

标签:BeanFactory,Spring,狂野,Bean,bean,Context,超强,BeanDefinition
From: https://www.cnblogs.com/xieshier/p/16927696.html

相关文章

  • SpringMVC
    什么是SpringMVC概述SpringMVC是SpringFramework的一部分,是基于Java实现MVC的轻量级Web框架官方文档:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-fram......
  • Spring--AOP简介+入门案例
    AOP简介面向切面编程:在不惊动原始设计的基础上,进行功能增强各个要应用该功能的对象叫做连接点,那个功能叫做通知,表面上的代码没有发生变化,私下里发生变化的连接点,会出现切......
  • Spring5初学
    项目截图包引用bean.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3......
  • Spring当中的常用注解
    常用注解如果有人问我在项目中使用的比较多的注解是什么,我想应该不能只说一些基础的,所以从今天开始记录一下遇到的一些比较非常见的注解。基础注解@Service@Controlle......
  • 【Spring Cloud实战】Spring Cloud Alibaba入门
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、为什么会出现​​SpringCloudnetflix​​进入维护模式......
  • 【Spring Cloud实战】Spring Cloud Stream消息驱动
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、概述屏蔽底层消息中间件的差异,降低切换成本,统一消息的......
  • 【Spring Cloud实战】Ribbon负载均衡
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、概述SpringCloudRibbon是基于NetflixRibbon实现的一......
  • 【Spring Cloud实战】OpenFeign服务接口调用
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、概述官网:https://docs.spring.io/spring-cloud-openfeig......
  • 【Spring Cloud实战】Spring Cloud GateWay服务网关
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/官网:https://docs.spring.io/spring-cloud-gateway/docs/cu......
  • springboot之redis启动时的三个警告
    第一个警告将net.core.somaxconn=1024添加到/etc/sysctl.conf中,然后执行sysctl-p生效配置。——20221116@设置的不起作用第二个警告将vm.overcommit_memory=1添......