gpt4 book ai didi

java - 将带注释的 Bean 注入(inject)常规 Bean

转载 作者:行者123 更新时间:2023-11-30 07:36:58 25 4
gpt4 key购买 nike

AppContext.xml

<bean id="myBean" class="com.myapp.MyClass">
<property ref="myService"/>
</bean>

我的服务.java

@Service
public class MyService {
...
}

这将抛出一个异常,说明找不到属性“myService”的 bean,我理解这是因为在上下文文件中找不到它,但我可以在其他 spring 管理的 bean 中 Autowiring 该字段,但我需要在我的上下文中显式构建 bean,因为 POJO 在我的项目范围内不可编辑。

最佳答案

假设您已经在使用组件类路径扫描,那么您可以为组件指定一个显式名称,而不是让 Spring 自动为您生成一个名称:

@Service("myService")
public class MyService {
...
}

我还没有测试过,但我相信是这样的。


编辑:经过一些挖掘,确定 bean 名称的逻辑在 AnnotationBeanNameGenerator.generateBeanName() 中找到。

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 时会发生什么?

关于java - 将带注释的 Bean 注入(inject)常规 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com