Spring注入的方式

Spring依赖注入分为两种:构造函数注入和setter方法注入;、

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 name="userInfo" class="com.openv.impl.UserInfoImpl">
		<constructor-arg>
			<ref bean="helloWorld"/>
		</constructor-arg>
	</bean>

	<!-- 当构造函数有多个参数时,可以使用constructor-arg标签的index属性,index属性的值从0开始 -->
	<bean name="helloWorld" class="com.openv.impl.HelloWorld">
		<constructor-arg index="0">
			<ref bean="fileHello"/>
		</constructor-arg>
		<constructor-arg index="1">
			<value>I am a learner.</value>
		</constructor-arg>
	</bean>

	<!-- 使用构造子注入时,则使用constructor-arg子标签,来指定构造函数的参数 -->
	<bean name="fileHello" class="com.openv.impl.HelloStrImpl">
		<constructor-arg>
			<value>helloworld.properties</value>
		</constructor-arg>
	</bean>
	
</beans>

        在上面的这个配置文件中我们主要有3个类:

        com.openv.impl.UserInfoImpl,com.openv.impl.HelloWorld,com.openv.impl.HelloStrImpl

这三个类的构造方法分别为:

public HelloWorld(HelloStr hStr,String words){
this.hStr=hStr;
this.words=words;
}
public HelloStrImpl(String profilename){
		this.profilename=profilename;
	}
UserInfoImpl(HelloWorld helloWorld){
		this.helloWorld=helloWorld;
	}

       从结合配置文件和构造方法,可以看出下面几点:1、如果构造方法中的参数类型是标准类型如字符串、数字等,在配置文件中就使用<value></value>来作为输入的参数,如果是用户定义的类那么久需要在配置文件中使用<property><ref/></property>来作为输入的参数。2、如果构造函数中含有多个参数在<constructor-args>中添加index来说明是第几个参数,默然是从0开始的。

2、使用setter方式进行注入的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
	"http://www.springframework.org/dtd/spring-beans.dtd">
	
<beans>

	<bean name="userInfo" class="com.openv.impl.UserInfoImpl">
		<property name="helloWorld">
			<ref bean="helloWorld"/>
		</property>
	</bean>

	<!-- 当构造函数有多个参数时,可以使用constructor-arg标签的index属性,index属性的值从0开始 -->
	<bean name="helloWorld" class="com.openv.impl.HelloWorld">
		<property name="hStr">
			<ref bean="fileHello"/>
		</property>
		<property name="words">
			<value>I am a learner.</value>
		</property>
	</bean>

	<!-- 使用构造子注入时,则使用constructor-arg子标签,来指定构造函数的参数 -->
	<bean name="fileHello" class="com.openv.impl.HelloStrImpl">
		<property name="profilename">
			<value>helloworld.properties</value>
		</property>
	</bean>
	
</beans>

          同样的我们也有三个类,名字分别为:

          com.openv.impl.UserInfoImpl,com.openv.impl.HelloWorld,com.openv.impl.HelloStrImpl

这3个类中没有显示的构造方法,但是他们三个类有一个共同的特点是:在这些类中都有setter方法,下面是这些类中参数的setter方法:

private String profilename;
	
	public void setProfilename(String profilename) {
		this.profilename = profilename;
	}
public void sethStr(HelloStr hStr) {
		this.hStr = hStr;
	}

	public void setWords(String words) {
		this.words = words;
	}
public void setHelloWorld(HelloWorld helloWorld) {
		this.helloWorld = helloWorld;
	}

       使用setter方法我们就能通过spring的注入。在配置文件中发生的主要变化就是<constructor-args>变为了<property>。

       在真正开发的过程中建议使用setter方法进行注入,setter方法注入时spring开发团队所提倡的,因为构造函数注入可能会出现下面的情况:A类依赖B类,B类依赖C类,C类又依赖A类,在使用构造函数注入时就会出现死锁,而使用setter方法进行注入就可以有效的解决这种情况。

       但是,构造函数注入存在也有他的原因,在没有setter方法的遗留代码或者没有源码的第三方类时,使用<contructor-args>是进行开发时很明智的选择。

       下面的代码是我做分析的源码

猜你喜欢

转载自weiliuhong1.iteye.com/blog/1070875