簡體   English   中英

將帶注釋的Bean注入常規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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM