用asp.net做电商网站,先做网站再付款 怎么回答,滁州网站开发czesou,wordpress 建站配置当通过Spring容器创建一个Bean实例时#xff0c;不仅可以完成Bean实例的实例化#xff0c;还可以为Bean指定特定的作用域。Spring支持如下5种作用域#xff1a;
singleton#xff1a;单例模式#xff0c;在整个Spring IoC容器中#xff0c;使用singleton定义的Bean将只有… 当通过Spring容器创建一个Bean实例时不仅可以完成Bean实例的实例化还可以为Bean指定特定的作用域。Spring支持如下5种作用域
singleton单例模式在整个Spring IoC容器中使用singleton定义的Bean将只有一个实例prototype原型模式每次通过容器的getBean方法获取prototype定义的Bean时都将产生一个新的Bean实例request对于每次HTTP请求使用request定义的Bean都将产生一个新实例即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时该作用域才有效session对于每次HTTP Session使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时该作用域才有效globalsession每个全局的HTTP Session使用session定义的Bean都将产生一个新实例。典型情况下仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时该作用域才有效 其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态负责维护Bean实例的生命周期行为如果一个Bean被设置成prototype作用域程序每次请求该id的BeanSpring都会新建一个Bean实例然后返回给程序。在这种情况下Spring容器仅仅使用new 关键字创建Bean实例一旦创建成功容器不在跟踪实例也不会维护Bean实例的状态。 如果不指定Bean的作用域Spring默认使用singleton作用域。Java在创建Java实例时需要进行内存申请销毁实例时需要完成垃圾回收这些工作都会导致系统开销的增加。因此prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功可以重复使用。因此除非必要否则尽量避免将Bean被设置成prototype作用域。 设置Bean的基本行为通过scope属性指定该属性可以接受singleton、prototype、request、session、globlesession5个值分别代表以上5种作用域。下面的配置片段中singleton和prototype各有一个
!-- 默认的作用域singleton --
bean idp1 classcom.abc.Person /
!-- 指定的作用域prototype --
bean idp2 classcom.abc.Person scopeprototype / 下面是一个测试类
public class BeanTest {public static void main(String args[]) {//加载类路径下的beans.xml文件以初始化Spring容器ApplicationContext context new ClassPathXmlApplicationContext();//分两次分别取同一个Bean比较二者是否是同一个对象System.out.println(context.getBean(p1) context.getBean(p1));System.out.println(context.getBean(p2) context.getBean(p2));}
} 执行结果分别是true和false 从结果可以看出正如上文所述对于singleton作用域的Bean每次请求该id的Bean都将返回同一个实例而prototype作用域的Bean 每次请求都将产生全新的实例。 注意早期指定Bean的作用域也可通过singleton属性指定该属性只接受两个属性值true和false分别代表singleton和prototype的作用域。使用singleton属性则无法指定其他三个作用域。实际上Spring2.X不推荐使用singleton属性指定Bean的作用域singleton属性是Spring 1.2.X的使用方式。 对于request作用域查看如下Bean定义
bean idloginAction classcom.abc.LoginAction scoperequest / 针对每次HTTP请求Spring容器会根据loginActionBean定义创建一个全新的LoginAction实例且该loginAction实例尽在当前HTTP Request内有效。因此如果程序需要完全可以自由更改Bean实例的内部状态其他请求所获得的loginAction实例无法感觉到这种内部状态的改变。当处理请求结束时request作用域的Bean将会被销毁。 注意request、session作用域的Bean只对Web应用才真正有效。实际上通常只会将Web应用的控制器Bean才指定成request作用域 session作用域与request作用域完全类似区别在于request作用域的Bean对于每次HTTP请求有效而session作用域的Bean对于每次Session有效。在Web应用中为了让request和session作用域生效必须将HTTP请求对象绑定到为该请求提供服务的线程上这使得具有request和session作用域的Bean实例能够在后面的调用链中被访问到。 为此我们有两种配置方式采用Listener配置或者采用Filter配置。当使用Servlet 2.4及以上规范的Web容器时我们可以在Web应用的web.xml文件中增加Listener配置该Listener负责为request作用域生效
listenerlistener-classorg.springframework.web.context.request.RequestContextListener/listener-class
/listener 如果使用了只支持Servlet 2.4以前规范的Web容器则该容器不支持Listener规范故无法使用这种配置方式只能改为使用Filter配置方式配置片段如下
filterfilter-namerequestContextFilter/filter-namefilter-classorg.springframework.web.filter.RequestContextFilter/filter-class
/filter
filter-mappingfilter-namerequestContextFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping 一旦在web.xml中增加了如上任意一种配置程序就可以在Spring配置文件中使用request或者session作用域了。下面是Spring配置文件的片段
bean idp3 classcom.abc.Person scoperequest / 这样Spring容器会每次HTTP请求都生成一个Person实例当该请求响应结束时该实例也随之消失。 如果Web应用直接使用Spring MVC作为MVC框架即使用SpringDispatcherServlet或DispatcherPortlet来连接所有用户请求则无需这些额外的配置因为他们已经处理了所有和请求有关的状态处理。 注意Spring 3.0 不仅可以为Bean指定已经存在的5个作用域还支持自定义作用域关于自定义作用域的内容请参看Spring官方文档等资料。