我不想在这里问一个问题,但是我已经研究了Stack Overflow上的20多个其他类似问题,而且似乎都不是完全相同的情况!
我有一个@ Service带注释的bean(Service1.java),我试图将其自动装配到另一个服务(Service2.java)中-问题是Service2用@ Bean批注而不是@@ Service批注进行注释,因为实例化的子类可以根据特定的数据库配置进行更改。这是相关代码:
ApplicationConfig.java
@Configuration
public class ApplicationConfig {
@Bean
public Service2 service2() throws Exception {
String className = Config.getString("service2.class");
return (Service2) Class.forName(className).newInstance();
}
}
Service1.java
@Service
public class Service1 {
....
}
Service2.java
public class Service2 {
private @Autowired Service1 service1;
...
}
有趣的是,将Service1自动装配到另一个带有[[@Service批注的bean(Service3.java)中,可以正常工作,所以我知道bean可以初始化了。例如:
Service3.java
@Service
public class Service3 {
private @Autowired Service1 service1;
}
有人在这里看到明显的东西吗?不幸的是,我们混合了基于XML和基于注释的bean实例化(尝试迁移到注释是一个缓慢的过程,因为我们仍然在Spring 3.2上!),因此组件扫描等操作都是在XML上下文文件中完成的。(当然是Service2),而@ Service注释的bean仅出现在后面的列表中。那么这是否意味着我的问题是,在[[@Bean带注释的Bean之后总是对@ Service带注释的Bean进行初始化,因此为什么在启动时会出现异常?完整性例外:有趣的是,当尝试调试这种情况时,我打印出了在设置应用程序上下文时初始化的Spring bean列表,然后在加载Web应用程序的登录页面时(注释掉
Service1
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.java
)。我几乎忘了提到,当我将Service1.java从成为[[@Service带注释的bean更改为初始化为@@ Bean带注释的bean时,自动装配实际上就起作用了,就像 Service2.java。
非常感谢!