Spring更简单的读取Bean对象

目录

前言

一、@Autowried属性注入

二、Setting注入

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

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

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


 

前言

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

一、@Autowried属性注入

接下来我们直接看代码:

Spring更简单的读取Bean对象_第1张图片

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

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

属性注入优缺点分析:

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

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

Spring更简单的读取Bean对象_第2张图片

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

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

二、Setting注入

Spring更简单的读取Bean对象_第3张图片

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

Setting优缺点分析:

优点:

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

缺点:

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

Spring更简单的读取Bean对象_第4张图片

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

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

Spring更简单的读取Bean对象_第5张图片

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

Spring更简单的读取Bean对象_第6张图片 优点:

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

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

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

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

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

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

Spring更简单的读取Bean对象_第7张图片

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

Spring更简单的读取Bean对象_第8张图片

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

Spring更简单的读取Bean对象_第9张图片

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

Spring更简单的读取Bean对象_第10张图片

@Autowired 和 @Resource 的区别:

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

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

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

Spring更简单的读取Bean对象_第11张图片

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

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

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

Spring更简单的读取Bean对象_第12张图片

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

Spring更简单的读取Bean对象_第13张图片

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

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

Spring更简单的读取Bean对象_第14张图片

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

Spring更简单的读取Bean对象_第15张图片

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

Spring更简单的读取Bean对象_第16张图片

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

Spring更简单的读取Bean对象_第17张图片@Resource可以说就是@AUtowired和@Qualifier的结合体,两者是等效的。 

 

你可能感兴趣的:(spring,java,后端)