Spring注解创建Bean的默认命名规则及字段Bean名称问询
嘿,咱们来拆解一下你的问题——这可是Spring Bean命名规则里超级容易踩的坑!
首先直接给你针对性的解答,再讲清楚完整规则:
你的ClassABC Bean默认名称到底是什么?
这得分两种常见的注解创建Bean的场景来看:
场景1:ClassABC类上标了@Component/@Service/@Repository/@Controller
如果没在注解里指定value(比如@Component("myBean")这种自定义名称的写法),那默认名称按这个规则生成:
- 如果类名的第一个字母大写、第二个字母小写(比如你的
ClassABC),默认名称就是首字母转小写的classABC - 但如果类名前两个字母都是大写(比如
CLASSABC、HTTPHelper),那默认名称就保持原类名不变,不会转小写
那为啥你用classABC拿不到?大概率是第二种场景:
场景2:通过配置类的@Bean方法创建的ClassABC
这种情况Spring的默认规则完全不一样——Bean的默认名称是方法的名字,而不是返回值的类名!
举个例子:
@Configuration public class AppConfig { @Bean public ClassABC getClassABC() { return new ClassABC(); } }
这里的Bean默认名称是getClassABC,而不是classABC!这时候你用类型ClassABC能找到(因为上下文里只有这一个该类型的Bean),但用classABC肯定找不到——这十有八九就是你遇到的问题!
完整的Spring注解Bean默认命名规则
再给你整理全两种核心场景的规则:
1. 类级别注解(@Component及其派生注解)
- 优先使用注解里指定的
value属性值作为Bean名 - 没指定的话,取类的简单名称,再按以下规则处理:
- 若类名首字母大写、第二个字母小写:转首字母为小写(如
UserService→userService) - 若类名前两个字母都大写:保留原类名(如
XMLParser→XMLParser)
- 若类名首字母大写、第二个字母小写:转首字母为小写(如
2. 方法级别注解(@Bean)
- 优先使用注解里指定的
name或value属性值 - 没指定的话,直接用方法的名称作为Bean名
怎么验证你的Bean到底叫啥?
最简单的办法是打印Spring上下文里所有的Bean名称,找到对应ClassABC的那个:
// 假设你能拿到ApplicationContext对象 for (String beanName : applicationContext.getBeanDefinitionNames()) { if (ClassABC.class.isAssignableFrom(applicationContext.getType(beanName))) { System.out.println("ClassABC对应的Bean名称是:" + beanName); } }
跑一下这段代码,就能精准定位问题啦!
内容的提问来源于stack exchange,提问作者DSimkin
相关产品推荐
相关产品推荐

