关于Spring aspectj load time weaving execution order
About Spring aspectj load time weaving execution order
@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在construct之前?那不是我所期望的。
我是不是误会了什么? @PostConstruct 的语义是什么?是 "post constructor" 还是 "post dependency injection"?我查看了@PostConstruct 的javadoc。它没有提到构造函数。
编辑:顺便说一句,这是我使用的库版本:
spring-方面 4.1.6.RELEASE
spring-仪器4.1.6.RELEASE
@PostConstruct
在 Spring 中由 CommonAnnotationBeanPostProcessor
处理并且 运行 连同所有 bean 配置 post-为给定配置的处理器bean 工厂并适用于所讨论的 bean(按照它们配置为 运行 的顺序)。 @Configurable
注释只是标记其他 Spring 托管的 beans 不符合自动装配和 bean post 处理的条件 Spring,这是通过 AnnotationBeanConfigurerAspect
完成的。 preConstruction=true
将表示此配置应该在相关对象的构造函数为 运行 之前发生。这意味着如果 preConstruction=true
,当相关对象的构造函数处于 运行 时,Spring 将完成对象的配置。
TL;DR - 是的,这是您的情况下应该发生的预期顺序。
@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在construct之前?那不是我所期望的。
我是不是误会了什么? @PostConstruct 的语义是什么?是 "post constructor" 还是 "post dependency injection"?我查看了@PostConstruct 的javadoc。它没有提到构造函数。
编辑:顺便说一句,这是我使用的库版本:
spring-方面 4.1.6.RELEASE
spring-仪器4.1.6.RELEASE
@PostConstruct
在 Spring 中由 CommonAnnotationBeanPostProcessor
处理并且 运行 连同所有 bean 配置 post-为给定配置的处理器bean 工厂并适用于所讨论的 bean(按照它们配置为 运行 的顺序)。 @Configurable
注释只是标记其他 Spring 托管的 beans 不符合自动装配和 bean post 处理的条件 Spring,这是通过 AnnotationBeanConfigurerAspect
完成的。 preConstruction=true
将表示此配置应该在相关对象的构造函数为 运行 之前发生。这意味着如果 preConstruction=true
,当相关对象的构造函数处于 运行 时,Spring 将完成对象的配置。
TL;DR - 是的,这是您的情况下应该发生的预期顺序。