解答面试题——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注解配置销毁方法。

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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值