公众号[ 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接口的类,实现接口中的这两个方法,在这两个方法中就可以做额外的操作了。
往期推荐 :
面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的
都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问
点点" 在看 " 呗
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Martian 框架发布 3.0.37 版本,支持切换内置服务
- Spark内置框架rpc通讯机制及RpcEnv基础设施-Spark商业环境实战
- XXL-RPC v1.2.2,分布式服务框架,内置原生轻量级注册中心
- 支付宝小程序IDE 0.70 稳定版发布,内置 uni-app 多端开发框架
- Nginx 的内置变量
- Python内置方法详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript权威指南
弗拉纳根 / 东南大学出版社 / 2007-6 / 99.00元
《JavaScript权威指南(影印版)(第5版)》已经经过全面地修订和扩展,涵盖了构建当今Web2.0应用程序所需的JavaScript技术。《JavaScript权威指南(影印版)(第5版)》不仅是一本实例驱动的程序员指南,同时也是一本可以摆在桌边随时查阅的参考手册,它以全新的章节阐述了有效使用Javascript脚本所需要知道的一切,包括: 脚本化的HTTP和Ajax;XML处理;使用......一起来看看 《JavaScript权威指南》 这本书的介绍吧!