解答面试题——Spring bean的作用域和生命周期

前言

这里我不是教学,只是加入我作为一个面试者,遇到这道题我应该怎么回答,我可能回答的不够好,所以希望能给大家帮助的同时也能得到大家的指点。缺乏从哪方面的回答。

Spring Bean的作用域

spring bean的作用域分为5种,分别是 singleton、prototype、request、session、global-session这五种。

singleton

这个模式是单例的,使用这个模式,IOC容器只创建一个实例,并且每次返回都是这一个实例,这种模式是默认的模式,也是我工作中使用最多的模式。

prototype

prototype是原型模式,是多例的,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。并且prototype是在使用时创建的,销毁也不受IOC容器管理,而是GC来管理的。
注意:在工作中我遇到一种情况是service明明是prototype,但是我注入到singleton中的Controller中,却只有一个实例,那是因为,Controller是单例的Controller在初始化时,注入的service,这时service被初始化。为什么只是一个bean实例,是因为Controller只创建了一次。
证明:创建多个Controller都注入service,修改service的值并打印,发现每个Controller中打印出来的值并不一样。

request

request是请求模式,是在同一次请求中,IOC容器会创建一个单例bean,这次请求中返回的bean是同一个bean。
我在工作中是用request实现的缓存,同一次请求的缓存。这样会节省很多重复操作。

session

session是会话模式,在同一个会话中,IOC容器会创建一个单例bean,并且每次都会返回同一个bean。
这里和session类似,我使用它是用在会话级的缓存,我用来存放登陆时的用户权限信息,和角色信息。

global-session

这个模式,是所有的session 共享同一个bean。

具体使用:我使用的是注解@scope注解。

Spring Bean的生命周期

简单概述:Bean的创建------>Bean的初始化-------->Bean的销毁
但实际上是我认为应该这样回答:
一个bean从创建到销毁,如果用Beanfactory来管理的话,那么会经历以下几个步骤:
1.IOC 创建bean定义;
2.IOC 按照bean定义来配置Bean的属性;
3.如果Bean实现了BeanNameAware接口,工厂会调用bean的setBeanName方法,参数是beanID ,使用的是观察者模式。
4.如果Bean实现了BeanFactoryAware接口,工厂会调用bean的setBeanName,参数是工厂本身。
5.如果BeanPostProcessors和bean关联,那么会调用postProcessBeforeInitialization方法。
6.Bean 实现了initializingBean 接口那么会调用afterProPertiesSet()方法。
7.Bean 可以定义自己的 初始化方法,通过配置注解的init-method 属性。或者使用@PostConstruct配置初始化方法。
执行initBean方法。
8.BeanPostProcessors没有和bean关联的话 ,那么就会执行后置方法ProcessaAfterInitialization();
9.bean被使用。
10.销毁-如果Bean实现了DisposableBean接口,那么会执行destroy方法,
11.也可以配置bean的销毁方法,通过配置@Bean的destroy-method,或者使用@PreDestroy注解配置销毁方法。

小编的回答应该也就这么多了。如果有更好的回答,希望评论区评论讨论。

你可能感兴趣的:(解答面试题——Spring bean的作用域和生命周期)