欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bean的作用域、初始化和销毁方法及生命周期

程序员文章站 2022-06-03 09:11:00
...

坚持每天写博文,积累下开发中的点点滴滴

  • bean的作用域: bean对象可以存活多久的.
<bean id="" class="" scope="作用域"/>

singleton: 单例 ,在Spring IoC容器中仅存在一个Bean实例 (默认的scope)
prototype: 多例 ,每次从容器中调用Bean时,都返回一个新的实例,
request: 用于web开发,将Bean放入request范围 ,request.setAttribute(“xxx”) , 在同一个request 获得同一个Bean
session: 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean
globalSession: 一般用于Porlet应用环境 , 分布式系统存在全局session概念(单点登录),如果不是porlet环境,globalSession 等同于Session
在开发中主要使用 scope=”singleton”、 scope=”prototype”.
对于MVC中的Action使用prototype类型,其他使用singleton


初始化和销毁方法:
比如DataSource,SessionFactory最终都需要关闭资源:在Bean销毁之前,都要调用close方法.

<bean id="someBean" class="......" 
        init-method="该类中初始化方法名" destroy-method="该类中销毁方法名">
</bean>

init-method:bean生命周期初始化方法,对象创建后就进行调用
destroy-method:容器被销毁的时候,如果bean被容器管理,会调用该方法。

如果bean的scope=”prototype”,那么容器只负责创建和初始化,它并不会被spring容器管理销毁。

  • 不使用Spring测试:演示Spring容器非正常关闭:

单元测试的线程很短.(获取网络信息,不要使用单元测试,使用主方法)

如何正常的关闭Spring容器:
AbstractApplicationContext:

@Test
    public void testLifeCycle2() throws Exception {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(
                "cn/itcast/cd/day1/lifecycle/LifeCycleTest-context.xml");
        SomeBean bean = ctx.getBean("someBean", SomeBean.class);
        System.out.println(bean);
        //关闭上下文对象
        //ctx.close();
        //最好的方式:把Spring线程作为JVM的子线程:Spring没有运行完,JVM就不会终止.
        ctx.registerShutdownHook();
    }

bean的作用域、初始化和销毁方法及生命周期

GC:垃圾回收

相关标签: spring