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 ...
随机推荐
- 背景色与WM_ERASEBKGND
1.背景模式 SetBkMode(TRANSPARENT/OPACITY) 用来反应文字,图形与窗口背景交互混合模式.透明则表示文字背景与窗口背景之间透明,互不干扰. 2.背景颜色 SetBkColo ...
- => 应用在js回调函数中
=> 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略 ...
- 前端之JavaScript再次补充(干死!!)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 细说 const
1.const 简单应用 const int pp=0 //pp 为整形常量,不能修改 还有另外一种不常用的方式 但是最容易误导 int const pp=0 //pp 为整形常量,不能修改 记住这两 ...
- BZOJ - 2460 :元素 (贪心&线性基)
相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们 ...
- HihoCoder 1158 : 质数相关 (最大独立集)
质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关 ...
- Xcode7 修改项目名完全攻略
1.先把整个工程文件夹名改为新的工程名. 2 .将旧项目文件夹和Tests文件名夹修改为新的名称,修改后如下图所示 3.右击 ,选择“show content package”(中文:显示包内容),看 ...
- springmvc中拦截器与springmvc全局异常处理器的问题
最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...
- 分布式缓存系统 Memcached 主线程之main函数
前两节中对工作线程的工作流程做了较为详细的分析,现把其主要流程总结为下图: 接下来本节主要分析主线程相关的函数设计,主函数main的基本流程如下图所示: 对于主线程中的工作线程的初始化到启动所有的工作 ...
- 【转】分布式存储和一致性hash
本文我将对一致性算法作介绍,同时谈谈自己对一致性hash和一般意义上的hash算法的区别 hash是什么 hash即hash算法,又称为散列算法,百度百科的定义是 哈希算法将任意长度的二进制值映射为较 ...