Spring更简单的读取Bean对象

目录

前言

一、@Autowried属性注入

二、Setting注入

三、构造方法注入(spring官方推荐)

四、@Resource:另⼀种注⼊关键字

五、多个同类型的对象注入到容器中使用依赖注入如何正确获取?


 

前言

        本篇博客接上一篇博客,上一篇博客主要介绍了使用五大类注解及@Bean方法注解来实现更简单的存储Bean对象,这一篇博客就来介绍一下使用三大依赖注入:属性注入@Autowried,Setting注入,以及构造方法注入以及这三大依赖注入的优缺点分析。

一、@Autowried属性注入

接下来我们直接看代码:

103e57aac930473e81b0bc7b569251a7.png

        通过上面的代码,我们可以看出,使用属性注入我们这里的名字是随便写的,也可以获取到对象,提到这个名字随便写,就不得不提到@Autowired的依赖注入流程:@Autowired首先是根据有类型来获取对象的,如果只获取到一个对象,那么就直接将此对象注入到当前的属性上;如果获取到多个对象,就根据名字来进行匹配获取。因此,我们上面的对象是只注入一个的,所以名字随便起都可以,反之,如果注入多个对象,那就还是会根据名字来获取对象的了。

至于要如何给要获取的对象设置名字我们后面再介绍。

属性注入优缺点分析:

优点:①使用非常简单方便,只要加上@Autowired注解就可以。

缺点:①功能性:无法注入一个不可变对象(final修饰的):

e1b0dbe2f6e54270beaee0c87ec9e07e.png

②通用性:只适用于IoC容器,如何来理解只适用于IoC容器?这个属性注入,如果在容器中是没有这个对象的,那么就无法正确获取,我们也没办法通过别的方法为这个对象赋值了,所以只适用于IoC容器。

③设计原则问题:更容易违背单一设计原则。

二、Setting注入

0a982d876b7a4074827a5e4aba533050.png

        setting注入类似于我们以前使用的set方法,也是通过参数为对象进行赋值的。区别就在于必须要加@Autowired,不然是无法注入的。

Setting优缺点分析:

优点:

①符合单一设计原则,因为set方法一般都是只传递一个参数的,不会传递多个参数,所以符合单一设计原则。

缺点:

①Setter注入依旧是无法解决注入不可变对象的(final修饰的对象)

966ed8791a694ccd8f2b4c0e55b5f00f.png

Setter 注入提供了 setXXX 的方法,意味着你可以在任何时候、在任何地方,通过调用 set 的方法来改变注入对象,所以 Setter 注入的问题是,被注入的对象可能随时被修改

三、构造方法注入(spring官方推荐)

a8c0fd7bf84246e58bd9d3bd5ffcfef5.png

构造方法注入当当前的类中只有一个构造方法,那么 @Autowired 也可以省略不写。如下所示:

abefeef7d17f45c5aac31816c4661889.png 优点:

①可注入不可变对象,这个明显是比属性注入和setting注入要好的一点的;

②注入对象不会被修改;因为构造方法只会在类初始化时调用一遍,因此不会被修改;

③注入对象会被完全初始化,因为依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化,

④通用性更好,构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。

四、@Resource:另⼀种注⼊关键字

有的人在使用@Resource发现并没有@Resource可以使用,这一般是JDK版本的问题,要解决这个问题就得去中央仓库引入相应的依赖即可:(我选的是1.3版本的) 

8747e1e8353e4042ae3a18fce0902f97.png

@Resource用在属性注入是可以的: 

4da663e603a94132be18d59e0172aef0.png

@Resource用在Setting注入也是可以的:

dcf18900b371489a83b0e9840841cfad.png

@Resource不能用于构造方法注入:

9a575bb1af6c4fa2a1b4e8192bed4119.png

@Autowired 和 @Resource 的区别:

出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解; 

使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。如下图所示:

@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊。

88ffbc6b65314dd28549b94a99729cc6.png

五、多个同类型的对象注入到容器中使用依赖注入如何正确获取?

        在上面的代码中,我们同一个类型的对象都只注入了一个,所以根据类型就能获取,但是如果有多个对象那就会根据名字来获取,那么我们该如何设置才能让他根据我们设置的名字来获取呢?接下来我们就来通过代码来介绍一下。

首先,我们在容器中注入以下两个同类型的对象:

e5cb8b04409142f39201f04d7d050fab.png

 使用@Autowired属性注入直接获取:

d42ed2da63d1423cba0e7ebe066cb5ac.png

我们可以看到,容器中有两个对象,一个叫teacher1,一个叫teacher2,但是我们的名字却叫teacher,所以这里获取不到对象,因此直接报错了。 所以这里我们只需要设置正确的名字就可以。具体如何设置这个名字,这里我们有两种解决方案:

第一种 :直接修改依赖注入的对象的名称

42320e1da6da4a478f36baf7639c2ff5.png

 第二种:使用@Qualifier为依赖注入的对象设置名字

ef07cdc3de7f46cf99c2ac628894a4e9.png

第三种:使用@Resource设置要获取对象的名称

0f3bfb51187d45caace0fd71fc6bb075.png

当对象有多个时,依旧是报同样的错误,当使用@Resource我们只需要直接在它本身上为name属性进行赋值即可,如下所示:

271aa77a60c74055b07e04b4a207de4e.png@Resource可以说就是@AUtowired和@Qualifier的结合体,两者是等效的。 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值