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

  • 时间:
  • 浏览:0
  • 来源:大发uu快3_uu快3骗局_大发uu快3骗局

前言

  开心一刻

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

what:是你是什么

  BeanFactoryPostProcessor接口很简单,只包含一个多多最好的妙招

/**
 * 通过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/801/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.80:3806/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也就很清楚了

猜你喜欢

E. Pastrana数据,E. Pastrana新闻,E. Pastrana视频,E. Pastrana身价

首页新闻视频直播数据APP懂球号直播君广告公司合作 E.PastranaE.Pastrana俱乐部:国籍:墨西哥身高:175CM位置:球员年龄:20岁体重:68KG号码:号生

2020-02-19

不动代码和模板修改wordpress分类顺序

外理此问题 ,小编推荐使用插件大法。wordpress拥遇见你想到的和没想到的任何插件,这也是让朋友 这么喜爱它的意味着之一。另外须要补充的是,本文所说,是调整分类目录的顺

2020-02-18

南昌世界VR大会签约723亿

图:在二〇一九世界VR产业大会上,观众体验VR设备\新华社【大公报讯】据中新社报道:正在江西省会南昌举行的2019世界VR(虚拟现实)产业大会招商工作取得丰硕成果。官方统计数据

2020-02-18

ComicAiII 漫画批量下载工具|ComicAiII 漫画批量下载工具 Build 120416下载

亲爱的漫友,你还在用浏览器周游在线漫画网站,和着各种广告一起看漫画吗?天哪,你为社 这样能忍?快让ComicAiII给你纯净的漫画环境吧。ComicAiII是一款在线漫画批量

2020-02-18

柏林漫言/柏林摄影周/余 逾

图:柏林摄影周现场的现代舞表演/作者供图受父亲影响,肯能我也否有 摄影爱好者吧,平时喜欢看看摄影展。完后 听说柏林摄影周活动即将开幕,我还觉得 期盼了一下。柏林摄影周,跟

2020-02-18