近期在写spring项目的时候,需要通过注解的形式去替代之前直接将Bean存放在Spring容器这种方式,以此来简化对于Bean对象的操作,但是这样无法通过准确的Id去获取到相应的Bean对象了 测试观察 首先,如果要将指定的对象
近期在写spring项目的时候,需要通过注解的形式去替代之前直接将Bean存放在Spring容器这种方式,以此来简化对于Bean对象的操作,但是这样无法通过准确的Id去获取到相应的Bean对象了
<content:component-scan base-package="com.spring.demo">content:component-scan>
UserController
类,并且加上了【@Controller】注解,此时Spring在加载的时候就会存储改对象@Controllerpublic class UserController { public void SayHello(){ System.out.println("do SayHello()"); }}
No bean named 'UserController' available
那我首先猜测它的命名就是这样规定的,但是有没有特例呢?
@Controllerpublic class SController { public void SayHello(){ System.out.println("do SayHello()"); }}
通过上面的测试可以看出,Spring对于这个Bean对象的命名转换是存在一定规则的,因为【在Spring中,约定大于俗成】
AnnotationBeanNameGenerator
,翻译一下即为【注释Bean名称生成器】,那我猜测命名规范的代码逻辑可能就在这个类中BeanName
有关联的,首先点击右侧的【结构】我们便可以看到这个类中到底有哪些方法,那一看我们就可以观察到有generateBeanName()
这个方法,点到对应的方法后再进行观察,便发现其最后返回时又去调用了一个方法,于是我继续按住Ctrl键点进去buildDefaultBeanName()
生成默认Bean名称public static String decapitalize(String name) { if (name == null || name.length() == 0) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; } char[] chars = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars);}
java.deskop
包下的一个类,那么我们在查看Spring源码的时候最终还是来到了JDK下,这个可以说明一点:Bean的命名并不是乱取的,而是使用JDK的一个命名标准去进行命名的然后我们就可以去看看JDK中对于命名的规范到底是怎样的💻
最后的话我们来总结一下本次查看源码的收获吧🍚
通过查看Spring的源码我们进入到了JDK中,经过代码的阅读将Bean的命名转换总结了以下两点
在学习Spring框架的过程中,初学者难免会遇到不理解的地方,因为Spring是一个ioc容器,会通过DI依赖注入的形式帮我们自动地去管理对象,所以内部的细节便不得而知,但我们可以通过【阅读源码】的方式来进行理解,去看看大佬是怎么思考的🤔
来源地址:https://blog.csdn.net/Fire_Cloud_1/article/details/131024305
--结束END--
本文标题: 【Spring】透过Spring源码查看Bean的命名转换规则
本文链接: https://lsjlt.com/news/380205.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0