关于弹簧方面加载时间编织执行顺序


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

最新更新