@Configurable(preConstruction = false)
public class Mock implements IMock
{
@Autowired
private Foo foo;
public Mock()
{
System.out.println("i need foo in the constructor but it is not autowired at this point " + foo);
}
@PostConstruct
public void start()
{
System.out.println("starting");
}
}
当我设置 Spring Aspectj 加载时间编织并通过new
这样的关键字创建一个实例时(如下所示(。事实证明,我无法访问构造函数中的依赖项。一切都如预期的那样好。执行顺序constructor->autowire->postconstruct
。
public class Main
{
public static void main(String[] args)
{
URL url = Main.class.getResource("applicationContext.xml");
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(url.getPath());
Mock mock = new Mock();
}
}
所以我设置了@Configurable(preConstruction = true)
.现在我可以访问构造函数中的依赖项。但问题是执行顺序:autowire->postconstruct->construct
. 为什么后建在建构之前?这不是我所期望的。
我是不是误会了什么?@PostConstruct的语义是什么?是"后构造函数"还是"后依赖注入"?我查看了@PostConstruct的javadoc。它没有说明构造函数。
编辑:顺便说一句,这是我使用的库版本:
弹簧方面 4.1.6.发布
弹簧仪器 4.1.6.发布
@PostConstruct
由CommonAnnotationBeanPostProcessor
在 Spring 中处理,并与所有为给定 Bean 工厂配置并适用于相关 Bean 的 Bean 配置后处理器一起运行(按照它们配置为运行的顺序(。@Configurable
注释只是将 Spring 管理的 bean 标记为有资格通过 Spring 进行自动布线和 bean 后处理,并且它是通过 AnnotationBeanConfigurerAspect
完成的。 preConstruction=true
将发出信号,表明此配置应在运行相关对象的构造函数之前发生。这意味着如果preConstruction=true
,当相关对象的构造函数运行时,Spring 将完成对对象的配置。
TL;DR - 是的,这是在您的情况下应该发生的预期顺序。