繁体   English   中英

Spring 3.2:无法将 @Service 注释 bean 自动装配到 @Bean 注释 bean - 发生 BeanNotFoundException

[英]Spring 3.2: Cannot autowire @Service annotated bean into a @Bean annotated bean - BeanNotFoundException occurring

我不想在这里问一个问题,但我在 Stack Overflow 上查看了 20 多个其他类似问题,但似乎没有一个是完全相同的场景!

我有一个@Service注解豆(Service1.java),我正在尝试自动装配到其他服务(Service2.java) -问题是,客服2@Bean注释,而不是@Service注解,因为得到的子类实例化可以根据特定的数据库配置而改变。 下面是相关代码:

应用程序配置文件

@Configuration
public class ApplicationConfig {

    @Bean
    public Service2 service2() throws Exception {
        String className = Config.getString("service2.class");
        return (Service2) Class.forName(className).newInstance();
    }
}

服务1.java

@Service
public class Service1 {
    ....
}

服务2.java

public class Service2 {
    private @Autowired Service1 service1;
    ...
}

有趣的是,将Service1自动装配到另一个带@Service注释的 bean ( Service3.java ) 工作得很好,所以我知道 bean 初始化正常。 例如

服务3.java

@Service
public class Service3 {
    private @Autowired Service1 service1;
}

任何人都可以在这里看到任何明显的东西吗? 不幸的是,我们混合了 XML 和基于注解的 bean 实例(尝试移动到注解是一个缓慢的过程,因为我们仍然在 Spring 3.2 上!),因此组件扫描等是在 XML 上下文文件中完成的。

有趣的是,试图调试的情况时,我打印出来在设置应用程序上下文的点初始化春豆的列表,然后在加载Web应用程序的登陆页面(后当然客服2注释掉服务1的自动装配),而@Service注释的bean 只出现在后一个列表中。 那么这是否意味着我的问题是@Service注释的 bean 总是在@Bean注释的 bean 之后初始化,因此为什么我在启动时得到我的异常? 以下是完整性的例外:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.eo3.eo3app.spring3.util.Service1] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

如果我需要添加任何其他详细信息,请告诉我。 我显然希望能够使用@Service注释来注释我的所有服务类,但不知道如何在每次启动应用程序时返回的子类可能不同的情况下执行此操作(例如Service2.service )。爪哇)。

我差点忘了提,自动装配实际工作时,我改变了Service1.java从一个@Service注解bean来初始化它作为一个@Bean注释豆就像Service2.java。

首先十分感谢!

您的情况的问题是使用 Class.forName 加载和实例化服务对象。 在这种情况下,自动装配功能将不起作用,因为它不是由 Spring 应用程序上下文实例化的。 您需要使用以下代码手动自动装配。

@Configuration
public class ApplicationConfig {

    @Bean
    public Service2 service2(ApplicationContext applicationContext) throws Exception {
        String className = Config.getString("service2.class");
        Service2 service2Impl = (Service2) Class.forName(className).newInstance();

        applicationContext.getAutowireCapableBeanFactory().autowireBean(service2Impl);

        return service2Impl;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM