浅谈Spring的Bean生命周期和作用域

学习spring有一段时间了。有的人说Spring的发展就是Java的发展,Spring就是Java的半壁江山,而且AOP思想更是OOP思想的一种扩展和延申。所以今天来浅谈一下spring的生命周期和它的作用域。

1.Spring的Bean的生命周期

如果说到Java编程语言的优越性,无非两点:“一次编写,到处运行”和它独有的垃圾回收机制。spring的bean和Java的对象一样,无非是所在的容器不一样,一个是在JVM的堆,另一个是在IOC容器罢了。都是为了防止内存溢出,同样都有自己类似的生命周期,init,work,destroy等。

 借鉴==《Spring In Action》==所讲的生命周期11步:
 1.实例化;
 2.填充属性;
 3.调用BeanNameAware接口的setBeanName()方法;
 4.调用BeanFactoryAware接口的setBeanFactory()方法;
 5.调用ApplicationContextAware接口的setAppplicationContext()方法;
 6.调用BeanPostProcessor的预初实化方法;
 7.调用InitializingBean的setPropertiesSet()方法;
 8.调用自定义的初始化方法
 9.调用BeanProcessor的初始化后方法;
 10.调用Disposable的destroy()方法
 11.调用自定义的销毁方法。

看似很复杂的11步的生命周期,实际就是对象从null到初始化装配,工作,再到销毁变为null的一个生命轮回罢了。

2.Spring的Bean的作用域

spring的作用域大概分为五种

singleton

singleton英文为单例的意思。有了解过23设计模式的朋友一个对单例模式很熟悉,因为它是最经典的设计模式。

单例模式共8种,典型的有懒汉和饿汉模式,分别是即时加载和懒加载的两种对象创建思想。单例模式的优点是可以为了避免反复创建较大的对象,导致内存溢出。当然spring的单例作用域也是借鉴的单例思想,spring的bean的默认作用域,在码界邢道荣看来这就是绿色环保的行为。

prototype

prototype英文翻译是原型的意思。23种设计模式的原型模式。

原型模式的核心思想就是深克隆和浅克隆。深浅克隆的区别字面表达复杂。但是了解过Java的垃圾回收机制的同学就很容易理解。

Java的垃圾回收算法主要分为两大种:引用计数算法根搜索算法
引用技术算法就是给对象添加引用计算器,每多一个引用的地方就加一,引用失效时就减一,当计数器为0时,表明对象未被使用,垃圾回收器可以收集该对象。而根搜索算法是通过判断某个对象能否通过节点和"gc root"相连,如果没有,说明该对象为不可达对象,垃圾回收器可以回收该对象的内存空间。其实两种的垃圾搜索算法的第一种算法只看自己有没有被使用,第二种是看自己被其他对象而引用。

深浅克隆也一样,浅克隆是克隆单独一个对象,而深克隆不仅仅克隆单独的一个对象,还有这个对象的引用关系。原型模式会针对每个getBean的请求会单独创建的单独的实例对象。从单例和原型模式的特点考虑,除非在特殊环境中,不然的话不断频繁的创建实例对象会造成性能的浪费。

上面两种是常见的spring的Bean的作用域,而接下来的三种是只在web环境里才会出现的生命周期。

session

session英文翻译为主菜的意思。在web环境中session是服务端会话,bean的生命是在整个session域中。

request

spring会为每个HTTP请求创建一个实例。

globalSession

第五种作用域是在《Spring In Action》和很多的文档中都没有介绍到的全局会话作用域。可能是因为他的使用范围有限,因为只有在web的portlet容器中才会使用到。

道荣能力有限,浅谈为止。希望自己的一些感慨能够抛砖引用,得到大家更多不同的看法。文章的很多知识点借鉴于《Spring In Action》和极客学院的部分文章等。

猜你喜欢

转载自blog.csdn.net/qq_39414348/article/details/103615673