我正在使用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?
关于这个问题的任何想法?
由于
答案 0 :(得分:3)
感谢您的评论。
我在Spring Framework提供的一个注释中找到了解决方案。
@DependsOn
注释的解决方案有效。实际上,当我使用@Bean以上ApplicationContext
的getter方法时,它正在解决问题中提到的异常。然后我阅读@DependsOn
注释documentation。它声明此注释适用于@Bean和@Component。作为注入ApplicationContext
的类,我已将ClassA @DependsOn
设为@Component
类,其中ApplicationContext
正在注入并且有效。
再次感谢您的评论。
答案 1 :(得分:1)
如果您的目的是使用MessageSource
,请使用内置支持,如here所述。
一般来说,不要@Autowire
个静态字段,请使用@Value
和PropertySourcePlaceholderConfigurer
作为属性。
答案 2 :(得分:0)
这是@Parth Bhagat提供的解决方案的一个很好的例子。