`
hhr_michael
  • 浏览: 74285 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

struts2+hibernate3+spring2读书笔记15(核心机制-----IOC)

阅读更多

                                     第16章 核心机制-----IOC   

本章导读语
      Spring框架所提供的众多功能之所以能成为一个整体正是建立在IoC的基础之上,IoC是Spring中极其重要的一部分,可谓是Spring的灵魂。

   本章将讲述IoC的知识,包括IoC的相关概念(例如实现的基本原理、IoC容器的概念等),另外还将讲述实例化容器和bean的几种方式,以及Spring中注入的几种方式。另外,Spring一般采用XML格式来配置,因此还讲述了Spring的基本配置,并重点讲述了bean属性及构造参数的配置。


一. 解说IoC的相关概念

1. 建立工程(建立一个名为springioc的web工程)

2. 控制反转的基本原理(IoC指的就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接控制。即组件之间的依赖关系由容器在运行期决定,下面以实例的形式演示IoC的原理)

(1) 编写影片类:Movie.java

package amigo.spring.ioc.conception;


/**
 * 影片类
 * */
public class Movie {
	/**影片ID.*/
	private long id;
	/**影片名称*/
	private String name;
	/**导演*/
	private String director;
	/**男演员*/
	private String actor;
	/**女演员*/
	private String actree;
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDirector() {
		return director;
	}
	public void setDirector(String director) {
		this.director = director;
	}
	public String getActor() {
		return actor;
	}
	public void setActor(String actor) {
		this.actor = actor;
	}
	public String getActree() {
		return actree;
	}
	public void setActree(String actree) {
		this.actree = actree;
	}
}

(2)编写影片查找器接口类:MovieFinder.java

   
package amigo.spring.ioc.conception;

import java.util.List;

public interface MovieFinder {
			List findAll();
}


(3)编写影片查找器SampleMovieFinder.java

 
package amigo.spring.ioc.conception;

import java.util.ArrayList;
import java.util.List;

/**查找器方法实现类*/
public class SampleMovieFinder implements MovieFinder {
		public List findAll(){
			List moveList = new ArrayList();
			
			Movie movie1 = new Movie();
			movie1.setId(1);
			movie1.setName("花样年华");
			movie1.setActree("张曼玉");
			movie1.setActor("梁朝伟");
			movie1.setDirector("王家卫");
			moveList.add(movie1);
			
			Movie movie2 = new Movie();
			movie2.setId(2);
			movie2.setName("茉莉 花");
			movie2.setActree("章子怡");
			moveList.add(movie2);
			
			Movie movie3 = new Movie();
			movie3.setId(3);
			movie3.setName("玉观音");
			movie3.setActree("孙俪");
			movie3.setActor("佟大为");
			moveList.add(movie3);
			
			
			Movie movie4 = new Movie();
			movie4.setId(4);
			movie4.setName("2046");
			movie4.setActree("张曼玉");
			moveList.add(movie4);
			
			return moveList;
		}

}


(4)编写影片查找器工厂类:sampleMovieFinder.java

   
package amigo.spring.ioc.conception;

/**影片查找器的工作类*/
public class MovieFinderFactory {
	public static MovieFinder getFinder(String finderName){
		MovieFinder finder= null;
		if("sampleFinder".equals(finderName)){
			finder = new SampleMovieFinder();
		}else{
			
			
		}
		return finder;
	}
}

(5)编写测试类:MovieLister.java

    package amigo.spring.ioc.conception;

import java.util.Iterator;
import java.util.List;

class MovieLister {
	private MovieFinder finder ;
	public MovieLister(){
		finder = MovieFinderFactory.getFinder("sampleFinder");	
	}
	
	public Movie[] moviesActressBy(String arg){
		List allMovies = finder.findAll();
		for(Iterator it=allMovies.iterator();it.hasNext();){
			Movie movie = (Movie)it.next();
			if(!movie.getActree().equals(arg)){
				it.remove();	
			}
		}
		return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
	}
	
	public static void main(String[] args){
		MovieLister lister = new MovieLister();
		Movie[] movies = lister.moviesActressBy("张曼玉");
		System.out.println("有"+movies.length+"部电影");
		for(int i=0;i<movies.length;i++){
			Movie movie = movies[i];
			System.out.println("影片id="+movie.getId()+",影片名称="+movie.getName());
			
		}
		
	}
	
}


Spring中的IoC所起的作用就相当于MovieFinderFactory类,它负责给需要某接口的实现类的某个类注入实现类。


二. XML格式配置元数据

1. 基本结构
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
	
	<bean id=" " class="" >
    ……….
</bean>

	<bean id=" " class="" >
    ……….
</bean>

</beans>


2.<beans>元素的配置

<beans>为配置文件的根元素,它可包含0到多个<bean>元素。它有如下属性:
(1) default-autowire:该属性用于指定默认的bean自动装配模式。
(2) default-dependency-check:该属性用于指定默认的依赖检查模式。
 none:不进行依赖检查。没有指定值的bean属性仅仅是没有设值。
 Simple:对于基本类型和集合(除了合作者外,比如其他的bean,所有东西)进行依赖检查。
 Object:对合作者进行信赖检查。
 All:对合作者,基本类型和集合都进行依赖检查。
(3)Default-lazy-init:该属性用于指定是否默认延迟加载。值为true表示延迟加载,为false表示非延迟加载
  
3.<bean>元素的基本配置
   <bean>元素为<beans>元素的子元素,它用于指明Spring容器一个类以及指明它是如何配置的。它具有如下属性:

 class:该属性用于指定类的全路径,例如amigo.spring.chapter16.SMSSender.
 id:class属性对应的类在BeanFactory中的唯一标识,代码中可通过该名称在BeanFactory获取类实例。
 name:同上,如果给bean增加别名,可以通过name属性指定一个或多个id
 scope:用于指定bean的作用域。Spring支持5种作用域
 abstract:设定ApplicationContext是否对bean进行预先的初始化。
 parent:定义一个模板。
 autowire:bean自动装配模式。
 dependency-check:依赖检查模式,同<beans>元素的default-dependency-check属性。
 lazy-init:延迟加载。
 init-method:该属性用于指定初始化方法,一般用于一些资 源的初始化工作。
 destroy-method:该属性用于指定销毁方法。
 factory-bean:该属性用于指定通过实例工厂方法创建bean,class属性必须为空,factory-bean属性必须指定一个bean的名字,这个bean一定要在当前的bean工厂或者父bean工厂中,并包含工厂方法。
 factory-method:该属性用于设定工厂类的工厂方法。
 depends-on:该属性用于指定Bean依赖关系。一般情况下无需设定。通过depends-on指定其依赖关系可保证在此Bean加载之前,首先对depends-on所指定的资源进行加载。

4.<property>元素的基本配置

<property>属性为<bean>元素的子元素,它用于设轩置一个属性。
 name:该属性用于指定属性的名称。
 value:用于指定bean的属性值。
 ref:指定了属性对BeanFactory中其他Bean的引用关系。


三. 实例化容器的几种方法

1. 创建包amigo.sqring.ioc.container

2. 编写辅助测试Bean:HelloBean.java
package amigo.spring.ioc.container;

/**
 * 实例化容器实例辅助类,用于输出Hello信息.
 * */
public class HelloBean {
		public void sayHelloWorld(){
				System.out.println("hello,amigo");
			
		}
}



3. 编写Spring配置文件:container.xml(该文件定义了一个bean:helloBean,指定的类为amigo.spring.ioc.container.HelloBean)

<?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:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

		<bean id="helloBean" class="amigo.spring.ioc.container.HelloBean"></bean>
</beans>


4. 获取Spring配置文件的三种方法(创建测试类Test.java)

package amigo.spring.ioc.container;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;


/**
 * 实例化容器测试类
 * */
public class Test {
	public static void main(String[] args){
			//方式一:在CLASSPATH路径下获取XMLBeanFactory实例
			ClassPathResource res = new ClassPathResource("container.xml");
			XmlBeanFactory factory = new XmlBeanFactory(res);
			HelloBean hellobean = (HelloBean)factory.getBean("helloBean");
			hellobean.sayHelloWorld();
			
			//方式二:指定绝对路径建ApplicatinContext实例
			FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("D:\\My_Struts_Cvs8\\springioc\\src\\container.xml");
			BeanFactory factory2 = (BeanFactory) context;
			HelloBean hellobean2 = (HelloBean)factory2.getBean("helloBean");
			hellobean2.sayHelloWorld();
			
			//方式三:通过ClassPathXmlApplicationContext创建BeanFactory实例
			ClassPathXmlApplicationContext context3 = new  ClassPathXmlApplicationContext("container.xml");
			BeanFactory factory3 = (BeanFactory) context3;
			HelloBean hellobean3 = (HelloBean)factory3.getBean("helloBean");
			hellobean3.sayHelloWorld();
	}
}


5. 容器的使用,容器接口类BeanFactory包括如下方法:

(1)containsBean(String):如果BeanFactory包含给定名称的bean定义(或bean实例),则返回true.
(2) getBean(String):返回以给定名字注册的bean实例。
(3)getBean(String ,Class):返回以给定名称注册的bean实例,并转换为给定class类型的实
        (4)getType(String name):返回给定名称的bean的class.
(5)isSingleton(String):判断给定名称的bean定义(或bean实例)是否为singleton模式。
    (6)getAliases(String):返回给定bean名称的所有别名的数组。

为了讲述其使用,在amigo.spring.ioc.container中创建ContainerUser.java类,该类的代码如下:

package amigo.spring.ioc.container;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * 展示容器对象BeanFactory的使用
 * */

public class ContainerUser {
	public static void main(String[] args){
		ClassPathResource res = new ClassPathResource("container.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res);
		boolean containFlag = factory.containsBean("helloBean");
		System.out.println("是否包含名为helloBean的bean:"+containFlag);
		if(containFlag){
			HelloBean hellobean =(HelloBean)factory.getBean("helloBean");
			hellobean.sayHelloWorld();
			System.out.println("成功通过getBean(String)获得Bean实例");
			
			HelloBean hellobean2 =(HelloBean)factory.getBean("helloBean",HelloBean.class);
			hellobean2.sayHelloWorld();
			System.out.println("成功通过getBean(String,Class)获得Bean实例");
			
			
			boolean isSingleton = factory.isSingleton("helloBean");
			System.out.println("helloBean是否为Singleton:"+isSingleton);
			
			Class type = factory.getType("helloBean");
			System.out.println("helloBean的类的类型为:"+type.getName());
			
			String[] aliases=factory.getAliases("helloBean");
			System.out.println("helloBean的类的别名个数为:"+aliases.length);
			
		}
		
	}
}


四. 实例化bean的3种方式


就Spring IoC容器而言,bean定义基本上描述了创建一个或多个实际bean对象的内容,当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数使用反射机制来创建一个实际的对象。
1. 创建包amigo.spring.ioc.bean
2. 编写用户对象类:UserBean.java

package amigo.spring.ioc.bean;

/**
 * 用户对象
 * */
public class UserBean {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	/**
	 *创建UserBean对象
	 *@retrun 返回UserBean对象,
	 *设置其username为:amigo1,密码为:123 
	 **/
	public static UserBean createUserBean(){
		UserBean user=new UserBean();
		user.setUsername("amigo1");
		user.setPassword("123");
		return user;
	}
}



3.编写UserBean的工厂类:UserBeanFactory.java

package amigo.spring.ioc.bean;

/**
 * UserBean的工厂类.
 **/

public class UserBeanFactory {

		/**
		 * 创建UserBean对象。
		 * @return返回UserBean对象,
		 * 设置其username为:amigo2,密码为:123456 注:需要注意的是,使用实例化工厂方法时,该方法不能声明static.
		 * */
	public UserBean createUserBean(){
			UserBean user = new UserBean();
			user.setUsername("amigo2");
			user.setPassword("123456");
			return user;
		
	}
}


4.编写测试类:Test.java

package amigo.spring.ioc.bean;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * bean实例化测试类
 * */
public class Test {
	public static void main(String[] args){
	//使用构造器实例化
	ClassPathResource res1 = new ClassPathResource("bean1.xml");
	XmlBeanFactory factory1 = new XmlBeanFactory(res1);
	UserBean userBean1 = (UserBean)factory1.getBean("userBean");
	System.out.println("使用构造器实例化,username="+userBean1.getUsername()+",password="+userBean1.getPassword());
	
	//使用静态工厂方法实例化
	ClassPathResource res2 = new ClassPathResource("bean2.xml");
	XmlBeanFactory factory2 = new XmlBeanFactory(res2);
	UserBean userBean2 = (UserBean)factory2.getBean("userBean");
	System.out.println("使用静态工厂方法实例化,username="+userBean2.getUsername()+",password="+userBean2.getPassword());
	
	//使用实例工厂方法实例化
	ClassPathResource res3 = new ClassPathResource("bean3.xml");
	XmlBeanFactory factory3 = new XmlBeanFactory(res3);
	UserBean userBean3 = (UserBean)factory3.getBean("userBean");
	System.out.println("使用实例工厂方法实例化,username="+userBean3.getUsername()+",password="+userBean3.getPassword());
	
	
	}
	
}



5.用构造器实例化(bean1.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:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

		<bean id="userBean" class="amigo.spring.ioc.bean.UserBean"></bean>
</beans>



6. 使用静态工厂方法实例化(bean2.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:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

		<bean id="userBean" class="amigo.spring.ioc.bean.UserBean" factory-method="createUserBean"/>
		
</beans>


7. 使用实例工厂方法实例化(bean3.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:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
		
		<bean id="userBeanFactory" class="amigo.spring.ioc.bean.UserBeanFactory"/>
		<bean id="userBean" factory-bean="userBeanFactory" factory-method="createUserBean"/>
		
</beans>


最后运行结果为:
使用构造器实例化,username=null,password=null
使用静态工厂方法实例化,username=amigo1,password=123
使用实例工厂方法实例化,username=amigo2,password=123456


五. 注入方式---构造子注入

1. 建立包目录

2. 编写短信类SMSSender.java(SMSSender1.java类用于发送短信,所需要的参数采用构造函数的方式注入,本例只是演示Spring构造函数注入的方式,所以发送短信的方法并没有给出实现,该类的代码如下所示:)

package amigo.spring.chapter16;

/**
 * 短信发送
 * */
public class SMSSender1 {
	public SMSSender1(
			int msgType,
			int needReport,
			int msgLevel,
			String serviceID,
			int msgFormat,
			String feeType,
			int feeUserType,
			String feeCode,
			String validTime,
			String atTime,
			String srcTermID
			){
		this.msgType=msgType;
		this.needReport=needReport;
		this.msgLevel=msgLevel;
		this.serviceID=serviceID;
		this.msgFormat=msgFormat;
		this.feeType=feeType;
		
		
		this.feeUserType=feeUserType;
		this.feeCode=feeCode;
		this.validTime=validTime;
		this.atTime=atTime;
		this.srcTermID=srcTermID;
		
	}
		/**0消息类型*/
		int msgType;
		/**1是否需要状态报告*/
		int needReport;
		/**1消息发送优先级别*/
		int msgLevel;
		/**11111 业务代码*/
		String serviceID;
		/**15消息格式*/
		int msgFormat;
		/**01计费类型*/
		String feeType;
		/**00用户类型*/
		int feeUserType;
		/**123456计费代码*/
		String feeCode;
		/**有效期*/
		String validTime;
		/**定时发送时间*/
		String atTime;
		/**11111源用户号码*/
		String srcTermID;
		public int getMsgType() {
			return msgType;
		}
		public void setMsgType(int msgType) {
			this.msgType = msgType;
		}
		public int getNeedReport() {
			return needReport;
		}
		public void setNeedReport(int needReport) {
			this.needReport = needReport;
		}
		public int getMsgLevel() {
			return msgLevel;
		}
		public void setMsgLevel(int msgLevel) {
			this.msgLevel = msgLevel;
		}
		public String getServiceID() {
			return serviceID;
		}
		public void setServiceID(String serviceID) {
			this.serviceID = serviceID;
		}
		public int getMsgFormat() {
			return msgFormat;
		}
		public void setMsgFormat(int msgFormat) {
			this.msgFormat = msgFormat;
		}
		public String getFeeType() {
			return feeType;
		}
		public void setFeeType(String feeType) {
			this.feeType = feeType;
		}
		public int getFeeUserType() {
			return feeUserType;
		}
		public void setFeeUserType(int feeUserType) {
			this.feeUserType = feeUserType;
		}
		public String getFeeCode() {
			return feeCode;
		}
		public void setFeeCode(String feeCode) {
			this.feeCode = feeCode;
		}
		public String getValidTime() {
			return validTime;
		}
		public void setValidTime(String validTime) {
			this.validTime = validTime;
		}
		public String getAtTime() {
			return atTime;
		}
		public void setAtTime(String atTime) {
			this.atTime = atTime;
		}
		public String getSrcTermID() {
			return srcTermID;
		}
		public void setSrcTermID(String srcTermID) {
			this.srcTermID = srcTermID;
		}
	
		/**
		 * 以二进制发送短信
		 * @param chargeTermID 计费手机号
		 * @param destTermID 目的手机号
		 * @param content 字节内容
		 * @return 返回完整的返回信息,操作成功时返回:“发送成功”,其余都为错误的情况
		 * */
		
			public String send(
				final String chargeTermID,
				final String destTermID,
				final byte[]content){
				String resultInfo="100";
				//.....
				return resultInfo;
				
			}
			
		
}


3. 编写Spring配置文件,具体内容如下:

<?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.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
	default-autowire="byName" default-lazy-init="true">

	<!-- 构造方法注入 -->

	<bean id="SMSSender1" class="amigo.spring.chapter16.SMSSender1">
		<constructor-arg index="0">
			<value>0</value>
		</constructor-arg>

		<constructor-arg index="1">
			<value>1</value>
		</constructor-arg>

		<constructor-arg index="2">
			<value>1</value>
		</constructor-arg>

		<constructor-arg index="3">
			<value>11111</value>
		</constructor-arg>

		<constructor-arg index="4">
			<value>15</value>
		</constructor-arg>

		<constructor-arg index="5">
			<value>01</value>
		</constructor-arg>
		
		<constructor-arg index="6">
			<value>01</value>
		</constructor-arg>

		<constructor-arg index="7">
			<value>000001</value>
		</constructor-arg>

		<constructor-arg index="8">
			<value></value>
		</constructor-arg>

		<constructor-arg index="9">
			<value></value>
		</constructor-arg>

		<constructor-arg index="10">
			<value>13555555555</value>
		</constructor-arg>
	</bean>

</beans>


4. 编写测试类TestSMSSender1.java

package amigo.spring.chapter16;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;


public class TestSMSSender1 {
	
	public static void main(String[] args){
			ClassPathResource res = new ClassPathResource("applicationContext.xml");
			XmlBeanFactory factory = new XmlBeanFactory(res);
			SMSSender1 sender1 = (SMSSender1)factory.getBean("SMSSender1");
			System.out.println(sender1.getSrcTermID());
		
	} 
}



最后结果打印出了srcTermID的值为:13555555555

六. 注入方式 ---setter方法注入


1. 编写短信类SMSSender2.java(此类与SMSSender1.java略有不同,它去掉了构造函数)

package amigo.spring.chapter16;
/**
 * 短信发送
 * */
public class SMSSender2 {
	/**0消息类型*/
	int msgType;
	/**1是否需要状态报告*/
	int needReport;
	/**1消息发送优先级别*/
	int msgLevel;
	/**11111 业务代码*/
	String serviceID;
	/**15消息格式*/
	int msgFormat;
	/**01计费类型*/
	String feeType;
	/**00用户类型*/
	int feeUserType;
	/**123456计费代码*/
	String feeCode;
	/**有效期*/
	String validTime;
	/**定时发送时间*/
	String atTime;
	/**11111源用户号码*/
	String srcTermID;
	public int getMsgType() {
		return msgType;
	}
	public void setMsgType(int msgType) {
		this.msgType = msgType;
	}
	public int getNeedReport() {
		return needReport;
	}
	public void setNeedReport(int needReport) {
		this.needReport = needReport;
	}
	public int getMsgLevel() {
		return msgLevel;
	}
	public void setMsgLevel(int msgLevel) {
		this.msgLevel = msgLevel;
	}
	public String getServiceID() {
		return serviceID;
	}
	public void setServiceID(String serviceID) {
		this.serviceID = serviceID;
	}
	public int getMsgFormat() {
		return msgFormat;
	}
	public void setMsgFormat(int msgFormat) {
		this.msgFormat = msgFormat;
	}
	public String getFeeType() {
		return feeType;
	}
	public void setFeeType(String feeType) {
		this.feeType = feeType;
	}
	public int getFeeUserType() {
		return feeUserType;
	}
	public void setFeeUserType(int feeUserType) {
		this.feeUserType = feeUserType;
	}
	public String getFeeCode() {
		return feeCode;
	}
	public void setFeeCode(String feeCode) {
		this.feeCode = feeCode;
	}
	public String getValidTime() {
		return validTime;
	}
	public void setValidTime(String validTime) {
		this.validTime = validTime;
	}
	public String getAtTime() {
		return atTime;
	}
	public void setAtTime(String atTime) {
		this.atTime = atTime;
	}
	public String getSrcTermID() {
		return srcTermID;
	}
	public void setSrcTermID(String srcTermID) {
		this.srcTermID = srcTermID;
	}

	/**
	 * 以二进制发送短信
	 * @param chargeTermID 计费手机号
	 * @param destTermID 目的手机号
	 * @param content 字节内容
	 * @return 返回完整的返回信息,操作成功时返回:“发送成功”,其余都为错误的情况
	 * */
	
		public String send(
			final String chargeTermID,
			final String destTermID,
			final byte[]content){
			String resultInfo="100";
			//.....
			return resultInfo;
			
		}
		
	
}



2.修改配置文件applicationContext.xml
   添加如下bean:


    
<!--setter 方式注入  -->
	<bean id="SMSSender2" class="amigo.spring.chapter16.SMSSender2">
		<property name="msgType" value="0"/>
		<property name="needReport" value="1"/>
		<property name="msgLevel" value="1"/>
		<property name="serviceID" value="11111"/>
		<property name="msgFormat" value="15"/>
		<property name="feeType" value="01"/>
		<property name="feeUserType" value="01"/>
		<property name="feeCode" value="000001"/>
		<property name="validTime" value=""/>
		<property name="atTime" value=""/>
		<property name="srcTermID" value="13555555555"/>
	</bean>



3.编写测试类:
package amigo.spring.chapter16;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class TestSMSSender2 {
	public static void main(String[] args){
		ClassPathResource res = new ClassPathResource("applicationContext.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res);
		SMSSender2 sender2 = (SMSSender2)factory.getBean("SMSSender2");
		System.out.println(sender2.getSrcTermID());
	
} 
}



七.注入方式---接口注入


   1.编写接口类UserBean.java

package amigo.spring.chapter16;

import java.util.List;

public interface UserBean {
	public List getUserList();
	
	public void saveUser(String loginName,String password);
	
	public void updateUser(String loginName,String password);
	
	public void deleteUser(String loginName);
}


2.编写实现类UserBeanImpl.java

package amigo.spring.chapter16;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserBeanImpl implements UserBean {

	@Override
	public void deleteUser(String loginName) {
		// TODO Auto-generated method stub

	}

	@Override
	public List getUserList() {
		List userList = new ArrayList();
		Map userMap1 = new HashMap();
		userMap1.put("loginName", "amigo");
		userMap1.put("password","xiexingxing");
		
		Map userMap2 = new HashMap();
		userMap2.put("loginName", "xiexingxing");
		userMap2.put("password", "xiexingxing");
		
		userList.add(userMap1);
		userList.add(userMap2);
		
		return userList;
	}

	@Override
	public void saveUser(String loginName, String password) {
		// TODO Auto-generated method stub

	}

	@Override
	public void updateUser(String loginName, String password) {
		// TODO Auto-generated method stub

	}

}


3.编写接口注入类InterfaceInject.java

package amigo.spring.chapter16;

public class InterfaceInject {
	private UserBean userBean;
		public void setUserBean(UserBean userBean){
			this.userBean=userBean;
		}
		public void printUserListSize(){
			System.out.println("userList's size is:"+userBean.getUserList().size());	
		}
}



4.编写Spring配置文件(在原有的配置文件上加上如下的bean)


<!-- 接口方式注入 -->
		<bean id="userBean" class="amigo.spring.chapter16.UserBeanImpl" />
		<bean id="InterfaceInject" class="amigo.spring.chapter16.InterfaceInject">
		<property name="userBean">
		<ref local="userBean"/>
		</property>
		</bean>



5.编写测试类

package amigo.spring.chapter16;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;


/**
 * 接口注入
 * */
public class TestInterfaceInject {
		public static void main(String[] args){
				ClassPathResource res = new ClassPathResource("applicationContext.xml");
				XmlBeanFactory factory = new XmlBeanFactory(res);
				InterfaceInject inject = (InterfaceInject) factory.getBean("InterfaceInject");
				inject.printUserListSize();
			
		}

}



八. Bean属性及构造器参数


下面来看一个直接量使用的举例,在DbConnection类中,driverClassName(驱动器类名)、url(数据库连接路径)、username(数据库用户名)和password(数据库密码)属性都需要在Spring中进行配置。

1. 配置直接量

(1) 编写测试类:DataSource.java

package amigo.spring.ioc.beanproperties;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * 演示直接量的使用
 * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * @Creation date: Sep 13, 2008 - 1:39:02 PM
 */
public class DataSource {
	/** 驱动器类名. */
	private String driverClassName;
	
	/** 数据库连接路径. */
	private String url;
	
	/** 数据库用户名. */
	private String username;
	
	/** 数据库密码. */
	private String password;
	
	public void setDriverClassName(String driverClassName) {
		this.driverClassName = driverClassName;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getDriverClassName() {
		return driverClassName;
	}

	public String getUrl() {
		return url;
	}

	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}

	public Object getConnection() {
		//...省略实现
		return null;
	}
	
	public void close() {
		//...省略实现
	}
	
	/**
	 * 测试方法.
	 * @param args
	 */
	public static void main(String[] args) {
		ClassPathResource res1 = new ClassPathResource(
				"beanproperties.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res1);
		DataSource dbConnection = (DataSource) factory.getBean("dataSource");
		System.out.println("driverClassName=" + dbConnection.getDriverClassName());
		System.out.println("url=" + dbConnection.getUrl());
		System.out.println("username=" + dbConnection.getUsername());
		System.out.println("password=" + dbConnection.getPassword());
	}
}


(2) 编写配置文件:Beanproperties.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"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
	<!-- 直接量.  -->
	<bean id="dataSource"
			destroy-method="close"
    		class="amigo.spring.ioc.beanproperties.DataSource">
    	<!-- 需要在amigo.spring.ioc.beanproperties.DataSource类中有相应的setter方法. -->
  		<property name="driverClassName">
    		<value>com.mysql.jdbc.Driver</value>
  		</property>
 		<property name="url">
    		<value>jdbc:mysql://localhost:3306/test</value>
  		</property>
  		<property name="username">
    		<value>root</value>
  		</property>
  		<property name="password">
    		<value>123</value>
  		</property>
	</bean>
</beans>



2. 引用其他的bean

(1) 编写测试类:User.java

package amigo.spring.ioc.beanproperties;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * 展示在Spring配置文件中如何引用其它的bean.
 * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * @Creation date: Sep 13, 2008 - 2:15:26 PM
 */
public class User {
	/** 用户名.*/
	private String username;
	
	/** 密码. */
	private String password;
	
	/** 所属部门. */
	private Dept dept;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Dept getDept() {
		return dept;
	}

	public void setDept(Dept dept) {
		this.dept = dept;
	}
	
	/**
	 * 测试方法.
	 */
	public static void main(String[] args) {
		ClassPathResource res1 = new ClassPathResource(
				"beanproperties.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res1);
		User user = (User) factory.getBean("user");
		System.out.println("用户所属部门名称=" + user.getDept().getName());
	}
}


(2) 编写依赖类:Dept.java

package amigo.spring.ioc.beanproperties;

/**
 * 展示在Spring配置文件中如何引用其它的bean.
 * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * @Creation date: Sep 13, 2008 - 2:17:04 PM
 */
public class Dept {
	/** 部门名称. */
	private String name;
	
	/** 状态. */
	private int status;

	public String getName() {
		return name;
	}

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

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}
}



(3)修改配置文件:beanproperties.

<!-- 引用其它的bean. -->
	<bean id="dept" class="amigo.spring.ioc.beanproperties.Dept">
  		<property name="name">
    		<value>软件研发部</value>
  		</property>
	</bean>
	
	<bean id="user" class="amigo.spring.ioc.beanproperties.User">
    	<property name="dept">
    		<ref local="dept" />
		</property>
    </bean>



3. 内部bean(内部bean是指在一个bean的<property/>或<constructor-arg/>元素中使用<bean/>元素定义的bean)

(1)编写测试类:OuterBean.java

package amigo.spring.ioc.beanproperties;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * 演示Spring中内部bean的配置.
 * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * @Creation date: Sep 13, 2008 - 2:53:59 PM
 */
public class OuterBean {
	private InnerBean innerBean;
	
	public InnerBean getInnerBean() {
		return innerBean;
	}

	public void setInnerBean(InnerBean innerBean) {
		this.innerBean = innerBean;
	}

	/**
	 * 测试方法.
	 */
	public static void main(String[] args) {
		ClassPathResource res1 = new ClassPathResource(
				"beanproperties.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res1);
		OuterBean outerBean = (OuterBean) factory.getBean("outerBean");
		System.out.println("内部bean的name属性值为=" + outerBean.getInnerBean().getName());
	}
}



(2)编写内部bean类:InnerBean.java

package amigo.spring.ioc.beanproperties;

/**
 * 内部bean. 
 * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * @Creation date: Sep 13, 2008 - 2:54:46 PM
 */
public class InnerBean {
	private String name;

	public String getName() {
		return name;
	}

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


(3)修改配置文件:beanproperties.xml

<!-- 内部bean -->
    <bean id="outerBean" class="amigo.spring.ioc.beanproperties.OuterBean">
	  <property name="innerBean">
	    <bean class="amigo.spring.ioc.beanproperties.InnerBean">
	    	<property name="name">
    			<value>我是内部bean</value>
  			</property>
	    </bean>
	  </property>
	</bean>


4. 在配置文件中配置集合

(1) 编写测试类:CollectionTest.java

package amigo.spring.ioc.beanproperties;

import java.util.*;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * Spring配置集合. 
 * @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
 * @Creation date: Sep 13, 2008 - 3:10:18 PM
 */
public class CollectionTest {
	private List userList;
	
	private Set emailSet;
	
	private Map typeMap;
	
	private Properties configProperties;
	
	public List getUserList() {
		return userList;
	}

	public void setUserList(List userList) {
		this.userList = userList;
	}

	public Set getEmailSet() {
		return emailSet;
	}

	public void setEmailSet(Set emailSet) {
		this.emailSet = emailSet;
	}

	public Map getTypeMap() {
		return typeMap;
	}

	public void setTypeMap(Map typeMap) {
		this.typeMap = typeMap;
	}

	public Properties getConfigProperties() {
		return configProperties;
	}

	public void setConfigProperties(Properties configProperties) {
		this.configProperties = configProperties;
	}

	/**
	 * 测试方法.
	 */
	public static void main(String[] args) {
		ClassPathResource res1 = new ClassPathResource(
				"beanproperties.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res1);
		CollectionTest test = (CollectionTest) factory.getBean("collectionTest");

		// List类型
		List userList =  test.getUserList();
		for (int i = 0, len = userList.size(); i < len; i++) {
			System.out.println("用户信息:" + (String) userList.get(i));
		}
		
		// Set类型
		Set emailSet = test.getEmailSet();
		Iterator ite = emailSet.iterator();
		while(ite.hasNext()) {
			System.out.println("Email信息:" + ite.next());
		}

		// Map类型
		Map typeMap = test.getTypeMap();
		System.out.println("id为1000的类型的名称为=" + typeMap.get("1000"));
		
		// Properties类型
		Properties configProperties = test.getConfigProperties();
		System.out.println("usernmae属性为:" + configProperties.getProperty("username"));
	}

}



(3) 修改配置文件:beanproperties.xml

<!-- 集合 -->
    <bean id="collectionTest" class="amigo.spring.ioc.beanproperties.CollectionTest">
    	<!-- List类型 -->
	    <property name="userList">
		    <list>
		        <value>阿蜜果</value>
		        <value>amigo</value>
		        <value>谢星星</value>
		    </list>
	  	</property>
	  
	  	<!-- Set类型 -->
		<property name="emailSet">
    		<set>
        		<value>administrator@amigo.com</value>
        		<value>xiexingxing1121@126.com</value>
        		<value>amigo@126.com</value>
    		</set>
    	</property>
    	
    	<!-- Map类型 -->
    	<property name="typeMap">
		    <map>
		        <entry>
		            <key>
		                <value>1000</value>
		            </key>
		            <value>时尚购物</value>
		        </entry>
		        <entry>
		            <key>
		                <value>1001</value>
		            </key>
		            <value>精彩旅游</value>
		        </entry>
		    </map>
		 </property>
		  
		 <property name="configProperties">
			<props>
				<prop key="username">阿蜜果</prop>
				<prop key="password">3344</prop>
		    </props>
		</property>
	</bean>   



分享到:
评论

相关推荐

    轻量级J2EE企业应用实战--Struts+Spring+Hibernate整合开发笔记

    轻量级 J2EE 企业应用实战 -- Struts+Spring+Hibernate 整合开发笔记 本资源为轻量级 J2EE 企业应用实战开发笔记,涵盖 Struts、Spring 和 Hibernate 三大框架的整合开发实践。笔记从 JDK 安装和配置环境变量开始,...

    struts+hibernate+spring读书笔记

    Struts、Hibernate和Spring是Java开发中非常重要的三个开源框架,它们各自负责应用程序的不同层面,共同构建了企业级应用的“铁三角”。这篇读书笔记将深入探讨这三个框架的核心概念、功能以及它们之间的协同工作...

    jsp+tomcat+Struts2+Spring+Hibernate应用实例.rar

    标题中的"jsp+tomcat+Struts2+Spring+Hibernate应用实例"揭示了一个基于Java Web技术的项目构建,其中涉及到的主要技术栈包括JSP、Tomcat服务器、Struts2、Spring和Hibernate。这个实例可能是一个典型的MVC(Model-...

    SSH(Struts1.0+Spring+Hibernate)框架集成笔记

    ### SSH(Struts1.0+Spring+Hibernate)框架集成笔记 #### 一、概述 SSH框架集成,即Struts1.0 + Spring + Hibernate框架的整合应用,是Java Web开发中较为复杂的集成模式之一。它集合了MVC设计模式(通过Struts...

    J2EE三大框架_笔记_a

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    J2EE框架_笔记_c

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    J2EE框架_笔记_b

    J2EE三大框架_笔记 共分三块: J2EE框架_笔记_a: 1-JSP+JDBC_假分页笔记 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页...54留言管理程序_Struts + Spring + Hibernate笔记

    Struts+spring+hibernate学习笔记! - Struts原理与实践 - JavaEye知识库.files

    Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们在企业级应用开发中起着关键作用。Struts 是一个 MVC(Model-View-Controller)架构的 Web 框架,Spring 提供了一个全面的后端服务管理平台,...

    struts+spring+hibernate学习笔记

    这个“struts+spring+hibernate学习笔记”应该涵盖了这三个框架的基础知识以及如何将它们整合使用的详细教程。 Struts是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于控制Web应用的流程。它...

    Struts+Spring+Hibernate整合笔记

    Struts+Spring+Hibernate 整合是Java Web开发中一种常见的技术栈,也被称为SSH框架。这个整合的主要目的是为了在企业级应用中实现MVC(Model-View-Controller)架构,提供更好的数据持久化、业务逻辑管理和前端展示...

    javaEE框架笔记,识货人下

    54留言管理程序_Struts + Spring + Hibernate笔记.pdf 6-Struts标签-BEAN标签笔记.pdf 7-Struts标签 -LOGIC标签笔记.pdf 8-Struts标签- HTML标签笔记.pdf 9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf

    struts+hibernate+spring详细笔记

    Struts、Hibernate和Spring是Java开发中非常重要的三个框架,它们构成了经典的SSH(Struts、Spring、Hibernate)架构,用于构建高效、灵活的企业级应用程序。本笔记将详细讲解这三个框架的核心概念、工作原理以及...

    使用Struts + Spring + Hibernate完成分页笔记

    "使用Struts + Spring + Hibernate完成分页笔记"这个主题涵盖了三个关键的Java EE框架:Struts、Spring和Hibernate,它们分别负责表现层、业务逻辑层和数据访问层的管理。下面将详细介绍这三个框架在分页实现中的...

    传智播客2016版hibernate+struts2+Spring框架资料课件+笔记

    《传智播客2016版hibernate+struts2+Spring框架学习资源详解》 在IT行业中,框架的使用是开发高效、稳定应用的关键。本资源包聚焦于三大主流Java Web框架:Hibernate、Struts2和Spring,它们在2016年时仍然是开发者...

    struts2.1.8+spring2.5+hibernate3.2+ext3.0框架整合笔记(三)

    Struts2、Spring2.5和Hibernate3.2是经典的Java Web开发框架组合,被称为SSH。这个整合笔记的第三部分可能涵盖了如何将这三个组件无缝集成到一个项目中的详细步骤。Struts2作为MVC框架负责控制流程,Spring2.5提供...

    JAVA框架核心技术笔记3 struts hibernate spring

    Java框架是Java开发中的核心工具,它简化了代码结构,提高了...通过这些笔记,你将能够深入理解Struts、Hibernate和Spring的核心原理和用法,并能掌握如何将它们有效地结合起来,构建出高效、可维护的Java Web应用。

    JSP三大框架笔记(SSH struts+hibernate+spring.rar)

    本笔记主要涵盖了Java服务器页面(JSP)开发中的三大主流框架:Struts、Hibernate和Spring。这三大框架是企业级Web应用开发中的基石,为开发者提供了高效、灵活且可扩展的解决方案。Struts作为MVC(模型-视图-控制器...

    Struts+Spring+hibernate学习总结

    Spring的IoC容器负责管理对象的生命周期和依赖关系,而Spring的AOP机制则允许开发者编写非侵入式的业务逻辑,提高代码的可维护性。 Hibernate是SSH架构中的数据访问层,它是一个强大的ORM(对象关系映射)工具,...

    Struts2-Spring-Hibernate

    Struts2-Spring-Hibernate(SSH)是一种经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这三个框架分别负责不同的职责:Struts2处理MVC(模型-视图-控制器)架构中的动作控制,Spring提供依赖...

    spring-note spring 读书笔记

    这份"spring-note spring 读书笔记"深入探讨了Spring的核心概念以及如何与其他流行技术如JDBC、Hibernate、Struts和事务管理进行集成。 1. **Spring依赖注入(IOC)**: Spring的IOC容器是其核心,负责创建对象并...

Global site tag (gtag.js) - Google Analytics