`

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之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。

 

依赖注入意义:

1、  动态替换Bean依赖对象,程序更加灵活;

2、  更好实践面向接口编程,代码更清晰:在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,通过容器注入依赖实现;

3、  更好实践优先使用对象组合,而不是类继承:因为IoC容器采用注入依赖,也就是组合对象,从而更好的实践对象组合。

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

4、  增加Bean可复用性。

5、  降低Bean之间耦合。

6、  代码结构更加清晰。

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

 

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

1、  构造器注入,就是容器实例化Bean时注入那些依赖,通过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖。

2、  Setter注入,通过setter方法进行注入依赖。

3、  方法注入,能通过配置方式替换掉Bean方法,也就是通过配置改变Bean方法功能。

 

构造器注入

 

构造函数

public class HelloDIImpl implements HelloDI {
	private String message;
	private int index;

	public HelloDIImpl(String message, int index) {
		this.message = message;
		this.index = index;
	}

	@Override
	public 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" class="com.iflytek.demo.HelloDIImpl">
		<constructor-arg index="0" value="Hello byIndex" />
		<constructor-arg index="1" value="1" />
	</bean>
	<!-- 通过构造器参数类型方式依赖注入 -->
	<bean id="byType" class="com.iflytek.demo.HelloDIImpl">
		<constructor-arg type="java.lang.String" value="Hello byType" />
		<constructor-arg type="int" value="2" />
	</bean>
	<!-- 通过构造器参数名称方式依赖注入 -->
	<bean id="byName" class="com.iflytek.demo.HelloDIImpl">
		<constructor-arg name="message" 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;
	}

	@Override
	public void sayHello() {
		System.out.println(index + ":" + message);
	}
}

 

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

<!-- 通过setter方式进行依赖注入 -->
	<bean id="bySetter" class="com.iflytek.demo.HelloDIImpl02">
		<property name="message" value="Hello bySetter" />
		<property name="index">
			<value>1</value>
		</property>
	</bean>

 

注入常量

 

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

 

注入Bean ID

 

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

<bean id="bean1" class="java.lang.String">
        <constructor-arg index="0" value="test"/>
    </bean>
   
    <bean id="bean2" class="java.lang.String">
        <constructor-arg index="0" value="test"/>
    </bean>
    
    
    <bean id="ByIdrefBean" class="com.iflytek.demo.IdZR">
        <property name="id"><idref bean="bean1"/></property>
    </bean>
    <bean id="ByIdrefLocal" class="com.iflytek.demo.IdZR">
        <property name="id"><idref local="bean2"/></property>
    </bean>

 

从配置中可以看出,注入的BeanID是一个java.lang.String类型,即字符串类型,因此注入的同样是常量,只是具有校验功能。

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

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

 

注入集合

 

1List

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" class="com.iflytek.demo.ListDemo">  
        <property name="values">  
            <list value-type="java.lang.String" merge="default">                <value>1</value>  
                <value>2</value>  
                <value>3</value>  
            </list>  
       </property>  
    </bean>  

 

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

 

3、数组

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

 

<bean id="byArray" class="com.iflytek.demo.ArrayDemo">
        <property name="array">
            <array value-type="java.lang.String" 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>	

 

4Map

<bean id="byMap" class="com.iflytek.demo.MapDemo">
        <property name="values">
            <map key-type="java.lang.String" value-type="java.lang.String">
                <entry>
                    <key><value>1</value></key>
                    <value>11</value>
                </entry>
                <entry key="2" value="22"/>
            </map>
        </property>
    </bean>

 

5Properties注入

package com.iflytek.demo

	import 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" class="com.iflytek.demo.PropertiesDemo">
        <property name="values">
            <props value-type="int" merge="default">
                <prop key="1">12sw</prop>
                <prop key="2">2</prop>
            </props>
        </property>
    </bean>

    <bean id="byProperties2" class="com.iflytek.demo.PropertiesDemo">
        <property name="values">
            <value>
               1=11
               2=22,
               3=33;
               4=44
            </value>   
        </property>
    </bean>

 

引用其他Bean

 

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

 

构造器注入方式:

通过” <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;
	}

	@Override
	public void sayHello() {
		System.out.println("=====================");
		helloDi.sayHello();
		System.out.println("=====================");
	}

}

 

	<!-- 定义依赖Bean -->
	<bean id="helloDIImpl" class="com.iflytek.demo.HelloDIImpl" />
	<!-- 通过构造器注入 -->
	<bean id="byConstructor" class="com.iflytek.demo.HelloDIDecorator">
		<constructor-arg index="0" ref="helloDIImpl" />
	</bean>
	<!-- 通过构造器注入 -->
	<bean id="bySetter" class="com.iflytek.demo.HelloDIDecorator">
		<property name="helloDi">
			<ref bean="helloDIImpl" />
		</property>
	</bean>

 

内部Bean定义

	<bean id="byInner" class="com.iflytek.demo.HelloDIDecorator">
		<property name="helloDi">
			<bean id="helloDIImpl" class="com.iflytek.demo.HelloDIImpl" />
		</property>
	</bean>

处理null

 

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

 

 

分享到:
评论

相关推荐

    java Spring DI依赖注入.rar

    java Spring DI依赖注入.rar

    Spring依赖注入DI.zip

    Spring依赖注入DI.zip

    JavaEE spring 依赖注入DI入门案例

    JavaEE spring 依赖注入DI入门案例

    SpringFramework常见知识点.md

    - Spring依赖注入的方式有几种? - 一个bean的定义包含了什么?(BeanDefinition) - bean的作用域有哪些? - Spring 的扩展点主要有哪些? - Spring如何解决循环依赖? - 事务的传播行为是什么?有哪些? - 什么是AOP...

    Spring_01_入门篇_依赖注入(控制反转)_XML

    此文档仅供初学者学习,包括Spring的依赖注入(控制反转)的详细实例。以三层贯穿实例(持久层、业务层、控制层),由MAIN方法直接调用测试用例。

    spring-security-demo

    在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术 --------------------- 作者:Tuzki_小辣鸡 来源:CSDN 原文:...

    spring-di:Spring依赖注入

    春- Spring依赖注入

    spring.net依赖注入Demo

    spring.net是为.net开发者提供的一个控制反转操作框架也称作依赖注入。 此demo仅提供参考spring.net mvc+三层

    SpringDI.rar

    Spring依赖注入(DI)的例子,包括接口注入、构造注入、set注入的简单类型和复杂类型注入的例子。

    spring 控制反转和依赖注入.docx

    spring 控制反转和依赖注入进行基础知识的生命周期、延迟初始化、装配方式等进行案例总结使用。从而对spring基础知识更加理解。

    Spring中依赖注入与容器

    依赖注入、IoC/DI Spring 框架(核心)IoC 容器 IoC:控制反转  DI:依赖注入  什么是依赖?一个组件(对象)的运行需要用到另一个组件(对象),称这种关系为依赖关系  举例:鱼依赖水,生命依赖空气、阳光、水...

    springday02

    DI依赖注入,通过set方法注入和通过构造方法注入的练习

    SpringSecurity.zip

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    Spring与IoC系列三:基于XML的依赖注入测试程序di.rar

    基于XML的依赖注入测试程序,配合博客资源学习。是基于XML的依赖注入方法的测试程序!

    Spring——IOC(控制反转)与DI(依赖注入).docx

    IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。... 在Spring中实现控制反转的是IOC容器 ,其 实现方法是依赖注入 (Dependency Injection,DI)

    SpringSet方法注入

    我们学习了spring框架spring框架里面有3个优势第一个是轻量级的IOC也叫控制反转后来改名为DI也叫依赖注入,依赖注入里面有3中注入方法分别是set注入,构造器注入,注解注入,我传的是set注入的视频

    Spring框架控制反转IOC和依赖注入DI详解

    本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...

    spring dom4j 解析 依赖DI注入 ioc 反转 反射原理

    spring dom4j 解析 依赖DI注入 ioc 反转 反射原理 反射技术

    Spring与IoC系列四:基于注解的依赖注入.rar

    Spring与IoC系列四:基于注解的依赖注入。对于DI使用注解,将不再需要在Spring配置文件中声明Bean实例。Spring中使用注解,需要在原有Spring运行环境基础上再做一些改变

    [依赖注入] 依赖注入 实战 (英文版)

    [Manning Publications] 依赖注入 实战 (英文版) [Manning Publications] Dependency Injection (E-Book) ☆ 图书概要:☆ Dependency Injection is an in-depth guide to the current best practices for using ...

Global site tag (gtag.js) - Google Analytics