构造函数DI如何使用AutowiredAnnotationBeanPostProcessor?

时间:2016-02-16 19:05:15

标签: spring annotations

根据Spring Framework JavaDoc,BeanPostProcessor是:

  

允许自定义修改新bean实例的工厂挂钩

Spring是否使用反射通过preInstantiateSingletons实例化非延迟单例bean,然后AutowiredAnnotationBeanPostProcessor使用反射来设置在构造函数上定义@Autowired的字段(例如最终字段) (和二传手/字段)?

如果是这样,是否可以编写在BeanPostProcessor之前处理的自定义AutowiredAnnotationBeanPostProcessor来验证此行为?我尝试使用自定义BeanPostProcessor通过实施PriorityOrdered执行此操作,如下所示:

@Override
public int getOrder() {
    return Ordered.LOWEST_PRECEDENCE;
}

注意:但是,当调用postProcessBeforeInitialization时,bean似乎已经通过@Autowired设置了字段。

1 个答案:

答案 0 :(得分:1)

查看 AbstractAutowireCapableBeanFactory.doCreateBean 。 基本上有三个步骤。

  1. createBeanInstance 构造bean对象
  2. populateBean 自动连接的bean属性值
  3. initializeBean fire BeanPostProcessor
  4. 所以 BeanPostProcessor 太迟了。但是看看 populateBean ,你会发现 InstantiationAwareBeanPostProcessor 将在autowired属性之前执行。 所以你可以为你创建 InstantiationAwareBeanPostProcessor 的bean类型。

    完整示例

    IFERROR