`
234390216
  • 浏览: 10200700 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:461245
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1772467
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1396040
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394104
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678483
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529545
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1179204
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:463124
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150408
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:67110
社区版块
存档分类
最新评论

Spring(03)——依赖注入

阅读更多

3依赖注入

Spring bean的依赖注入有两种形式,通过构造方法注入和通过set方法注入。构造方法注入是通过constructor-arg元素来指定的,而set方法注入是通过property元素来指定的。

3.1构造方法注入

先来看一个简单的示例:

	<bean id="hello" class="com.app.Hello">
		<constructor-arg value="hello"/>
	</bean>

上述配置定义了一个类型为com.app.Hellobean,我们通过constructor-arg指定了其第一个构造参数的值为字符串“hello”,这就是一个简单的通过构造方法进行注入的示例。

当参数类型为基本数据类型时可以直接通过constructor-arg元素的value属性指定对应的值,更确切的讲应该是Spring能够通过String进行转换的类型,默认Spring能将String转换成对应的基本数据类型,其它的需要自己指定转换规则了。如上面示例中的value=”hello”就是这样的。
当有多个构造参数时就需要使用多个constructor-arg进行定义,默认会将定义的顺序作为参数的顺序。

public class Hello {

	public Hello(String str1, boolean b2, int i3) {
		
	}
	
}

如上Class,我们在定义对应的bean时可以如下定义,这个时候默认会按照定义的顺序将第一个参数赋值给构造方法的第一个参数,第二个给第二个,第n个给第n个。

	<bean id="hello" class="com.app.Hello">
 		<constructor-arg value="str1"/><!-- str1 -->
 		<constructor-arg value="true"/><!-- b2 -->
 		<constructor-arg value="3"/><!-- i3 -->
 	</bean>

当然,我们也可以明确的利用index来指定constructor-arg对应参数的位置,index是从0开始的,即第一个参数对应的index为0。使用index时,Hello对应的bean可以如下定义。

	<bean id="hello" class="com.app.Hello">
 		<constructor-arg index="1" value="true"/><!-- b2 -->
 		<constructor-arg index="0" value="str1"/><!-- str1 -->
 		<constructor-arg index="2" value="3"/><!-- i3 -->
 	</bean>

当构造参数对应于ApplicationContext中的一个bean时,我们也可以通过ref属性关联对应的bean,即注入的不再是普通的字符串,而是对应的bean

public class Hello {

	public Hello(World world1) {
		
	}
	
}
	<bean id="world" class="com.app.World"/>
 
 	<bean id="hello" class="com.app.Hello">
 		<constructor-arg ref="world"/>
 	</bean>

我们还可以通过constructor-arg元素的name属性来指定对应constructor-arg对应的参数,如:

public class Hello {

	public Hello(String s1, int i2) {
		
	}
	
}
	<bean id="hello" class="com.app.Hello">
 		<constructor-arg name="i2" value="2"/><!-- 对应参数i2 -->
 		<constructor-arg name="s1" value="1"/><!-- 对应参数s1 -->
 	</bean>

但是这需要我们的class是通过debug方式进行编译的,这样Spring才能识别出对应的参数名称。当然我们也可以通过JDK提供的@ConstructorProperties注解来指定构造参数对应的名称。如:

public class Hello {

	@ConstructorProperties({"s1", "i2"})
	public Hello(String s1, int i2) {
		
	}
	
}

当我们的构造参数比较复杂,比如是一个array、list、set、map等或者需要定义一个内部的bean时,我们可以直接在constructor-arg元素中间进行定义,如:

	<bean id="hello" class="com.app.Hello">
 		<constructor-arg>
 			<bean class="com.app.World"/>
 		</constructor-arg>
 	</bean>

3.2set方法注入

set方法注入是通过property元素定义的。定义时我们需要指定property元素的name属性,其对应的值并非bean需要进行注入的属性名称,而是对应set方法去掉set前缀后首字母小写的结果。

public class Hello {

	private String prop1;
	
	public void setProp(String prop) {
		this.prop1 = prop;
	}
	
}

对于上述class定义,如果现在我们需要定义对应的bean,并通过setProp()方法将字符串“Value”注入给其私有属性prop1,那么我们的bean应该如下定义:

	<bean id="hello" class="com.app.Hello">
		<property name="prop" value="Value"/>
	</bean>

在上述示例中property元素对应的语义是setProp(“value”),即我们的注入虽然是通过property元素进行的,但其不是通过bean的某属性进行注入的,而是通过对应的set方法进行注入的。
对于基本数据类型值我们可以直接通过property元素的value属性进行注入,如果需要注入其它bean,我们可以通过在property元素下定义ref元素进行引用或者通过property元素的ref属性进行引用,也可以在property元素下定义bean元素进行注入。对于其它集合类型,如Set、List、Map、Array、Properties等则可以在property元素下通过set、list等元素进行定义。

3.3idref

当我们需要通过构造方法或者set方法给bean注入一个普通的字符串类型的值时,我们可以直接进行注入,如下就是直接将字符串“Value1”通过setP1()方法注入对应的bean的示例。

	<bean id="hello" class="com.app.Hello">
		<property name="p1" value="Value1"/>
	</bean>

当我们需要注入的普通字符串是bean容器中另一个beanbeanName时,我们还可以通过idref元素来指定对应的值,此时对应的值是通过idref元素的bean属性来指定的。当使用idref元素来指定对应的值时Spring将检查ApplicationContext中是否存在idnameidref元素的bean属性值的bean,所以当我们使用idref元素时需要我们的ApplicationContext中存在idref对应的bean。当我们需要指定的值确实是ApplicationContext中一个beanidname时,这可以帮助我们在Spring初始化对应的bean时就发现对应的错误。

	<bean id="world" class="com.app.World"/>
	<bean id="hello" class="com.app.Hello">
		<!-- 将字符串world通过bean的setP1()方法进行注入 -->
		<property name="p1">
			<!-- 注入的是字符串world,但是Spring将检查ApplicationContext中是否存在id或name为world的bean -->
			<idref bean="world"/>
		</property>
	</bean>

在上述配置中我们给idhellobean通过setP1()方法注入的是字符串world,而不是其对应的bean。由于我们是通过idref元素来注入字符串world的,Spring将检查ApplicationContext中是否存在idnameworldbean

3.4ref元素关联其它bean

不管是通过构造方法注入还是通过set方法注入依赖项,我们都可以通过ref元素关联其它的beanref元素可以用来定义对应的关联项,而真正的关联项是通过ref元素的bean属性或parent属性来指定的,它们对应的是目标beanidname

	<bean id="hello" class="com.app.Hello">
		<property name="world">
			<ref bean="world"/><!-- 关联id或name为world的bean -->
		</property>
	</bean>
	<bean id="world" class="com.app.World"/>

refbean属性关联和parent属性关联是不同的。通过bean属性指定关联时会在当前容器及其父容器中寻找关联项,而通过parent属性指定关联时只会在当前容器的父容器中寻找关联项。

	<!-- 假设是定义在父容器中的bean -->
	<bean id="parenWorld" class="com.app.World"/>
	
	<bean id="hello" class="com.app.Hello">
		<property name="world">
			<ref parent="parentWorld"/><!-- 关联父容器中id或name为world的bean -->
		</property>
	</bean>

不管是通过构造方法注入还是通过set方法注入,我们都可以通过属性ref来替代<ref bean=”…”/>,如上面的示例我们就可以替换成如下这样:

	<bean id="hello" class="com.app.Hello">
		<property name="world" ref="world"/><!-- 使用ref属性替代<ref bean="..."/> -->
	</bean>
	<bean id="world" class="com.app.World"/>

3.5复合属性的注入

设想一下我们的beanA有一个属性beanB,而beanB又有一个属性beanCbeanC又有一个属性propD,我们可以直接在定义beanA的时候指定对应的beanB的属性beanC的属性propD的值,如:

	<bean id="beanA" class="com.app.beanA">
		<property name="beanB.beanC.propD" value="ValueD"/>
	</bean>

其对应的语义是beanA.getBeanB().getBeanC().setPropD(“ValueD”),所以能够成功指定propD值的条件是getBeanB()不能为nullgetBeanB()getBeanC()也不能为null。当然,最终要注入的不一定是基本数据类型,换成是一个bean也是可以的,如:

	<bean id="beanA" class="com.app.beanA">
		<property name="beanB.beanC.beanD" ref="beanD"/>
	</bean>

(注:本文是基于Spring4.1.0所写)

0
1
分享到:
评论

相关推荐

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    Spring从入门到入土——依赖注入(DI)

    DIDependency Injection概念注入方式...Spring从入门到入土——依赖注入(DI) Spring从入门到入土——Bean的作用域 Dependency Injection 概念 依赖注入(DI) 依赖:指Bean对象的创建依赖于容器。Bean对象的依赖资

    Spring——IOC(控制反转)与DI(依赖注入).docx

    IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。... 在Spring中实现控制反转的是IOC容器 ,其 实现方法是依赖注入 (Dependency Injection,DI)

    Java课件-14-Spring-IoC-Course

    Spring容器简介——依赖注入

    javaSpring

    Spring核心机制——依赖注入,Spring与Struts 2整合应用

    Spring从入门到入土——Bean的作用域

    Spring从入门到入土——依赖注入(DI) Spring从入门到入土——Bean的作用域 Bean的作用域 ​ 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始...

    spring培训-笔记

    控制反转(IoC)/依赖注入(DI) 11 什么是控制反转/依赖注入? 11 依赖注入的三种实现形式 12 BeanFactory 14 BeanFactory管理Bean(组件)的生命周期 15 Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪...

    Spring教程  主要内容:介绍Spring的历史,Spring的概论和它的体系结构,重点阐述它在J2EE中扮演的角色。

    控制反转(IoC)/依赖注入(DI) 11 什么是控制反转/依赖注入? 11 依赖注入的三种实现形式 12 BeanFactory 14 BeanFactory管理Bean(组件)的生命周期 15 Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪(Ready...

    golang依赖注入——wire

    最近在做golang的框架,发现golang同样需要类似java中spring一样的ioc依赖注入框架。 如果项目规模小的情况下,是否有依赖注入框架问题不大,但是当项目变大之后,有一个合适的依赖注入框架是十分必要的。 通过调研...

    Spring技术内幕学习笔记.docx

    《Spring技术内幕》学习笔记1——IoC容器体系结构 ...《Spring技术内幕》学习笔记5——IoC容器的依赖注入 《Spring技术内幕》学习笔记6——IoC容器的高级特性 《Spring技术内幕》学习笔记7——AOP基础

    《Java EE应用开发基础》第五章课件(PDF版)

    济南大学《Java EE应用开发基础》课程课件(PDF版...5.2 Spring核心机制——依赖注入 5.3 Spring核心接口及基本配置 5.4 Spring AOP 5.5 Spring事务支持 5.6 Spring与Struts 2整合应用 5.7 Spring与Hibernate整合应用

    什么是依赖注入——本文作者的思想太经典了

    作者形象的讲解了Spring的以来机制,对于初学者会有很大的帮助!推荐去看看!

    Spring——DI和通过注解实现IOC和DI

    DI(依赖注入) – 问题的提出: 之前所说的IOC,其中没有提到,如果当spring保存的类中有其他属性需要赋值的话怎么办(其实可以用工厂模式来完成),所以今天我们就来解决这个问题。 – DI的概念: 当spring容器...

    跟我学spring3(8-13)

    【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3 【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3 【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring...

    初识Spring——Spring核心容器

    IOC-InversionofControl,译为控制反转,是一种遵循依赖倒置原则的代码设计思想。所谓依赖倒置,就是把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层...DI-DependencyInjection,译为依赖注入,实际上

    狂神说Java-Spring学习笔记

    4、依赖注入 5、Bean的自动装配 6、注解开发 7、代理模式 8、AOP 能学到什么:详细了解Spring基础以及使用 阅读建议: 建议配合狂神教学视频使用:...

    跟我学spring3(8-13).pdf

    11.2 实现通用层 11.3 实现积分商城层 12.1 概述 12.2 注解实现Bean依赖注入 12.3 注解实现Bean定义 12.4 基于Java类定义Bean配置元数据 12.5 综合示例-积分商城 13.1 概述 13.2 单元测试 集成测试 ——跟我学spring3

    SSH整合实例

    Struts2、Spring与Hibernate整合应用 ————学生成绩管理系统 要求: (1) 整合Struts2、Spring和...掌握Spring的开发步骤,理解依赖注入、AOP、事务管理等 掌握Struts2、Spring和Hibernate框架的整合 掌握分页技术

    Spring.3.x企业应用开发实战(完整版).part2

    4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂方法注入 4.3.4 选择注入方式的考量 4.4 注入参数详解 4.4.1 字面值 4.4.2 引用其他Bean 4.4.3 内部Bean 4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型...

Global site tag (gtag.js) - Google Analytics