- 浏览: 144840 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1723学习spring 里的PointCut Interface接口 ... -
spring 学习笔记-----访问资源
2009-04-21 22:21 1030访问资源的核心:Resource 这是一个接口,这个接口定义了 ... -
spring 学习笔记-----PropertyEditors
2009-04-20 22:54 1516基本类型:是指Spring默认提供的7中属性编辑器的类型,而非 ... -
从common-logging谈log4j
2009-04-02 11:28 2066引子: 最近老是用 ... -
基于XML文件读取bean定义:XmlBeanDefinitionReader
2009-04-01 23:23 4599基于XML文件读取bean定义 除了基于Properties文 ... -
spring 源码学习笔记:XXX-Aware
2009-03-12 23:26 1506学习了package org.springframework. ... -
spring 2.5 源码学习笔记: PropertyEditorRegistrySupport
2009-03-12 16:07 2054PropertyEditorRegistrySupport 介 ... -
Spring自动绑定技术总结
2009-03-09 17:06 16371.概念介绍:这些概念 ... -
Spring中Bean的初始化过程
2009-03-03 14:08 6924在传统的Java应用中,Bean的生命周期非常简单。Java的 ... -
Aspectj 概念介绍
2009-02-20 18:13 1583Aspectj AspectJ是一个 ... -
spring入门 :一个输出日志的实例分析Java的代理机制
2009-02-20 15:00 15601.通用的日志输出方法 a. 原来在程序中编写日志时,都要在每 ... -
spring BeanWrapper设置和获取属性值实例
2009-02-20 09:33 3259考虑下面两个类: public class Company { ... -
spring Lifecycle接口
2009-02-19 11:14 54911.初始化回调 实现org.springframework.b ... -
spring如何将Http request范围的bean注入到另一个bean中
2009-02-19 10:44 3113如果你打算将一个Http re ... -
spring bean 作用域总结
2009-02-19 10:15 32941.Singleton作用域: 当一 ... -
spring IOC容器
2009-02-18 22:40 9651.Spring IoC容器的实例化方法: a.Resour ... -
关于spring bean 的总结
2009-02-18 22:30 12391.bean的别名: 在对bean ... -
spring为ApplicationContext提供有三种实现
2009-02-16 10:49 6773spring为ApplicationContext提供 ...
相关推荐
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...
### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...
**Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...
Spring依赖注入是Spring框架的核心特性之一,它使得对象之间的依赖关系得以解耦,增强了代码的可测试性和可维护性。依赖注入(Dependency Injection,简称DI)的理念是,一个对象不应该负责寻找并创建它所依赖的对象...
Spring 框架中提供了多种依赖注入方式,其中最常用的三种依赖注入方式分别是接口注入、设值注入和构造函数注入。下面,我们将分别对这三种依赖注入方式进行详细的介绍和分析。 一、接口注入 接口注入是指通过接口...
javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...
Spring框架是Java应用程序开发中的一个核心框架,尤其以其强大的依赖注入(Dependency Injection,简称DI)功能闻名。依赖注入是面向切面编程(AOP)的一个关键原则,它允许开发者将对象之间的依赖关系解耦,使得...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许对象之间的耦合性降低,使得代码更易于测试和维护。依赖注入的核心思想是将一个对象依赖的其他对象通过构造函数、setter方法...
Spring依赖注入(Dependency Injection,简称DI)是Java应用开发中常用的设计模式,它极大地提高了代码的可测试性和可维护性。在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化了这一特性,使其更加灵活和强大。本篇文章将...
【Spring依赖注入详解】 在Java开发中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)功能而闻名。依赖注入是一种设计模式,它允许我们解耦组件,使我们的应用程序更加灵活,易于测试和维护。本篇...
### 二、Spring.NET 中的依赖注入 Spring.NET 提供了多种依赖注入方式,包括构造函数注入、属性注入和方法注入。以下分别介绍: 1. **构造函数注入**:通过在类的构造函数中传递依赖对象的实例来实现。这种方式...
在Spring框架中,依赖注入和控制反转实际上是同一概念的不同表达形式。当程序中的组件需要另一个组件的帮助时,通常是由调用者(即需要帮助的角色)来创建被调用者(即提供帮助的角色)的实例。但在Spring中,这个...
通过阅读和理解这些源码,你可以更深入地了解Spring依赖注入的工作原理及其在项目中的具体使用。 在进行依赖注入时,Spring使用BeanFactory或ApplicationContext作为容器,负责创建、管理和装配Bean。容器读取配置...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入方式,包括构造器注入、设值注入...
在Spring中,依赖注入可以通过XML配置、注解或Java配置实现。本例子主要关注基于注解的依赖注入,这是一个现代且更简洁的方法。 首先,让我们理解一下依赖注入的基本概念。在面向对象编程中,一个类可能会依赖于...
在本例“Spring Ioc(依赖注入)入门例子--属性注入”中,我们将关注如何通过属性注入来管理依赖。 属性注入是指Spring容器将一个对象的属性值设置为另一个对象的引用。这通常用于将服务对象注入到需要使用它们的...
本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际项目中应用。 依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许组件之间通过外部源来管理其依赖关系,而不是由组件自己来创建或查找...