春季,XML bean 在应用程序启动时调用注释 bean



我有一个带有一些方法的注释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>

我启动我的应用程序出现下一个错误。

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:未定义名为"adminController"的 bean

我认为问题是 Spring 首先加载 XML 豆,然后加载注释豆,然后在这一刻"管理员控制器"bean 不退出......

我该如何解决它?

解决了!!

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

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

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

请参见: 4.10 类路径扫描和托管组件

一点猜测:你的控制器是在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可能是在父上下文中定义的,因此您可以轻松访问它。

最新更新