Spring总结三:DI(依赖注入)
简介:
所谓的依赖注入,其实是当一个bean实例引用到了另外一个bean实例时spring容器帮助我们创建依赖bean实例并注入(传递)到另一个bean中,比如你使用Spring容器创建的对象A里面需要引用对象B或者集合之类的,Spring容器会在创建A的实现类和B的实现类后,把B的实现类注入A实例中(通过反射),而且这些其他的对象怎么创建什么时候创建A实不需要知道的,这样就完成了各个对象之间的关系控制。
依赖注入的三种方式:
1,构造方法参数注入
2,属性setter方法注入
3,接口注入
Spring 在配置方面只支持 构造器参数注入和属性setter方法注入
构造方法参数注入:
JavaBean:(Person类)
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
applicationContext.xml配置:
<!--构造方法注入-->
<bean id="person" class="com.zy.spring.Person">
<constructor-arg name="name" value="张学友"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
测试:
@Test
public void setProByConstructor(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = ac.getBean("person", Person.class);
System.out.println(person);
}
运行结果:

属性setter方法注入:
JavaBean:(Man类)
public class Man {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Man{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
applicationContext.xml配置:
<!--属性setter方法注入-->
<bean id="man" class="com.zy.spring.Man">
<property name="name" value="刘德华"></property>
<property name="age" value="20"></property>
</bean>
测试:
@Test
public void setProBySetter(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Man man = ac.getBean("man", Man.class);
System.out.println(man);
}
运行结果:

p名称空间的使用:
Spring2.5 版本之后,为了简化属性setter依赖注入,提供虚拟名称空间 p !
首先配置文件的上方需要添加引用:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="man2" class="com.zy.spring.Man" p:name="郭富城" p:age="25"></bean>
复杂类型属性注入:
JavaBean:
public class ComplexType {
private Man man;
private List<String> list;
private Set<Integer> set;
private Map<String, Integer> map;
private Properties properties;
public void setMan(Man man) {
this.man = man;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<Integer> set) {
this.set = set;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "ComplexType{" +
"man=" + man +
", list=" + list +
", set=" + set +
", map=" + map +
", properties=" + properties +
'}';
}
}
applicationContext.xml:
<bean id="man" class="com.zy.spring.Man">
<property name="name" value="刘德华"></property>
<property name="age" value="20"></property>
</bean> <!--复杂类型注入 p:man-ref 表示引用赋值-->
<bean id="complexType" class="com.zy.spring.ComplexType" p:man-ref="man">
<property name="list">
<list>
<!-- value注入简单类型值, ref注入复杂对象引用 -->
<value>abc</value>
<value>def</value>
</list>
</property>
<property name="set">
<set>
<value>10</value>
<value>20</value>
</set>
</property>
<property name="map">
<map>
<entry key="aa" value="11"/>
<entry key="bb" value="22"/>
</map>
</property>
<property name="properties">
<props>
<prop key="qwe">111</prop>
<prop key="asd">222</prop>
</props>
</property>
</bean>
测试:
@Test
public void setComplexType(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ComplexType complexType = ac.getBean("complexType", ComplexType.class);
System.out.println(complexType);
}
运行结果:

Spring总结三:DI(依赖注入)的更多相关文章
- Spring 05: 用DI(依赖注入)优化Spring接管下的三层项目架构
背景 用注解改造前面Spring博客集里(指 Spring 02)Spring接管下的三层项目架构 对前面Spring博客集里(指 Spring 04)@Controller + @Service + ...
- Spring详解(三)------DI依赖注入
上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- 【SSH系列】深入浅出spring IOC中三种依赖注入方式
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- spring IOC中三种依赖注入方式
Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- spring(一) IOC 控制反转 、DI 依赖注入
IOC 控制反转:创建对象的方式 变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...
随机推荐
- macOS 下 Visual Studio Code(VSCODE)安装配置及应用
Visual Studio Code 重新定义了 Code 编辑. 在任何操作系统上编辑和调试应用程序内置 Git 支持1000 种以上的扩展免费和开源 为什么使用VSCODE? 我们来看看以下功能: ...
- 从无到有开发自己的Wordpress博客主题---运行环境准备
目前只做本地开发,只在本地搭建测试环境,最后会在服务器的CentOS中搭建正式环境,我使用的是Mac,最简单的办法就是安装MAMP. 1.下载并安装MAMP 下载地址:https://www.mamp ...
- Unity3D开发之Matrix4x4矩阵变换
在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置.旋转和缩放.但是很多人都不太理解这儿Matrix4x4变换矩阵.通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么 ...
- 常用的两个PHP类
/** * Class Interval * @author logonmy * @desc 简单分析程序执行时间: */ Class Interval{ var $start; publ ...
- 使用 event.preventDefault 拦截表单的提交
event.preventDefault() 方法 W3C 官方的定义是:取消事件的默认动作,不单单可以拦截表单的提交,<a>标签的跳转, <input>标签的输入等等默认动作 ...
- [QT]QToolBox 抽屉控件初步学习使用
创建一个不带界面的widget工程201701100038. main.c #include "widget.h" #include <QApplication> #i ...
- HihoCoder 1044 01-string 贪心
1144 : 01串 时间限制:7000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个整数n和m,求是否存在恰好包含n个0和m个1的01串S,使得S中不存在子串"001& ...
- 如果有人问你ZooKeeper是什么,就把这篇文章发给他。
前言 提到ZooKeeper,相信大家都不会陌生.Dubbo,Kafka,Hadoop等等项目里都能看到它的影子.但是你真的了解 ZooKeeper 吗?如果面试官让你给他讲讲 ZooKeeper 是 ...
- 处理get中文乱码
package com.servlet; import java.io.IOException; import java.io.PrintWriter; ...
- sublime text 3设置浏览器快捷键
一.设置默认浏览器 1,打开sublime 依次选择 tools > build system > new build system... 2,选择你喜欢的浏览器,右键 > 属性 把 ...