spring 源码 IOC
IOC
- 依赖注入 换言之通常我们需要一个对象时会new 但是,spring 会替你做这个事情
- 对于spring 来说会维护ioc容器 用来存放对象(也叫spring bean),当需要获取对象实例时会从容器中获取。
- 以下是一个最原始加载bean的方法
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext();
XXX bean = (XXX)cpx.getBean("XXX.class");
- 以下是spring 创建一个spring-bean的流程
- 所有的bean 会保存在ioc 容器中,ioc容器会是一个map 如下图所示
BeanDefinition
- BeanDefinition 是spring的一个接口, 指的是bean里的一些信息,比如我这个bean的类型,bean的别名等等。
- BeanDefinitionReader 也是一个抽象类,将各种类型的数据转换为BeanDefinition,如xml,properties
- 如下图所示
bean的生命周期
- spring 会通过反射创建spring-bean
- DefaultListableBeanFactory是spring 默认bean 工厂的实现 (它实现自BeanFactory接口)
beanfactory和factorybean的区别
初始化之设置aware接口属性
- aware 接口感知类
- spring 中存在非常多的实现aware 接口的类 比如 BeanNameAware (用你的bean 实现对应的接口),让你的bean 得到更多的能力,如实现了BeanNameAware 则可以获取到bean的名称。
- 实现其他类也可以获得更多的参数。
PostProcessor(后置增强器)
- 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;
}
}
待续