avatar

幽林萌逐的blog

幽林萌逐的blog

  • 首页
  • 跑团
  • 数据库
  • java
  • 中间件
  • 生活
  • 神秘学
  • 跑团tool
  • 关于
  • 文章归档
Home spring 源码 IOC
文章

spring 源码 IOC

Posted 2022-07-22 Updated 2023-02- 26
By 幽林萌逐
8~10 min read

  • IOC
    • BeanDefinition
    • bean的生命周期
      • beanfactory和factorybean的区别
      • 初始化之设置aware接口属性
      • PostProcessor(后置增强器)

IOC

  • 依赖注入 换言之通常我们需要一个对象时会new 但是,spring 会替你做这个事情
  • 对于spring 来说会维护ioc容器 用来存放对象(也叫spring bean),当需要获取对象实例时会从容器中获取。
  • 以下是一个最原始加载bean的方法
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext();
XXX bean = (XXX)cpx.getBean("XXX.class");
  • 以下是spring 创建一个spring-bean的流程
    image-1658500982286
  • 所有的bean 会保存在ioc 容器中,ioc容器会是一个map 如下图所示
    image-1658502115822

BeanDefinition

  • BeanDefinition 是spring的一个接口, 指的是bean里的一些信息,比如我这个bean的类型,bean的别名等等。
    image-1658572955248
  • BeanDefinitionReader 也是一个抽象类,将各种类型的数据转换为BeanDefinition,如xml,properties
  • 如下图所示
    image-1658573148483

bean的生命周期

  • spring 会通过反射创建spring-bean
  • DefaultListableBeanFactory是spring 默认bean 工厂的实现 (它实现自BeanFactory接口)

beanfactory和factorybean的区别

image-1658574084972

初始化之设置aware接口属性

  • aware 接口感知类
  • spring 中存在非常多的实现aware 接口的类 比如 BeanNameAware (用你的bean 实现对应的接口),让你的bean 得到更多的能力,如实现了BeanNameAware 则可以获取到bean的名称。
  • 实现其他类也可以获得更多的参数。

PostProcessor(后置增强器)

image-1658574820011

  • BeanFactoryPostProcessor是用来在bean 创建时动态改变bean里的值/属性的。
  • 应用场景: 如你需要动态加载jdbc 配置,redis 配置等 ,spring 就是使用BeanFactoryPostProcessor 实现的。
  • 如图所示PostProcessor对同一个bean 可以强化多次。
  • BeanFactoryPostProcessor 设置的配置属性 如设置bean 懒加载等。
  • BeanPostProcessor 修改的是我们定义的spring-bean里的属性。
  • 以下为BeanPostProcessor 的接口定义对应上图的before 和 after。
public interface BeanPostProcessor {

	/**
	 * 初始化方法调用前要进行的处理逻辑
	 */
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	/**
	 * 在初始化方法指定后要进行的处理逻辑
	 */
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
}

待续

java, 框架
ioc spring
License:  CC BY 4.0
Share

Further Reading

Apr 10, 2022

java 之自定义 扁平化 try catch 函数式工具类

设计初衷 为了解决业务服务较为复杂的业务逻辑假如有个业务场景:第三方会同步一批数据到我方系统,我方使用mq异步消费来解耦合一次消费会同时消费100条数据,其中可能存在非法数据,或一些未知异常所以数据之间不能互相影响。业务中会调用如下三个方法public Demo insert(Demo demo);

Dec 8, 2022

spring-boot yml/yaml 里配置内容在具体代码里的位置

如上图所示

Aug 5, 2022

spring-event 教程 spring对于事件驱动的支持

OLDER

关于 调酒

NEWER

spring 中 BeanFactory 和 FactoryBean 的区别

Recently Updated

  • java 之自定义 扁平化 try catch 函数式工具类
  • 塔罗牌 大阿卡纳 隐士
  • 塔罗牌 大阿卡纳 星星
  • 塔罗牌 大阿卡纳 战车
  • 塔罗牌 大阿卡纳 力量

Trending Tags

大阿卡纳 权杖 塔罗牌 神秘学 ro rabbitmq 自动化 注解 剧本杀 ssh

Contents

©2023 幽林萌逐的blog. Some rights reserved.

Using the Halo theme Chirpy