繁体   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