简介:

  所谓的依赖注入,其实是当一个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(依赖注入)的更多相关文章

  1. Spring 05: 用DI(依赖注入)优化Spring接管下的三层项目架构

    背景 用注解改造前面Spring博客集里(指 Spring 02)Spring接管下的三层项目架构 对前面Spring博客集里(指 Spring 04)@Controller + @Service + ...

  2. Spring详解(三)------DI依赖注入

    上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...

  3. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  4. 【SSH系列】深入浅出spring IOC中三种依赖注入方式

    spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...

  5. 一) Spring 介绍、IOC控制反转思想与DI依赖注入

    一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...

  6. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

  7. spring IOC中三种依赖注入方式

    Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...

  8. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  9. 三大框架 之 Spring(IOC控制反转、DI依赖注入)

    目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...

  10. spring(一) IOC 控制反转 、DI 依赖注入

    IOC 控制反转:创建对象的方式  变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...

随机推荐

  1. 出书了!实战微信小程序

    真正用心写完一本书,才知道写书真的很不容易. 我热衷喜欢分享一些技术,也喜欢钻研一些新东西,去年微信小程序刚内测的时候,我和我的同事四个人就一起研究,恰好公司有小程序相关的项目,做项目的同时,越发感觉 ...

  2. 使用pdfcrack破解PDF密码(Linux)

    pdfcrack是破解PDF保护密码的Linux命令行工具. 安装pdfcrack Debian系列: # apt install pdfcrack 暴力破解 # pdfcrack -f filena ...

  3. 【MFC】MFC绘图不闪烁——双缓冲技术

    MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/yuanlong_zheng@126/ ...

  4. hibernate的list和iterate的区别

    一.先介绍一下java中的缓存系统JCS(java cache system)  1.JCS(Java Caching System)是一个对象Cache,它可以把Java对象缓存起来,提高那些访问频 ...

  5. MAC OS X常用命令总结

    附录:UNIX常用命令 ============================================================================ 1.  cd     ...

  6. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  7. mysql 执行批量的sql

    <?xml version="1.0" encoding="utf-8" ?> <dbconfig> <!-- 数据库驱动 --& ...

  8. Python学习之异常处理

    1.首先了解错误和异常的概念: 错误:代码运行前的代码错误或者是程序执行过程中的逻辑错误 1:语法错误:代码不符合解释器或者编译器语法(代码错误) 2:逻辑错误:不完整或者不合法输入或者计算出现问题( ...

  9. js大法处理无法点击的问题

    js定位的其他方法:

  10. 让memcached分布式

    memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较 ...