分析&回答
Servlet的生命周期:实例化 New,初始化 Init,接收请求service,销毁destroy;
bean的生命周期
- Bean的建立:容器寻找Bean的定义信息并将其实例化。
- 属性注入:使用依赖注入,Spring按照Bean定义信息配置Bean所有属性
- BeanNameAware的setBeanName():如果Bean类有实现org.springframework.beans.BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。
- BeanFactoryAware的setBeanFactory():如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
- BeanPostProcessors的ProcessBeforeInitialization()如果有org.springframework.beans.factory.config.BeanPostProcessors和Bean关联,那么其postProcessBeforeInitialization()方法将被将被调用。
- initializingBean的afterPropertiesSet():如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法
- Bean定义文件中定义init-method:可以在Bean定义文件中使用"init-method"属性设定方法名称,执行到这个阶段,就会执行initBean()方法
- BeanPostProcessors的ProcessaAfterInitialization()如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法
- 此时,Bean已经可以被应用系统使用,并且将保留在BeanFactory中知道它不在被使用。
- 如果不使用了有两种方法可以将其从BeanFactory中删除掉:
- DisposableBean的destroy() 在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
- Bean定义文件中定义destroy-method在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称。
反思&扩展
管理者角色的是BeanFactory或ApplicationContext的情况下略有不同,能说清楚实例化、初始化、接收请求、销毁就行。
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!