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

  • 时间:
  • 浏览:0
  • 来源:大发快3_快3手机app下载_大发快3手机app下载

前言

  开心一刻

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

what:是什么

  BeanFactoryPostProcessor接口很简单,只含有一一四个 辦法

/**
 * 通过BeanFactoryPostProcessor,我们

歌词


自定义修改应用tcp连接上下文中的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/1501/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.1150:31506/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也就很清楚了

猜你喜欢

巫师3狂猎游戏闪退跳出怎么办 游戏闪退跳出原因详解

关于当我们当我们当我们  |  加入当我们当我们当我们  |  意见反馈  |  招聘信息  |  商务媒体合作|  游戏库列表温馨提示,适度游戏益脑,沉迷游戏伤身,合理安排时

2020-02-18

簡訊\港男花劍日本站8強出局

男子花劍世界杯日本站昨天在幕張展覽館舉行團體賽,由蔡俊彥、張家朗、張小倫及小將吳諾弘組成的中國香港男子花劍隊,在16強擊敗英國後,晉級8強不敵意大利出局。港隊昨晨出戰英國,張家

2020-02-18

BMForum Myna|BMForum Myna v7.0下载

BMForum是一款应用于当事人、商业领域的基于MySQL数据库新型PHP论坛多多进程 。作为另一两个 全部开放源代码的论坛多多进程 ,BMForum以强大的功能和易

2020-02-18

花絮/「黃媒」咄咄逼人 鄧炳強淡定化解

警方例行記者會昨日的焦點全在荃灣開槍事件,吸引近百記者到場。記者會開始,播放前日暴亂片段期間,記者室的收音时不时故障,主持人唯有敲定記者會暫停十分鐘,但官員離席不久後时不时修好

2020-02-18

AB胶种珊瑚 育海洋雨林

图:志愿者从海底清除的废旧渔网\受访者供图纪力伟表示,深港两地有就说 潜水爱好者喜欢潜观珊瑚。“就说 潜水爱好者看完珊瑚后,想为保护珊瑚做些事,大家就把珊瑚碎片种回去。”“

2020-02-18