Spring 中设置依赖注入
package com.ysq.vo;
public class User {
private int uid;
private String uname;
private String pwd;
private Date birth;
private String[] likes; //声明一个数组
private List<String> list; //声明一个集合
private Map<String, String> map; //声明一个map
public User() {
super();
}
public User(String uname, String pwd) {
super();
this.uname = uname;
this.pwd = pwd;
}
public User(int uid, String uname, String pwd) {
super();
this.uid = uid;
this.uname = uname;
this.pwd = pwd;
} public User(String uname, String pwd, Date birth) {
super();
this.uname = uname;
this.pwd = pwd;
this.birth = birth;
}
以省略了对应的get,set方法
}
1. Constructor injection 构造函数注入
1.1 在Bean的配置文件中,使用<constructor-arg>来表示将使用Constructor injection,由于使用Constructor injection时并不如Setter injection时拥有setXXX()这样易懂的名称,所以必须指定参数的位置索引,index属性就是用于指定对象将注入至建构函式中的哪一个参数,参数的顺序指定中,第一个参数的索引值是0,第二个是1,依此类推。 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 构造函数注入 -->
<bean id="cons_3" class="com.ysq.vo.User">
<constructor-arg index="0" value="111"/>
<constructor-arg index="1" value="李四"/>
<constructor-arg index="2" value="1212"/>
</bean>
</beans>
1.2 如果constructor上只有一个参数,则不必指定index属性。 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 构造函数注入 -->
<bean id="cons_4" class="com.ysq.vo.User">
<constructor-arg value="李四"/>
</bean>
</beans>
1.3 若有两个以上的参数,而参数类型各不相同的话,可以使用type来指定constructor上的参数类型。 示例代码
配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 构造函数注入 -->
<bean id="cons_4" class="com.ysq.vo.User">
<constructor-arg type="java.lang.Integer">
<value>1111</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>张三</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>112222</value>
</constructor-arg>
</bean>
</beans>
2. property injection (通过属性注入)
2.1 直接指定值或是使用<ref>直接指定参考至其它的Bean 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="dateBean" class="java.util.Date"/> <bean id="helloBean" class="com.ysq.vo.User">
<property name="uname">
<value>张三!</value>
</property>
<property name="birth">
<ref bean="dateBean"/><!--引入bean文件-->
</property>
</bean>
</beans>
2.2 也可以用内部Bean的方式来注入依赖关系 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="helloBean" class="org.sixsun.spring.HelloBean">
<property name="uname">
<value>Hello!</value>
</property>
<property name="date">
<bean id="dateBean" class="java.util.Date"/>
</property>
</bean>
</beans>
3. 自动绑定
直接指定值或是使用<ref>直接指定参考至其它的Bean,Spring也支持隐式的自动绑定,您可以通过类型(byType)或名称(byName)将Bean绑定至其它Bean上对应的属性: 3.1 byType 在配置文件中,并没有指定helloBean的Date属性,而是透过自动绑定,由于autowire指定了byType,所以会根据helloBean 的 Date属性所接受的类型,判断是否有类似的类型对象,并将之绑定至helloBean的Date属性上,如果byType无法完成绑定,则抛出 org.springrframework.beans.factory.UnsatisfiedDependencyExcpetion异常。 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="dateBean" class="java.util.Date"/>
<bean id="helloBean"
class="com.ysq.vo.User"
autowire="byType">
<property name="uname">
<value>Hello!</value>
</property>
</bean>
</beans>
3.2 byName 也可以指定byName来绑定,则Spring会根据bean的别名与属性名称是否符合来进行自动绑定,举个例子来说,如果是byName而Date属性要完成依赖注入的话,则必须修改一下第一个Bean的id值为date: 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="com.ysq.vo.User"
autowire="byName">
<property name="uname">
<value>Hello!</value>
</property>
</bean>
</beans>
3.3 constructor也可以尝试进行自动绑定 由于autowire设定为constructor,在建立绑定关系时,Spring容器会试图比对容器中的Bean及相关的建构方法,在类型上是否有符合,如果有的话,则选用该建构方法来建立Bean实例,例如上例中,HelloBean的带参数建构方法与date这个Bean的类型相符,于是选用该构造方法来建构实例,并将date这个Bean注入给它,如果无法完成绑定,则抛出 org.springframework.beans.factory.UnsatisfiedDependencyException异常。 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="com.ysq.vo.User"
autowire="constructor">
<property name="uname">
<value>Hello!</value>
</property>
</bean>
</beans>
3.4 autodetect 使用autodetect时,会尝试使用constructor,然后使用byType,哪一个先符合就先用。 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="com.ysq.vo.User"
autowire="autodetect">
<property name="uname">
<value>Hello!</value>
</property>
</bean>
</beans>
3.5 其它: 隐式的自动绑定没办法从配置文件中清楚的看到是否每个属性都完成设定,我们可以加入相依检查,在<bean>上加入dependency- check,有四种相依检查方式:simple、objects、all、none。 simple只检查简单的属性,像是原生(primitive)数据型态或字符串对象; objects检查对象属性; all则检查全部的属性; none是预设,表示不检查相依性; 示例配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="com.ysq.vo.User"
autowire="autodetect"
dependency-check="all">
<property name="uname">
<value>Hello!</value>
</property>
</bean>
</beans>
4. 集合对象注入:
对于像数组、java.util.List、java.util.Set、java.util.Map等集合对象,在注入前必须填充入一些对象至集合中,然后再将集合对象注入至所需的Bean中,例如若有个Bean如下:
示例代码:
public class SomeBean {
private String[] someStrArray;
private SomeObj[] someObjArray;
private List someList;
private Map someMap;
.... }
示例配置:
<beans>
<bean id="someBean" class="onlyfun.caterpillar.SomeBean">
<property name="someArray">
<list>
<value>Hello!Justin!</value>
<value>Hello!Momor!</value>
<value>Hello!Bush!</value>
</list>
</property>
<property name="someObjArray">
<list>
<ref bean="someObj1"/>
<ref bean="someObj2"/>
</list>
</property>
<property name="someList">
<list>
<value>Hello!Justin!</value>
<ref bean="someObj1"/>
<ref bean="someObj2"/>
</list>
</property>
<property name="someMap">
<map>
<entry key="somekey1">
<ref bean="someObj1"/>
</entry>
<entry key="somekey2">
<value>Hello!Justin!</value>
</entry>
</map>
</property>
</bean>
</beans>
上面的Bean定义文件是个综合示范,数组与List对象都是用<list>卷标来设定,而Map对象使用<map>卷标设定,并需要一个key值设定。 Set的使用<set>标签,例如:
<set>
<value>a set element</value>
<ref bean="otherBean"/>
<ref bean="anotherBean"/>
</set>
您也可以注入java.util.Properties,Bean定义档的写法示范如下:
<bean id=....>
....
<property name="someProperties">
<props>
<prop key="someProkey1">
someProValue1
</prop>
<prop key="someProkey2">
someProValue2
</prop>
</props>
</property>
</bean>
Spring 中设置依赖注入的更多相关文章
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- Spring学习(一)——Spring中的依赖注入简介
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- spring中的依赖注入
Ioc的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理: 以后都交给Spring来维护 在当前类需要用到其他类的对象,由Spring为我们提供, 我们只需要在配置文件中说明 依赖关系的维护,就称 ...
- spring中的依赖注入(DI)笔记
使用xml bean依赖注入有set注入和构造器注入 set注入用的比较多 <bean id="a" class="com.A"> <prop ...
- 类比Spring框架来实现OC中的依赖注入
如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...
- 谈谈自己了解的spring.NET的依赖注入
spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序 ...
随机推荐
- Python数据类型转换
Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 compl ...
- Can't connect to MySQL server on localhost (10061)解决方法
出现这种错误的原因是由于MySQL的服务被关闭的原因,重新启动一下服务就可以了,启动服务的操作如下: 右键[计算机]-[管理]
- 【Java基础】Jar包结构结构分析和操作具体解释
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 一 ...
- android85 短信防火墙
系统收到短信是有广播的,广播中包含了短信的号码和内容 ###短信防火墙 * 系统发送短信广播时,是怎么把短信内容存入广播的,我们就只能怎么取出来 * 如果短信过长,那么发送时会拆分成多条短信发送,那么 ...
- Android实战技巧之六:PreferenceActivity使用详解
一.写作前面 当我们做应用的时候,需要用户配置一些信息,而这就是通常所说的应用设置. 对于Android系统来说,系统本身的设置带来的用户体验和习惯已经深入人心,在我们的应用中同样用到类似的设置页, ...
- 从源码角度理解android动画Interpolator类的使用
做过android动画的人对Interpolator应该不会陌生,这个类主要是用来控制android动画的执行速率,一般情况下,如果我们不设置,动画都不是匀速执行的,系统默认是先加速后减速这样一种动画 ...
- Java-hibernate的Hello World
hibernate 是对jdbc进行轻量级封装的 orm 框架,充当项目的持久层. 要使用 hibernate首先就需要继续配置, 引包:下载hibernate然后加入jar包 同时引入mysql ...
- CI框架篇之模型篇--AR操作(2)
CodeIgniter 和众多的框架一样,有属于自己的一套对数据库的操作方式,本框架更是如此 有属于自己的一套对数据库的安全并且简单的操作, 成为AR操作:下面来对AR操作进行介绍: 首先,确定要启动 ...
- 我对WindowsPhone8的一些反大众看法.
最近看到网上好多人抱怨wp8的系统设计.我个人有一些观点.实在是不吐不快! 1.为什么系统没有重力感应开关. 答:因为这部分开关功能不是wp8所必备的.只是APP的一个功能.所以.错误在APP上因 ...
- 学习java随笔第十一篇:java窗体程序
要开java的窗体程序,就要下载开发窗体的工具. 这里我用的是的myeclipse,可以直接在网上下载安装即可. 我用的是10.0版本的,如果需要汉化的话,可以看一下这篇文章:myeclipse.10 ...