面试官:Spring 框架内置了哪些可扩展接口,咱们一个一个聊

栏目: IT技术 · 发布时间: 4年前

公众号[ JavaQ ]原创,专注分享 Java 基础原理分析、实战技术、微服务架构、分布式系统构建,诚邀点赞关注!

面试官 :如果想在一个Bean被实例化时做一些额外的初始化操作,如何实现?

小小白 :有两种方法,一个是使用@PostConstruct注解或init-method指定初始化方法,另一个是这个Bean实现InitializingBean接口,InitializingBean接口中只有一个afterPropertiesSet方法,这个方法是在Bean的属性都设置值后被调用,用于完成一些初始化工作。

面试官 :afterPropertiesSet方法和init-method指定的方法执行的先后顺序有了解过吗?

小小白 :afterPropertiesSet方法先执行,init-method指定的方法后执行。

面试官 :像这种初始化方法,在使用上有什么需要注意的?

小小白 :这两种方式都是用于完成一些初始化工作,所以相应的方法中尽量不要编写一些复杂且执行时间很长的逻辑,例如网络请求、IO操作。

面试官 :那如果想在Bean被销毁回收的时候做一些额外的操作,如何操作?

小小白 :同样也是两种方法,一个是使用@PreDestroy注解或destroy-method指定销毁方法,另一个是这个Bean实现DisposableBean接口,DisposableBean接口中只有一个destroy方法,该方法会在Bean被销毁、生命周期结束之前被调用,用于做一些销毁的收尾工作。DisposableBean接口的destroy方法先于destroy-method指定的方法先执行。

面试官 :如果想在Bean被加载的过程中获取Spring的应用上下文ApplicationContext,如何实现?

小小白 :Spring框架中有一个ApplicationContextAware接口,接口有一个setApplicationContext方法,只要Bean实现了ApplicationContextAware接口,就可以在该Bean被加载的过程中获取Spring的应用上下文ApplicationContext,通过ApplicationContext可以获取Spring容器内的很多信息。

面试官 :说到获取Spring的应用上下文ApplicationContext,在基于Spring MVC的Web应用中,如何获取WebApplicationContext?

小小白 :Spring框架提供了一个WebApplicationContextUtils工具类,通过这个 工具 类的getWebApplicationContext方法可以获取到。

面试官 :如果想在Bean被加载的过程中获取加载该Bean的BeanFactory,如何实现?

小小白 :Spring框架中有一个BeanFactoryAware接口,接口中有一个setBeanFactory方法。实现了BeanFactoryAware接口的Bean,可以在该Bean被加载的过程中获取加载该Bean的BeanFactory,同时也可以获取这个BeanFactory中加载的其它Bean。

面试官 :那这个setBeanFactory方法在什么时候被调用的?

小小白 :在Bean实例化后,Setter方法之前调用。

面试官 :如果要定制Bean的实例化逻辑,如何实现?

小小白 :Spring框架的FactoryBean接口可以实现Bean实例化的个性定制,让Spring容器加载我们想要的Bean。实现了FactoryBean接口的类,可以通过实现getObject方法,实现加载我们想要的Bean。

面试官 :说到FactoryBean,BeanFactory和FactoryBean有什么区别?

小小白 :BeanFactory定义了ioc容器的最基本形式,并提供了ioc容器应遵守的的最基本的接口,也就是Spring ioc所遵守的最底层和最基本的编程规范,它只是个接口,并不是ioc容器的具体实现。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。再来说说FactoryBean,一般情况下,Spring通过反射机制利用bean的class属性实例化Bean,然而在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在bean的定义中提供大量的配置信息,而配置这种方式的灵活性是受限的,这时采用编码的方式可能会是一个比较合适的方案,Spring为此提供了FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。

面试官 :有了解过Spring中的BeanPostProcessor接口吗?

小小白 :BeanPostProcessor接口中有两个方法,分别为postProcessBeforeInitialization和postProcessAfterInitialization。实现了BeanPostProcessor接口的类,会在每个Bean初始化(即调用setter)之前和之后,分别调用这个类中的postProcessBeforeInitialization方法和postProcessAfterInitialization方法,实现初始化的逻辑控制。

面试官 :如果想在初始化前修改bean的属性,如何实现?

小小白 :BeanFactoryPostProcessor接口中只有postProcessBeanFactory方法。实现了该接口的类,可以在Bean被创建之前,获取容器中Bean的定义信息,并且可以进行修改。实现类中的postProcessBeanFactory方法只会被执行一次,且先于BeanPostProcessor接口的方法。

面试官 :如果想在Bean实例化调用构造函数前后做一些额外操作,如何实现?

小小白 :Spring框架的InstantiationAwareBeanPostProcessor接口中,常用的方法是postProcessBeforeInstantiation和postProcessAfterInstantiation。每个Bean的实例化(即调用构造函数)之前和之后,会分别调用实现了该接口的类中的postProcessBeforeInstantiation和postProcessAfterInstantiation方法,所以只要自定义一个实现InstantiationAwareBeanPostProcessor接口的类,实现接口中的这两个方法,在这两个方法中就可以做额外的操作了。

往期推荐

Spring声明式事务处理的实现原理,来自面试官的穷追拷问

Spring MVC相关面试题就是无底洞,反正我是怕了

说实话,面试这么问Spring框架的问题,我快扛不住了

没使用加号拼接字符串,面试官竟然问我为什么

面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的

都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问

Java注解是如何玩转的,面试官和我聊了半个小时

如何去除代码中的多次if而引发的一连串面试问题

三分钟快速搞定git常规使用

String引发的提问,我差点跪了

就写了一行代码,被问了这么多问题

面试官:JVM对锁进行了优化,都优化了啥?

synchronized连环问

面试官:Spring 框架内置了哪些可扩展接口,咱们一个一个聊

点点" 在看 " 呗


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

利用Python进行数据分析

利用Python进行数据分析

Wes McKinney / 唐学韬 / 机械工业出版社 / 2013-11-18 / 89.00

【名人推荐】 “科学计算和数据分析社区已经等待这本书很多年了:大量具体的实践建议,以及大量综合应用方法。本书在未来几年里肯定会成为Python领域中技术计算的权威指南。” ——Fernando Pérez 加州大学伯克利分校 研究科学家, IPython的创始人之一 【内容简介】 还在苦苦寻觅用Python控制、处理、整理、分析结构化数据的完整课程?本书含有大量的实践案例,......一起来看看 《利用Python进行数据分析》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具