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

面试官:如果想在一个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接口的类,实现接口中的这两个方法,在这两个方法中就可以做额外的操作了。

学习更多JAVA知识与技巧,关注与私信博主(555)!
热爱学习和渴望进阶的小伙伴,各种JAVA学习路线、笔记、面试题,免费分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值