![](/img/trans.png)
[英]Injecting Collection of Interface Type into Method Annotated with @Bean
[英]Injecting Annotated Bean into Regular Bean
AppContext.xml
<bean id="myBean" class="com.myapp.MyClass">
<property ref="myService"/>
</bean>
MyService.java
@Service
public class MyService {
...
}
这将引发异常,表明无法为属性“ myService”找到任何bean,据我所知,因为在上下文文件中找不到该bean,但是我可以将该字段自动连接到其他spring受管bean中,但是我需要显式在我的上下文中构建Bean,因为POJO在我的项目范围内不可编辑。
假设您已经在使用组件类路径扫描,那么可以为组件指定一个明确的名称,而不是让Spring为您自动生成一个名称:
@Service("myService")
public class MyService {
...
}
我尚未对此进行测试,但我相信情况确实如此。
编辑 :经过一番挖掘,可以在AnnotationBeanNameGenerator.generateBeanName()
找到确定bean名称的逻辑:
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
if (definition instanceof AnnotatedBeanDefinition) {
String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
if (StringUtils.hasText(beanName)) {
// Explicit bean name found.
return beanName;
}
}
// Fallback: generate a unique default bean name.
return buildDefaultBeanName(definition);
}
换句话说,它尝试从注解中获得一个明确的bean名称,如果失败,它将使用默认值:
protected String buildDefaultBeanName(BeanDefinition definition) {
String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
return Introspector.decapitalize(shortClassName);
}
因此,是的,对于一个名为MyService
的带注释的类,自动生成的Bean名称确实应为myService
,因此您的代码应该可以使用。
出于好奇,当您使用@Component
而不是@Service
时会发生什么?
如果有的话,这应该可以工作
<context:component-scan base-package="your.root.package" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.