关于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 - 是的,这是您的情况下应该发生的预期顺序。