2014-03-31 57 views
2

我正在使用弹簧框架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?

在这个问题上的任何想法?

感谢

+1

如果您想要从消息源读取属性,应该检出@Value注释并避免注入整个应用程序上下文。每个类应该有最少的依赖关系 – geoand

回答

3

感谢您的意见。

我在Spring框架提供的其中一个注解中找到了解决方案。

解决方案的@DependsOn注释工作。实际上,当我在ApplicationContext的上面使用@Bean getter方法时,它正在触发问题中提到的异常。然后我阅读@DependsOn注释的documentation。它声明这个注解适用于@Bean和@Component。作为ApplicationContext正在被注入的类,我已经做了ClassA @DependsOn@Component类,其中ApplicationContext被注入并且它工作。

再次感谢您的意见。

1

如果你的目的是使用MessageSource,使用内置的支持,为解释here

一般情况下,请勿使用@Autowire静态字段,请使用@ValuePropertySourcePlaceholderConfigurer作为属性。

+0

我试图以链接上提到的方式注入MessageSource。但是它与ApplicationContext的情况相同。 –