|
|
@ -2,11 +2,11 @@ BeanFactoryBeanPostProcessor是当BeanDefinition读取完元数据(也就是
|
|
|
|
|
|
|
|
|
|
|
|
抄录并翻译官方的语句
|
|
|
|
抄录并翻译官方的语句
|
|
|
|
|
|
|
|
|
|
|
|
> `BeanFactoryPostProcessor` 操作 bean 的元数据配置. 也就是说,Spring IoC 容器允许 `BeanFactoryPostProcessor` 读取配置元数据, 并可能在容器实例化除 `BeanFactoryPostProcessor` 实例之外的任何bean *之前* 更改它
|
|
|
|
> `BeanFactoryPostProcessor` 操作 bean 的元数据配置. 也就是说,Spring IoC 容器允许 `BeanFactoryPostProcessor` 读取配置元数据, 并可能在容器实例化除 `BeanFactoryPostProcessor` 实例之外的任何 bean _之前_ 更改它
|
|
|
|
|
|
|
|
|
|
|
|
tip:
|
|
|
|
tip:
|
|
|
|
|
|
|
|
|
|
|
|
> 在 `BeanFactoryPostProcessor` (例如使用 `BeanFactory.getBean()`) 中使用这些 bean 的实例虽然在技术上是可行的,但这么来做会将bean过早实例化, 这违反了标准的容器生命周期. 同时也会引发一些副作用,例如绕过 bean 的后置处理.
|
|
|
|
> 在 `BeanFactoryPostProcessor` (例如使用 `BeanFactory.getBean()`) 中使用这些 bean 的实例虽然在技术上是可行的,但这么来做会将 bean 过早实例化, 这违反了标准的容器生命周期. 同时也会引发一些副作用,例如绕过 bean 的后置处理。
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
```java
|
|
|
|
public interface BeanFactoryPostProcessor {
|
|
|
|
public interface BeanFactoryPostProcessor {
|
|
|
@ -23,12 +23,9 @@ public interface BeanFactoryPostProcessor {
|
|
|
|
|
|
|
|
|
|
|
|
ApplicationContext 的 refresh() 中的 invokeBeanFactoryPostProcessors 方法就开始创建我们的 BFPP(BeanFactoryPostProcessor)了
|
|
|
|
ApplicationContext 的 refresh() 中的 invokeBeanFactoryPostProcessors 方法就开始创建我们的 BFPP(BeanFactoryPostProcessor)了
|
|
|
|
|
|
|
|
|
|
|
|
具体执行方法invokeBeanFactoryPostProcessors,虽然一百多行代码,其实只需要特别了解的地方就几处
|
|
|
|
具体执行方法 invokeBeanFactoryPostProcessors,虽然一百多行代码,其实只需要特别了解的地方就几处。
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
```java
|
|
|
|
public static void invokeBeanFactoryPostProcessors(
|
|
|
|
|
|
|
|
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void invokeBeanFactoryPostProcessors(
|
|
|
|
public static void invokeBeanFactoryPostProcessors(
|
|
|
|
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
|
|
|
|
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
|
|
|
|
|
|
|
|
|
|
|
@ -290,7 +287,7 @@ Person(name=李华, address=Address(province=四川, city=成都))
|
|
|
|
|
|
|
|
|
|
|
|
让我们 debug 走一遍
|
|
|
|
让我们 debug 走一遍
|
|
|
|
|
|
|
|
|
|
|
|
如果你已经耐心看完上面的```BeanFactoryPostProcessor执行时期的探究```那么你应该可以知道接下来我们的步骤应该是进入invokeBeanFactoryPostProcessors这个方法里了
|
|
|
|
如果你已经耐心看完上面的`BeanFactoryPostProcessor执行时期的探究`那么你应该可以知道接下来我们的步骤应该是进入 invokeBeanFactoryPostProcessors 这个方法里了
|
|
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
```java
|
|
|
|
private static void invokeBeanFactoryPostProcessors(
|
|
|
|
private static void invokeBeanFactoryPostProcessors(
|
|
|
@ -465,17 +462,4 @@ public Object convertForProperty(@Nullable Object value, String propertyName) th
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
你可以自己可以尝试debug一下,看别人实践真的不如自己动手实践一下,Spring的包装类实属太多,但是可以抓住核心流程进行debug
|
|
|
|
你可以自己可以尝试 debug 一下,看别人实践真的不如自己动手实践一下,Spring 的包装类实属太多,但是可以抓住核心流程进行 debug。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|