`

四 spring管理bean的作用域

 
阅读更多
四 spring管理bean的作用域

先看配置
<bean id="personservice" class="cn.itcast.service.impl.PersonServiceBean"></bean>

执行代码
	ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
	PersonService personservice1=(PersonService)ctx.getBean("personservice");
	PersonService personservice2=(PersonService)ctx.getBean("personservice");
	logger.info( personservice1== personservice2);

输出为true 
现在我们知道了吧!默认情况下,spring管理的bean的作用域是单实例的(singleton)

如果把配置文件修改成 
<bean id="personservice" class="cn.itcast.service.impl.PersonServiceBean" scope="prototype"></bean>
输出就为false
通过scope就可以让其bean实例为多实例的
prototype在spring是什么意思
prototype 每次从容器获取bean都是新的对象。

现在我们可以进一步思考 这个实例是什么时候就被加载的呢 ?
我们可以在实现类中写一个默认的构造方法 并且在构造方法中输出一句话 
修改下 

package cn.itcast.service.impl;

import cn.itcast.service.PersonService;



public class PersonServiceBean implements PersonService {

    public PersonServiceBean(){
    	System.out.println("我被实例化了");
    }
	public void save(){
		System.out.println("我是save()方法");
	}
}



执行代码
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");

输出:
我被实例化了
注意:在执行这代码之前必须让实现类交给spring管理的作用域范围为默认的,只有在单例(singleton)的情况下才会
实例化bean,在scope="prototype"的情况下将不会在初始化spring中实例化bean 这时候只有在调用的情况下才会实例化

这就说明了,这实例在初始化spring的时候就同时把实例也初始化了 
可不可以让初始化在调用的时候加载实例呢?
当然可以


singleton

默认情况下的单例模式,每次调用getBean方法获取的都是同一个bean对象

默认情况喜爱会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init属性来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean。

<bean id="xxx" class="xxx" lazy_init="true"/>

如果对所有bean都应用延迟初始化

<beans default-lazy-init="true"...>

prototype

每次从容器获取bean都是一个新的对象

request

session

global session


在bean实例初始化的时候,我们还可以进行初始化方法的配置 
在配置文件中的bean节点加入init-method即可 
执行 
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
就可以看到输出了

同时我们还可以在spring服务关闭的时候执行资源的释放
在bean节点中加入destroy-method即可
AbstractApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
ctx.close();

实现类
package cn.itcast.service.impl;

import cn.itcast.service.PersonService;



public class PersonServiceBean implements PersonService {

    public PersonServiceBean(){
    	System.out.println("我被实例化了");
    }
	public void save(){
		System.out.println("我是save()方法");
	}
	public void init(){
		System.out.println("初始化方法进行中");
	}
	public void destroy(){
		System.out.println("销毁的方法进行中");
	}
}

配置文件
<bean id="personservice" class="cn.itcast.service.impl.PersonServiceBean" init-method="init" destroy-method="destroy"></bean>

end 完毕!

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics