Spring:更简单的存储与读取Bean对象

前言:

        上节课我们简单了解一些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 把这个注释掉就能正常运行了~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值