Spring3的@Configuration不能@Inject组件扫描的bean

时间:2011-04-16 01:37:41

标签: spring configuration dependency-injection spring-3

这是我的app.xml:

<context:component-scan base-package="destiny.web" />
<context:annotation-config/>

在destiny.web包中有一个Dao(接口)和DaoImpl(注释为@Repository)。

还有另一个Spring3的destiny.web.AppConfig类:

@Configuration
public class AppConfig
{
  @Inject
  private Dao daoImpl

  public AppConfig()
  {
    System.out.println("dao = " + daoImpl);
  }
}

打印'null',为什么?

我确信所有这些bean /配置/存储库都会被扫描。但似乎@Configuration不知道其他扫描的bean。我错过了什么吗?

我尝试通过@ImportResource解决它:

@Configuration
@ImportResource("classpath:app.xml")
public class AppConfig

但它似乎导致了循环bean扫描并抛出了这个异常:

{main} org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Only one AsyncAnnotationBeanPostProcessor may exist within the context.
Offending resource: class path resource [app.xml]

如何解决?

感谢。

2 个答案:

答案 0 :(得分:1)

Spring将invoke constructor firstly before inject / autowiring另一个组件。因此,当您在构造函数中打印时,您的dao为null,因为dao still not injected yet

尝试为您的configapp创建测试应用程序。

public class Main {
    public static void main(String[] args) {
        ApplicationContext context =
            new ClassPathXmlApplicationContext("stackoverflow.xml");

        AppConfig appConfig = context.getBean(AppConfig.class);
        appConfig.getConfig("smtp.host");
    }
}

答案 1 :(得分:0)

您是否也使用注释@Autowired代替@Inject

进行了尝试