4

我有一个类似于以下内容的 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. 自动连线字段
  2. @PostConstruct 注释方法
  3. @Bean 注解的方法

我的目标是让 2 和 3 以相反的顺序执行。我如何知道这些注释在 Java Config 文件中的混合顺序以及哪些选项可用于控制该顺序?

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

这似乎适用于我所做的非常有限的测试。有谁知道在调用 @PostConstruct 时是否保证所有必要的 Spring 初始化都完成,这样调用 @Bean 注释的方法将始终有效?我确实进入了调用并看到拦截器被调用,但我不知道我将得到的代理将永远是“正确的”代理,所有顾问、建议等都正确附加。

4

2 回答 2

0

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

于 2014-12-01T22:11:57.990 回答
0

您可以在 SomeBeanApi 而不是 MyConfig 中包含以下代码

   @Autowired(required = true)
    private MyRegistry registry;

   @PostConstruct
    public void postConstructionCodeHere() {
        registry.register(this);
    }
于 2015-12-10T02:55:56.857 回答