一、应用场景:Spring会帮创建实现类的实例,但是有时候我们还需要在类中设置一些属性用于传入设置值,这些跟类紧密关联的属性就叫依赖,通过spring帮忙设置的过程叫依赖注入。

二、依赖注入的实现

 A.构造方法的注入。

//这样配置bean都是通过无参构造生成bean实例
<bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl"/>

通过上面无参构造我们想到是否有有参构造创建实例了,这样不就达到了注入属性的目的了吗?确实,看下面:

//java代码:
private String name;
public UserDaoImpl(String name) {
this.name = name;
}
@Override
public void insert() { System.out.println(name+"用户信息插入");
} //配置文件
<bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl">
<constructor-arg name="name" value="李四"/>
</bean>

只提供了有参构造而没有提供无参,所以现在Spring只能通过有参构造来创建实例,并注入属性。

B.set方式注入。

  这种方式就比较常见了,在需要实例化的类里面提供属性及其set方法。

//java类里面:
private String name; @Override
public void insert() { System.out.println(name+"用户信息插入");
} public void setName(String name) {
this.name = name;
}

配置文件里:

 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl">
<!-- 属性依赖注入,底层会自动封装,只要在dao实现类提供属性和set方法就行 -->
<property name="name" value="张三"></property>
</bean>

运行结果:

18:05:18,439  INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 18:05:18 CST 2019]; root of context hierarchy
18:05:18,461 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
张三用户信息插入

C.构造或者set设置非普通属性(对象或者数组等引用类型)

//在需要Spring代理的实体类中用set或者构造
private Car car; /*public UserDaoImpl(Car car) {
this.car = car;
}*/ public void setCar(Car car) {
this.car = car;
} @Override
public void insert() { System.out.println(car);
}

主要看配置文件:

      <bean id="car" class="cn.xxx.bean.Car">
<property name="carName" value="奇瑞QQ"></property>
<property name="money" value="50000"></property>
</bean> <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl">
<!-- <constructor-arg name="car" ref="car"></constructor-arg> -->
<!-- 非普通属性注入,注意,ref为引用其他代理类的id或者name,这里面name里面car代表上面引用id的实例,必须保持一致,否则出错 -->
<property name="car" ref="car"></property>
</bean>

也就是说只靠在实体类里设置property不够,我们需要对象里面每个属性的值,所以直接把bean类托管给Spring。在我们需要的类里面用ref属性引入这个bean类

运行结果:

18:43:10,444 INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 18:43:10 CST 2019]; root of context hierarchy
18:43:10,476 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
Car [carName=奇瑞QQ, money=50000.0]

D.P名称空间的属性注入(Spring2.5版本以后)

  有点类似与表达式那种,可以替换一些标签,用处不大,了解一下。首先得引入p名称空间(名称空间是xml中的概念)

<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="car" class="cn.xxx.bean.Car" p:carName="劳斯莱斯" p:money="12000000">
</bean> <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" p:car-ref="car" p:name="王校长">
</bean>

就是将一些在property等标签里面写的东西拿到了bean标签上面写,简化了代码量

E:SPEL的方式属性注入(Spring3.x版本后使用)

  SpEL:Spring Expression Language(Spring表达式语言),语法:#{SpEL}

 

  <bean id="car" class="cn.xxx.bean.Car" >
<property name="carName" value="#{'奔驰'}" ></property>
<property name="money" value="#{600000}"></property>
</bean> <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" >
<!-- 注意不管数据类型复杂与否,都用value -->
<property name="car" value="#{car}"></property>
<!-- 引入另一个类里面的属性 -->
<!-- <property name="carName" value="#{car.carName}"></property> -->

运行:

20:43:14,694  INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 20:43:14 CST 2019]; root of context hierarchy
20:43:14,709 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]
Car [carName=奔驰, money=600000.0]
小周用户信息插入

F:复杂数据类型注入(集合,数组)

配置文件:

 <bean id="userDao" class="cn.xxx.dao.impl.UserDaoImpl" >
<property name="arrs">
<array>
<value>你</value>
<value>我</value>
<value>它</value>
</array>
</property> <!-- 定义list集合 -->
<property name="list">
<list>
<value>芙蓉</value>
<value>如花</value>
<value>凤姐</value>
</list>
</property> <!-- 定义map集合 ,key里面有个key-ref,所以可以传引入类型-->
<property name="map">
<map>
<entry key="aaa" value="111"></entry>
<entry key="bbb" value="222"></entry>
<entry key="ccc" value="333"></entry>
</map>
</property>
</bean>
//bean里面
private String[] arrs;
private List<String> list;
private Map<String,String> map;public void setArrs(String[] arrs) {
this.arrs = arrs;
} public void setList(List<String> list) {
this.list = list;
} public void setMap(Map<String, String> map) {
this.map = map;
}

运行结果:

21:27:48,113  INFO ClassPathXmlApplicationContext:578 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@61443d8f: startup date [Sun May 05 21:27:48 CST 2019]; root of context hierarchy
21:27:48,128 INFO XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [config/applicationContext.xml]



芙蓉
如花
凤姐
aaa...111
bbb...222
ccc...333

如果是set集合那么就用set标签。上面就是属性注入全方位讲解了。

SpringIOC学习_属性注入(依赖注入)的更多相关文章

  1. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  2. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  3. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

  4. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  5. .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...

  6. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC

    原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...

  7. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

  8. 【框架学习与探究之依赖注入--Autofac】

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7603642.html 序 同样的又是一个双11如期而至,淘宝/天猫实时数据显示,开场3分钟总交易额突破 ...

  9. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

随机推荐

  1. 一个关于MYSQL IFNULL的用法

    select a.receiveID,(a.num - IFNULL(b.num,0)) as num from (SELECT num,receiveID from dog_giftnumrecor ...

  2. 【转载】HTTP协议与WEB本质

    当你在浏览器地址栏敲入"http://www.csdn.net/",然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是 ...

  3. OpenCV图像处理篇之图像平滑

    图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪.平滑要使用滤波器.为不改变图像的相位信息,一般使用线性滤波器,其统一形式例如以下: %20\Large%20g(i,j)=\sum_{k ...

  4. Linux——系统调用笔记1

    底层文件访问:    进程:运行中的程序,它有一些与值关联的文件描述符,有多少个文件描述符取决于系统配置情况.    当一个程序开始运行时,一般会打开三个文件描述符:        0:标准输入    ...

  5. ym——优化你的Java代码(新)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 1.面向对象的3要素. 2.面向对象开发的6大原则. 1.单一职责原则 应该有且仅有一 ...

  6. grep命令最经常使用的功能总结

    1. grep最简单的用法,匹配一个词:grep word filename 2. 能够从多个文件里匹配:grep word filename1 filenam2 filename3 3. 能够使用正 ...

  7. [他山之石]Google's Project Oxygen Pumps Fresh Air Into Management

    The Project Oxygen team spent one year data-mining performance appraisals, employee surveys, nominat ...

  8. CodeChef Consecutive Snakes 三分(整数)

    题意 在年度阅兵中,所有的士兵蛇都在阅兵场集合了,但这些蛇的站位不对.整场阅兵必须能从主席台看清楚,所有蛇都应该站成一排.但这些士兵非常懒惰,你必须指挥士兵重新排队,使得所有人的移动距离之和最短. 形 ...

  9. HTML的DOM和浏览器的BOM

    DOM和BOM的区别 HTML DOM 的 document 是 BOM 的 window 对象的属性之一: 通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML. Ja ...

  10. create database 默认utf-8

    CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 这是sql语句 CREATE TA ...