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

  • 时间:
  • 浏览:0
  • 来源:3分时时彩官网_3分时时彩网站_去哪玩3分时时彩

前言

  开心一刻

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

what:是哪几种

  BeanFactoryPostProcessor接口很简单,只包涵盖2个 法律辦法

/**
 * 通过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/2001/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.200:32006/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也就很清楚了