@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的语义是什么?它是" post constructor"或者"发布依赖注入"?我检查了@PostConstruct的javadoc。它没有说明构造函数。
编辑:顺便说一下,这是我使用的库版本:
spring-aspects 4.1.6.RELEASE
spring-instrument 4.1.6.RELEASE
答案 0 :(得分:1)
@PostConstruct
在Spring中由CommonAnnotationBeanPostProcessor
处理,并与为给定bean工厂配置并适用于所讨论的bean的所有bean配置后处理器一起运行(按顺序排列)配置为运行)。 @Configurable
注释只标记Spring管理的bean没有资格进行Spring的自动装配和bean后处理,而是通过AnnotationBeanConfigurerAspect
完成的。 preConstruction=true
将表示此配置应在运行相关对象的构造函数之前发生。这意味着如果preConstruction=true
,在运行相关对象的构造函数时,Spring将完成对象的配置。
TL; DR - 是的,这是您的情况下应该发生的预期命令。