环境是 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
实际上是一个传进方法的变量。
1
kissice 2022-11-16 09:30:04 +08:00 1
看下程序入口处是不是加了下面这个注解,如果是去掉就行了,一般来说程序里有同名不同包的类才会考虑用这个注解
@ComponentScan(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class) |
2
persona5 OP @kissice 感谢提醒,是这个类似的原因。
没注意什么时候 Application 上面的 @ComponentScan 有人指定了一个自定义的 nameGenerator ,然后在里面把 generateBeanName 重写成 definition.getBeanClassName() 了... |
3
duanguyuan 2022-11-17 09:39:14 +08:00 via Android
1 楼经验好丰富,膜拜大佬
|