Spring拓展接口之BeanFactoryPostProcessor,占位符与敏感信息解密原理

  • 时间:
  • 浏览:0
  • 来源:大发快3_快3在线稳定计划_大发快3在线稳定计划

前言

  开心一刻

    一只被二哈带偏了的柴犬,我只想弄死隔壁的二哈

what:是那些

  BeanFactoryPostProcessor接口很简单,只包含高一1个多 最好的办法

/**
 * 通过BeanFactoryPostProcessor,朋友

自定义修改应用多多守护进程


上下文中的bean定义
 *
 * 应用上下文也能在所有的bean定义中自动检测出BeanFactoryPostProcessor bean,
 * 并在任何其他bean创建事先应用那些BeanFactoryPostProcessor bean
 *
 * BeanFactoryPostProcessor对自定义配置文件非常有用,都还能能覆盖应用上下文由于配置了的bean属性
 *
 * PropertyResourceConfigurer也不BeanFactoryPostProcessor的典型应用
 * 将xml文件中的占位符替换成properties文件中相应的key对应的value
 */
@FunctionalInterface
public interface BeanFactoryPostProcessor {

    /**
     * 在应用上下文完成了标准的初始化事先,修改其内部内部结构的bean工厂
     * 将加载所有bean定义,但尚未实例化任何bean. 
     * 朋友

都还能能覆盖或换成bean定义中的属性,甚至是提前初始化bean
     */
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

  推荐朋友 直接去读它的源码注释,说的更删剪、更好理解

  简单来说,BeanFactoryPostProcessor是spring对外提供的接口,用来拓展spring,也能在spring容器加载了所有bean的信息信息事先、bean实例化事先执行,修改bean的定义属性;大家由于会问,这有那些用?朋友 还记得spring配置文件中的占位符吗? 朋友 会在spring配置中配置PropertyPlaceholderConfigurer(继承PropertyResourceConfigurer)bean来处里占位符, 举个例子朋友 还会印象了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/4001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
        <list>
            <value>classpath:mysqldb.properties</value>
        </list>
        </property>
    </bean>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName"value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password"value="${jdbc.password}" />
    </bean>
</beans>

  mysqldb.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.400:34006/mybatis
jdbc.username=root
jdbc.password=root

  PropertyPlaceholderConfigurer类的继承关系图

how:要怎样会会用

  要怎样会会用,这俩 那些的现象比较简单,朋友 实现BeanFactoryPostProcessor接口,只要 将将其注册到spring容器即可,在spring启动过程中,在常规bean实例化事先,会执行BeanFactoryPostProcessor的postProcessBeanFactory最好的办法(后面 有朋友 如果 的逻辑),完成朋友 如果 的操作;

  重点应该是:用来干那些

  上述占位符的例子是BeanFactoryPostProcessor的应用之一,但这是spring提供的BeanFactoryPostProcessor拓展,还会朋友 自定义的;实际工作中,自定义BeanFactoryPostProcessor的情況人太好少,反正要花费 我是用的非常少的,但我还是有使用印象的,那也不对敏感信息的解密处里;上述数据库的连接配置中,用户名和密码还会明文配置的,这就地处泄漏风险,还有redis的连接配置、shiro的加密算法、rabbitmq的连接配置等等,凡是涉及到敏感信息的,都还要进行加密处里,信息安全非常重要

  配置的事先以密文配置,在真正用到事先在spring容器中进行解密,只要 用解密后的信息进行真正的操作,下面让人举个简单的例子,用BeanFactoryPostProcessor来删剪敏感信息的解密

  加解密工具类:DecryptUtil.java

  配置文件:application.yml

  工程中解密:DecryptConfig.java

  主要也不五个文件,DecryptUtil对明文进行加密处里后,得到的值配置到application.yml中,只要 工程启动的事先,DecryptConfig会对密文进行解密,明文信息存到了spring容器,后续操作还会在spring容器的明文上进行的,也不与朋友 平时的不加密的结果一致,只要 却对敏感信息进行了保护;工程测试结果如下:

  删剪工程地址:spring-boot-BeanFactoryPostProcessor

  有兴趣的都还能能去看下jasypt-spring-boot的源码,让人发现他的原理是一样的,也是基于BeanFactoryPostProcessor的拓展

why:为那些能那么用

  为那些DecryptConfig实现了BeanFactoryPostProcessor,将DecryptConfig注册到spring事先,DecryptConfig的postProcessBeanFactory最好的办法就会执行?事出必有因,肯定是spring启动过程中会调用DecryptConfig实例的postProcessBeanFactory最好的办法,具体朋友 来看看源码,朋友 从AbstractApplicationContext的refresh最好的办法开始

  不得不说,spring的命名、注释人太好写得好,很明显朋友 从refresh中的invokeBeanFactoryPostProcessors最好的办法开始 ,朋友 都还能能仔细看下PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors最好的办法,先按PriorityOrdered、Ordered、普通(那么实现PriorityOrdered和Ordered接口)的顺序调用BeanDefinitionRegistryPostProcessor,只要 再按先按PriorityOrdered、Ordered、普通的顺序调用BeanFactoryPostProcessor,这俩 顺序还是值得朋友 注意下的,由于朋友 自定义的多个BeanFactoryPostProcessor有顺序之分,而朋友 又那么指定其执行顺序,那么由于出显的还会朋友 如果 的结果

  这里由于会有会大家有曾经的的那些的现象:bean定义(BeanDefinition)是在那些事先加载到spring容器的,要怎样保证BeanFactoryPostProcessor实例起作用事先,所有的bean定义都由于加载到了spring容器

    ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor,在springboot的createApplicationContext阶段注册到spring容器的,也也不说在spring的refresh事先还会了ConfigurationClassPostProcessor实例;ConfigurationClassPostProcessor被应用的事先(调用其postProcessBeanDefinitionRegistry最好的办法),会加载删剪的bean定义(包括朋友 自定义的BeanFactoryPostProcessor实例:DecryptConfig)到spring容器,bean的加载详情可查看:springboot2.0.3源码篇 - 自动配置的实现,有你想象中的那样吗,那么在应用BeanFactoryPostProcessor实例事先,所有的bean定义就由于加载到spring容器了,BeanFactoryPostProcessor实例也就能修改bean定义了

  至此,BeanFactoryPostProcessor的机制朋友 就清楚了,为那些能那么用这俩 那些的现象也就明了了

总结

  1、BeanFactoryPostProcessor是beanFactory的后置处里器接口,通过BeanFactoryPostProcessor,朋友 都还能能自定义spring容器中的bean定义,BeanFactoryPostProcessor是在spring容器加载了bean的定义信息事先、bean实例化事先执行;

  2、BeanFactoryPostProcessor类型的bean会被spring自动检测,在常规bean实例化事先被spring调用;

  3、BeanFactoryPostProcessor的常用场景包括spring中占位符的处里、朋友 自定义的敏感信息的解密处里,当然不局限与此;

  人太好只要朋友 明白了BeanFactoryPostProcessor的生效时机,那些场景适用BeanFactoryPostProcessor也就很清楚了

猜你喜欢

全球比特币谷歌搜索量最大城市TOP10:第一名竟然是它

图片版权所属:站长之家今日块讯(ChinaZ.com)6月12日消息:据Bitcoinist报道,比特币经济学家TuurDemeester发布推文否认了“比特币”谷歌搜索量最多

2020-01-21

乖仔被「洗腦」 打母稱「光復屋企」

圖:暴徒四處設路障堵路,阻礙救護車救人李偉孝曾做青少年義工,當提到現時學生暴徒年齡不斷下降,僅得十一、二歲都參與暴亂,他難過得兩度落淚。李Sir感慨政客煽動,暴力氛圍滲透到每個

2020-01-21

秀婉的江南园林,最有韵味的中国风

我能发布    发布日期:2018-06-0409:37:41核心提示:中国古建筑的美,体现在秀婉的江南园林之中▼亭台飞檐,廊桥蜿蜒▼奇石秀水,移步换景▼拱门营发名者中国古建筑

2020-01-21

如龙0真岛吾朗支线任务怎么做

更新时间:2018-08-0809:56:12来源:斗蟹游戏编辑:我还没想好如龙0真岛吾朗支线任务缘何做?还不清楚的玩家不妨来看看小编为亲戚亲戚大伙带来的如龙0真岛吾朗全支线任

2020-01-21

魔兽世界怀旧服怎么收费?国服采用点卡还是月卡收费

魔兽世界怀旧服如果 在8月27日上线,玩家们十分关心怀旧服的收费依据,是点卡收费还是月卡收费,这里当当我们来看下具体的介绍。暴雪曾表示怀旧服会有并是不是生活收费依据,即经

2020-01-21