![](/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.