首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入。

依赖注入是指:让调用类对某一接口的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖。

Spring容器中支持的依赖注入方式主要有属性注入、构造函数注入、工厂方法注入。接下来将为大家详细介绍这三种依赖注入的方式以及它们的具体配置方法。

1、属性注入

属性注入即通过setXXX( )方法注入bean的属性值或依赖对象。由于属性注入方式具有可选择性和灵活性高的特点,因此它也是实际开发中最常用的注入方式。

Spring首先会调用bean的默认构造函数实例化bean对象,然后再通过反射的方法调用set方法来注入属性值。

属性注入要求bean提供一个默认的构造函数,并且为需要注入的属性提供set方法 。

TIps:所谓默认的构造函数,即不带参数的构造函数。如果类中没有自定义任何构造函数,则系统(JVM)会自动生成一个不带参的默认构造函数,如果类中显示的自定义了有参数的构造函数,则系统就不会在自动生成默认构造函数,需要自己手动再加一个无参的构造函数。

下面通过一个实例来演示Spring中bean的属性注入方式:

编写一个user类:

package com.Kevin.bean;
/** * 创建一个类测试bean的属性注入方式 * @author Kevin * */
public class User {    private String username;  public String getUsername() {    return username;  }   public void setUsername(String username) {
this.username = username;  }}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- bean definitions here -->   <!-- 配置对象 -->  <bean id="user" class="com.Kevin.bean.User">    <property name="username">      <value>Kevin</value>    </property>  </bean>
</beans>

其中,每个属性值对应一个property标签,name属性值为类中属性的名称。在bean实现类中拥有与其对应的实现方法setUsername( )。

Tips:Spring只会检查bean中是否含有setter方法,而对是否有对应的属性变量则不作具体要求,但按照约定俗成的规则我们最好为其设定相应的属性变量。

Spring中<property>标签的命名规范:

Spring的<property>标签所指定的属性名称和bean实现类的setter方法满足Sun JavaBean的属性命名规范,即XXX的属性对应setXXX( )的方法。

一般情况下,java的属性变量名都以小写字母开头,但考虑到一些特殊意义的英文缩略词,java bean也允许一些大写字母开头的变量名。但必须满足以下两点:

变量的前两个字母要么全部大写,要么全部小写;

但以一般编程习惯来说,属性名最好全部使用小写字母,方便编程和阅读。

对于属性注入方式来说,只能人为地在配置文件中提供保证,而无法在语法级别提供保证。此时就需要使用构造函数注入这种方式,以此来更好地满足要求。

2、构造函数注入

构造函数注入是除属性注入之外的另一种常用的注入方式,它可以保证一些必要的属性在bean实例化时就得到了设置,并在实例化后就可以使用。

使用构造函数注入的前提是: bean必须提供带参的构造函数。

对于构造函数的注入,配置文件可以有以下几种方式:

  1. 按类型匹配入参

  2. 按索引匹配入参

  3. 联合使用类型和索引匹配入参

  4. 通过自身类型反射匹配入参

3、工厂方法注入

工厂方法是应用中被经常使用的设计模式,也是控制反转和单实例设计思想的主要实现方法。工厂类负责创建一个或多个工厂类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例。

工厂类对外屏蔽了目标类的实例化步骤,调用者甚至根本不用指定具体的目标类是什么。由于Spring容器以框架的方法提供工厂方法的功能,并以透明的方式开放给开发者。因此很少需要手工编写工程方法。但在一些遗留系统或第三方类库中还是会碰到工程方法,此时便可以使用Spring工厂注入的方法来进行Spring的注入。

Spring工厂注入的方法可以分为静态和非静态两种。

(1) 非静态工厂方法

有些工厂方法是非静态的,必须实例化工厂类之后才能调用工厂方法。下面通过一个示例来演示。

编写工厂类:

package com.Kevin.factorybean;/** * 编写工厂类测试非静态工厂方法注入 * @author Kevin * */ public class BookFactory {  public Book buyBook(){    Book book = new Book();    book.setName("Think in Java");    return book;  }
}

配置文件编写:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- bean definitions here -->   <!-- 配置对象 -->  <bean id="bookFactory" class="com.Kevin.factorybean.BookFactory"></bean>  <bean id="book" factory-bean="bookFactory" factory-method="buyBook"></bean>
</beans>

由于bookFactory的工厂方法不是静态的,因此需要先定义一个工厂类的bean,然后通过 factory-bean 属性来引用工厂bean实例。再通过属性 factory-method 来指定对应的工厂方法。

(2) 静态工厂方法

很多工厂类方法都是静态的,这意味着无需创建工厂类实例的情况下就可以调用工厂类方法。因此静态工程方法比非静态工厂方法的调用更加方便简洁。下面通过一个实例来演示静态工厂方法。

编写factory类:

package com.Kevin.factorybean;
/** * 编写工厂类测试静态工厂方法注入 * @author Kevin * */
public class CarFactory {  public static Car createCar(){    Car car = new Car();    car.setBrand("Lamborghini");    return car;  }
}

编写配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- bean definitions here -->  <!-- 配置对象 -->  <bean id="car" class="com.Kevin.factorybean.Car" factory-method="createCar"></bean>
</beans>

总结

Spring提供了三种可供选择的注入方式,但在实际应用中,我们究竟该选择哪种注入方式,并没有统一的标准,如下是一些可以参考的理由:

构造函数注入理由:

  • 构造函数保证重要属性预先设置;

  • 无需提供每个属性的setter方法,减少类的方法个数;

  • 可以更好地封装类变量,避免外部错误调用。

属性注入理由:

  • 属性过多时,构造函数变得臃肿;

  • 构造函数注入灵活性不强,有时需要为属性注入null值;

  • 多个构造函数时,配置上产生歧义,复杂度升高;

  • 构造函数不利于类的继承和扩展;

  • 构造函数注入会引起循环依赖的问题。

其实Spring为我们注入参数提供了这么多方法,那么这些方法必然有他们存在的道理,每个方法在某一问题上会有独特的优势,我们只需要按照我们具体的使用需求选择适合的方法来使用就好了。

spring依赖注入三种方式相关推荐

  1. Spring 依赖注入三种方式的实现,及循环依赖问题的解决(源码+XML配置)

    搬砖啦,搬砖啦,这几天在看Spring相关的书,下面给大家分享一下这几天的心得与收获,Go Go Go! Spring支持两种依赖注入方式,分别是属性注入,构造函数注入.除此之外,Spring还支持工 ...

  2. Spring学习3 - Bean的属性、DI依赖注入三种方式

    文章目录 1. 属性设置 - XML配置文件.以及与其等价的注解形式 2. 依赖注入DI的方式 2.1 属性自动注入 - 不推荐 代码准备阶段 代码测试 2.2 子节点构造器注入 - 不推荐 2.3 ...

  3. 22 springboot依赖注入三种方式

    1 基于构造函数的依赖注入 Spring 基于构造函数的依赖注入_w3cschoolJ虽然当前有关Spring Framework(5.0.3)的文档仅定义了两种主要的注入类型,但实际上有三种 pub ...

  4. Spring IoC注入三种方式

    三种注入方式: setter & getter 注入 构造函数注入 p命名空间注入 有两个实体类 student: public class Student {String name;int ...

  5. 依赖注入的三种方式_Java核心知识 Spring原理十 Spring 依赖注入四种方式

    构造器注入 /*带参数,方便利用构造器进行注入*/ public CatDaoImpl(String message){ this. message = message; } setter 方法注入 ...

  6. Spring循环依赖的三种方式以及解决办法

    Spring循环依赖的三种方式以及解决办法 [转]https://www.cnblogs.com/liuqing576598117/p/11227007.html 示例 https://github. ...

  7. Spring集成Memcached三种方式(一)

    Spring集成Memcached三种方式(一) 转载:http://blog.csdn.net/u013725455/article/details/52102170 Memcached Clien ...

  8. IoC、Spring 环境搭建、Spring 创建对象的三种方式、DI

    二.IoC 中文名称:控制反转 英文名称:(Inversion of Control) 3.I oC 是什么? 3.1 IoC 完成的事情原先由程序员主动通过 new 实例化对象事情,转交给 Spri ...

  9. Spring 学习之 二----Spring创建对象的三种方式

    最近在系统的学习Spring,现在就Spring的一些知识进行总结. 我们知道Spring是一个开放源代码的设计层面的框架,他主要解决的是业务逻辑层与其他各层之间松耦合的问题. Spring 有三个核 ...

最新文章

  1. adoquery查询结果如何赋给一个变量(delphi和c++ builder)
  2. 今天清华学长手把手带你做UI自动化测试
  3. pdf更新啦,快来瞧瞧!
  4. [云炬创业基础笔记]第五章创业机会评估测试6
  5. TensorBoard(一)
  6. 13-爬虫之js加密,解密,混淆,逆向破解思路
  7. 博弈论入门 HDU 1850
  8. springboot+jpa+mysql+redis+swagger整合步骤
  9. Linux -Ubuntu安装 Tomcat
  10. 新冠疫苗接种宣传海报PSD素材模板
  11. spring framwork解析
  12. java unit scanner_Java输入输出常用类Scanner
  13. CSDN新版下载频道改版上线了
  14. GitLab CI/CD 初体验
  15. muma很可能在陪你玩游戏
  16. 安卓Tasker自动转发短信到邮箱
  17. 学影视模型与游戏模型哪个更有前景呢?
  18. div 中进行左右分离
  19. NodeJS 开发多人实时对战游戏服务器 (一)
  20. visual studio创立上位机软件(C#)(定时器)

热门文章

  1. 用户注册发送激活邮件(上)
  2. 【pwnable.kr】Toddler‘s Bottle-[random]
  3. 通过JS控制页面不跟随系统文本、应用比例缩放
  4. Python 数组排序
  5. html点击按钮复制一个样式,这10个按钮,把 CSS HOVER 的创意发挥到极致了
  6. Excel、Word、PPT快捷键介绍使用
  7. C语言多人聊天室,Socket网络编程
  8. JetBrains IDE 中的隐藏宝石技巧
  9. mysql 简单练习题
  10. 【Azure Data Platform】Dedicated SQL Pool——导入性能测试(2)——CTAS