`
一日一博
  • 浏览: 229976 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring3核心技术之DI依赖注入

阅读更多
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。顾名思义,依赖注入就是Spring管理下的Bean需要依赖Spring容器来帮他注入属性。
这篇博客对IOC和DI有比较好的解释:http://jinnianshilongnian.iteye.com/blog/1471944

Spring IoC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源。
● Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,这也正是IoC名字的由来,此处的有依赖是指Bean和容器之间的依赖关系。
● 容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。

从以上我们可以看出,其实依赖注入只是一种装配对象的手段,设计的类结构才是基础,如果设计的类结构不支持依赖注入,Spring IoC容器也注入不了任何东西,从而从根本上说“如何设计好类结构才是关键,依赖注入只是一种装配对象手段”。
Spring注入依赖资源主要有以下两种常用实现方式
● 构造器注入:就是容器实例化Bean时注入那些依赖,通过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖(一般不推荐使用)
● setter注入:通过setter方法进行注入依赖(推荐使用)
还有静态工厂方法和实例工厂方法注入(不常用),用法请看博客:
http://jinnianshilongnian.iteye.com/blog/1415277

下面这个Demo用到了Spring属性注入的两种方法(构造器注入和set方法注入)
Spring不仅能注入简单类型数据,还能注入集合(Collection、无序集合Set、有序集合List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据:

public class MyBeanA implements MyBean{
	private String myName;
	private Long myAge;
	private Map<String, String> resultMap;
	private String arg1;
	private Long arg2;
	private Boolean b1;
	private Boolean b2;
	private Boolean b3;
	private Properties pros;
	private Double[] nums;

	//无参构造方法
	public MyBeanA() {}

	//构造函数 接收配置文件constructor-arg标签的参数
	//@java.beans.ConstructorProperties({"arg1", "arg2"}) 
	public MyBeanA(String arg1, Long arg2, Boolean b1, Boolean b2, Boolean b3) {
		this.arg1 = arg1;
		this.arg2 = arg2;
		this.b1= b1;
		this.b2= b2;
		this.b3= b3;
	}
	
	public void domain() {
		System.out.println("MyBeanA is executing...");
		for (int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]);
		}
		System.out.println(pros.getProperty("1"));
		System.out.println(myName);
		System.out.println(myAge);
		System.out.println(arg1);
		System.out.println(arg2);
		System.out.println(b1);
		System.out.println(b2);
		System.out.println(b3);
		if (resultMap != null) {
		    System.out.println(resultMap.values());
		}
	}
	//省略set方法
}

public class MyBeanB implements MyBean{

	private MyBeanA beanA;

	public void setBeanA(MyBeanA myBeanA) {
		this.beanA = myBeanA;
	}
	
	public void domain() {
		System.out.println("MyBeanB is executing...");
		beanA.domain();
	}

}

public class MyBeanC {
	private Set<MyBean> beanSet;
	private List<MyBean> beanList;
	private MyBean money;
	
	public void execute() {
		System.out.println("MyBeanC is executing...");
		System.out.println(money == null);
		for (MyBean myBean : beanList) {
			myBean.domain();
		}
	}

	//set方法
}

下面是配置文件applicationContext.xml的配置:
Spring的容错处理:注意“value”中指定的全是字符串,由Spring容器将此字符串转换成属性所需要的类型,如果转换出错,将抛出相应的异常。
Spring容器目前能对各种基本类型把配置的String参数转换为需要的类型。Spring类型转换机制对于boolean类型进行了容错处理,除了可以使用“true/false”标准的Java值进行注入,还能使用“yes/no”、“on/off”、“1/0”来代表“true/false”。

<beans ....>
	<bean id="bean_a" class="com.chou.spring.bean.MyBeanA">
		<!-- constructor-arg即通过构造函数注入,value值表示注入值,ref表示bean的id -->
		<!-- <constructor-arg  ref="beanId"/> -->
		<constructor-arg index="0" value="Hello Spring"/>
		<constructor-arg type="java.lang.Long" value="222"/>
		<!-- 注入Boolean类型数据 -->
		<constructor-arg type="java.lang.Boolean" value="1"/>
		<constructor-arg type="java.lang.Boolean" value="on"/>
		<constructor-arg type="java.lang.Boolean" value="no"/>

		<!-- property代表是通过set方法注入,value表示注入的内容,ref表示bean的id -->
		<property name="myName" value="Iverson"/>
		<property name="myAge" value="22"/>
		<property name="resultMap">
			<map key-type="java.lang.Long" value-type="java.lang.String">
				<entry key="1" value="用户或密码错"/>
				<entry key="2" value="手机号码前缀错误"/>
				<entry key="3" value="内容存在关键字错误"/>
				<entry key="4" value="超出流量"/>
			</map>
		</property>
<!-- 注入java.util.Properties类型数据,虽然指定了value-type,但是这里不起作用,键和值默认String -->
		<property name="pros">
			<props value-type="java.lang.Long">
				<prop key="1">First</prop>
				<prop key="2">Garent</prop>
				<prop key="3">Tomcat</prop>
			</props>
		</property>

<!-- 注入数组 -->
		<property name="nums">
			<array value-type="java.lang.Double">
				<value>100.11</value>
				<value>100</value>
				<value>10088</value>
			</array>
		</property>
	</bean>
	
	
	<bean id="bean_b" class="com.chou.spring.bean.MyBeanB">
		<property name="beanA" ref="bean_a"/>
	</bean>
	
	<bean id="bean_c" class="com.chou.spring.bean.MyBeanC">
		<!-- 注入Collection类型 -->
		<property name="beanSet">
			<set value-type="com.chou.spring.bean.MyBean">
				<ref bean="bean_a" />
				<ref bean="bean_b" />
			</set>
		</property>
		<property name="beanList">
			<list value-type="com.chou.spring.bean.MyBean">
				<ref bean="bean_a" />
				<ref bean="bean_b" />
			</list>
		</property>
		<!-- null值注入 -->
		<property name="money">
			<null/>
		</property>
	</bean>
	
</beans>

String[] configs = new String[] {"applicationContext.xml"};
ApplicationContext cxt = new ClassPathXmlApplicationContext(configs);		
MyBeanC c = cxt.getBean("bean_c",MyBeanC.class);
c.execute();
分享到:
评论

相关推荐

    java Spring DI依赖注入.rar

    Java Spring 框架是企业级Java应用开发的首选框架之一,其核心特性之一就是依赖注入(Dependency Injection,简称DI)。依赖注入是一种设计模式,它允许我们解耦组件,提高代码的可测试性和可维护性。Spring框架通过...

    Spring 核心机制(依赖注入)

    Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度,提高软件的可维护性和可扩展性,还能简化项目配置,...

    spring依赖注入底层详解

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...

    Spring Ioc 注解 依赖注入

    其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...

    spring依赖注入

    Spring依赖注入是Spring框架的核心特性之一,它使得对象之间的依赖关系得以解耦,增强了代码的可测试性和可维护性。依赖注入(Dependency Injection,简称DI)的理念是,一个对象不应该负责寻找并创建它所依赖的对象...

    Spring依赖注入DI.zip

    Spring框架的依赖注入(Dependency Injection,简称DI)是其核心特性之一,它使得应用程序的组件之间可以松散耦合,增强了代码的可测试性和可维护性。在Spring框架中,DI通过控制反转(Inversion of Control,IoC)...

    廖雪峰 Spring 2.0 核心技术与最佳实践 高清扫描版

    该教程首先会介绍Spring的基本概念,包括依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC),这是Spring的核心设计理念,能够帮助开发者降低组件之间的耦合度,提高代码的可测试性和可...

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

    Spring 框架的核心是控制反转(IOC)和依赖注入(DI),它可以将对象的创建和依赖关系管理,实现高内聚、低耦合的开发模式。 下面是 Spring 框架的核心知识点: 1. 控制反转(IOC):控制反转是 Spring 框架的...

    Java开发学习(六)----DI依赖注入之setter及构造器注入解析.doc

    Java 开发学习(六)----DI 依赖注入之 setter 及构造器注入解析 本文将详细介绍 Java 中的依赖注入(Dependency Injection,简称 DI),特别是 setter 注入和构造器注入两种方式的使用和实现。 一、DI 依赖注入 ...

    spring学习:依赖注入的几种方式讨论

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...

    SPRING DI注入例子

    Spring框架的Dependency Injection(DI,依赖注入)是其核心特性之一,它允许开发者在运行时通过容器来管理对象及其依赖关系,而不是硬编码这些依赖。这样可以提高代码的可测试性和可维护性,降低了组件之间的耦合度...

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...

    spring依赖注入的实现原理

    在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)实现了组件之间的解耦。 ### 依赖注入的基本概念 依赖注入允许开发者在不修改代码的情况下,通过配置来改变对象间的依赖关系。...

    模仿Spring依赖注入

    【Spring依赖注入详解】 ...总结,Spring的依赖注入机制是其核心特性之一,它极大地提高了代码的可读性、可维护性和可测试性。理解并熟练掌握依赖注入,能够帮助开发者构建更健壮、更灵活的Java应用。

    Spring依赖注入检查.

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际...

    第三章 Spring4 依赖注入

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化了这一特性,使其更加灵活和强大。本篇文章将...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

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

    其中,依赖注入是Spring的核心特性之一,它使得代码更加灵活、可测试且易于维护。 依赖注入允许开发者将对象间的依赖关系解耦,不再由对象自身负责创建和查找依赖的对象,而是由外部容器(如Spring IoC容器)来管理...

    Spring依赖注入使用静态工厂设注入demo

    在Spring框架中,依赖注入(Dependency Injection,DI)是一种核心设计模式,它使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本篇将详细讲解如何使用静态工厂方法进行依赖注入,结合提供的...

Global site tag (gtag.js) - Google Analytics