以下内容引用自http://wiki.jikexueyuan.com/project/spring/dependency-injection/spring-setter-based-dependency-injection.html:

当容器调用一个无参的构造函数或一个无参的静态factory方法来初始化你的bean后,通过容器在你的bean上调用Setter函数,基于Setter函数的DI就完成了。

例子:

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jsoft.testspring</groupId><artifactId>testbeansetter</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>testbeansetter</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- Spring Core --><!-- http://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.4.RELEASE</version></dependency><!-- Spring Context --><!-- http://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.4.RELEASE</version></dependency></dependencies>
</project>

SpellChecker.java:

package com.jsoft.testspring.testbeansetter;public class SpellChecker {public SpellChecker(){System.out.println("SpellChecker无参数构造函数初始化");}public void checkSpelling(){System.out.println("SpellChecker检查方法");}
}

TextEditor.java:

package com.jsoft.testspring.testbeansetter;public class TextEditor {private SpellChecker spellChecker;public void setSpellChecker(SpellChecker spellChecker){System.out.println("TextEditor通过setter初始化");this.spellChecker = spellChecker;}public void spellCheck() {this.spellChecker.checkSpelling();}}

beans.xml:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="spellChecker" class="com.jsoft.testspring.testbeansetter.SpellChecker"></bean><bean id="textEditor" class="com.jsoft.testspring.testbeansetter.TextEditor"><property name="SpellChecker" ref="spellChecker"></property></bean></beans>

唯一的区别就是在基于构造函数注入中,我们使用的是<constructor-arg>标签,而在基于Setter函数的注入中,我们使用的是<property>标签。

第二个你需要注意的点是,如果你要把一个引用传递给一个对象,那么你需要使用ref属性,而如果你要直接传递一个值,那么你应该使用value属性。

App.java:

package com.jsoft.testspring.testbeansetter;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Hello world!**/
public class App
{public static void main( String[] args ){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");TextEditor textEditor = (TextEditor)applicationContext.getBean("textEditor");textEditor.spellCheck();}
}

运行结果:

下面将介绍使用p-namespace实现XML配置:

如果你有许多的Setter函数方法,那么在XML配置文件中使用p-namespace是非常方便的。区别如下:

以下为使用<property>标签的配置:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="john-classic" class="com.example.Person"><property name="name" value="John Doe"/><property name="spouse" ref="jane"/></bean><bean name="jane" class="com.example.Person"><property name="name" value="John Doe"/></bean></beans>

改用p-namespace之后:

<?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:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="john-classic" class="com.example.Person"p:name="John Doe"p:spouse-ref="jane"></bean><bean name="jane" class="com.example.Person"p:name="John Doe"></bean></beans>

看起来非常的整洁,在这里,您应该注意到使用p-namespace指定原始值和对象引用的区别。-ref部分表示这不是一个直接的值,而是引用另一个bean。

测试工程:https://github.com/easonjim/5_java_example/tree/master/springtest/test8/testbeansetter

转载于:https://www.cnblogs.com/EasonJim/p/6883587.html

Spring基于Setter函数的依赖注入(DI)相关推荐

  1. Spring框架—③依赖注入DI、Bean作用域及自动装配

    依赖注入 DI,Dependency injection 依赖: 指bean对象的创建依赖于Spring容器 注入: 指Bean对象所依赖的资源,由容器来设置和装配 在beans.xml中配置 1.常 ...

  2. Android 依赖注入 DI - Dagger2

    1.依赖注入 (Dependency Injection) 1.1 面向接口编程 public interface Drivable {void drive(); }public class Bike ...

  3. spring源码分析第三天------spring核心IOC容器和依赖注入原理

    基于XML的依赖注入 1.依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC ...

  4. Java依赖注入 - DI设计模式示例教程

    Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...

  5. 依赖注入(di)模式_Java依赖注入– DI设计模式示例教程

    依赖注入(di)模式 Java Dependency Injection design pattern allows us to remove the hard-coded dependencies ...

  6. 控制反转IOC、依赖注入DI的详细说明与举例

    文章目录 引入 IOC介绍 IOC的实现 通过构造函数注入依赖 通过 setter 设值方法注入依赖 依赖注入容器 IOC优缺点 优点 缺点 阅读时忽略语言差异,参考了很多其他博主内容,参考博文在最后 ...

  7. 依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)

    DIP,IoC与DI概念解析 依赖倒置 DIP(Dependency Inversion Principle) DIP的两大原则: 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象. 2.抽象不 ...

  8. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 "Inversion of Control".依赖注入DI, 全称 "Dependency Injection". 面向的问题:软件开发 ...

  9. [Android]使用Dagger 2依赖注入 - DI介绍(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5092083.html 使用Dagger 2依赖注入 - DI介 ...

最新文章

  1. Linux与Windows文件共享命令 rz,sz
  2. python cv2 轮廓的包络 面积_Python 基于FIR实现Hilbert滤波器求信号包络详解
  3. 装完nvme固态经常蓝屏_微软确认Win10 20H2使用雷电连接固态盘会直接蓝屏死机
  4. 4*4矩阵按键控制数码管显示0-F
  5. Python入门100题 | 第029题
  6. Flask 教程 第十八章:Heroku上的部署
  7. mysql md5版本校验_通过MD5校验和验证MySQL软件包的完整性
  8. 汇编语言重写除零中断
  9. android studio 抽屉,java - Android导航抽屉(由Android Studio默认提供) - 堆栈内存溢出...
  10. unity3d Json解析工具类
  11. 2019计算机国二操作题,2019年3月计算机二级C++操作练习题及答案(十二)
  12. 数据分析CSV模块的基本使用(以分析复杂的天气情况为例),附完整的Python代码及csv文件详解---数据可视化
  13. 摩托罗拉G7系列发布:G7 Plus还有中国红配色
  14. 西门子 S7-200以太网模块连接MCGS组态软件方法
  15. java毕业答辩_Java毕业设计答辩技巧
  16. 微型计算机中的数据总线用来进行什么的传输,汽检2011级汽车车载网络复习题答案...
  17. 关闭惠普计算机通电启动注册表,惠普电脑自动重启的解决方法
  18. fiddler重放请求
  19. 你知道吗:Android为何比iOS和WP慢?
  20. 1. 大型网站架构演化

热门文章

  1. XMLSpy编写DTD出错:Character 'D' is grammatically unexpected
  2. 推荐 9 个 爱不释手的 JSON 工具!
  3. 这 17 个 JVM 参数,高级 Java 必须掌握!
  4. 电商那些年,我摸爬打滚出的高并发架构实战精髓(续)
  5. 剑指offer:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
  6. 西门子fifo_查缺补漏必备 |三菱西门子学员知识问答汇总(技成周报134期)
  7. 数据中心架构有哪些组件?
  8. 使用DCIM软件确保数据中心符合DCOI
  9. python的pandas包使用教程_「Python」pandas入门教程
  10. Java游戏地下城_地下城与勇士DNF-鬼剑士