所谓依赖注入,我觉得说白了其实就是给成员变量赋值,不管这个成员变量是基本类型还是引用类型,Spring中常用的依赖注入方式有两种:

1、构造器注入

2、setter注入

下面通过代码实例说明这两种注入的实现方式。

一、构造器注入

1、构造注入的原理

构造注入是利用类的构造方法,大部分情况下我们是通过类的构造函数(含参数或不含参数)创建一个对象,Spring中也可以通过反射方法通过构造函数完成注入。所以这种注入方式一般是用于引用类型。

2、代码实现

在spring中实现需要三个步骤:

1⃣️创建类,提供构造方法。

 public class Employee {
private Integer id; private String username; private String pwd; private String sex; private String random; public Employee() {
}
   //通过含参数的构造方法进行注入
public Employee(Integer id, String username, String pwd, String sex, String random) {
this.id = id;
this.username = username;
this.pwd = pwd;
this.sex = sex;
this.random = random;
}

2⃣️配置spring文件,如果构造函数含有参数,还需要定义参数。

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 通过构造函数注入 -->
<bean id="employee" class="com.hyc.pojo.Employee">
<constructor-arg name="id" value="2" />
<constructor-arg name="username" value="李四" />
<constructor-arg name="pwd" value="lisi123" />
<constructor-arg name="sex" value="male" />
<constructor-arg name="random" value="32412" />
</bean> </beans>

上面的配置文件中主要有以下几点需要注意:

  • id:通过id获取该bean(资源)
  • class:需要装配的类的全限定名
  • constructor-arg:配置构造函数的参数,属性name是参数名称,value是参数值

注意⚠️:参数类型无需定义,spring会自动转化。因为我的类中定义的id是整形,在配置文件中没有定义数据类型,我debug时发现注入成功之后它已经被转换为Integer类型了。

3⃣️通过spring装配(之后的文章会介绍,本文先以XML方式实现)

 public class SpringIocTest {

     public static void main(String[] args) {
ClassPathXmlApplicationContext context = null;
String xmlPath = "classpath*:spring-iocconfig.xml";
try {
context = new ClassPathXmlApplicationContext(xmlPath);
//装配bean
Employee user = (Employee) context.getBean("employee");
System.out.println(user.getUsername());
} catch (BeansException e) {
System.out.println(e.getMessage());
} finally {
if (null != context) {
context.destroy();
}
}
}
}

上面代码用来测试是否注入成功,ClassPathXmlApplicationContext是通过XML的方式装配bean,其中最重要的是context.getBean("employee")这句,其中的employee就是在配置文件中定义的id,这样就能获取到这个bean实例,下面看以下测试结果(预测应该就是上面配置的李四):

注意⚠️:因为调用了getName方法,所以在定义类的时候需要提供getter方法,我没有贴出来!!

看结果与预测是一致的,并且从打印出的信息看出注入的过程中加载了配置文件获取bean。

上面就是构造注入的实现过程。

二、setter注入

setter注入是Spring中最常使用的注入方式,它是利用java bean中定义的setter方法实现注入。使用构造注入时需要给构造函数传多个参数,如果改用setter方法,就不需要定义构造方法了,只要定义一个无餐构造函数和对应的setter方法即可。setter注入实现的步骤也有三步:

1⃣️创建类,提供无参构造方法和setter方法

 public class Employee {
private Integer id; private String username; private String pwd; private String sex; private String random; public Employee() {
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username == null ? null : username.trim();
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd == null ? null : pwd.trim();
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex == null ? null : sex.trim();
} public String getRandom() {
return random;
} public void setRandom(String random) {
this.random = random == null ? null : random.trim();
}
}

一般定义setter和getter方法,setter设置值,getter获取值。

2⃣️配置bean文件

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 通过setter方法注入-->
<bean id="employee1" class="com.hyc.pojo.Employee">
<property name="id" value="3" />
<property name="username" value="张三" />
<property name="pwd" value="lisi123" />
<property name="sex" value="male" />
<property name="random" value="32412" />
</bean> </beans>

注意⚠️:上面的配置中:

  • id:获取这个bean的标识
  • class:需要注入类的全限定名
  • property:类中的成员变量(属性),需要设置哪些变量的值就设置哪些
  • value:属性值

3⃣️通过spring装配

 public class SpringIocTest {

     public static void main(String[] args) {
ClassPathXmlApplicationContext context = null;
String xmlPath = "classpath*:spring-ioc.xml";
try {
context = new ClassPathXmlApplicationContext(xmlPath);
//装配bean
Employee user = (Employee) context.getBean("employee1");
System.out.println(user.getUsername());
} catch (BeansException e) {
System.out.println(e.getMessage());
} finally {
if (null != context) {
context.destroy();
}
}
}
}

同构造注入中介绍的一样,也是通过XML方式获取bean,只不过为了区分在XML中将bean的id定义为employee1。查看测试结果(预期应该是张三)

结果符合预期,注入成功。

以上就是依赖注入的两种实现方式。

装配SpringBean(一)--依赖注入的更多相关文章

  1. Spring-Bean的依赖注入分析-01

    ###我们先通过一个例子弄明白为什么要使用依赖注入### 1.创建业务层UserService接口及UserServiceImpl实现类(接口代码省略) public class UserServic ...

  2. Java开发学习(七)----DI依赖注入之自动装配与集合注入

    一.自动配置 上一篇博客花了大量的时间把Spring的注入去学习了下,总结起来就两个字麻烦.麻烦在配置文件的编写配置上.那有更简单方式么?有,自动配置 1.1 依赖自动装配 IoC容器根据bean所依 ...

  3. Spring笔记——依赖注入

    依赖注入有三种方式: 1. 使用构造器注入  2. 使用属性setter方法注入 3. 使用Field注入(用于注解方式) 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自 ...

  4. spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  5. 【10分钟学Spring】:(二)一文搞懂spring依赖注入(DI)

    Spring最基础的特性就是创建bean.管理bean之间的依赖关系.下面通过具体实例演示该如何装配我们应用中的bean. Spring提供了三种主要的装配机制 在xml中进行显示的配置 在Java中 ...

  6. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配

    一.依赖注入的三种方式      在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...

  7. Spring bean依赖注入、bean的装配及相关注解

    依赖注入 Spring主要提供以下两种方法用于依赖注入 基于属性Setter方法注入 基于构造方法注入 Setter方法注入 例子: public class Communication { priv ...

  8. Spring实战2:装配bean—依赖注入的本质

    主要内容 Spring的配置方法概览 自动装配bean 基于Java配置文件装配bean 控制bean的创建和销毁 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的,这些组件必须 ...

  9. Spring基于的注解自动装配和依赖注入(***)

    #自动装配的小Demo: package com.gyf.annotation; //DAO层 public interface UserDao { public void save(); } pac ...

随机推荐

  1. SPSS分析:Bootstrap

    SPSS分析:Bootstrap 一.原理: 非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法,也称为自助法.其核心思想和基本步骤如下: 1.采用重抽样技术从原始样本中抽取一定数量(自己 ...

  2. ASP.NET的底层体系1

    文章引导 1.ASP.NET的底层体系1 2.ASP.NET的底层体系2 引言: 学习ASP.NET,要想做的更好,不了解ASP.NET是不行的.一个有理想的程序员都会像挤压海绵一样,努力的去学习和获 ...

  3. day19_生成器

    20180730 初次上传 20180731 更新,4.列表生成式,以及部分注释 #!/usr/bin/env python # -*- coding:utf-8 -*- # ************ ...

  4. 【Oracle】如何在查询视图时使用索引

    通常我们使用hint来固定查询计划选择走表的索引 固定表的连接等等,但是如果第一层查询的是视图呢? yang@rac1>CREATE TABLE TA (ID NUMBER, NAME VARC ...

  5. JS控制语句 编程练习 学生数据,分别是姓名、性别、年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦。

    编程练习 在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名.性别.年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦. 学生信息如下 ...

  6. Java中Arrys数组常用的方法

    Arrys常用方法 1.toString() Arrays.toString(arr)        //打印数组的内容,观察数组元素的值 2.sort() Arrays.sort(arr);     ...

  7. shell脚本使用需要注意的地方

    shell脚本中,函数内部定义变量可以为局部变量和全局变量,局部变量使用local定义,全局变量不带local,全局变量可以在函数外部可见,如下: #!/bin/bash function calle ...

  8. [转]C#操作Excel初探

    近期一段时间正好在做winform导出Excel报表的问题,学习了一下C#操作Excel的一些方法(如:向Excel中插入图片:删除Excel指定sheet中的某行或某列,在Excel指定的单元格中画 ...

  9. springBoot_JPA和lombok

    一.JPA 特点:JPA可以根据方法名自动匹配sql语句. JPA是一个标准 Hibernate是JPA的一个实现,宗旨是尽量少写sql语句. 使用JPA 1.application.properti ...

  10. AMPQ

    AMPQ AMQP,即Advanced Message Queuing Protocol,高级消息队列协议, 是`应用层协议的一个开放标准,为面向消息的中间件设计`. 由于AMQP是一个网络协议,所以 ...