依赖注入:通过第三方注入调用类对接口实现类的依赖,消除调用类对接口实现类的依赖。
接下来,我们将详细了解Spring 容器支持的三种依赖注入方法以及如何配置它们。
• 属性注入方法
• 如何注入构造函数
工厂方法注入方法
一。财产注入
属性注入是通过setXXX()方法注入bean的属性值或依赖对象。在实践中,属性注入是最常用的,因为它具有选择性和灵活性的优点。
Spring首先通过调用bean的默认构造函数来实例化一个bean对象,然后通过反射调用set方法来注入属性值。
属性注入需要bean为需要注入的属性提供默认的构造函数和set方法。
注意:所谓默认构造函数是指不带参数的构造函数。
JAVA中的定义:
如果一个类没有定义构造函数,JAVA虚拟机会自动为该类生成一个默认构造函数。相反,如果在类中显式定义了构造函数,JAVA虚拟机将不会生成它。
让我们看一下Java 中的一些示例代码。
公共汽车{
私人琴弦品牌。
公共无效setBrand(字符串品牌){
this.brand=品牌;
}
公共字符串getBrand() {
返回this.brand。
}
}
您可以看到Car 类有一个String 类型的品牌属性,并为其提供了setter 和getter 方法。
我们看一下对应的属性插入配置文件。
bean id=\”car\” class=\”com.jike.***.Car\”
属性名称=“品牌”
价值奔驰/价值
/财产
/豆子
每个属性值对应一个属性标签,name是属性的名称。
bean实现类有一个对应的实现方法setBrand()。
注意:Spring只检查bean是否有setter方法,并没有对是否有对应的属性变量提出任何具体要求。不过,最好还是遵循传统的规则,设置相应的属性变量。
旁注:Spring 属性元素的命名约定:
Spring 配置文件中的属性元素和bean 实现类中的setter 方法中指定的属性名称符合Sun JavaBean 属性命名规范。即xxx属性对应的是setXxx()方法。一般来说,Java 属性变量名称以小写字母开头,但考虑到一些具有特殊含义的英文缩写,Java bean 也允许某些变量名称以大写字母开头。但是,必须满足某些条件。
变量的前两个字符必须全部大写或全部小写。
不过,从编程经验来看,属性名最好全部使用小写字母,这样编程更容易。
使用属性插入方法时,只能在配置文件中手动提供保证,而不能在语法级别提供。接下来介绍以下几种注入方式: 构造函数注入这种方式非常符合我们的要求。
二。构造函数注入
构造函数注入是除了属性注入之外的另一种常用的注入方式。这会在实例化bean 时设置一些必需的属性,并使其在实例化后可用。
使用构造函数注入的先决条件是bean必须向构造函数提供参数。
对于构造函数注入,配置文件可以包含以下方法:
按类型匹配输入参数
按索引匹配输入参数
使用类型和索引的组合来匹配输入参数
通过自己的类型反射来匹配输入参数
1、根据类型匹配输入参数。
让我们首先查看bean 代码。
公共汽车{
私人琴弦品牌。
私人双价。
公共汽车(字符串品牌,价格的两倍){
this.brand=品牌;
这个.价格=价格;
}
公共字符串getBrand() {
返回品牌;
}
公共无效setBrand(字符串品牌){
this.brand=品牌;
}
公共双getPrice() {
退货价格。
}
公共无效setPrice(双倍价格){
这个.价格=价格;
}
}
创建bean的配置文件
bean id=\’汽车\’ 类=\’cn.lovepi.chapter02.reflect.Car\’
构造函数- 参数类型=\’string\’
超值红旗CA72/超值
/构造函数参数
构造函数- 参数类型=\’double\’
值26666/值
/构造函数参数
/豆子
Spring 的配置文件采用独立于元素标签顺序的配置策略。此策略提供了有关配置信息的某种程度的确定性。
因此,当一个bean内的构造函数的多个参数类型相同时,按类型匹配输入参数会造成混乱,所以让我们看另一种方法:按索引匹配输入参数。
2、根据索引匹配参数输入方式。
首先,编写与bean对应的代码。
公共汽车{
私人琴弦品牌。
私人琴弦公司。
私人双价。
公共汽车(字符串品牌,字符串公司,双倍金额){
this.brand=品牌;
this.corp=公司;
这个.价格=价格;
}
}
正如你所看到的,这个bean的构造函数有两个String类型的参数,所以我们使用索引来注入参数。
bean id=\’汽车\’ 类=\’cn.lovepi.chapter02.reflect.Car\’
构造函数参数=\’0\’ 值=\’红旗CA72\’/
构造函数参数索引=\’1\’ 值=\’中国一汽\’/
构造函数参数索引=\’2\’ 值=\’2666\’/
/豆子
消息:
在属性注入时,Spring根据Java Bean规范确定配置属性和对应的setter方法,并利用Java反射机制调用属性的setter方法来完成属性注入。但是,Java 反射机制不记住构造函数输入参数名称。因此,由于无法通过指定构造函数的入参名称来配置构造函数,因此只能通过入参的类型及其索引来间接完成构造函数的属性注入。
3.使用类型和索引组合来匹配输入参数
一些复杂的配置文件需要类型和索引一起使用来完成构造函数参数注入。现在让我们看一下下面的例子。
公共汽车{
私人琴弦品牌。
私人字符串公司。
私人双价。
私有int 最大速度;
公共汽车(字符串品牌,字符串公司,双倍金额){
this.brand=品牌;
this.corp=公司;
这个.价格=价格;
}
公共汽车(字符串品牌,字符串公司,int maxSpeed){
this.brand=品牌;
this.corp=公司;
this.maxSpeed=maxSpeed;
}
}
该类有两个重载的构造函数,它们都采用三个输入参数。在这种情况下,您当前需要将type 和Index 方法与这两个属性结合使用。
现在我们来看看对应的配置文件。
bean id=\’汽车\’ 类=\’cn.lovepi.chapter02.reflect.Car\’
构造函数参数索引=\’0\’ 类型=\’字符串\’
超值红旗CA72/超值
/构造函数参数
构造函数参数索引=\’1\’ 类型=\’字符串\’
价值中国一汽/价值
/构造函数参数
构造函数参数索引=\’2\’ 类型=\’int\’
值200/值
/构造函数参数
/豆子
可以看到,重点实际上是在第三个输入参数的类型上。因此,我们在配置文件中指定索引和类型,以便Spring知道哪些构造函数有参数注入。
消息:
即使配置文件有歧义,Spring容器也能正常启动。没有报告错误。使用随机匹配构造函数实例化bean。随机选择的构造函数可能不是用户需要的,因此编程时应小心避免此类歧义。
4.通过自己的类型反射来匹配输入参数
如果bean构造函数的参数类型是可区分的,那么Java反射机制就可以检索构造函数参数的类型,这样即使构造函数注入没有提供类型和索引信息,Spring也可以检索构造函数信息。
在下面的代码示例中,您可以识别Boss类构造函数的输入参数的类型。
公开课老板{
私有字符串名称。
私人汽车。
私人办公室。
public Boss(String name, Car car, Office office) {
this.name=名称;
这.汽车=汽车;
this.office=办公室;
}
}
参数值可以直接在配置文件中设置。
bean id=\’Boss\’ class=\’cn.lovepi.chapter03.scope.Boss\’
构造函数参数
价值一/价值
/构造函数参数
构造函数参数
ref bean=\’汽车\’/
/构造函数参数
构造函数参数
ref bean=\’办公室\’/
/构造函数参数
/豆子
虽然以上方法都可以实现构造函数参数注入,但建议使用显示的索引和类型来配置构造函数的输入参数信息,以避免出现问题。
三。工厂方法注入方法
工厂方法是应用程序中经常使用的设计模式,也是实现控制反转和单实例设计思想的主要方式。
工厂类负责创建一个或多个工厂类实例。工厂类方法通常以接口或抽象类变量的形式返回目标类实例。
工厂类向外界屏蔽了目标类实例化步骤,因此调用者甚至不必指定特定的目标类。
Spring容器在框架方法中提供了工厂方法的功能,从而以透明的方式将其暴露给开发人员。因此,几乎不需要手动编码工程方法。然而,一些遗留系统和第三方类库仍然使用工厂方法。目前,您可以使用Spring 工厂注入方法来注入Spring。
Spring工厂注入方法可以分为两种类型:静态和非静态。
1.非静态工厂方法
有些工厂方法是非静态的,要求您在调用工厂方法之前实例化工厂类。
我们来看一下代码示例。
公共类CarFactory{
公共汽车createHongQiCar(){
汽车车=新车();
car.setBrand(\’红旗CA72\’);
车子在回家的路上。
}
}
写入配置文件:
bean id=\’carFactory\’ class=\’cn.lovepi.chapter02.reflect.CarFactory\’/
bean id=\’car\’ 工厂bean=\’carFactory\’
工厂方法=\’createHongQiCar\’
/豆子
因为carFactory的工厂方法不是静态的,所以必须首先为工厂类定义一个bean,然后通过factory-bean属性引用工厂bean实例。相应的工厂方法由factory-method 属性指定。
2.静态工厂方法
许多工厂类方法是静态的。这意味着您可以调用工厂类方法,而无需创建工厂类的实例。
因此,静态工厂方法比非静态工厂方法调用起来更方便。
现在让我们看一下静态工厂方法的bean 代码:
公共类CarFactory{
公共静态汽车createCar(){
汽车车=新车();
car.setBrand(\’红旗CA72\’);
车子在回家的路上。
}
}
其配置文件为:
bean id=\’car\’ class=\’cn.lovepi.chapter02.reflect.Car” 工厂方法=\’createCar\’/bean
概括:
虽然Spring提供了三种替代的注入方法,但是在实际应用中选择哪种注入方法并没有统一的标准。原因如下。
构造函数注入的原因:
构造函数确保重要属性已预设
不需要为每个属性提供setter方法,这样就减少了类中方法的数量。
可以更好的封装类变量,避免外部错误调用
属性插入的原因:
太多的属性会让你的构造函数变得臃肿和可怕。
构造函数注入不是很灵活,因此您可能需要向属性中注入空值。
多个构造函数会导致配置的歧义和复杂性。
构造函数对类的继承和扩展没有帮助
构造函数注入可能会导致循环依赖问题
事实上,Spring 提供了多种用于注入参数的方法,因此每种方法对于您的特定问题都应该有优势。所以,您只需根据自己的具体使用需求选择合适的方法即可,但以下是不推荐的方法:工厂方法注入。
以上相关内容来源网络介绍了#Spring beans的三种依赖注入方法,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91852.html