前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:Spring框架内置了哪些可扩展接口,咱们一个一个聊

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

作者头像
JavaQ
发布2020-04-24 17:26:51
1.2K0
发布2020-04-24 17:26:51
举报
文章被收录于专栏:JavaQJavaQ

公众号[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接口的类,实现接口中的这两个方法,在这两个方法中就可以做额外的操作了。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档