Spring Java Config中的加载顺序

时间:2013-05-03 17:27:55

标签: java spring dependency-injection config

我有一个类似于:

的Java Config类
@Configuration
public class MyConfig {

    @Autowired(required = true)
    private MyRegistry registry;

    public CustomAttributeConfig() {
        . . .
    }

    @Bean
    public IBeanApiType someBeanApi() {
       return new SomeBeanApi();
    }

    @PostConstruct
    public void postConstructionCodeHere() {
        registry.register(someBeanApi());
    }
    . . . 

@Autowired@Bean@PostConstruct的执行顺序是否以任何方式得到保证? 如果@Bean使用了@Autowired注册表值,该怎么办?

我在实际代码中看到的执行顺序是:

  1. autowired field
  2. @PostConstruct注释方法
  3. @Bean注释方法
  4. 我的目标是让2和3以相反的顺序执行。如何知道Java Config文件中这些注释的混合顺序以及可用于控制该顺序的选项?

    EDITTED! 考虑到这一点,虽然我对订单感兴趣,但这可能并不重要。我稍微修改了上面的代码,以反映我想从@PostConstruct代码调用@Bean构造函数的事实。

    对于我所做的非常有限的测试,这似乎工作得很好。有没有人知道在调用@PostConstruct时是否保证完成所有必要的Spring初始化,以便调用@Bean注释方法将始终有效?我确实进入了调用并看到了被调用的拦截器,但是我不知道我将返回的代理将始终是“正确”的代理,并且所有顾问,建议等都已正确附加。

2 个答案:

答案 0 :(得分:0)

是的,在使用bean创建方法的当前构造中,Spring将确保此方法返回创建的bean。当然可以确保bean正确初始化

答案 1 :(得分:0)

您可以在SomeBeanApi中使用以下代码而不是MyConfig

   @Autowired(required = true)
    private MyRegistry registry;

   @PostConstruct
    public void postConstructionCodeHere() {
        registry.register(this);
    }