Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式

时间:2021-09-08 23:13:40

### 1. Spring IoC

IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java程序中,当使用了Spring框架后,对象的创建与管理都不再由开发者编写的程序来决定!而是交给框架来决定,具体的做法可以是通过配置框架的XML文件来实现,或其它方式。

DI:Dependency Injection:依赖注入:为类的属性注入值。

IoC是Spring框架所实现的目标,而DI是实现该目标所使用的手段,即:Spring通过DI实现了IoC。

### 2. 通过SET方式为属性注入值

可能通过配置Spring的配置文件,使得类中的属性是注入过值的,最终,当从Spring容器中获取对象时,其中的属性就已经有值了!

要为属性注入值,首先,需要为属性添加SET方法:

    public class User {
Integer age; public void setAge(Integer age) {
this.age = age;
}
}

然后,在Spring的配置的XML中:

<bean id="xx" class="xx.xx.xx">
<property name="age" value="23" />
</bean>

以上配置中,`<property>`节点用于配置属性的值,`name`可以理解为属性名称,`value`就是需要注入的值,仅适用于属性的值是基本值(可以直接书写的值,例如数值、布尔值、字符或字符串)的情况,如果属性的值是对象型的,需要在Spring的配置文件中先配置对象所归属的类的`<bean>`,然后,注入值时,使用`ref`属性引用到那个`<bean>`的`id`值:

<bean id="now"
class="java.util.Date" /> <bean id="user"
class="cn.tedu.spring.User">
<property name="regTime" ref="now" />
</bean>

注意:在`<property>`节点中,`name`属性的值,其实是类中的属性对应的SET方法名称中`set`右侧的名称且首字母小写,例如SET方法名是`setAge`,则此处`<property name="???">`的值应该是`age`,如果SET方法名是`setFrom`,则`<property name="???">`的值应该是`from`!但是,通常可以不必关心这个问题,因为SET方法应该是通过Eclipse这种开发工具自动生成的,SET方法的名称是规范的,与Spring框架使用的规则是相同的,所以,只要能保证SET方法的名称是规范的,不必纠结`<property>`中的`name`属性到底指的是什么。

### 3. 【不常用】 通过构造方法注入属性的值

假设存在:

    public class Person {
public String from; public Person(String from) {
this.from = from;
}
}

即:需要注入值的属性并没有SET方法,而是存在构造方法为该属性赋值,在这种情况下的配置应该是:

<!-- 通过构造方法注入属性的值 -->
<!-- constructor-arg节点用于配置构造方法的参数 -->
<bean id="person"
class="cn.tedu.spring.Person">
<constructor-arg
index="0" value="Shenzhen" />
</bean>

在以上配置中,`<constructor-arg>`节点用于配置构造方法的参数,节点中的`index`属性表示参数的序号,是从0开始顺序编号的,即第1个参数的`index`值应该是0,如果有更多的参数,第2个参数的`index`值应该是1,以此类推,需要注入的值根据类型选取`value`或`ref`即可。

### 4. 注入集合类型的值

常见的集合类型的数据有:List、Set、Map和数组,在注入这些类型的属性值时,还是应该先选取使用SET方式注入,或使用构造方法注入,通常,优先选择通过SET方式注入:

    public class SampleBean {

        // 期望值:Tom, Kate, Mary, David
private List<String> names;
// 期望值:Beijing, Shanghai, Guangzhou, Shenzhen
private Set<String> cities;
// 期望值:uid=9527, username=Jack, password=1234
private Map<String, String> session;
// 期望值:3个数字
private Integer[] numbers; public List<String> getNames() {
return names;
} public void setNames(List<String> names) {
this.names = names;
} public Set<String> getCities() {
return cities;
} public void setCities(Set<String> cities) {
this.cities = cities;
} public Map<String, String> getSession() {
return session;
} public void setSession(Map<String, String> session) {
this.session = session;
} public Integer[] getNumbers() {
return numbers;
} public void setNumbers(Integer[] numbers) {
this.numbers = numbers;
} }

在编写XML配置时,由于使用的是SET方式注入,所以,还是在`<bean>`节点之下添加`<property>`进行注入,根据属性类型的不同,选择不同的子级节点,例如`<list>`、`<set>`、`<map>`、`<array>`:

    <!-- 注入集合类型的值 -->
<bean id="sampleBean"
class="cn.tedu.spring.SampleBean">
<!-- 注入List类型的值 -->
<property name="names">
<list>
<value>Tom</value>
<value>Kate</value>
<value>Mary</value>
<value>David</value>
</list>
</property>
<!-- 注入Set类型的值 -->
<property name="cities">
<set>
<value>Hangzhou</value>
<value>Beijing</value>
<value>Shanghai</value>
<value>Guangzhou</value>
<value>Shenzhen</value>
</set>
</property>
<!-- 注入Map类型的值 -->
<property name="session">
<map>
<entry key="uid" value="9527" />
<entry key="username" value="Jack" />
<entry key="password" value="1234" />
</map>
</property>
<!-- 注入数组类型的值 -->
<property name="numbers">
<list>
<value>7</value>
<value>3</value>
<value>9</value>
</list>
</property>
</bean>

在实际应用中,还经常需要使用到`.properties`类型的配置文件,在Spring中,只需要通过`<util:properties>`节点就可以轻松读取这类型的配置文件:

    <!-- 读取.properties文件 -->
<!-- classpath表示src/main/resources文件夹 -->
<util:properties id="dbConfig"
location="classpath:db.properties" />

需要注意的是`<util:properties>`本质上还是`<bean>`,所以,可以被其它的注入操作来引用:

    <!-- 注入来自.properties中的配置 -->
<property name="properties" ref="dbConfig" />

在某些场景中,如果一定需要自行配置`Properties`类型的值,其结构为:

    <property name="xx">
<props>
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>

以上所有关于集合类型的值的注入操作中,`Properties`类型的相关操作属于略常用操作,其它类型的注入操作相对更少。

### Spring表达式

通过Spring表达式,可以在配置中访问到某个`Bean`的某个属性的值!

Spring表达式的基本格式是`#{表达式}`,假设`ValueBean`中有`username`属性,其值是`User`中的`name`属性值,则配置为:

<bean id="valueBean"
class="cn.tedu.spring.ValueBean">
<property name="username"
value="#{user.name}" />
</bean>

以上Spring表达式`#{user.name}`中,`user`是bean id,`name`是属性名。

假设`ValueBean`中有`realname`属性,其值是`SampleBean`中的`names`(List类型的集合)中的第2个值,则配置为:

    <property name="realname"
value="#{sampleBean.names[1]}" />

假设`ValueBean`中有`password`属性,其值是`SampleBean`中的`session`(Map类型的集合)中Key为`password`的值,则配置为:

<property name="password"
value="#{sampleBean.session.password}" />

以*问Map集合中的数据的表达式还可以写为`#{sampleBean.session['password']}`,但是,使用相对比较麻烦,并不推荐这样使用!

总的来说,使用Spring表达式可以访问其它Bean中的属性值:

- 某属性的值:`#{bean-id.属性名称}`
- 访问List集合中的值:`#{bean-id.集合名称[下标或索引]}`
- 访问Map集合中的值:`#{bean-id.集合名称.key}`或`#{bean-id.集合名称['key']}`

Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式的更多相关文章

  1. Spring框架中IoC&lpar;控制反转&rpar;的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  2. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  3. Spring中的控制反转和依赖注入

    Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...

  4. Spring-初识Spring框架-IOC控制反转(DI依赖注入)

    ---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...

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

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

  6. spring中的控制反转

    为什么使用spring框架,控制反转是它的重要优势之一. 传统的程序设计中,某个对象需要被调用时(比如mvc模式中controller调用service),需要调用者自己创建被调用对象. 而在spri ...

  7. spring中的控制反转IoC和依赖注入DI

    原文:http://blog.163.com/xianghuxian@126/blog/static/50639037200721345218382/ IoC(Inversion of Control ...

  8. 轻松了解Spring中的控制反转和依赖注入(一)

    我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...

  9. Spring的IOC控制反转和依赖注入-重点-spring核心之一

    IoC:Inverse of Control(控制反转): 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,好比于MVC.就是将原本在程序中手动创建对象的控制权,交由S ...

随机推荐

  1. php结合redis实现高并发下的抢购、秒杀功能

    抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...

  2. EasyUI datagrid &colon; 启用行号、固定列及多级表头后,头部行号位置单元格错位的问题

    症状如图: 上图中,行号列与checkbox 列融合了.解决方法是在datagrid 的 onLoadSuccess 事件中加入如下代码: var opts = $(this).datagrid('o ...

  3. unix环境高级编程基础知识之第四章

    1.从当前用户转到root用户:直接输入su命令,然后输入root密码,如果之前没有设置root命令密码会登陆不成功,这里需要命令sudo passwd命令设置密码,然后按照上面输入就成:从root命 ...

  4. Spring MVC和Struts2的比较的优点

    Spring MVC和Struts2的区别: 机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filter和servlet是不同的.以前认为filter是 ...

  5. php操作oracle的方法类集全

    在网上开始找php中操作oracle的方法类~ 果然找到一个用php+oracle制作email表以及插入查询的教程,赶忙点开来看,从头到尾仔细的看了一遍,还没开始操作,便觉得收获很大了.地址在此:h ...

  6. 【转载】link和&commat;import的区别

    link和@import的区别 原文地址:http://www.cnblogs.com/zbo/archive/2010/11/17/1879590.html 页面中使用CSS的方式主要有3种:行内添 ...

  7. 多种的android进度条的特效源码

    多种的android进度条的特效源码,这个源码是在源码天堂那个网站上转载过来的,我已经修改一部分了,感觉很实用的,大家可以学习一下吧,我就不上传源码了,大家可以直接到那个网站上下载吧. 源码天堂下载地 ...

  8. nginx往后端转发时需要注意的两个问题

    1.nginx后端有做redirect和rewrite时,需要要注意以下问题:          (1)nginx本身使用的是非80和443端口,例如8080,并且与后端的端口不一致,例如后端为808 ...

  9. MySQL数据转移至MSSQL详解

    一.安装MySQL ODBC驱动 为MySQL安装Connector/ODBC驱动.在此需要注意的一点是Connector/ODBC驱动与MySQL Server的版本对应问题.   二.创建系统DS ...

  10. 洛谷 P1411 树

    最近在做些树形DP练练手 原题链接 大意就是给你一棵树,你可以断开任意数量的边,使得剩下的联通块大小乘积最大. 样例 8 1 2 1 3 2 4 2 5 3 6 3 7 6 8 输出 18 我首先想的 ...