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
北京大兴
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值