前言:
上节课我们简单了解一些Spring非常基础的使用,但是在存储与读取Bean对象这个操作上来看还是有点麻烦滴~~ 我们有更方便的方法去实现存储与读取Bean对象。
1.存储Bean对象
我们要想将Bean对象存储到Spring容器中,要先配置好存储对象的扫描路径,这个环节是非常重要的,如果不配置其扫描路径,就好似上战场不带枪一样。只有配置好所属的包,该包的所有类添加了注解才会被正确识别并存储起来~~
1.1首先第一步需要补充配置
这时候就声明了换句话说告诉了Spring 你要扫描的目标~
1.2 添加注解 存储Bean对象
接上文,在com.bit.service 处创建一个所要存储的类~~我们就称为StudentController具体如下:
接着在Main启动类中 启动程序~~
一个简单存储Bean对象就完成啦~~
我们大体了解这个操作步骤之后,再详细了解一下这几个注解;
其实除了这个五大类注解,还有一种注解可以实现轻松的存储Bean对象~~
1.3 @Bean方法注解
但是启动类还是main还是需要ApplicationContext来实现:
启动类中用User user 因为是我们是将User类存到Spring容器中,而不是UserController类(只是傀儡)。
报错原因有俩:
1.@Bean注解 的名字是 也就是命名规则:是方法名(存储的对象名称是 方法名)
2. @Bean注解 必须搭配五大类注解一起使用。(基于Spring追求性能所致)
但是如果就是取方法名的话 是有些不太优雅~~ 因此@Bean 注解 是提供重命名的操作的:
这里要注意的时候,当我们重命名之后,方法名就不能使用了~~
2.五大类注解
1. @Controller:控制器 这里的意思是验证用户数据的正确性 (可以理解为安保系统,来保证数据的正确性)
2. @Service: 服务 就是编排和调度具体的执行方法(可以理解为客服中心,告诉这个方法要去哪执行等)
3. @Repository: 持久层 这里就是与数据库进行交互的模块了(执行者)
4. @Component: 组件 (工具类)
5. @Configuration(配置存储)
我们先明确一点:这五大类注解 功能上都是相同的~~但是为什么还要这么多的注解呢?
2.1设置多个注解的原因
就好比车牌号 鲁A代表济南 鲁B代表青岛,如果一个省不分个ABC的话,不仅是会浪费更多的号码,而且不能很直观的知道这俩车是哪个地区的,代入到这里也很能了解其缘由,就是为了表明当前的代码是为了啥,了解当前类的用途。
2.2 注解的使用注意事项
1.想用注解 就必须在配置中明确规定你要扫描的路径,换句话说你的类就必须在要扫描的路径下~~如果你的类在包下,但是没加注解还是不行:注解 位置 扫描路径 缺一不可!!
2.如果你在配置声明了扫描路径,一样是可以有bean标签,用最原始的方式来进行存储Bean对象的
3.命名规则
4.五大类注解关系
命明规则问题还得是看看源码找一下答案:
通过研读源码可以明白命名规则:
当name为空直接返回name
当name长度大于1的时候,并且首字母和第二字母都是大写字母的话,直接返回name
否则的话 改为小驼峰(首字母小写)再返回name
五大类注解的关系:
3.读取Bean对象(对象装配)
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊
对象装配(对象注⼊)的实现⽅法以下 3 种:
1. 属性注⼊
2. 构造⽅法注⼊
3. Setter 注⼊
3.1 属性注入
属性注入是最常使用且是最简便的方法实现对象装配的~~
启动类这样实现:
因此其属性注入实际上就一行代码:
@Autowired
private Bean对象的类名 变量名
优点:简单
缺点:1.可能会丢掉单一设计原则 2.没办法实现final修饰的变量注入(把这个改成private final UserService 就完蛋了)3.兼容不好 只能在IoC容器中实现。
3.2 Setter方法
优点:实现了单一设计原则
缺点:1.不能注入不可变对象 2.这个set方法 是可以修改值的
3.3 构造方法实现
优点:1.实现了单一设计原则 2.不可变的对象也可以实现取Bean对象 3.因为是构造方法 所以这个对象的值不会被修改 4.通用性更好
如果当前只有这一个构造方法的时候,这个@Autuwired可以省略~~
题外:为什么final修饰的Bean对象 只有构造方法才可被注入?
这是SE的规定,final修饰变量 只有俩种方式赋值:
1.直接赋值
2.构造方法
这样的基础语法规定才导致这样的事情发生~~
3.4 @Resource
除了@Autowired注解还有这个@Resource注解,从表面来看,并没有什么区别,但是细节还是区别的~~
出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
参数不同:@Resource支持更多的参数设置
@Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊
更多的参数设置体现在 @Resource 有很多参数其中有一个是name 可以将Bean对象进行命名:
(在Spring中找Bean对象有俩种方式:1.通过名称,2.通过类型)
例如以下代码示例:
1.实体类 & 存Bean对象的类:
2.Controller类
因此 在启动类中 执行的时候就会报这种异常(找到了多个User对象)
将这种情况进行总结:
1.@Autowired 先根据类型查找 再根据名称查找。 根据名称查找的时候名称就是在UserController2类里,那个user变量名
2.@Resource 先根据名称查找,再根据类型查找。
将以上代码单纯换上@Resource还是会报错~~
这时候@Resource的参数设置就显现出来作用了
但是在我的程序总是报错,费老鼻子劲终于找到原因:在UserController类里 有@Autowired 把这个注释掉就能正常运行了~~