`
JavaCrazyer
  • 浏览: 3012107 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类

Spring温习(2)--IOC容器

阅读更多

1. Spring IoC的依赖注入
 
1) 使用构造方法来注入依赖:比较麻烦
    <constructor-arg index="构造方法参数的索引(从0开始)" value="给这个属性注入的值"/>
 
2) 使用setter方法来注入依赖:建议使用
    <property name="属性名" [value="要注入的值"|ref="引用自Spring容器中的其它JavaBean的ID"]/>
 3) 集合类型的注入
    <property>
       <set>、<list>、<map>、<props>
    </property>

首先来看看第1)和第2)的综合示例

JavaBean.java

package com.javacrazyer.bean;


public class JavaBean {
	
	private int intValue;
	private double doubleValue;
	private boolean booleanValue;
	private char charValue;
	private String stringValue;
	
	public JavaBean(){}

	public JavaBean(int intValue, double doubleValue, boolean booleanValue,
			char charValue, String stringValue) {
		super();
		this.intValue = intValue;
		this.doubleValue = doubleValue;
		this.booleanValue = booleanValue;
		this.charValue = charValue;
		this.stringValue = stringValue;
	}

	public int getIntValue() {
		return intValue;
	}

	public void setIntValue(int intValue) {
		this.intValue = intValue;
	}

	public double getDoubleValue() {
		return doubleValue;
	}

	public void setDoubleValue(double doubleValue) {
		this.doubleValue = doubleValue;
	}

	public boolean isBooleanValue() {
		return booleanValue;
	}

	public void setBooleanValue(boolean booleanValue) {
		this.booleanValue = booleanValue;
	}

	public char getCharValue() {
		return charValue;
	}

	public void setCharValue(char charValue) {
		this.charValue = charValue;
	}

	public String getStringValue() {
		return stringValue;
	}

	public void setStringValue(String stringValue) {
		this.stringValue = stringValue;
	}
	
}

 JavaBean2.java

package com.javacrazyer.bean;


public class JavaBean2 {
	
	private int intValue;
	private double doubleValue;
	private boolean booleanValue;
	private char charValue;
	private String stringValue;
	
	public JavaBean2(){}


	public int getIntValue() {
		return intValue;
	}

	public void setIntValue(int intValue) {
		this.intValue = intValue;
	}

	public double getDoubleValue() {
		return doubleValue;
	}

	public void setDoubleValue(double doubleValue) {
		this.doubleValue = doubleValue;
	}

	public boolean isBooleanValue() {
		return booleanValue;
	}

	public void setBooleanValue(boolean booleanValue) {
		this.booleanValue = booleanValue;
	}

	public char getCharValue() {
		return charValue;
	}

	public void setCharValue(char charValue) {
		this.charValue = charValue;
	}

	public String getStringValue() {
		return stringValue;
	}

	public void setStringValue(String stringValue) {
		this.stringValue = stringValue;
	}
	
	
	
}

 JavaBean4.java

package com.javacrazyer.bean;

public class JavaBean4 {
	
	public void init(){
		System.out.println("对JavaBean4进行初始化");
	}
	
	public void destroy(){
		System.out.println("对JavaBean4进行资源回收");
	}
	
}

 Spring配置applicationContext-base.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<bean id="javaBean" class="com.javacrazyer.bean.JavaBean" scope="prototype">
		<constructor-arg index="0" value="123"/>
		<constructor-arg index="1" value="456.789"/>
		<constructor-arg index="2" value="true"/>
		<constructor-arg index="3" value="中"/>
		<constructor-arg index="4" value="中国北京"/>
	</bean>
	
	<bean id="javaBean2" class="com.javacrazyer.bean.JavaBean2">
		<property name="intValue" value="321"/>
		<property name="doubleValue" value="876.54"/>
		<property name="booleanValue" value="false"/>
		<property name="charValue" value="中"/>
		<property name="stringValue" value="java"/>
	</bean>
	
	<bean id="javaBean4" class="com.javacrazyer.bean.JavaBean4" 
			init-method="init" 
			destroy-method="destroy"/>
</beans>

 

 测试示例

package com.javacrazyer.test;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.javacrazyer.bean.JavaBean;
import com.javacrazyer.bean.JavaBean2;
import com.javacrazyer.bean.JavaBean4;

public class ContstructorDITest {
	private static ApplicationContext context;
	
	
	@BeforeClass
	public static void init(){
		context = new ClassPathXmlApplicationContext("applicationContext-base.xml");
	}
	
	@Test
	public void testDI(){
		
        //构造器方式注入测试
		JavaBean jb = (JavaBean)context.getBean("javaBean");
		System.out.println(jb.getIntValue());
		System.out.println(jb.getDoubleValue());
		System.out.println(jb.isBooleanValue());
		System.out.println(jb.getCharValue());
		System.out.println(jb.getStringValue());
		//属性方式注入测试
        JavaBean2 jb2 = (JavaBean2)context.getBean("javaBean2");
		System.out.println(jb2.getIntValue());
		System.out.println(jb2.getDoubleValue());
		System.out.println(jb2.isBooleanValue());
		System.out.println(jb2.getCharValue());
		System.out.println(jb2.getStringValue());
	}
	
	@Test
	public void testScope(){
		JavaBean jb = (JavaBean)context.getBean("javaBean");
		JavaBean jb2 = (JavaBean)context.getBean("javaBean");
		System.out.println(jb == jb2);
	}
	
	@Test
	public void testInit() throws InterruptedException{
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-base.xml");
		JavaBean4 jb4 = (JavaBean4)context.getBean("javaBean4");
		jb4 = null;
		Thread.sleep(10000);
		
	}
}

 

对于testDI方法主要是构造和属性注入方式的测试方法,测试结果为

123
456.789
true

中国北京


321
876.54
false

java
对于testScope方法,其实主要是Spring中bean的创建模式,测试结果为

false

指定Spring容器管理的Bean的生存范围
  <bean>标记上有一个scope属性,它的可选值有:
   sigleton:一个容器只有Bean的一个实例。默认值
   prototype: 使用一次就创建一个实例
   request:在HTTP请求范围内。只有在使用具有Web能力的Spring容器时才有效
   session:HTTP Session范围。同上。

而对于最后一个方法testInit,则是对于bean创建和销毁时调用方法的测试,结果为

对JavaBean4进行初始化

 

集合类型的注入示例

javaBean3.java

package com.javacrazyer.bean;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;


public class JavaBean3 {
	
	private Set<String> strSet;
	private List<String> strList;
	private Map<String, String> strMap;
	private Properties props;
	private JavaBean2 javaBean2;
	
	
	public Set<String> getStrSet() {
		return strSet;
	}
	public void setStrSet(Set<String> strSet) {
		this.strSet = strSet;
	}
	public List<String> getStrList() {
		return strList;
	}
	public void setStrList(List<String> strList) {
		this.strList = strList;
	}
	public Map<String, String> getStrMap() {
		return strMap;
	}
	public void setStrMap(Map<String, String> strMap) {
		this.strMap = strMap;
	}
	public Properties getProps() {
		return props;
	}
	public void setProps(Properties props) {
		this.props = props;
	}
	public JavaBean2 getJavaBean2() {
		return javaBean2;
	}
	public void setJavaBean2(JavaBean2 javaBean2) {
		this.javaBean2 = javaBean2;
	}
	
	
}

 

Spring配置文件applicationContext-collection.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<bean id="javaBean3" class="com.javacrazyer.bean.JavaBean3">
		<property name="strSet">
			<set>
				<value>abc</value>
				<value>中国</value>
			</set>
		</property>
		
		<property name="strList">
			<list>
				<value>asdfasdf</value>
				<value>xxxx</value>
			</list>
		</property>
		
		<property name="strMap">
			<map>
				<entry key="cn" value="中国"/>
				<entry key="us" value="美国"/>
			</map>
		</property>
		
		<property name="props">
			<props>
				<prop key="xxx">XXX</prop>
			</props>
		</property>
		
		<property name="javaBean2" ref="javaBean2"/>
	</bean>
	
</beans>

 

测试类

	@Test
	public void testCollectionDI(){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-*.xml");
		//上边的-*指的就是applicationContext-base.xml和applicationContext-collection.xml
		JavaBean3 jb = (JavaBean3)context.getBean("javaBean3");
		
		System.out.println(jb.getStrSet());
		System.out.println(jb.getStrList());
		System.out.println(jb.getStrMap());
		System.out.println(jb.getProps());
		
		JavaBean2 jb2 = jb.getJavaBean2();
		if(jb2 != null){
			System.out.println("jb2.intValue" + jb2.getIntValue());
		}
	}
	

 

测试结果

[abc, 中国]
[asdfasdf, xxxx]
{cn=中国, us=美国}
{xxx=XXX}
jb2.intValue321

 

最后,介绍下继承装配

<bean>元素提供了两个特殊属性来支持装配Bean的继承:
parent:指定父类Bean的id。 相当于java中extends
abstract:如果设置为true,表示此Bean为抽象的,不能被Spring容器实例化。

具体示例

ParentBean.java

package com.javacrazyer.bean;

public class ParentBean {
	
	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

 

 ChildBean.java

package com.javacrazyer.bean;

public class ChildBean extends ParentBean {

	private String address;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}

 

 Spring配置applicationContext-adv.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<bean id="parent" class="com.javacrazyer.bean.ParentBean" abstract="true">
		<property name="name" value="javacrazyer"/>
		<property name="age" value="38"/>
	</bean>
	
	<bean id="child" class="com.javacrazyer.bean.ChildBean" parent="parent">
		<property name="address" value="北京大兴"/>
		<property name="age" value="16"/>
	</bean>
	
</beans>

 

 测试代码

	@Test
	public void testExtends(){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-*.xml");
		ChildBean c = (ChildBean)context.getBean("child");
		System.out.println(c.getName());
		System.out.println(c.getAge());
		System.out.println(c.getAddress());
	}

 测试结果

javacrazyer
16
北京大兴
  

8
0
分享到:
评论
1 楼 liu2511981 2011-05-20  
很好,呵呵,
              

不过我还是希望能看到Spring 3 的教程。。

相关推荐

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    Java-Spring-SpringIoC容器-SpringIoC的学习

    在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...

    Spring----IOC实现

    1. **IoC容器**:Spring的IoC容器是实现IoC的核心。它负责读取配置文件(XML或Java注解),创建和初始化对象,并管理它们之间的依赖关系。容器通过反射机制来实例化对象,并通过setter方法或构造函数注入依赖。 2. ...

    Spring.net二----初探IOC容器.rar源代码

    在本教程中,我们将深入探讨Spring.NET中的重要组件——IOC(Inversion of Control,控制反转)容器,以及如何通过它来管理对象的生命周期和依赖关系。 IOC容器是Spring.NET的核心,它负责创建、配置和组装应用程序...

    spring-framework-1.0-m2.zip

    例如,开发者可以定义bean的定义,包括类名、属性以及依赖的其他bean,然后由Spring容器负责创建和管理这些bean。 其次,AOP是Spring的另一大亮点。AOP允许开发者定义“切面”,这些切面可以插入到应用程序的多个点...

    Spring-ioc-jar

    这个jar文件"Spring-ioc-jar"包含了实现Spring IOC功能所需的关键类和接口,是学习和使用Spring IOC技术的基础。 Spring框架的IOC容器是其核心组件,主要由`ApplicationContext`和`BeanFactory`两个接口代表。`...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘2.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘3.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘4.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘1.zip

    023-spring-ioc-ioc容器的bean获取三种方式.mp4 024-spring-ioc-扩展组件周期方法.mp4 025-spring-ioc-扩展作用域配置.mp4 026-spring-ioc-扩展factoryBean使用.mp4 027-spring-ioc-三层架构组件管理介绍和...

    maven-spring-ioc

    IoC容器是Spring的核心,它负责管理对象的生命周期和对象间的依赖关系。在本教程中,我们将深入探讨Spring如何通过配置文件实现IoC。 ### 1. Spring IoC概述 IoC(Inversion of Control)是一种设计原则,它将控制...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    当需要使用CGLIB或Objenesis创建代理对象时,Spring容器会根据配置和上下文信息,动态地生成并管理这些代理对象。 6. **测试支持**: 在测试环境中,Objenesis可以帮助快速创建对象,尤其是那些带有复杂初始化逻辑...

    spring-01-ioc1.rar

    2. **Spring容器**:Spring的核心是IoC容器,如BeanFactory和ApplicationContext,它们负责读取配置,实例化、配置及管理Bean。 3. **Bean定义**:如何在XML或Java配置中定义Bean,包括其类名、初始化方法、属性...

    struts2-spring-plugin-2.2.1.jar

    1. **自动扫描和实例化Action类**:插件会自动扫描指定包下的Action类,并通过Spring容器来创建和管理这些Action实例。 2. **依赖注入**:Struts2的Action可以通过字段或者构造函数接收Spring管理的bean,实现依赖...

    spring-framework-master

    例如,Spring的事件驱动模型、AOP的实现原理、以及IoC容器的内部工作流程等。此外,源码还展示了Spring如何与其他技术(如JDBC、JMS、EJB等)无缝集成,以及如何利用注解简化配置。 通过阅读和分析"spring-...

    spring入门学习-2、IOC、DI知识.pdf

    ### Spring入门学习:IOC与DI详解 #### 一、什么是IOC? **IOC**,全称为 **Inversion of Control**(控制反转),它并不是一项具体的技术,而是一种设计思想。在传统的Java开发过程中,当我们需要使用某个组件时...

    struts2-spring-plugin-2.0.11.1.jar

    在Struts2中引入Spring插件,可以将Struts2的动作类(Action)声明为Spring的bean,这样Struts2就可以通过Spring容器来管理和实例化这些动作类。这样做的好处包括: 1. **依赖注入**:通过Spring的DI功能,可以方便...

    官方原版完整包 spring-framework-5.3.1.RELEASE.zip

    这些schema定义了如何编写XML配置文件,使开发者能够遵循一定的结构和约定,更规范地配置Spring容器及其组件。它们对于理解和编写Spring的XML配置文件至关重要。 在使用Spring Framework 5.3.1时,开发者可以利用其...

    spring-framework-1.0-with-dependencies.zip

    IoC使得对象的创建和管理由Spring容器负责,而不是由代码直接创建,这样降低了组件之间的耦合度。AOP则允许开发者定义“切面”,将关注点如日志、事务管理等与业务逻辑分离,提高了代码的可维护性和可复用性。 该...

    otus-spring-hw-01-ioc-xml:Otus Spring框架开发人员

    可选:用测试覆盖服务如何使项目运行从GitHub克隆存储库: git clone git@github.com:ifqthenp/otus-spring-hw-01-ioc-xml.git 使用以下命令进入文件夹: cd otus-spring-hw-01-ioc-xml 使gradlew脚本可执行(如果...

Global site tag (gtag.js) - Google Analytics