首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

03-Spring3 依赖注入(DI)A_配备使用【转】

2013-08-09 
03-Spring3 依赖注入(DI)A_配置使用【转】?前面我们说了简单的实例化Bean(Spring IOC),没有涉及Bean之间的关

03-Spring3 依赖注入(DI)A_配置使用【转】

?

前面我们说了简单的实例化Bean(Spring IOC),没有涉及Bean之间的关系,下面我们来说一下配置Bean之间的关系,即依赖注入(DI)。

Spring IoC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源

Bean依赖容器,就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,此处的依赖是指Bean和容器之间的依赖关系。

容器注入Bean的依赖资源容器负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。

?

依赖注入意义:

采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成,其Bean本身可能只提供少许功能或根本无任何功能,全部委托给依赖Bean,对象组合具有动态性,能更方便的替换掉依赖Bean,从而改变Bean功能。而如果采用类继承,Bean没有依赖Bean,而是采用继承方式添加新功能,,而且功能是在编译时就确定了,不具有动态性,而且采用类继承导致Bean与子Bean之间高度耦合,难以复用。

从上面看可以发现,依赖注入只是一种装配对象的手段,如何设计好类的结构才是王道。

?

前面我们了解了Bean依赖IoC容器,今天开始理一下IoC如何注入Bean的依赖资源,其实现方式主要有以下几种:

构造器注入

?

构造函数

public class HelloDIImpl implements HelloDI {private String message;private int index;public HelloDIImpl(String message, int index) {this.message = message;this.index = index;}@Overridepublic void sayHello() {System.out.println(index + ":" + message);}}

?

静态工厂类

public static HelloDIImpl newInstance(String message, int index) {     return new HelloDIImpl(message, index);  }  

?

实例工厂类

public HelloDIImpl newInstance(String message, int index) {     return new HelloDIImpl(message, index);  }  

?

<!-- 通过构造器参数索引方式依赖注入 --><bean id="byIndex" value="Hello byIndex" /><constructor-arg index="1" value="1" /></bean><!-- 通过构造器参数类型方式依赖注入 --><bean id="byType" value="Hello byType" /><constructor-arg type="int" value="2" /></bean><!-- 通过构造器参数名称方式依赖注入 --><bean id="byName" value="Hello byName" /><constructor-arg name="index" value="3" /></bean>

?

Setter注入

?

Setter注入(根据setter名字进行注入),是通过在通过构造器实例化好Bean后,通过调用Bean类的setter方法进行注入依赖。

public class HelloDIImpl02 implements HelloDI {private String message;private int index;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}@Overridepublic void sayHello() {System.out.println(index + ":" + message);}}

?

可以没有getter方法,但是完整的类还写上比较好。

<!-- 通过setter方式进行依赖注入 --><bean id="bySetter" value="Hello bySetter" /><property name="index"><value>1</value></property></bean>

?

注入常量

?

    <property name="message" value="Hello World!"/>  

?

注入Bean ID

?

用于注入Bean的ID,ID是一个常量不是引用,且类似于注入常量,但提供了错误验证功能

<bean id="bean1" value="test"/>    </bean>       <bean id="bean2" value="test"/>    </bean>            <bean id="ByIdrefBean" style="margin: 0cm 0cm 0pt;">从配置中可以看出,注入的Bean的ID是一个java.lang.String类型,即字符串类型,因此注入的同样是常量,只是具有校验功能。

<idref bean="……"/>将在容器初始化时校验注入的ID对于的Bean是否存在,如果不存在将抛出异常。

<idref local="……"/>将在XML解析时校验注入的ID对于的Bean在当前配置文件中是否存在,如果不存在将抛出异常,它不同于<idref bean="……"/>是校验发生在XML解析式而非容器初始化时,且只检查当前配置文件中是否存在相应的Bean,可能会发生不可预料的错误。因此如果想注入Bean的ID,推荐使用bean的方式。

?

注入集合

?

1、List

public class ListDemo {      private List<String> values;      public List<String> getValues() {          return values;      }      public void setValues(List<String> values) {          this.values = values;      }  }  

?

<bean id="byListBean" merge="default">                <value>1</value>                  <value>2</value>                  <value>3</value>              </list>         </property>      </bean>  

?

2、Set则将上面的List替换成Set即可。

?

3、数组

public class ArrayDemo {    private String[] array;    private String[][] array2;   //getter setter}

?

<bean id="byArray" merge="default">                <value>1</value>                <value>2</value>                <value>3</value>            </array>        </property>                <property name="array2">            <array>                <array>                    <value>1</value>                    <value>2</value>                    <value>3</value>                </array>                <array>                    <value>4</value>                    <value>5</value>                    <value>6</value>                </array>            </array>                    </property>    </bean>

?

4、Map

<bean id="byMap" value-type="java.lang.String">                <entry>                    <key><value>1</value></key>                    <value>11</value>                </entry>                <entry key="2" value="22"/>            </map>        </property>    </bean>

?

5、Properties注入

package com.iflytek.demoimport java.util.Properties;public class PropertiesDemo {        private Properties values;    public Properties getValues() {        return values;    }    public void setValues(Properties values) {        this.values = values;    }}

?

<bean id="byProperties1" merge="default">                <prop key="1">12sw</prop>                <prop key="2">2</prop>            </props>        </property>    </bean>    <bean id="byProperties2" style="margin: 0cm 0cm 0pt;">引用其他Bean

?

???? 引用其他Bean的步骤与注入常量的步骤一样,可以通过构造器注入及setter注入引用其他Bean,只是引用其他Bean的注入配置稍微变化了一下:可以将“<constructor-arg index="0" value="Hello World!"/>”和“<property name="message" value="Hello World!"/>”中的value属性替换成bean属性,其中bean属性指定配置文件中的其他Bean的id或别名。另一种是把<value>标签替换为<.ref bean=”beanName”>,bean属性也是指定配置文件中的其他Bean的id或别名。

?

构造器注入方式:

通过” <constructor-arg>”标签的ref属性来引用其他Bean,这是最简化的配置:

通过” <constructor-arg>”标签的子<ref>标签来引用其他Bean,使用bean属性来指定引用的Bean:

?

setter注入方式:

通过” <property>”标签的ref属性来引用其他Bean,这是最简化的配置:

通过” <property>”标签的子<ref>标签来引用其他Bean,使用bean属性来指定引用的Bean:

public class HelloDIDecorator implements HelloDI {private HelloDI helloDi;// 空参构造器public HelloDIDecorator() {}// 有参构造器public HelloDIDecorator(HelloDI helloDi) {this.helloDi = helloDi;}public void setHelloDi(HelloDI helloDi) {this.helloDi = helloDi;}@Overridepublic void sayHello() {System.out.println("=====================");helloDi.sayHello();System.out.println("=====================");}}

?

<!-- 定义依赖Bean --><bean id="helloDIImpl" /><!-- 通过构造器注入 --><bean id="byConstructor" ref="helloDIImpl" /></bean><!-- 通过构造器注入 --><bean id="bySetter" /></property></bean>

?

内部Bean定义

<bean id="byInner" /></property></bean>

处理null值

?

转自:http://jinnianshilongnian.iteye.com/

?

?

热点排行