IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot/Spring扩展点系列之叱咤风云BeanFactoryPostProcessor - 第428篇 -> 正文阅读

[Java知识库]SpringBoot/Spring扩展点系列之叱咤风云BeanFactoryPostProcessor - 第428篇

历史文章(累计400+篇文章)

国内最全的Spring Boot系列之一

国内最全的Spring Boot系列之二

国内最全的Spring Boot系列之三

国内最全的Spring Boot系列之四

国内最全的Spring Boot系列之五》

SpringBoot使用EasyYapi对代码0侵入实现API接口一键发布到YApi - 第422篇

SpringBoot使用EasyYapi对代码0侵入实现API接口一键发布到YApi的进阶使用 - 第423篇

SpringBoot使用thymeleaf实现布局方案一,不懂就out了(循序渐进的超级详细讲解方式) - 第424篇

SpringBoot使用thymeleaf实现布局方案二,方案在手说走就走 - 第425篇

SpringBoot/Spring扩展点系列之初出茅庐ApplicationContextInitializer - 第426篇

悟纤:师傅,你在哪里哪里?您的爱徒呼叫你~

师傅:徒儿,你啥时候嘴变得这么贫了。

悟纤:师傅,徒儿哪有呀~

师傅:徒儿,话说你有啥问题呢?

悟纤:师傅,你看哦,我这里有一个连接数据库的配置类,比如userName,password,这些信息最终会交给数据源DataSource进行连接数据库。

如果password是明文的情况下,那么是可以连接成功的,但是如果给password加密了,就连接异常了。

师傅:那肯定得异常呢,你密码加密了,你都不认识密码了,数据源就更不认识了。对于数据源只认识明文的密码。

悟纤:那怎么办呐?

师傅:那就需要解密呀,这时候获取就可以接触扩展点BeanFactoryPostProcessor来修改Bean的属性值。

悟纤:那师傅,赶紧的呗,我已经被搞的寝食难安了。

师傅:学会这一招,你就能叱咤风云了~

导读

???????当我们有场景需要对类的属性进行修改或者对于加密的数据进行解密的时候,这时候BeanFactoryPostProcessor接口的postProcessBeanFactory就可以派上用场了。

(1)?《SpringBoot/Spring扩展点之初出茅庐ApplicationContextInitializer

(2)?《SpringBoot/Spring扩展点之略有小成BeanDefinitionRegistryPostProcessor

(3)《SpringBoot/Spring扩展点系列之叱咤风云BeanFactoryPostProcessor》

???????这一节我们就来看看:

《SpringBoot/Spring扩展点系列之叱咤风云BeanFactoryPostProcessor》

一、BeanFactoryPostProcessor基本概念

1.1是什么?

???????BeanFactoryPostProcessor就是BeanFactory的后处理类。

Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。

注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息。

1.2?使用场景

(1)对敏感信息的解密处理

???????数据库的连接配置中,用户名和密码都是明文配置的,这就存在泄漏风险,还有redis的连接配置、shiro的加密算法、rabbitmq的连接配置等等,凡是涉及到敏感信息的,都需要进行加密处理,信息安全非常重要。

???????配置的时候以密文配置,在真正用到之前在spring容器中进行解密,然后用解密后的信息进行真正的操作。

(2)Spring中占位符的处理

1.3?其它说明

BeanFactoryPostProcessor可以在Bean实例化之前修改Bean的属性,但不适合在BeanFactoryPostProcessor中做Bean的实例化,这样会导致一些意想不到的副作用,就是不要把Spring玩坏了,若需要做Bean的实例化可以使用BeanPostProcessor

(1)BeanFactoryPostProcessor允许使用者修改容器中的bean definitions。

(2)BeanFactoryPostProcessor可以与bean definitions打交道,但是千万不要进行bean实例化。

二、BeanFactoryPostProcessor扩展实现方式

方式一:使用@Configuration+ @Bean 方式初始化

方式二:使用@ComponentScan+ @Component方式初始化

接下来通过方式二来看下。

2.1?构建一个应用

???????这里使用了上一节构建的应用,你可以接着或者重新构建一个新的Sprin Boot项目。

2.2?定义一个User

???????先构建一个User:

package com.kfit.demo.bean;?public class User {    private String userName;    private int age;?    public User(String userName,int age){        this.userName = userName;        this.age = age;    }?    public String getUserName() {        return userName;    }?    public void setUserName(String userName) {        this.userName = userName;    }?    public int getAge() {        return age;    }?    public void setAge(int age) {        this.age = age;    }}?

2.3?注入User

???????使用@Configuration注入User:

package com.kfit.config;?import com.kfit.demo.bean.User;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;?@Configurationpublic class UserConfig {?    @Bean(name = "user")    public User user(){        System.out.println("Configuration.user");        return new User("WuQian",18);    }}

???????如果此时启动应用,获取user bean的话,打印userName值是WuQian。

2.3自定义BeanFactoryPostProcessor

???????自定义一个BeanFactoryPostProcessor,然后修改user的属性值:

package com.kfit.config;?import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.stereotype.Component;?/** * 扩展点BeanFactoryPostProcessor * * @author 悟纤「公众号SpringBoot」 * @date 2022-05-24 * @slogan 大道至简 悟在天成 */@Componentpublic class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {        System.out.println("MyBeanFactoryPostProcessor.postProcessBeanFactory-->start");        BeanDefinition bd = beanFactory.getBeanDefinition("user");        //开始修改属性的值        bd.getPropertyValues().add("userName","悟纤");        System.out.println("MyBeanFactoryPostProcessor.postProcessBeanFactory-->end");    }}?

???????自定义一个MyBeanFactoryPostProcessor实现BeanFactoryPostProcessor接口,重写postProcessBeanFactory()方法来实现对User Bean定义的修改

???????可以在任意一个service类使用User,

package com.kfit.demo.service;?import com.kfit.demo.bean.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;?import javax.annotation.PostConstruct;?/** * * * @author 悟纤「公众号SpringBoot」 * @date 2022-05-16 * @slogan 大道至简 悟在天成 */@Servicepublic class DemoService {?    @Value("${test.name}")    private String name;?    @Autowired    private User user;???    public DemoService(){        System.out.println("DemoService.DemoService()");    }?    @PostConstruct    public void  init(){        System.out.println("DemoService.init ,name ="+name);        System.out.println("DemoService.init -> " +user.getUserName());    }}?

???????启动应用看下结果:

???????从这里的控制台的信息的打印也可以看出前面的几个扩展点确实在BeanFactoryPostProcessor之前执行的。

???????另外就是user对象的属性值确实是被替换了。

??

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-08 18:52:54  更:2022-06-08 18:54:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:47:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码