指定Spring @Autowired的订单

时间:2014-03-31 11:38:50

标签: java spring spring-mvc autowired spring-annotations

我正在使用Spring Framework 4。

我有一个类(比如ClassA),其中使用了另一个类(比如ClassB)。 ClassA的成员变量从ClassB获得价值。 ClassB有一个静态方法,它从属性文件中读取数据。在ClassB中,使用ApplicationContext注释注入静态成员变量@Autowired

我想要的是,我想确保当ClassA使用其成员变量时,它应该使用从属性文件中读取的值进行全部设置。对于该ClassB,所有ApplicationContext都应设置为从MessageSource读取。

由于ClassA被标记为@Component,Spring会加载ClassA,但是当它尝试初始化成员变量时,它会变为NullPointerException,因为ApplicationContext尚未初始化。

所以我的问题是,有没有办法让Spring告诉某些bean应该按照某种顺序或类似的东西进行初始化。我尝试使用@DependsOn注释并将@Bean指定为ApplicationContext的getter方法。但它给出了以下例外:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'applicationContext': Requested bean is currently in creation: Is there an unresolvable circular reference?

关于这个问题的任何想法?

由于

3 个答案:

答案 0 :(得分:3)

感谢您的评论。

我在Spring Framework提供的一个注释中找到了解决方案。

@DependsOn注释的解决方案有效。实际上,当我使用@Bean以上ApplicationContext的getter方法时,它正在解决问题中提到的异常。然后我阅读@DependsOn注释documentation。它声明此注释适用于@Bean和@Component。作为注入ApplicationContext的类,我已将ClassA @DependsOn设为@Component类,其中ApplicationContext正在注入并且有效。

再次感谢您的评论。

答案 1 :(得分:1)

如果您的目的是使用MessageSource,请使用内置支持,如here所述。

一般来说,不要@Autowire个静态字段,请使用@ValuePropertySourcePlaceholderConfigurer作为属性。

答案 2 :(得分:0)

这是@Parth Bhagat提供的解决方案的一个很好的例子。

https://www.baeldung.com/spring-depends-on