Spring的开发要点总结
文章目录
- 【JavaEE】Spring的开发要点总结(2)
- 1. 通过类注解的方式存储Bean对象
- 1.1 五大 类注解
- 1.1.1 @Controller 控制器存储
- 1.1.2 @Service 服务存储
- 1.1.3 @Repository 仓库存储
- 1.1.4 @Component 组件存储
- 1.1.5 @Configuration 配置存储
- 1.2 Bean对象的名字
- 1.2.1 注解加参数
- 1.2.2 注解不加参数(默认情况下的名字)
- 1.2.3 其他的注解什么情况
- 2. 通过方法注解@Bean的方式存储Bean对象
- 2.1 创建一个不含类注解的实体类
- 2.2 方法注解的使用规则
- 2.3 Bean对象的名字
- 2.3.1 注解不加参数(默认情况下的名字)
- 2.3.2 注解加参数
- 2.3.3 方法注解重名问题
【JavaEE】Spring的开发要点总结(2)
Spring的开发要点总结(1)博客传送门:【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取_s:103的博客-CSDN博客
在上一篇文章中,可见Bean对象的存储和获取还是有点麻烦,这一篇文章的重点就在于简化这个过程~
- 在JavaEE的学习中,要实现一个功能,要先考虑有没有实现对应功能的一个 注解,在JavaEE进阶中,注解的使用很常见~
- 对于注解,它是可以实现一定业务逻辑的东西
1. 通过类注解的方式存储Bean对象
在配置文件里配置一个组件:
- 没有这个,就内部代码就不知道扫描哪里,从而无法通过类注解存储Bean对象
<?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="com.bit.service"></content:component-scan>
</beans>
beans的属性与原配置的属性也不同哦
这个属性的值的含义就是,扫描的路径
如果不填写
base-package
属性,默认情况下会扫描配置文件所在包及其子包下的组件。但为了避免不必要的不确定性,建议明确指定需要扫描的包路径。你可以在
<context:component-scan>
标签的base-package
属性中指定多个扫描路径。可以使用逗号(,
)或分号(;
)将多个路径分隔开。
- 我填写的是:com.mara.demo~
而扫描路径下,如果加了类注解的类,就会存储一个Bean对象到Spring里
- @Controller
- @Service
- @Repository
- @Component
- @Configuration
这样做不会有一些不必要的开销,因为一个项目的类特别多,没必要每个类都扫描到,每个类都有Bean对象存储到Spring里
1.1 五大 类注解
1.1.1 @Controller 控制器存储
【控制器】,重要作用就是校验参数的合法性(安检系统)
1.1.2 @Service 服务存储
【服务】业务组装(客服中心)
- 就是一些业务逻辑代码,它只是调用一些方法,然后去实现“逻辑”,但是并没有实质去实现那些“持久化数据的操作”
1.1.3 @Repository 仓库存储
【数据持久层】DAO层,实际的业务处理
1.1.4 @Component 组件存储
【组件】工具类层(基础的工具)
1.1.5 @Configuration 配置存储
【配置】配置层
- 在之前的项目开发里也很常见地需要配置一些依赖啥的~
- 配置版本号~
而我们以后做项目也要讲代码进行分类,是这五种中的哪一种,就放到对应的包里,而包里面java类的类注解就是对应功能的类注解
程序的工程分层图:
1.2 Bean对象的名字
Bean对象的类理所当然就是对应的类
那么Bean对象怎么命名呢?
1.2.1 注解加参数
运行结果:
- 获取并使用
- 不获取不使用
可见,配置文件被识别的时候,就会扫描对应的路径,把Bean存储起来~
- 不加注解
- 连名字都不可能有
- 其他的命名方式(value)
结果一样
初步来看,Bean对象的名字可以通过注解后面添加参数来规定
- 并且不能有多个名字
1.2.2 注解不加参数(默认情况下的名字)
(括号加不加都一样)
运行结果:
居然可以,难道是大驼峰变小驼峰就行了?
好像又不是~
改为类名:
又可以了~
我认为是这样的,有一些大驼峰,前两个字母都是大写的情况,有可能是本来就是缩写的形式,变成小驼峰不美观,然后也不能全小写(可能会显示拼写错误)
所以干脆就是类名了~
- 对于不规范的类名
- 小驼峰->小驼峰
总结:
- 第一个字母大写,第二个字母小写,默认名就是小驼峰
- 前两个字母都大写,默认名就是类名
- 小驼峰,则依旧是小驼峰
补充:
- 一个类的类注解生成的Bean对象就一个,因为名字就一个,默认的名字会给的参数被替换~
源代码:shift shift:
- 注解相关的
一路走过去:
- 符合刚才的规则
而这个包就是jdk中的一个,也就是说不上Spring发展而当生的
- 也就是java中的一种命名方式~
1.2.3 其他的注解什么情况
其他的注解的结果都是一样的~
- 目前我们的认知就区分这些注解为,设计代码是为了不同的“初心”吧~
- 其他四个注解都是Component的子类~
2. 通过方法注解@Bean的方式存储Bean对象
2.1 创建一个不含类注解的实体类
在model(实体类 -> 数据库的表的字段的模型)包中,
获得Getter和Setter
生成一个toString方法~
创建一个类,去使用方法注解:
2.2 方法注解的使用规则
- 将当前方法返回的对象存储到 IoC 容器中~
接下来我在这个方法中去填写一些“伪代码”:
- 这边是个伪代码,我们只体现它返回的对象会存储到容器中
- 后续再规范的去写(不使用手动new)
- 我们学完一些基础知识,才能串起来~
2.3 Bean对象的名字
2.3.1 注解不加参数(默认情况下的名字)
在APP类中去测试:
- 猜测:跟类注解的一样?
运行结果:
没找到~
是名字错了吗?
- 不是,是因为通过配置文件,没扫描到那个地方
- 也就是说,在获取Bean对象的时候,并没有获取@Bean下方法返回的对象
因为需要一个“五大类注解”
-
<content:component-scan base-package="com.mara.demo"></content:component-scan>
-
这个的规则就是在指定的目录下扫描带有注解的类
- 之后才能扫描到带@Bean的方法~
- 方法在项目中是特别多的,如果不这样,那肯定开销特别大,性能特别低!
即,@Bean必须配合五大类注解使用
- 五个中的其中一个~
- 这个对象通常是个组件,所以用Component,对应这五个在项目中的定位,现在比较模糊,但是以后就会很明确了,现在不了解以后了解!
运行结果:
- 咋都是默认值呢?
因为注解加在实体类那了,我们获取到的则是类注解方式存储的Bean对象~
我们要在@Bean所在的类进行类注解:
运行结果:
那么这个命名规则就是跟前面的一样吗?
- 并不是,此处的命名规则是:方法名
运行结果:
- 找到Article的类注解存储的Bean对象~
- 找到了~
疑问:那么重载方法咋办?
不能出现重载方法,因为通过方法注解获取的对象,默认都是没有参数列表的,自然无法调用其重载方法,自然就无法存储Bean对象~
2.3.2 注解加参数
对了,无论是哪里,注解中的字符串千万别是空!
- 直接写字符串
- name = “…”
- value = “…”
- value/name = {“…”, “…”, …}
前三种本质是一样的,第四种方式则比较特殊,是一个Bean对象,多个名,而且每个名字指的是同一个对象~
- 字符串数组为空,则代表没填~
- 类注解存储方式是没有第二和第四种方法
在Bean的源代码也能看出来(即使你看不懂,就猜一下):
运行结果:
运行结果:
- 我并没有重写equals和使用equals方法,所以这true就代表引用的指向是一样的!
而用参数去命名的话,原来的默认命名被覆盖~
这种方式 Spring 存储 Bean 的逻辑结构是:
2.3.3 方法注解重名问题
对于类注解的方式,由于就一个类,所以不会重名
但是对于方法注解,就可以有多个方法,返回同一个类的对象,而不同的方法是不同的Bean对象,如果他们重名咋办?
运行结果:
-
而且不是巧合
-
并不会报错~
这是跟加载顺序和权重有关的~
- 加载顺序,可通过@Order去间接定义,@Order参数值小的要更先加载
- 在Spring容器中,如果多个Bean使用相同的名称,后续的Bean定义将会覆盖之前的Bean定义。 这意味着只有最后一个定义的Bean会被存放到容器中,并与该名称关联起来。之前的Bean定义将会被覆盖,并且无法再通过该名称获取到之前的Bean。
- 这个方法适用于不同类的Bean对象
- 不适用于同一个类的Bean对象,这个跟代码顺序有关~
同一个类中:
运行结果:
尽管你在@Bean方法上使用了@Order注解,但最终的加载顺序仍然由Spring容器的实现决定,而不是由@Order注解决定。这意味着无法确保art1()方法必定在art2()方法之前加载。
不同类:
运行结果:
运行结果:
但是,总的来说,重名是不合理的,不要写成这样!
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!代码链接:SpringDemo2/src/main · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)
本文讲解了注解方式存储Bean的方法,是不是更方便了呢?