如有不同意见,请留言。
我将尽力做到准确、全面,并将在我的一生中不断修改、补充和更新它。
目录
1 依赖注入概述
依赖注入,英文名为 ,缩写为DI。
DI 和 IoC(IoC 容器详解)含义是一样的,从两个角度描述同一个概念自动友情链接,做的事情也是一样。
当一个 Java 实例需要另一个 Java 实例时,被调用者实例由调用者创建(使用 new 关键字获取被调用者实例)后再使用。使用框架之后,被调用者实例不再由调用者创建,而是由 IoC 容器创建。这就叫控制反转,简称 IoC。
当 IoC 容器创建被调用者的实例时,会自动将调用者需要的对象实例注入到调用者中,这样调用者就通过 IoC 容器获取到被调用者的实例,这就叫依赖注入,简称 DI。
Bean的依赖注入,或者说Bean的组装有多种形式,比如接下来要介绍的基于XML的依赖注入(有两种实现方式:设置注入和构造函数注入)、基于依赖注入、基于自动组装、基于静态工厂依赖注入和基于实例工厂依赖注入。
2 依赖注入的多种方式(Bean组装方法) 2.1 基于XML的依赖注入 2.1.1 (设置方法注入)
设置方法注入又叫方法注入,是最简单的注入方式。
意思是IoC容器通过方法注入来注入依赖实例,通过调用无参构造函数或者无参工厂方法实例化一个bean之后,再调用该bean的方法就可以实现基于DI。
案例练习,出发啦!
目的:通过接口的实现类中的方法初始化的对象。
具体步骤如下:
步骤1:在com..包下创建一个接口。如下图所示:
第二步:在com..包下创建该接口的实现类,在类中声明一个变量,但是不初始化,这里需要一个方法(这个方法是IoC容器的注入入口,相当于IoC容器调用方法初始化变量),如下图所示:
步骤3:在.xml配置文件中添加配置信息。
标签中name属性值为()方法(也叫依赖)的参数;ref属性值为Bean的名称或者id值。添加内容如下所示:
步骤4:编写测试类并使用JUnit运行。在com..test包下的类中创建一个test2()方法,如下所示:
从上图可以看出,使用IoC容器获取到实例之后,会调用该实例的()方法,而在该方法中又调用了接口的实现类中的save()方法(对象是由IoC容器自动调用该方法注入的,本例中该方法就是()方法)。
2.1.2 (构造函数注入)
指 IoC 容器使用构造函数注入依赖实例。基于构造函数的 DI 是通过调用带参数的构造函数来实现的(本文介绍带参数的构造函数)。每个参数代表一个依赖项。容器会根据 bean 中指定的构造函数参数决定调用哪个构造函数。
案例练习,出发啦!
目的:在类中创建成员变量,使用类构造函数注入实例。也就是说,容器在创建类的实例时,也把该实例作为构造函数的参数值传递给类(在配置文件中操作,use标签,ref属性代表Bean的id)。
具体步骤如下:
步骤1:直接在之前的项目中操作,在类中创建一个成员变量,构造函数(),如下所示:
第二步:配置配置文件,如下图:
步骤3:编写测试类,运行JUnit测试。如下图所示:
从上图可以看出,通过容器获取到实例之后,会调用实例的save()方法,在这个方法中又调用了接口的实现类中的()方法(该对象是容器通过构造函数注入的。)
2.2 (基于注解的)依赖注入 2.2.1 (基于注解的)依赖注入概述
如果应用程序中有大量的bean,那么基于XML配置文件实现bean的组装将导致XML配置文件过于臃肿,从而给维护和升级带来一定的困难。
基于(注解)的依赖注入可以解决这个问题。
2.2.2 常见注解概述 2.3.3 先来一个实际的例子
步骤1:导入关键JAR包。然后创建DAO层接口,在com..dao包下创建接口,并添加add()方法。如下图所示:
第二步:创建DAO层接口的实现类。在com..包下创建接口的实现类,并添加DAO层add()方法。使用@注解将该类标记为Bean,相当于配置文件中的写法。如下图所示:
步骤3:创建层界面。如下图所示:
步骤4:创建该层接口的实现类。如下图所示:
步骤5:创建控制层。如下图所示:
第六步:创建配置文件。需要添加更多约束文件。如何将约束文件提交给管理层,请参考博文《开始旅程:第一个程序!》。
第七步:创建测试类,并运行JUnit进行测试。如下图所示:
从上图可以看出,DAO layer、layer、layer的add()方法均成功输出结果。
那么,使用组装Bean的方法已经成功实现了。
2.3 基于自动装配的依赖注入
这篇文章太长了,所以我再写一篇。
请参考博文《基于自动装配的依赖注入详解》。
2.4 静态工厂注入
需要提供一个静态工厂方法()来创建Bean的实例(即()方法返回的类的实例就是要创建的类的实例)。
需要在配置文件中使用标签的--属性来告诉容器调用工厂类中的()方法来获取该Bean的实例。
案例演示如下:
步骤1:在com..包中创建实体类。
第2步:创建一个静态工厂类,并在类中创建静态方法,用于创建Bean的实例。
步骤3:创建配置文件。
步骤 4:创建测试类和 JUnit 测试运行器。
从上面的运行结果我们可以看出,使用静态工厂方法实例化Bean成功。
2.5 实例工厂注入
使用这种方法,工厂类不再使用静态方法创建Bean的实例,而是直接在成员方法中创建Bean的实例。
也就是说需要一个成员方法()来创建该Bean的实例。
在配置文件中,需要实例化的bean并不直接通过class属性指向需要实例化的类,而是通过-bean属性配置一个实例工厂,然后通过--属性来决定使用工厂里的哪一个方法。
案例演示如下:
步骤1:创建一个实体类,并向该类添加say()方法。
第2步:创建实例工厂类,并添加成员方法()。
步骤3:创建配置文件。
步骤 4:创建测试类和 JUnit 测试运行器。
从上面的运行结果我们可以看出,使用实例工厂方法也可以实例化Bean。
【友情链接】 微信公众号:Coder阿杰博客园 【参考文献】
标题:Spring 框架中的依赖注入与控制反转:概念、作用与实现
链接:https://www.llthd.com/news/xydt/16626.html
版权:文章转载自网络,如有侵权,请联系删除!