1.依赖注入:就是指程序在运行过程中,如果需要另外一个对象协助完成时,无需在代码中创建被调用者,而是依赖外部的注入获取。

2.依赖注入的两种方式:

设置注入:设置注入是通过setter方法注入被调用者的实例。

构造注入:利用构造方法来设置依赖注入的方式称为构造注入。

3.接下来附上例子来说明设置注入

(1).首先,附上设置注入的例子,新建一个Java项目,配置好Spring后,即可,项目结构图如下图所示:

(2).首先,新建2个接口,一个Animal接口,一个Person接口,其中Animal接口有一个抽象的用途方法,就是动物是用来干嘛的,其中Person接口有一个饲养的方法。

Animal.java文件代码如下:

package com.inter;public interface Animal {void use();//定义抽象的用途方法
}

Person.java文件代码如下:

package com.inter;public interface Person {void raise();//定义抽象的饲养方法
}

(3).接着新建3个类,放在com.bean包下,分别为Dog、Cat、Businessman类,其中Dog、Cat类的use方法只输出一句话,Businessman类中有个Animal对象属性,并有其对应的setter方法,有一个raise方法,也是简单的输出和调用方法。

Dog.java文件代码如下:

package com.bean;import com.inter.Animal;public class Dog implements Animal{@Overridepublic void use() {// TODO Auto-generated method stubSystem.out.println("狗的用途是看家");}}

Cat.java文件代码如下:

package com.bean;import com.inter.Animal;public class Cat implements Animal{@Overridepublic void use() {// TODO Auto-generated method stubSystem.out.println("猫的用途是捉老鼠");}}

Businessman.java文件代码如下:

package com.bean;import com.inter.Animal;
import com.inter.Person;public class Businessman implements Person {private Animal animal;public Businessman() {}public void setAnimal(Animal animal) {this.animal = animal;}@Overridepublic void raise() {// TODO Auto-generated method stubSystem.out.println("人饲养动物");animal.use();}}

(4).对上面的类在applicationContext.xml文件中进行配置,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="bus" class="com.bean.Businessman"><property name="animal"><ref bean="dog"/></property></bean><bean id="dog" class="com.bean.Dog"></bean><bean id="cat" class="com.bean.Cat"></bean>
</beans>

其中定义一个Businessman类的bean中,有个属性property标签,其中name对应Businessman类的Animal对象属性,并且使用ref标签引用了下面定义的Dog对象的id, 就这样设置注入了dog对象。

(5).最后编写测试类Test,代码如下:

package com.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.inter.Person;public class Test {public static void main(String[] args){ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");Person p=(Person) ac.getBean("bus");p.raise();}
}

通过查找配置文件来找到有id为bus的bean,然后把这个bean强制转换为一个Person对象,再调用这个Person对象的raise方法,此时raise方法即为Businessman的raise方法,因为在Businessman类中使用了Animal对象属性,并通过设置注入到了配置文件中。

(6).运行后效果如下:

为什么输出的是狗的用途呢,因为我们把对象属性通过设置注入的方式注入到配置文件中,而配置文件中的对象属性引用的为Dog这个类。

4.接下来附上构造注入的例子,来说明构造注入

(1).首先,新建一个Java项目,配置好Spring环境,先附上这个项目的文件结构图:

(2).首先,定义两个接口,分别为Axe和Person接口,放在com.inter包下,其中Axe(斧头)接口定义了一个抽象的chop(砍)方法,其中Person(人)接口定义了一个使用斧头的方法。

Axe.java文件的代码如下:

package com.inter;public interface Axe {String chop();
}

Person.java文件代码如下:

package com.inter;public interface Person {void useAxe();
}

(3).接着新建3个类,分别为Chinese、SteelAxe、StoneAxe类,放在com.bean包下,其中Chinese类实现Person接口,SteelAxe和StoneAxe类实现Axe接口,其中Chinese类有一个对象属性,一个普通属性,并通过构造方法传入两个属性作为参数,其中SteelAxe、StoneAxe类里有一个返回值为字符串的方法。

Chinese.java文件代码如下:

package com.bean;import com.inter.Axe;
import com.inter.Person;public class Chinese implements Person {private Axe axe;private String name;public Chinese() {}public Chinese(Axe axe,String name){this.axe=axe;this.name=name;}public String getName() {return name;}@Overridepublic void useAxe() {// TODO Auto-generated method stubSystem.out.println(axe.chop());}}

SteelAxe.java文件代码如下:

package com.bean;import com.inter.Axe;public class SteelAxe implements Axe{@Overridepublic String chop() {// TODO Auto-generated method stubreturn "钢斧砍柴好快";}}

StoneAxe.java文件代码如下:

package com.bean;import com.inter.Axe;public  class StoneAxe implements Axe{@Overridepublic String chop() {// TODO Auto-generated method stubreturn "石斧砍柴好慢";}}

(4).其中在applicationContext.xml配置文件配置bean,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="chinese" class="com.bean.Chinese"><constructor-arg><ref bean="stoneAxe"/></constructor-arg><constructor-arg name="name" value="A-Lin"></constructor-arg></bean><bean id="steelAxe" class="com.bean.SteelAxe"></bean><bean id="stoneAxe" class="com.bean.StoneAxe"></bean>
</beans>

其中Chinese对象中使用constructor-arg标签,直接引用stoneAxe这个id的StoneAxe类,就可以给对象属性axe这个注入值 ,这种方式就为构造注入,其中为普通属性注入值,就像配置文件的constructor-arg标签的name属性一样,并赋给value属性一个值,其中name属性对应的为Chinese类的name属性!

(5).最后,编写测试类Test,代码如下:

package com.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bean.Chinese;
import com.inter.Person;public class Test {public static void main(String[] args){ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");Chinese c=(Chinese) ac.getBean("chinese");System.out.println(c.getName());c.useAxe();}
}

其中使用类路径的方式查找到applicationContext.xml文件,生成一个ApplicationContext应用上下文环境对象,利用这个对象在配置文件中获得Chinese这个类的对象,调用其方法。

(6).运行后,效果如下图所示:

5.以上内容仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!



依赖注入的两种方式并附上例子相关推荐

  1. Dagger2 知识梳理(1) Dagger2 依赖注入的两种方式

    一.资料推荐 最近这几天一直在看有关Dagger2有关的文章,感觉就是这东西真难用.真难懂,数次想要放弃,还好有网上大神的教程帮助,模模糊糊总算能把基本的几个概念跑通了. 这里首先推荐 牛晓伟 的下面 ...

  2. spring依赖注入简介以及依赖注入的两种方式

    1.spring依赖注入简介 依赖注入:Set注入1.依赖:bean对象创建依赖于容器!2.注入:bean对象中的所有属性,由容器来注入! 2.依赖注入的两种方式   实体类: package com ...

  3. 【SSM】13-Spring中实现依赖注入的两种方式(xml和注解)

    目录 前言 1.Bean的装配 1.1 默认的装配方式 1.2 Bean的作用域 2.基于xml的依赖注入 2.1 set注入(也叫设值注入) 2.1.1 简单类型 2.1.2 引用类型 2.2 构造 ...

  4. java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

    IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...

  5. Spring依赖注入的两种方式(根据实例详解)

    1,Set注入    2,构造注入 Set方法注入: 原理:通过类的setter方法完成依赖关系的设置 name属性的取值依setter方法名而定,要求这个类里面这个对应的属性必须有setter方法. ...

  6. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  7. 【IOC 控制反转】IOC 简介 ( 依赖注入的两种实现方式 | 编译期注入 | 运行期注入 )

    文章目录 一.IOC 简介 二.依赖注入的两种实现方式 一.IOC 简介 IOC 是 Inversion Of Control 的缩写 , 控制反转 ; 其最主要的作用是 降低代码的耦合度 , 最常见 ...

  8. IoC(控制反转)的主要组件和注入的两种方式

    一.IoC的主要组件: (1).Spring框架的两个最基本和最重要的包是org.springframework.beans.factory(该包中的主要接口是BeanFactory)和org.spr ...

  9. Spring系列之依赖注入的三种方式

    目录 一.依赖注入方式 1.使用属性的setXXX方法注入 2.构造函数注入 (1)按类型匹配入参type (2)按索引匹配入参index (3)联合使用类型和索引匹配入参[type和index一起使 ...

最新文章

  1. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——1.13节生产网络模拟问题1-1...
  2. golang struct 转map 及 map[string]*Struct 初始化和遍历
  3. Java导出基础 用POI导出Excel
  4. 2021-11-14泛型
  5. Scala声明类及创建类的对象
  6. 算法与数据结构(python):冒泡排序、选择排序、插入排序
  7. 2019年我总结的前端面试题
  8. mysql截取字符串与reverse函数
  9. 【需求工程】需求应用域理解
  10. [书目20081126]转型:用对策略,做对事
  11. 并查集之Wireless Network(一)
  12. Hadoop大数据平台构建与应用
  13. 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
  14. 计算机网络 什么是帧头部,帧头是什么意思
  15. mac数字键盘错乱_苹果手机数字键盘 苹果电脑键盘打不出数字解决办法
  16. 前端基础-VUE入门教程(一)
  17. python修改桌面壁纸_3分钟教你用python把你的桌面壁纸变得酷起来
  18. ARM基础教程 | ARM与RISC-V架构的区别
  19. activity-3、数据表介绍
  20. openwrt编译固件流程

热门文章

  1. struts中ModelDriven()接口
  2. 如何变得有价值,需要突破问题,提高解决各种问题的能力?
  3. Android 实现瀑布流的两种思路
  4. 第五章:关于ESearch的应用
  5. TS Type As
  6. 7-41 大数的乘法 (10 分)
  7. 7-64 计算平均成绩 (15 分)
  8. 如何监测服务器网络稳定性centos,centos下网络监测工具nethogs
  9. 链表的分解(C++)
  10. pta-3、输入输出-格式化输出字符串 (10 分)