SSH——Spring 依赖注入

来源:互联网 发布:linux双系统启动顺序 编辑:程序博客网 时间:2024/05/29 04:14


        在上篇博文中介绍了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这个轻量级框架功不可没的地位。



 

 

0 0
原创粉丝点击