龙空技术网

依赖注入——setter注入&构造方法注入&自动注入

码上咖啡馆 96

前言:

而今咱们对“构造器与方法的区别”大体比较注意,各位老铁们都需要了解一些“构造器与方法的区别”的相关文章。那么小编也在网络上收集了一些有关“构造器与方法的区别””的相关知识,希望你们能喜欢,咱们一起来学习一下吧!

想一个问题,要给一个类传值应该如何做?

在“DI(依赖注入)入门案例”中已经讲过通过set()方法注入一个对象即引用类型

但是,要是注入的不是这种引用类型而是简单类型如String,int之类的呢?

其实,有两种方法即setter注入和构造方法(构造器)注入

(还有个问题:可不可以不要自己写依赖,要啥依赖自己去找呢?最后部分——自动装配)

一.setter()注入

1)注入引用类型:“DI(依赖注入)入门案例”已讲述,不再重复!

2)注入简单类型:很类似引用类型,首先在类里定义属性及对应set方法,然后在配置文件通过<property name value>进行配置依赖关系即可,即相对于引用类型仅仅在配置依赖关系的时候将ref改为value

以在BookDaoImpl.java类中注入简单类型为例

定义简单属性及对应set方法:

BookDao类

再在配置文件中配置bean的时候定义依赖关系:

注意这里相比于引用类型这里使用的是value传入值

配置文件

可以运行起点程序了(这里获得bookService对象并调用里面的save()方法,bookService对象并调用里面的save()方法又调用bookDao里的save()方法):

起点程序

运行结果:

运行结果

这就是setter方法对于两种数据类型的注入!!!

二.构造方法(构造器)注入

其实跟setter注入差不多,只不过在类里将set方法换成构造方法,然后在配置文件中将<property>标签换成<constructor-arg>标签即可

1)引用类型注入:一样的,首先类里定义引用属性,然后写构造方法,最后配置文件中进行配置传值即可

以BooksService类为例,定义引用属性和构造方法:

BooksService类

配置文件进行配置:使用constructor-arg标签,name的值是构造方法里形参名(注意不是属性名),通过ref传值即要传入的对象

配置文件

最后就可以运行起点程序得到结果

运行结果

2)简单类型注入:一样的,类里定义简单类型变量并生成构造方法

BookDao类

再配置文件进行配置:相比于引用类型只不过由ref变成了value,要注意的是,跟配置引用类型一样,name的值依然要跟构造方法里形参名字一致

配置文件

此时就可以运行了

起点程序

起点程序

运行结果

运行结果

但是,这里发现一个问题:对于简单类型注入来说也需要在配置的时候name的值和构造方法形参的名字一样,这有耦合度,可不可打破这个限制呢?有:

打破方式一:

配置的时候将name换成type,即只传入数据类型没这样就不要写具体名字了,但是当有两个及以上的参数是同数据类型的那就不可用了

name换成type

打破方式二:解决了上一种方式的缺陷,即只通过index给参数位置

换成index

总结一下:name--->type--->index

三.自动装配(注意这种方式只能用于引用类型)

这个就实现了配置文件的时候不需要自己写依赖,需要什么类型自己去找,实现方法很简单,通过一个属性autowire即可实现

使用BookServiceImpl.java为例

类里写上属性类型即属性名称和setter方法,即BookServiceImpl要使用BookDao

BookServiceImpl.java为

再到配置文件种进行配置依赖关系:常规操作创建BookDaoImpl的bean,再创建BookServiceImpl的bean,但是,这里通过autowire自动装配:

1)按类型

配置文件

即bookService类里通过private BookDao bookDao;知道它要的是是BookDao类型,然后配置文件中正好有一个这个类型的bean即bookDao,因此就自己寻找并且配上了

此时可以运行程序:

起点程序

运行结果:

运行结果

2)还可以按名称

bookService类里通过private BookDao bookDao;知道它要的变量名是bookDao,而配置文件中正好有一个叫bookDao的bean,因此直接配上了

配置文件按名称

同样运行起点程序得结果

运行结果

到此为止,依赖注入基本就学完了!!!

但是还有个问题:到此为止知道了引用类型,简单类型的注入,但是集合怎么注入呢?集合只是个壳子,注入的话是注入里面的数字呀

标签: #构造器与方法的区别