指定顺序弹簧@Autowired
我正在使用弹簧框架4.指定顺序弹簧@Autowired
我有一个类(说ClassA),其中使用了另一个类(说ClassB)。 ClassA的成员变量从ClassB中获取值。 ClassB具有从属性文件读取数据的静态方法。在ClassB中,已使用@Autowired
注释注入静态成员变量ApplicationContext
。
我想要的是,我想确保当ClassA使用它的成员变量时,它应该获得从属性文件中读取的所有值。并且对于该ClassB应该获得ApplicationContext
全部设置为从MessageSource
读取。因为ClassA标记为@Component
,Spring加载ClassA,但是当它试图初始化成员变量时,它变得NullPointerException
,因为ApplicationContext
尚未初始化。
所以我的问题是,有没有什么办法可以让Spring告诉某些bean应该以某种顺序或类似的方式初始化。我尝试使用@DependsOn
注释并将@Bean
指定为ApplicationContext
的吸气器方法。但它给下面的例外:
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?
在这个问题上的任何想法?
感谢
感谢您的意见。
我在Spring框架提供的其中一个注解中找到了解决方案。
解决方案的@DependsOn
注释工作。实际上,当我在ApplicationContext
的上面使用@Bean getter方法时,它正在触发问题中提到的异常。然后我阅读@DependsOn
注释的documentation。它声明这个注解适用于@Bean和@Component。作为ApplicationContext
正在被注入的类,我已经做了ClassA @DependsOn
@Component
类,其中ApplicationContext
被注入并且它工作。
再次感谢您的意见。
如果你的目的是使用MessageSource
,使用内置的支持,为解释here。
一般情况下,请勿使用@Autowire
静态字段,请使用@Value
和PropertySourcePlaceholderConfigurer
作为属性。
我试图以链接上提到的方式注入MessageSource。但是它与ApplicationContext的情况相同。 –
如果您想要从消息源读取属性,应该检出@Value注释并避免注入整个应用程序上下文。每个类应该有最少的依赖关系 – geoand