一、应用场景: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中“Table ‘’ is read only”的解决办法

    之前是在linux下面直接Copy的data下面整个数据库文件夹,在phpMyAdmin里面重新赋予新用户相应权限后,drupal成功连接上数据库.但出现N多行错误提示,都是跟Cache相关的表是‘R ...

  2. 在学习c++过程中,总结类的三个用户以及使用权限,感觉非常实用

    首先我们需要知道类的三个用户分别是:类的实现者,类的普通用户和类的继承者(派生类),接下来分别讲解这几种用户的区别. 1 .类的实现者:顾明思议,就是类的设计者,拥有最大的权限,可以访问类中任何权限的 ...

  3. 2 Angular 2 的核心概念

    一.组件(Components): 组件是构成 Angular 应用的基础和核心,它是一个模板的控制类,用于处理应用和逻辑页面的视图部分.组件知道如何渲染自己及配置依赖注入,并通过一些由属性和方法组成 ...

  4. Gson转换Json串为对象报java.lang.NoClassDefFoundError

    解决方法: 1.右键项目 ---> properties ----> java buildpath ---> order and export 2. 勾选 gson-x.x.x.ja ...

  5. 浏览器同部署了https的服务器交互的过程

    1 浏览器发起https请求 2 https服务器发送自己的公钥给浏览器 3 浏览器用https服务器发送过来的公钥加密一个用于双方通信的的对称密码 4 https服务器用自己的私钥解密,获取对称密码 ...

  6. 将最大主机/ DNS名称字符长度从63增加到255

    https://mp.weixin.qq.com/s/WcjaAgAOvEhjtP2nXx5Fhw Zabbix 4.0.0alpha8发行说明 运维帮 昨天 Zabbix团队很高兴地宣布Zabbix ...

  7. 相关性系数缺点与证明 k阶矩

    相关性系数 https://baike.baidu.com/item/相关系数/3109424?fr=aladdin 缺点 需要指出的是,相关系数有一个明显的缺点,即它接近于1的程度与数据组数n相关, ...

  8. center os 安装mysql5.6

    软件 MySQL-server-5.6.13-1.el6.x86_64.rpm MySQL-client-5.6.13-1.el6.x86_64.rpm 安装命令 rpm -ivh MySQL-ser ...

  9. poj2676 Sudoku(搜索)

    题目链接:http://poj.org/problem?id=2676 题意:9*9的方格,0代表没数字,其他代表数字,请在格子中填入1~9的数字,使得在每行,每列和每个3*3的方块中,1~9的数字每 ...

  10. 如何替换某文件中的所有的特定字符?---linux sed命令(文本编辑命令) (转载)

    转自:http://blog.csdn.net/year_9/article/details/20318407 sed是一个很好的文件处理工具,主要是以行为单位进行处理,可以将数据行进行替换.删除.新 ...