SSH——Spring 依赖注入



        在上篇博文中介绍了spring控制反转,其中已经实际使用到了依赖注入:在UseManager类中声明了dao,并提供set方法,通过<property name="userDao" ref="usrDao4Oracle"/>配置。这是依赖注入的常用方式之一,而二便是通过提供声明类的构造方法,在配置文件中使用<constructor-arg ref="userDao4Mysql"/>关联具体dao。

一、依赖注入原理

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。即当某个角色(可能是一个Java实例【调用者】)需要另一个角色(另一个Java实例,【被调用者】)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也叫做依赖注入。

依赖注入的好处在于依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。

二、常见属性注入

<bean id="bean1" class="com.max.spring.Bean1">  《!--在bean1中提供一下不同属性,xml文件配置如下-->
		<property name="strValue" value="hi"></property>
		<property name="intValue" value="123"></property>
		<property name="listValue">
			<list>
				<value>list1</value>
				<value>list2</value>
			</list>			
		</property>
		<property name="setValue">
			<set>
				<value>set1</value>
				<value>set2</value>
			</set>
		</property>
		<property name="arrayValue">
			<list>
				<value>arrayValue1</value>
				<value>arrayValue2</value>
			</list>
		</property>
		<property name="mapValue">
			<map>
				<entry key="k1" value="v1"></entry>
				<entry key="k2" value="v2"></entry>
			</map>
		</property>
		
		<property name="date" value="2011/11/11"></property>
	</bean>

测试类,读取配置文件,创建bean,调用get方法输出

public class InjectionTest extends TestCase{

	private BeanFactory fac;
        
	protected void setUp() throws Exception {		
		fac= new ClassPathXmlApplicationContext("applicationContext-*.xml");
	}
	
	
	public void testInjection1()
	{
		Bean1 bean1=(Bean1)fac.getBean("bean1");
		
		System.out.println(bean1.getIntValue());
		System.out.println(bean1.getStrValue());
		System.out.println(bean1.getArrayValue());
		System.out.println(bean1.getListValue());
		System.out.println(bean1.getMapValue());
		System.out.println(bean1.getSetValue());
		System.out.println(bean1.getDate());
		
	}<span style="font-family:Microsoft YaHei;">
</span>

 三、减少xml文件配置

     在不同实体中很容易出现类似于id、name等相同的属性,在每一个bean里都去配置这些相同的property难免显得有些笨拙,为减少重复的编码操作,spring标签起到了灵活的应对。

     例如,现在分别有bean2、3、4三个类,bean2调用3,4;3、4实体里分别有几个相同属性字段,代码如下:

<bean id="bean2" class="com.bjpowernode.spring.Bean2">
		<property name="bean3" ref="bean3"/>	
		<property name="bean4" ref bean="bean4"/>
	</bean>

	<bean id="bean3" class="com.bjpowernode.spring.Bean3">
		<property name="id" value="100"/>
		<property name="name" value="zhangsan"/>
		<property name="sex" value="nan"/>
	</bean>
	
	<bean id="bean4" class="com.bjpowernode.spring.Bean4">
		<property name="id" value="100"/>
		<property name="name" value="zhangsan"/>
		<property name="sex" value="nan"/>
		<property name="age">
			<value>90</value>
		</property>
	</bean>

可将配置简化为:

	<bean id="AbstractBean" abstract="true"> --配置一个抽象bean,写好bean3、4相同的属性。
		<property name="id" value="100"/>
		<property name="name" value="zhangsan"/>
		<property name="sex" value="nan"/>
	</bean>
	<!--3、4 分别“继承”于该抽象bean-->
	<bean id="bean3" class="com.bjpowernode.spring.Bean3" parent="AbstractBean"/>
	
	<bean id="bean4" class="com.bjpowernode.spring.Bean4" parent="AbstractBean">
		<property name="age">
			<value>90</value>
		</property>
	</bean>

依赖注入的方式除了以上介绍的set 和构造方法之外,还有其他方法,各有千秋。Spring 通过依赖注入、Ioc容器控制反转,能有效地组织J2EE应用各层的对象。不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调、运行,且耦合度大大降低。这也体现了SSH中spring这个轻量级框架功不可没的地位。



 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值