Spring3之 bean 作用域scope

本文详细介绍了Spring框架中Bean的五种作用域:singleton、prototype、request、session和global session。通过具体示例展示了不同作用域下Bean实例的生命周期特点,并对比了它们之间的差异。

Bean scopes 作用域

5个:singleton,prototype,request,session,global session

singleton 是默认的作用域,容器只产生一个实例,只要调用的id相同,返回的实例就是同一个;

prototype 每次调用返回的是不同的实例;

Request, session, and global session scopes 这三个是WEB方面使用的,使用基于webSpring ApplicationContext实现(XmlWebApplicationContext

前二个

com.spring305.test.scope.po.SingletonScope.java

public class SingletonScope {

	private int id = (int) (100 * Math.random());

	public void printID() {
		System.out.println(SingletonScope.class + " id=" + id);
	}

}

 com.spring305.test.scope.po.PrototypeScope.java

 

public class PrototypeScope {
	private int id = (int) (100 * Math.random());

	public void printID() {
		System.out.println(PrototypeScope.class + " id=" + id);
	}
}

 

src/testScope.xml

<bean id="singletonScope" class="com.spring305.test.scope.po.SingletonScope"></bean>
<bean id="prototypeScope" class="com.spring305.test.scope.po.PrototypeScope" scope="prototype"></bean>

 

测试:

@Test
public  void testSingletonProtoType(){
	ApplicationContext ctx = new ClassPathXmlApplicationContext("testScope.xml");
	SingletonScope singletonScope1 = ctx.getBean("singletonScope",SingletonScope.class);
	SingletonScope singletonScope2 = ctx.getBean("singletonScope",SingletonScope.class);
	PrototypeScope prototypeScope1 = ctx.getBean("prototypeScope",PrototypeScope.class);
	PrototypeScope prototypeScope2 = ctx.getBean("prototypeScope",PrototypeScope.class);
	singletonScope1.printID();
	singletonScope2.printID();
		
	prototypeScope1.printID();
	prototypeScope2.printID();
}

 

得到结果:

class com.spring305.test.scope.po.SingletonScope id=89
class com.spring305.test.scope.po.SingletonScope id=89
class com.spring305.test.scope.po.PrototypeScope id=12
class com.spring305.test.scope.po.PrototypeScope id=50

 singleton的值没有变化,而prototype的变化

 

再看后三种:

web.xml中加入spring Listener

<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<!-- classpath:applicationContext.xml -->
		<param-value>/WEB-INF/testScope.xml</param-value>
	</context-param>

	<listener>
		<listener-class>
			org.springframework.web.context.request.RequestContextListener
		</listener-class>
	</listener>

	<servlet>
		<servlet-name>ScopeTest</servlet-name>
		<servlet-class>
			com.spring305.test.scope.po.ScopeTest
		</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>ScopeTest</servlet-name>
		<url-pattern>/ScopeTest</url-pattern>
	</servlet-mapping>

 /WEB-INF/testScope.xml

<bean id="singletonScope" class="com.spring305.test.scope.po.SingletonScope"></bean>
<bean id="prototypeScope" class="com.spring305.test.scope.po.PrototypeScope" scope="prototype"></bean>
<bean id="requestScopeT" class="com.spring305.test.scope.po.RequestScope" scope="request"></bean>
<bean id="sessionScopeT" class="com.spring305.test.scope.po.SessionScope" scope="session"></bean>
<bean id="globalSessionScope" class="com.spring305.test.scope.po.GlobalSessionScope" scope="globalSession"></bean>

 servlet doGet内容如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

                response.setContentType("text/html");
	PrintWriter out = response.getWriter();
	System.out.println("in get");
	ServletContext context = getServletContext();

		ApplicationContext   ctx   =   null; 
        if   (ctx   ==   null)       
        {       
        	ctx   =   WebApplicationContextUtils.getRequiredWebApplicationContext(context);       
        }       
       
        /**
         *     SingletonScope singletonScope1 = ctx.getBean("singletonScope",SingletonScope.class);
                SingletonScope singletonScope2 = ctx.getBean("singletonScope",SingletonScope.class);
	PrototypeScope prototypeScope1 = ctx.getBean("prototypeScope",PrototypeScope.class);
	PrototypeScope prototypeScope2 = ctx.getBean("prototypeScope",PrototypeScope.class);
	singletonScope1.printID();
	singletonScope2.printID();
		
	prototypeScope1.printID();
	prototypeScope2.printID();
         */
        
	RequestScope requestScope = (RequestScope) ctx.getBean("requestScopeT");
	requestScope.printID();

	SessionScope sessionScope = (SessionScope) ctx.getBean("sessionScopeT");
	sessionScope.printID();
	GlobalSessionScope gScope = (GlobalSessionScope)ctx.getBean("globalSessionScope",GlobalSessionScope.class);
	gScope.printID();
		
	out.println("123");
	out.flush();
	out.close();
}

 同一浏览器刷新二次得到结果:

in get
class com.spring305.test.scope.po.RequestScope id=11
class com.spring305.test.scope.po.SessionScope id=50
class com.spring305.test.scope.po.GlobalSessionScope id=70
in get
class com.spring305.test.scope.po.RequestScope id=92
class com.spring305.test.scope.po.SessionScope id=50
class com.spring305.test.scope.po.GlobalSessionScope id=70

 可见,除了requet的值变化了,session,globalsession的都没有变

换个浏览器刷新下servlet

in get
class com.spring305.test.scope.po.RequestScope id=96
class com.spring305.test.scope.po.SessionScope id=89
class com.spring305.test.scope.po.GlobalSessionScope id=38

 相对而言,值都变化了,那么globalsession为什么也会变?官方给出解释:

The global session scope is similar to the standard HTTP Session scope (described above), and
applies only in the context of portlet-based web applications

 基于portlet的web应用中才有意义.

 

<!--EndFragment-->
内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值