您的位置:首页 > 编程语言 > Java开发

SSH——Spring 依赖注入

2015-11-13 10:17 405 查看

在上篇博文中介绍了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这个轻量级框架功不可没的地位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: