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