关于Spring aspectj加载时间编织执行顺序

时间:2018-02-02 02:20:02

标签: java spring aspectj

@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

1 个答案:

答案 0 :(得分:1)

@PostConstruct在Spring中由CommonAnnotationBeanPostProcessor处理,并与为给定bean工厂配置并适用于所讨论的bean的所有bean配置后处理器一起运行(按顺序排列)配置为运行)。 @Configurable注释只标记Spring管理的bean没有资格进行Spring的自动装配和bean后处理,而是通过AnnotationBeanConfigurerAspect完成的。 preConstruction=true将表示此配置应在运行相关对象的构造函数之前发生。这意味着如果preConstruction=true,在运行相关对象的构造函数时,Spring将完成对象的配置。

TL; DR - 是的,这是您的情况下应该发生的预期命令。