一、应用场景: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. 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用

    责任链模式的具体应用   1.业务场景 生产车间中使用的条码扫描,往往一把扫描枪需要扫描不同的条码来处理不同的业务逻辑,比如,扫描投入料工位条码.扫描投入料条码.扫描产出工装条码等,每种类型的条码位数 ...

  2. C++常用的函数,好的博客文章整理,集锦

    http://www.cnblogs.com/xianghang123/archive/2011/08/24/2152404.html    c语言产生随机数的方法 http://blog.sina. ...

  3. 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    这是一篇命题作文.近期一直想写点东西,但一直找不到题目.正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以认为这是个好题目,索性花了多半 ...

  4. 32位与4G内存限制

    32位有4G内存限制,好像人所共知.但这个32位是指32位的CPU还是32位的操作系统? 答案是,都是.内存限制,是操作系统和硬件(CPU,也许还有内存控制器)共同制约的.CPU对应的是寻址物理地址, ...

  5. SpringMVC_基本配置 --跟海涛学SpringMVC(和自己在项目中的实际使用的对比)

    ☆依赖jar包: 1.Spring框架jar 包: 为了简单,将spring-framework-3.1.1.RELEASE-with-docs.zip/dist/下的所有jar包拷贝到项目的WEB- ...

  6. (17)会话之Cookie的使用详解

    Cooke技术 1,特点 Cookie技术:会话数据保存在浏览器客户端. 2,Cookie技术核心 Cookie类:用于存储会话数据  1)构造Cookie对象 Cookie(java.lang.St ...

  7. LOJ114_k 大异或和_线性基

    LOJ114_k 大异或和_线性基 先一个一个插入到线性基中,然后高斯消元. 求第K小就是对K的每一位是1的都用对应的线性基的一行异或起来即可. 但是线性基不包含0的情况,因此不能确定能否组成0,需要 ...

  8. Java-Runoob-高级教程-实例-字符串:14. Java 实例 - 连接字符串

    ylbtech-Java-Runoob-高级教程-实例-字符串:14. Java 实例 - 连接字符串 1.返回顶部 1. Java 实例 - 连接字符串  Java 实例 以下实例演示了通过 &qu ...

  9. bzoj1933

    背包dp 一道很早以前就见过的dp dp[i][j][k]表示选到第i本书,第一层宽度为j,第二层宽度为k的最小高度,我们先把书按高度排序,然后转移就很方便了,因为高度降序,所以后选的书不影响之前选的 ...

  10. Java 支持JavaScript脚本计算

    Java支持了JavaScript脚本的执行计算能力: import javax.script.Invocable; import javax.script.ScriptEngine; import ...