一、应用场景: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. 李洪强iOS开发之函数式 编程初窥

    函数式 编程初窥   最近在学习Erlang和Python.Erlang是完全的函数式编程语言,Python语言是面向对象的语言,但是它的语法引入了大量的函数式编程思想.越研究越觉得函数式的编程思路可 ...

  2. 嵌入式开发之davinci--- 8148 中dsp在dsp_drv.c中的processdata()加算法出现下边缘条纹问题

    (1)问题原因 dsp在alglink_priv.c中做灰度处理发现,下面出现条纹,后面发现是cache 缓存没及时写进内存问题 (2)解决办法 for(frameId=0; frameId<f ...

  3. ie6不支持png图片的解决办法

    在head里引入png.js文件 <!--[if lte IE 6]> <script type="text/javascript" src="js/P ...

  4. mysql 时间间隔计算

    业务需求说明 早8:30点执行该sql,写入定时脚本 [在稳定前,需要手动复检] INSERT INTO test_error ( url, no_open_times, no_ad_times, o ...

  5. UESTC 982质因子分解

    读入一个自然数,将nn分解为质因子连乘的形式输出. Input 有多组测试数据.输入的第一行是整数TT(0<T≤10000),表示测试数据的组数.每一组测试数据只有一行,包含待分解的自然数nn. ...

  6. 高清摄像头MIPI CSI2接口浅解【转】

    本文转载自:http://blog.csdn.net/u012075739/article/details/44672435 MIPI摄像头常见于手机.平板中,支持500万像素以上高清分辨率.它的全称 ...

  7. YTU 2439: C++习题 复数类--重载运算符+

    2439: C++习题 复数类--重载运算符+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1022  解决: 669 题目描述 定义一个复数类Complex,重载运算符"+ ...

  8. sphinx索引部分源码续——过程:连接到CSphSource对应的sql数据源,通过fetch row取其中一行,然后解析出field,分词,获得wordhit,最后再加入到CSphSource的Hits里

    后面就是初始化一些存储结构,其中重点说下缓存出来的几个临时文件分别的作用.结尾时tmp0的存储的是被上锁的Index,有些Index正在被查询使用 故上锁.tmp1,即对应将来生成的spp文件,存储词 ...

  9. webpack -v显示的版本与package.json的devDependencies节点显示的webpack版本不一致的问题

    最近在学习webpack,遇到个奇葩的问题.就是安装完成webpack后,查看安装的webpack版本与package.json中显示的版本不一致, webpack是局部安装的,非全局安装, 命令1: ...

  10. Linux系统挂载NTFS文件系统(转载)

    转自:http://hermesbox.blogbus.com/logs/47386987.html 今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其 ...