Spring,XML bean在app启动时调用Annotation bean

时间:2012-04-27 16:00:41

标签: spring annotations

我有一个带有一些方法的Annotation bean。它工作正常。

public @Controller("adminController") class AdminController {

...
private @Autowired AdminDAO adminDAO;

public void resetTemporalList() {

    System.out.println("HE SIDO EJECUTADO.");

    this.adminDAO.resetTemporalRegisters();
}

...

}

现在,我正在整合一个石英任务。但是我使用调用previus注释bean的XML定义bean加载它。

<bean id="resetTemporalRegisters" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="adminController" />
    <property name="targetMethod" value="resetTemporalList" />
    <property name="concurrent" value="false" />
</bean>

Whan我开始我的应用程序出现下一个错误。

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'adminController'的bean

我认为问题是Spring首先加载XML bean,在Annotation bean之后,然后在这一刻“adminController”bean不能退出...

我该如何解决?

解决了它!!

问题在于我将xml bean定义放在applicationContext.xml中。

2 个答案:

答案 0 :(得分:0)

不,XML和注释集成得很好,但您实际上是否在XML中有组件扫描代码?

<context:component-scan base-package="com.yourcompany.yourapp"/>

请参阅:4.10 Classpath scanning and managed components

答案 1 :(得分:0)

一点点猜测:你的控制器是在Spring MVC创建的子应用程序上下文中定义的,而你resetTemporalRegisters在主应用程序上下文(父)中作业。子上下文可以从父上下文访问bean,但不能反过来。

这提出了一个重要的问题:为什么你的业务逻辑试图调用控制器的方法?这些方法应该只被称为MVC框架。你不能只打电话

this.adminDAO.resetTemporalRegisters();

直接从你的工作?

<bean id="resetTemporalRegisters" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject" ref="adminDAO" />
  <property name="targetMethod" value="resetTemporalRegisters" />
  <property name="concurrent" value="false" />
</bean>

adminDAO可能在父上下文中定义,因此您可以轻松访问它。