|
|
|
@ -15,16 +15,16 @@ public interface BeanPostProcessor {
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
共有两种方式实现
|
|
|
|
|
共有两种方式实现:
|
|
|
|
|
|
|
|
|
|
- 实现BeanPostProcessor 接口,然后将此类注册到Spring即可
|
|
|
|
|
- 第二种是通过`ConfigurableBeanFactory` 的 addBeanPostProcessor方法进行注册.
|
|
|
|
|
- 实现 BeanPostProcessor 接口,然后将此类注册到 Spring 即可;
|
|
|
|
|
- 第二种是通过`ConfigurableBeanFactory` 的 addBeanPostProcessor 方法进行注册。
|
|
|
|
|
|
|
|
|
|
BeanPostProcess可以有多个,并且可以通过设置 order 属性来控制这些 BeanPostProcessor实例的执行顺序. 仅当 BeanPostProcessor 实现 Ordered 接口时,才能设置此属性,或者PriorityOrdered接口
|
|
|
|
|
BeanPostProcess 可以有多个,并且可以通过设置 order 属性来控制这些 BeanPostProcessor 实例的执行顺序。 仅当 BeanPostProcessor 实现 Ordered 接口时,才能设置此属性,或者 PriorityOrdered 接口。
|
|
|
|
|
|
|
|
|
|
如果某个类实现了BeanPostProcessor则它会在AbstractApplicationContext中的 registerBeanPostProcessors(beanFactory)方法中创建bean而不是和普通的bean一样在finishBeanFactoryInitialization(beanFactory)中才被创建
|
|
|
|
|
如果某个类实现了 BeanPostProcessor 则它会在 AbstractApplicationContext 中的 registerBeanPostProcessors(beanFactory)方法中创建 bean 而不是和普通的 bean 一样在 finishBeanFactoryInitialization(beanFactory)中才被创建。
|
|
|
|
|
|
|
|
|
|
当我们注册BeanPostProcessor的时候,其中我省略了大部分无关代码。
|
|
|
|
|
当我们注册 BeanPostProcessor 的时候,其中我省略了大部分无关代码:
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
public static void registerBeanPostProcessors(
|
|
|
|
@ -73,7 +73,7 @@ public static void registerBeanPostProcessors(
|
|
|
|
|
|
|
|
|
|
在此我举例一个典型的例子 AutowiredAnnotationBeanPostProcessor,是 BeanPostProcessor 的一个子类,是@Autowired 和@Value 的具体实现,其他的子类你也可以按如下的流程自行走一边,注意我的例子只是一个最为简单的例子,也就是用@Autowired 注入了一个普通的字段对象
|
|
|
|
|
|
|
|
|
|
我们看看AutowiredAnnotationBeanPostProcessor类,当然也是省略大部分代码
|
|
|
|
|
我们看看 AutowiredAnnotationBeanPostProcessor 类,当然也是省略大部分代码:
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
// 这个类可以看见当我们创建AutowiredAnnotationBeanPostProcessor对象的时候完成了一个工作就是给
|
|
|
|
@ -109,7 +109,7 @@ public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, Str
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
BeanPostProcessor的职责是在bean初始化后进行实例的更改,所以我们在普通bean实例化的时候就可以看见它的身影 AbstractAutowireCapableBeanFactory中的populateBean就是给bean属性填充值,同样我们省略大部分代码
|
|
|
|
|
BeanPostProcessor 的职责是在 bean 初始化后进行实例的更改,所以我们在普通 bean 实例化的时候就可以看见它的身影 AbstractAutowireCapableBeanFactory 中的 populateBean 就是给 bean 属性填充值,同样我们省略大部分代码:
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
|
|
|
|
@ -140,4 +140,4 @@ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable B
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
至此当前的bean就实现了@Autowired的字段注入,当然看似过程简单,但是是省略了大部分,里面细节多如牛毛。
|
|
|
|
|
至此当前的 bean 就实现了@Autowired 的字段注入,整个过程看似简单,但却有诸多细节。
|
|
|
|
|