热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

一篇文章带你玩转Springbean的终极利器

这篇文章主要给大家介绍了关于玩转Springbean的终极利器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用springbean具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

前面的篇幅里有提到通过InitializingBean和Disposable等接口可以对bean的初始化和销毁做一些自定义操作,那么有一点要注意,那仅仅是在bean被容器实例化之后的操作,在spring的世界里,要想对实例化这个过程做点什么,作为一个普通业务的开发人员,显然不需要去继承ApplicationContext或者BeanFactory,因为spring container为我们提供了一些接口,让我们以插件的形式去扩展BeanFactory对bean的初始化操作,其中就有我们今天的主角——BeanPostProcessor(以下简称bpp)接口。

源码,先睹为快

这个用法很简单,它只有两个方法,我们实现自己的BeanPostProcessor,Spring能自动注册到容器中。

其中before方法是在bean实例化之后,属性设置之后但在初始化方法之前执行;after方法是在各种初始化方法之后执行。

说到这里可能有人会想,这跟生命周期中的其它初始化接口有啥区别?其它的初始化方法也可以修改bean啊,这个问题问得好,那么我们来说下这个接口与InitializingBean Disposable接口以及自定义的init destroy方法的本质区别

  • bpp的两个方法是有返回值Object的,这恰恰是问题的关键,这个bean就是我们要修改的bean,这样一来,我们就可以修改bean实例本身,或替换,或wrap成一个proxy bean(Spring中的aop机制多是这么干),而其它的初始化接口的返回为void,因此它们理论上只能修改bean的状态,能做的东西相当受限制。
  • bpp是以扩展插件的形式被Container执行,不需要bean本身去做什么(bean本身不用实现这个接口),所以这个插件跟bean在代码上不耦合
  • 在执行方式上也完全不同,bpp是作为Spring container的一个扩展,在容器初始化bean的过程过,对每个bean都会执行一次,而初始化接口,由于是特定的bean实现的,所以与其它的bean无关,只对初始该类型的bean执行。简而言之就是,虽然都是由容器执行对bean的操作,bpp是扩展的容器本身行为,而初始化接口是扩展bean的行为后被容器执行的。

在这里有两种特殊的bpp不得不说,假设你需要自定义一个类似于@Autowire或者@Inject的注入功能的注解的时候(你可能会用到InjectionMetadata),普通的bpp可能就满足不了你的需要了,你可能用到两个特殊的bpp。

MergedBeanDefinitionPostProcessor(以下简称mbdpp)

InstantiationAwareBeanPostProcessor(以下简称iabpp)

他们都是继承自bpp,但在spring bean 创建的过程中切入点不同于普通的bpp。

InstantiationAwareBeanPostProcessor接口

 看注释


postProcessBeforeInstantiation方法

查阅AbstractAutowireCapableBeanFactory的createBean方法(这个方法是Spring容器创建bean的核心方法),可以看到,postProcessBeforeInstantiation是在bean实例化之前,postProcessAfterInstantiation是在实例化之后属性设置以及autowire注入之前,它一般是spring框架内部使用,但在这里大有可为,用postProcessBeforeInstantiation可以生成代理对象( 一般作法是让postProcessorBeforeInstantiation方法返回不为null,这样就会中断后续创建bean实例的过程,会以这个方法返回的对象作为bean实例),看源码:

postProcessPropertyValues方法

用postProcessPropertyValues 可以完成对属性的各种操作,注解中元数据的解析等,Spring的@Autowire注入,JSR330的@Inject以及JSR250的@Resource等注入操作都是通过这个方法完成。

这接口的用处在spring底层较多,有兴趣的同学可以翻阅源码,以下是两个比较典型的实现。

AutowiredAnnotationBeanPostProcessor
AbstractAutoProxyCreator

MergedBeanDefinitionPostProcessor接口


这个接口传入了一个RootBeanDefinition,这里允许我们修改bean的定义,@AutuwiredAnnotationBeanPostProcessor通过实现这个方法检查并注册需要注入的成员。

BeanFactoryPostProcessor(bfpp)

除了BeanPostProcessor还有一种想必大家都知道,那就是BeanFactoryPostProcessor

bfpp是作为beanFactory的一个很重要扩展插件,可以用来自定义BeanDefination的。它与bpp主要区别在于:

  • bpp是处理的bean实例,bfpp是处理bean的定义
  • bfpp能读取和修改bean的定义(BeanDefination),比如说在配置中属性值用到的占位符${}就是PropertyPlaceholderConfigurer通过实现bfpp来实现的
  • bpp处理的则是新鲜出炉并且设置好属性的bean的实例(上边提到iabpp和mdbpp的两种特殊的bpp除外)

好了,说了这么多,来看下Spring创建bean的大致流程图,这里只标出了比较关键的节点

 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 本文深入探讨了企业级开发框架NHibernate和Spring.NET的关键特性之一——面向方面编程(AOP)。文章不仅介绍了AOP的基本概念及其如何增强面向对象编程(OOP),还详细说明了Spring.NET中AOP的具体应用,包括事务管理和自定义方面的实现。 ... [详细]
  • Kipling与可口可乐联袂推出2021新年特别系列
    比利时知名包袋品牌Kipling联合Coca-Cola,以积极向上的品牌精神和环保理念,共同打造2021新年特别联名系列。 ... [详细]
  • 前端监控系列2 | 深入探讨JS错误监控的重要性与实践
    作者:彭莉,火山引擎APM研发工程师,专注于前端监控技术的研发。本文将深入讨论JS错误监控的必要性及其实现方法,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 深入解析Java设计模式之责任链模式
    责任链模式通过将处理请求的对象链接成一条链,确保每个请求能够沿着这条链传递,直至找到合适的处理者。本文将详细介绍责任链模式的原理、优势、局限及实际应用案例。 ... [详细]
  • 地理信息、定位技术及其在物联网中的应用
    地理位置信息是物联网系统中不可或缺的关键要素,它不仅提供了物理世界的坐标,还增强了物联网应用的实用性和准确性。本文探讨了位置服务的基本概念、关键技术及其在物联网中的重要作用,特别介绍了定位技术的最新进展。 ... [详细]
  • 深度解析:任务宝裂变营销的成功之道
    任务宝裂变作为一种高效用户增长手段,在微信生态下被广泛应用。本文将通过实际案例,探讨如何设计和实施任务宝裂变策略,以实现持续获客的目标。 ... [详细]
  • 本文介绍了一种通过自定义工具类实现Spring的ApplicationContextAware接口来获取Spring容器中Bean的方法,并提供了详细的代码示例和配置说明。 ... [详细]
  • Pikachu平台SQL注入漏洞详解
    本文详细介绍了SQL注入漏洞的基本原理、攻击流程、不同类型注入点的识别与利用方法,以及基于union联合查询、报错信息、布尔盲注、时间盲注等多种技术手段的信息获取方式。同时,探讨了如何通过SQL注入获取操作系统权限,以及HTTP Header注入和宽字节注入等高级技巧。最后,提供了使用SQLMap自动化工具进行漏洞测试的方法和常见的SQL注入防御措施。 ... [详细]
  • Python与MySQL交互指南:从基础到进阶
    本文深入探讨了Python与MySQL数据库的集成方法,包括数据库连接、数据表创建、索引管理、数据操作以及如何防止SQL注入等关键内容。适合初学者及希望提升数据库操作技能的开发者。 ... [详细]
  • mybatis相关面试题 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • 这个报错出现在userDao里面,sessionfactory没有注入。解决办法:spring整合Hibernate使用test测试时要把spring.xml和spring-hib ... [详细]
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
author-avatar
mobiledu2502853623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有