首先,要学习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.xsdhttp://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.xsdhttp://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.xsdhttp://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注入bean的几种方式,希望对大家有帮助,更多spring的学习内容,可直接观看以下spring视频教程,这个spring视频教程是动力节点的老师讲的,内容涵盖了实际工作中可能用到的几乎所有知识点,也为以后的学习打下坚实的基础。

视频学习点这里哦!

Spring框架学习教程,详解Spring注入bean的几种方式相关推荐

  1. 【Spring MVC学习】详解spring mvc 3.0常用注解

    Spring mvc的注解功能 1.@Controller--表示控制器 举例: @Controller public class SoftCreateController extendsSimple ...

  2. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  3. spring 注入bean的两种方式

    我们都知道,使用spring框架时,不用再使用new来实例化对象了,直接可以通过spring容器来注入即可. 而注入bean有两种方式: 一种是通过XML来配置的,分别有属性注入.构造函数注入和工厂方 ...

  4. Spring 使用@Import注入Bean的三种方式

    一.准备工作 1.导入spring-context依赖 <dependency><groupId>org.springframework</groupId>< ...

  5. 详解 CSS position定位的五种方式

    position 属性规定应用于元素的定位方法的类型(static.relative.fixed.absolute 或 sticky). 常见的固定定位,例如手机端的导航,快捷按钮.例如本站的&quo ...

  6. html正方形边框,详解HTML设置边框的三种方式

    HTML设置边框的三种方式 border-width: 1px 2px 2px; border-style: solid dashed dotted; border-color:red green b ...

  7. vue路由跳转写法在html,详解vue 路由跳转四种方式 (带参数)

    1.  router-link 1. 不带参数 //name,path都行, 建议用name // 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由 ...

  8. Spring框架面试题详解

    1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标是简化Jav ...

  9. php反弹教程,详解NC反弹shell的几种方法

    假如ubuntu.CentOS为目标服务器系统 kali为攻击者的系统,ip为:192.168.0.4,开放7777端口且没被占用 最终是将ubuntu.CentOS的shell反弹到kali上 正向 ...

最新文章

  1. lucene DocValues——没有看懂
  2. 在GridView中使用Cache
  3. B - Average Numbers CodeForces - 134A(水题,思维)
  4. 在Java中给出的时间
  5. React 篇 Search Bar and content Table
  6. 求数字序列中的第n位对应的数字
  7. oracle ora 00283,【案例】Oracle报错ORA-16433非归档丢失redo无法启动的恢复过程
  8. sqlmap --os-shell反制小思路
  9. iOS __strong __weak @Strongify @Weakify
  10. SAP License:SAP职场处好人际关系的六大秘籍
  11. Material Design设计技巧
  12. android zxing 自动对焦,Zxing中的camera
  13. 题目:身份证录入系统 一、语言和环境 a)实现语言Java, 使用Android开发环境实现《身份证录入系统》APP。
  14. Windows安装Java8以及环境变量的配置(图解以及java安装包下载)
  15. 去掉GaussView 3.07启动警告窗口的完整解决方案
  16. 【前端】跨域 问题 原理 + 解决方案 下
  17. Scrapy框架中CrawSpider的使用
  18. 计算机 先进事迹范文,计算机,先进事迹范文.doc
  19. 利用139邮箱的免费短信提醒作为报警接口
  20. c++逆天改命进阶--二叉树练习题

热门文章

  1. 迅雷看看低价甩卖 无力回天有原因
  2. 不同省份天地图服务汇总
  3. Sklearn分类树在合成数集上的表现
  4. 直播带货选择什么平台比较好
  5. 开源工作流自动化工具n8n
  6. 巧用 chrome 浏览器的开发者工具解决sdk问题
  7. 【OBS-studio】 CMakeList阅读2 ( libobs plugin)
  8. 分秒帧团队版在线审阅视频工具好用吗?
  9. 华为手机信息不弹屏了为什么_华为手机为什么微信有新消息不提示?
  10. oracle proc编程 fetch,Oracle Proc编程性能优化经验