Spring中Bean的作用域及生命周期
参考文章:
Spring中Bean的作用域、生命周期: Spring Bean的生命周期(非常详细): Java面试–Spring中的Bean的作用域和生命周期:
bean区别于其他对象的区别:由IOC容器进行初始化,装配和管理
一.bean的作用域
五种:singleton(单例),prototype(原型),request,session,global.Session。通过scope进行配置
-
Singleton:Spring IOC容器中只会存在一个共享的Bean实例,无论多少个Bean引用它,指向的都是同一个对象(又称“无状态”)。只要请求的ID和bean定义匹配,返回的都是一个对象。 比如说UserDao,数据库的CRUD操作 这里所说的单例不是线程安全的,并且区别于Java单例,Singleton:Spring容器中只有一个,Java里面的单例是基于JVM,每个JVM只有一个实例 prototype:每次获取prototype定义的bean时,容器都会创建一个新的实例,每个bean实例都有自己的属性和状态。而Singleton是全局只有一个对象。所以该作用域又称为“有状态” prototype每次调用getBean,相当于new一个对象 request:在一个http请求中,容器会返回同一个bean实例。不同的请求产生不同的bean实例,该bean只在当前http request内比如说登录请求仅适用于WebApplicationContext环境种 < bean id=“loginAction” class=“com.cnblogs.Login” scope=“request” /> session:同一个HttpSession共享一个Bean,不同Session使用不同bean,仅适用于WebApplicationContext环境中。 < bean id=“userPerferences” class=“com.fool.userPerference” scope=“session”> 针对每个HttpSession,spring容器都会创建一个全新的userPerference bean,并且这个对象只在当前sessiosn有效。**可以根据需求放心更改bean中状态,其他session看不到这个状态的变化。**当session废弃后,bean也会被废弃 global.session:一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext(全局Session)
二.bean的生命周期
1.Spring装配Bean的过程
-
使用BeanFactory作为SpringBean的工厂类,都是在第一次使用的时候加载bean 如果使用ApplicationContext作为工厂类 如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候, 直接从这个缓存中取
2.bean的实例化过程
3.Bean的生命周期
1.Spring对Bean进行实例化(默认是单例) 2.Spring对Bean进行依赖注入(常用Setter) 3.如果bean视线里BeanNameAware接口,则容器将bean的id传给setBeanName()方法 4.如果bean实现了BeanFactoryAware接口,则spring调用setBeanFactory()方法,将BeanFactory实例传递进来 5.如果bean实现了ApplicationContextAware接口,其setApplicationContext()将会调用,将上下文的引用传入bean 6.如果bean实现了BeanPostProcesser接口,其postProcessBeforeInitializaition方法将会被调用 7.如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用; 8.如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用; 9.此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁; 10.若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
BeanNameAware和BeanFactoryAware接口: SpringBean的生命周期: 分析spring源码第七篇:bean的生命周期:
4.Bean的注册
5.Spring单例bean和线程安全:
