3分时时彩官网_3分时时彩平台哪个好_玩3分时时彩的网站

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

时间:2020-01-02 01:17:43 出处:3分时时彩官网_3分时时彩平台哪个好_玩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/10001/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.1000:310006/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也就很清楚了

热门

热门标签