Spring IoC(控制反转)【三】
2014-07-29 13:04
197 查看
bean的作用域
当在配置文件中配置了bean后,可以理解为告诉了Spring IoC容器如何生成该bean模板。
例如:
IoC容器不仅可以向bean注入不同的依赖属性,还可以指定其作用域。
bean有5种作用域,其中有三种只能在Web环境中使用。
1、singleton
singleton是bean默认的作用域,即单例。
意思是在一个IoC容器中只初始化一个bean的实例,并将该实例存储到单实例缓存中。
不管多少次获得该bean的实例,都将返回唯一一个实例。
测试如下:
dataSource==dataSource2: true
2、prototype
如果某个bean需要在一个IoC容器中创建多个实例,那么可以使用scope属性将其作用域配置为prototype。
同上测试运行结果:
3、request
request只在Web应用中使用,表示请求范围。
4、session
session只在Web应用中使用,表示会话范围。
5、global session
global session范围表示全局会话,只有在基于Portlet的Web应用中才有效。
bean的初始化和析构
Spring API中提供了InitializingBean和DisposableBean两个接口,可以用来修改容器中bean的行为。
InitializingBean接口定义了如下方法:
void afterPropertiesSet():当bean的属性被复制后,调用该方法进行初始化。
DisposableBean接口中定义了如下方法:
void destory():bean实例销毁前调用。
例:
当IoC容器将Course类的bean实例的属性赋值后,将调用afterPropertiesSet方法,在销毁Course类的bean实例前,将调用destory方法。
如果采用这种通过实现接口的方式进行bean实例的初始化和析构,则将与Spring的API紧耦合。
Course类可以不识闲InitializingBean和DisposableBean接口,而自定义初始化和析构方法:
当在配置文件中配置了bean后,可以理解为告诉了Spring IoC容器如何生成该bean模板。
例如:
<bean id="course" class="vo.Course"> <constructor-arg index="0"> <value>4</value> </constructor-arg> <constructor-arg index="1"> <value>Java</value> </constructor-arg> <constructor-arg index="2"> <value>1000</value> </constructor-arg> </bean>上述配置告诉了Spring IoC容器,如果要实例化Course的实例,可以调用三个参数的构造方法,并为构造方法传递了实际参数。
IoC容器不仅可以向bean注入不同的依赖属性,还可以指定其作用域。
bean有5种作用域,其中有三种只能在Web环境中使用。
1、singleton
singleton是bean默认的作用域,即单例。
意思是在一个IoC容器中只初始化一个bean的实例,并将该实例存储到单实例缓存中。
不管多少次获得该bean的实例,都将返回唯一一个实例。
<bean id ="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property>上述配置中,dataSource没有指定作用域,则使用默认的singleton作用域。
测试如下:
ApplicationContext ctxt = new ClassPathXmlApplicationContext("applicationContext.xml"); BasicDataSource dataSource =(BasicDataSource)ctxt.getBean("dataSource"); BasicDataSource dataSource2 =(BasicDataSource)ctxt.getBean("dataSource"); System.out.println("dataSource==dataSource2: "+(dataSource==dataSource2));运行结果:
dataSource==dataSource2: true
2、prototype
如果某个bean需要在一个IoC容器中创建多个实例,那么可以使用scope属性将其作用域配置为prototype。
<bean id ="dataSource" class="org.apache.commons.dbcp.BasicDataSource" scope="prototype"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property>
同上测试运行结果:
dataSource==dataSource2: false
3、request
request只在Web应用中使用,表示请求范围。
<bean id="LoginAction" class="action.LoginAction" scope ="request">
4、session
session只在Web应用中使用,表示会话范围。
<bean id="cart" class="cart.Order" scope="session">
5、global session
global session范围表示全局会话,只有在基于Portlet的Web应用中才有效。
bean的初始化和析构
Spring API中提供了InitializingBean和DisposableBean两个接口,可以用来修改容器中bean的行为。
InitializingBean接口定义了如下方法:
void afterPropertiesSet():当bean的属性被复制后,调用该方法进行初始化。
DisposableBean接口中定义了如下方法:
void destory():bean实例销毁前调用。
例:
public class Course implements InitializingBean,DisposableBean{ public void afterPropertiesSet() throws Exception{ System.out.println("afterPropertiesSet()"); } public void destroy() throws Exception{ System.out.println("destroy()"); } }
当IoC容器将Course类的bean实例的属性赋值后,将调用afterPropertiesSet方法,在销毁Course类的bean实例前,将调用destory方法。
如果采用这种通过实现接口的方式进行bean实例的初始化和析构,则将与Spring的API紧耦合。
Course类可以不识闲InitializingBean和DisposableBean接口,而自定义初始化和析构方法:
public class Course{ public void init() throws Exception{ System.out.println("init()"); } public void destroy() throws Exception{ System.out.println("destroy()"); } }配置文件中配置:
<bean id="course" class="vo.Course" init-method="init" destroy-method="destroy"> <constructor-arg index="0"> <value>4</value> </constructor-arg> </bean>
相关文章推荐
- 使用spring ioc(控制反转)的两种方法
- Spring IOC(控制反转)详解及示例
- Spring IoC(控制反转)
- spring ioc(反转控制)
- Spring IoC(控制反转)【IoC的技术基础】
- 总结: 十分钟快速理解 Spring IoC 控制反转
- Spring IoC 控制反转 DI依赖注入 以及常用注解
- Spring IOC控制反转 依赖注入DI
- [转]spring IOC 控制反转
- Spring IoC(控制反转)之IoC的使用
- Spring IoC(控制反转)【IoC使用实例】
- spring IOC(控制反转)浅析
- Spring IOC 反转控制
- IOC——控制反转
- spring——控制反转
- 架构设计之依赖倒置、控制反转与依赖注入
- 关于IoC(控制反转,依赖注入)的理解
- 控制反转
- [教程]控制反转(IoC)与依赖注入(DI)
- 依赖注入与控制反转的理解