Spring IoC(控制反转)【三】

bean的作用域

当在配置文件中配置了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>




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值