- 浏览: 141853 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
abc08010051:
请问楼主:既然hashmap是用数组存放Entry,为什么还在 ...
java hashSet与hashMap -
adam_zs:
没看懂哦
Java-----装饰模式 -
hekai1990:
受教了...
java date和hibernate date -
jarorwar:
...
Spring中Bean的初始化过程 -
tyut8518:
探究的相当深啊 得循序渐进来了
java hashSet与hashMap
示例代码:
1. Constructor injection
1.1 在Bean的配置文件中,使用<constructor-arg>来表示将使用Constructor injection,由于使用Constructor injection时并不如Setter injection时拥有setXXX()这样易懂的名称,所以必须指定参数的位置索引,index属性就是用于指定对象将注入至建构函式中的哪一个参数,参数的顺序指定中,第一个参数的索引值是0,第二个是1,依此类推。
示例配置:
1.2 如果constructor上只有一个参数,则不必指定index属性。
示例配置:
1.3 若有两个以上的参数,而参数类型各不相同的话,可以使用type来指定constructor上的参数类型。
示例代码:
示例配置:
2. property injection
示例代码:
2.1 直接指定值或是使用<ref>直接指定参考至其它的Bean
示例配置:
2.2 也可以用内部Bean的方式来注入依赖关系
示例配置:
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异常。
示例配置:
3.2 byName
也可以指定byName来绑定,则Spring会根据bean的别名与属性名称是否符合来进行自动绑定,举个例子来说,如果是byName而Date属性要完成依赖注入的话,则必须修改一下第一个Bean的id值为date:
示例配置:
3.3 constructor也可以尝试进行自动绑定
由于autowire设定为constructor,在建立绑定关系时,Spring容器会试图比对容器中的Bean及相关的建构方法,在类型上是否有符合,如果有的话,则选用该建构方法来建立Bean实例,例如上例中,HelloBean的带参数建构方法与date这个Bean的类型相符,于是选用该构造方法来建构实例,并将date这个Bean注入给它,如果无法完成绑定,则抛出 org.springframework.beans.factory.UnsatisfiedDependencyException异常。
示例配置:
3.4 autodetect
使用autodetect时,会尝试使用constructor,然后使用byType,哪一个先符合就先用。
示例配置:
3.5 其它:
隐式的自动绑定没办法从配置文件中清楚的看到是否每个属性都完成设定,我们可以加入相依检查,在<bean>上加入dependency- check,有四种相依检查方式:simple、objects、all、none。
simple只检查简单的属性,像是原生(primitive)数据型态或字符串对象;
objects检查对象属性;
all则检查全部的属性;
none是预设,表示不检查相依性;
示例配置:
4. 集合对象注入:
对于像数组、java.util.List、java.util.Set、java.util.Map等集合对象,在注入前必须填充入一些对象至集合中,然后再将集合对象注入至所需的Bean中,例如若有个Bean如下:
示例代码:
示例配置:
上面的Bean定义文件是个综合示范,数组与List对象都是用<list>卷标来设定,而Map对象使用<map>卷标设定,并需要一个key值设定。
Set的使用<set>标签,例如:
您也可以注入java.util.Properties,Bean定义档的写法示范如下:
package org.sixsun.spring; public class HelloBean { private String name; private String helloWord; public HelloBean() { } public HelloBean(String name, String helloWord) { this.name = name; this.helloWord = helloWord; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { return helloWord; } }
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="helloBean" class=" org.sixsun.spring.HelloBean"> <constructor-arg index="0"> <value>sixsun</value> </constructor-arg> <constructor-arg index="1"> <value>HelloSpring</value> </constructor-arg> </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="helloBean" class=" org.sixsun.spring.HelloBean"> <constructor-arg> <value>sixsun</value> </constructor-arg> </bean> </beans>
1.3 若有两个以上的参数,而参数类型各不相同的话,可以使用type来指定constructor上的参数类型。
示例代码:
package org.sixsun.spring; public class HelloBean { private String name; private Integer age; public HelloBean() { } public HelloBean(String name, Integer age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(Integer age) { this.age = age; } public Integer getAge() { return age; } }
示例配置:
<?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"> <constructor-arg type="java.lang.String"> <value>sixsun</value> </constructor-arg> <constructor-arg type="java.lang.Integer"> <value>23</value> </constructor-arg> </bean> </beans>
2. property injection
示例代码:
package org.sixsun.spring; import java.util.Date; public class HelloBean { private String helloWord; private Date date; public void setHelloWord(String helloWord) { this.helloWord = helloWord; } public String getHelloWord() { return helloWord; } public void setDate(Date date) { this.date = date; } public Date getDate() { return date; } }
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="org.sixsun.spring.HelloBean"> <property name="helloWord"> <value>Hello!</value> </property> <property name="date"> <ref bean="dateBean"/> </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="helloWord"> <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="org.sixsun.spring.HelloBean" autowire="byType"> <property name="helloWord"> <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="org.sixsun.spring.HelloBean" autowire="byName"> <property name="helloWord"> <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="org.sixsun.spring.HelloBean" autowire="constructor"> <property name="helloWord"> <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="org.sixsun.spring.HelloBean" autowire="autodetect"> <property name="helloWord"> <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="org.sixsun.spring.HelloBean" autowire="autodetect" dependency-check="all"> <property name="helloWord"> <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 学习笔记------PointCut接口
2009-04-23 23:14 1683学习spring 里的PointCut Interface接口 ... -
spring 学习笔记-----访问资源
2009-04-21 22:21 999访问资源的核心:Resource 这是一个接口,这个接口定义了 ... -
spring 学习笔记-----PropertyEditors
2009-04-20 22:54 1479基本类型:是指Spring默认提供的7中属性编辑器的类型,而非 ... -
从common-logging谈log4j
2009-04-02 11:28 2020引子: 最近老是用 ... -
基于XML文件读取bean定义:XmlBeanDefinitionReader
2009-04-01 23:23 4552基于XML文件读取bean定义 除了基于Properties文 ... -
spring 源码学习笔记:XXX-Aware
2009-03-12 23:26 1460学习了package org.springframework. ... -
spring 2.5 源码学习笔记: PropertyEditorRegistrySupport
2009-03-12 16:07 1964PropertyEditorRegistrySupport 介 ... -
Spring自动绑定技术总结
2009-03-09 17:06 15941.概念介绍:这些概念 ... -
Spring中Bean的初始化过程
2009-03-03 14:08 6885在传统的Java应用中,Bean的生命周期非常简单。Java的 ... -
Aspectj 概念介绍
2009-02-20 18:13 1534Aspectj AspectJ是一个 ... -
spring入门 :一个输出日志的实例分析Java的代理机制
2009-02-20 15:00 15191.通用的日志输出方法 a. 原来在程序中编写日志时,都要在每 ... -
spring BeanWrapper设置和获取属性值实例
2009-02-20 09:33 3223考虑下面两个类: public class Company { ... -
spring Lifecycle接口
2009-02-19 11:14 54441.初始化回调 实现org.springframework.b ... -
spring如何将Http request范围的bean注入到另一个bean中
2009-02-19 10:44 3073如果你打算将一个Http re ... -
spring bean 作用域总结
2009-02-19 10:15 32521.Singleton作用域: 当一 ... -
spring IOC容器
2009-02-18 22:40 9281.Spring IoC容器的实例化方法: a.Resour ... -
关于spring bean 的总结
2009-02-18 22:30 12001.bean的别名: 在对bean ... -
spring为ApplicationContext提供有三种实现
2009-02-16 10:49 6736spring为ApplicationContext提供 ...
相关推荐
Spring Ioc 注解 依赖注入
javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...
Spring 三种依赖注入方式.doc Spring 三种依赖注入方式.doc
如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的 依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程(将依赖关系注入到对象中) ,spring的依赖注入有3种方式: ...
该资源包含了一个利用spring实现的依赖注入的案例,简单易懂。
详解 Spring 3.0 基于 Annotation 的依赖注入实现。。详解 Spring 3.0 基于 Annotation 的依赖注入实现。。
NULL 博文链接:https://shmilyaw-hotmail-com.iteye.com/blog/2169569
spring依赖注入底层详解,很不错的资源,欢迎大家来下载学习。
Spring的依赖注入,与前置通知的实例
全面的Spring 核心机制 依赖注入 的描述,运用,实例开发运用,
Spring依赖注入——java项目中使用spring注解方式进行注入.rar
本项目为Java项目,使用Spring实现依赖注入,实现采用ApplicationContext,不再直接使用XmlBeanFactory方式。适合初学者了解Spring依赖注入的实现。
java 无需数据库 简单实例 如何实现Spring依赖注入 AOP
模拟Spring IOC 自己实现依赖注入 自己的Spring 自己的代码模拟spring的依赖注入 自己写的 绝对独一无二
Spring依赖注入笔记,思维导图方式!还是比较全面的,->就是想简单分享给大家!!!
NULL 博文链接:https://slnddd.iteye.com/blog/1756411
spring IOC容器依赖注入XML配置详解 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
Spring依赖注入检查,适合初学者进一步了解Spring框架。
模仿Spring依赖注入,代码详细,简单,明了
通过java代码模拟spring的依赖注入