关于 Spring 的创建及简单的使用
可以参考这篇文章
🔎Spring—存储Bean
之前的存储方式是利用<bean id="" class=""></bean>
进行存储
但这种方式存在一个弊端
即需要存储的 Bean 过多时, 手动添加过于繁琐
利用注解可以有效规避这种情况
- 添加注解存储 Bean
- 类注解
- @Controller: 控制器存储
- @Service: 服务存储
- @Repository: 仓库存储
- @Component: 组件存储
- @Configuration: 配置存储
- 方法注解
- @Bean: 对象存储(需搭配类注解一同使用)
配置扫描路径
添加如下代码至xml
文件中
<content:component-scan base-package=""></content:component-scan>
base-package=""
引号中填写的是扫描路径
完整代码
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <content:component-scan base-package=""></content:component-scan> </beans>
如图
base-package="com.demo"
扫描路径为com
包下的demo
包下的全部
所有的类都写在 Java 根路径下, 没有目录, 该如何存储 / 获取 Bean🍭
(了解即可, 通常不会这么做)
base-package="**"
将扫描路径更改为根目录下的全部
*
表示根目录
**
表示根目录下的全部
利用类注解进行存储
在 Spring Core 中, 类注解之间的区别不大
添加注解存储Bean
添加 @Controller 注解存储 Bean
获取 Bean
添加 @Service 注解存储 Bean
获取 Bean
添加 @Repository 注解存储 Bean
获取 Bean
添加 @Component 注解存储 Bean
获取 Bean
添加 @Configuration 注解存储 Bean
获取 Bean
关于Id
通过添加注解的方式存储 Bean, 获取 Bean 时的 Id 该如何命名🍭
- 当类名为标准驼峰命名时, 将类名的首字母小写, 其余字母不变
- (例如类名为
UserInfo
, 其对应的Id
为userInfo
)
- 当类名的首字母为小写时, 不做改变
- (例如类名为
userInfo
, 其对应的Id
为userInfo
)
- 当类名的首字母和第二个字母均为大写, 不做改变
- (例如类名为
UInfo
, 其对应的Id
为UInfo
)
源码分析🍭
- AnnotationBeanNameGenerator
- Annotation, 注解
- BeanName, 对象名
- Generator, 生成
- Annotation BeanName Generator, 生成对象名注解
找到AnnotationBeanNameGenerator
的generateBeanName()
点击buildDefaultBeanName()
点击buildDefaultBeanName()
点击decapitalize()
找到最终的调用方法
分析这段代码
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); }
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; }
如果长度 > 1 且第 1 个字符与第 0 个字符均是大写, 返回该字符串
(当类名的首字母和第二个字母均为大写, 不做改变)
chars[0] = Character.toLowerCase(chars[0]);
将第 0 个字符变为小写
(当类名为标准驼峰命名时, 将类名的首字母小写, 其余字母不变)
(当类名的首字母为小写时, 不做改变)
为什么需要五个类注解
既然都可以通过添加类注解的方式存储 Bean
那为何还需要五个类注解呢?
- 通过类注解可以了解当前类的用途
- 具体的功能存在差异
举个栗子🌰
通过车牌可以了解是哪里的车🚗, 例如 京 → 北京, 津 → 天津
(通过类注解可以了解当前类的用途)
类注解的用途🍭
- @Controller(控制器), 归属于业务逻辑层, 用于校验用户参数的有效性(控制用户的行为)
- @Service(服务), 归属于服务层, 调用持久化类实现相应的功能(不直接与数据库交互, 类似于控制中心)
- @Repository(仓库), 归属于持久层, 直接与数据库交互(通常一张表对应一个 @Repository)
- @Configuration(配置), 归属于配置层, 用于配置当前项目的一些信息
- @Component(组件), 归属于公共工具类, 提供某些公共方法
举个栗子🌰
滑稽老哥家中失窃, 选择报警
接警员判断情况是否属实, 避免小孩子的恶作剧
(@Controller)
警局根据接警员的信息派出一些警察负责跟进
(@Service)
出警的警察负责这一起案件
(@Repository)