Spring 中通过 ApplicationContext 获取 service bean 时发现 beanName 突然变成类全限定名?

2022-11-16 09:23:05 +08:00
 persona5

环境是 springboot 2.3.3 ,JDK 11 。

@Slf4j
@Service
public class TestServiceImpl extends ... implements ... {
	...
}

通过 ApplicationContext (或者 hutool 的 SpringUtil 之类的工具类)获取 bean

@Autowired
private ApplicationContext ctx;


Object bean = ctx.getBean("testServiceImpl");

出现异常

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'testServiceImpl' available

按照我的理解,@Service 中我没有指定 beanName ,默认的就应该是 testServiceImpl 吧?并且以前就是这么使用的,没有遇到过问题。

然后尝试通过 Class 获取

// [com.xxx.xxx.service.impl.TestServiceImpl]
String[] arr = ctx.getBeanNamesForType(TestServiceImpl.class);

// {com.xxx.xxx.service.impl.TestServiceImpl = com.xxx.xxx.service.impl.TestServiceImpl@5a48da4f}
Map<String, TestServiceImpl> beansOfType = ctx.getBeansOfType(TestServiceImpl.class);

从日志输出结果来看,beanName 是类的全限定名,随后尝试用 getBean(类的全限定名) 可以获取到 service 。

就算我在 @Service 注解中指定 beanName ,@Service("testServiceImpl"),上面两个的输出也还是类的全限定名。

请问这是什么问题?我的目标是希望能够用 getBean("testServiceImpl") 来获取,testServiceImpl 实际上是一个传进方法的变量。

1269 次点击
所在节点    程序员
3 条回复
kissice
2022-11-16 09:30:04 +08:00
看下程序入口处是不是加了下面这个注解,如果是去掉就行了,一般来说程序里有同名不同包的类才会考虑用这个注解
@ComponentScan(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
persona5
2022-11-16 09:37:24 +08:00
@kissice 感谢提醒,是这个类似的原因。

没注意什么时候 Application 上面的 @ComponentScan 有人指定了一个自定义的 nameGenerator ,然后在里面把 generateBeanName 重写成 definition.getBeanClassName() 了...
duanguyuan
2022-11-17 09:39:14 +08:00
1 楼经验好丰富,膜拜大佬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895579

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX