Spring中的BeanPostProcessor有什么作用
Spring中的BeanPostProcessor有什么作用
在Spring
中,你一定看到过BeanPostProcessor
,那么这个接口有什么作用呢?
简单说下,他是Spring
中创建bean
的过程中,非常重要的一个扩展;它允许我们在Spring
容器初始化、依赖注入、bean
的初始化的时候,插入自定义的一些逻辑。
正因为如此,它大大提高了Spring
的灵活性和扩展性,那么我们该如何去使用它呢?
我们先看看看这个接口的源码,有什么方法,注释我就去掉了,想了解的可以自行翻阅源码
代码语言:javascript代码运行次数:0运行复制package org.springframework.beans.;
import org.springframework.beans.BeansException;
import org.springframework.lang.ullable;
public interface BeanPostProcessor {
@ullable
default Object postProcessBeforeInitialization(Object bean, String beaname) throws BeansException {
return bean;
}
@ullable
default Object postProcessAfterInitialization(Object bean, String beaname) throws BeansException {
return bean;
}
}
可以看到,这个接口定义了两个方法,都有默认的实现
postProcessBeforeInitialization()
:此方法会在bean
的初始化之前调用
postProcessAfterInitialization()
:此方法会在bean
的初始化之后调用
下面我们就用一个简单的demo
来使用以下这个BeanPostProcessor
。
那么首先,我们定义一个配置文件application.yml
,添加下面的信息
custom:
property1: value1
property2: value2
现在我们写一个bean
,读取这配置文件的配置
package com.;
import lombok.Data;
import org.springframework.properties.ConfigurationProperties;
import org.annotation.Configuration;
import java.util.List;
@Data
@Configuration
@ConfigurationProperties("custom")
public class CustomProperties {
private String property1;
private String property2;
private List<String> moreProperties;
}
接下来,我们需要实现BeanPostProcessor
,在其中实现了postProcessAfterInitialization
方法
package com.;
import slf4j.Slf4j;
import org.jetbrains.;
import org.springframework.beans.BeansException;
import org.springframework.beans..BeanPostProcessor;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
private final List<String> CUSTOM_PROPERTIES = new ArrayList<String>() {{
add("value");
add("value4");
}};
@Override
public Object postProcessAfterInitialization(@otull Object bean, @otull String beaname) throws BeansException {
if (bean instanceof CustomProperties) {
// 将新的属性源添加到属性中
CustomProperties customProperties = (CustomProperties) bean;
List<String> moreProperties = customProperties.getMoreProperties();
if (Objects.isull(moreProperties)) {
moreProperties = new ArrayList<>();
customProperties.setMoreProperties(moreProperties);
}
moreProperties.addAll(CUSTOM_PROPERTIES);
}
return bean;
}
}
这代码逻辑十分简单,就是判断一下bean
类型,然后往指定的属性中添加属性
下面我们启动一下Spring
,从配置文件中读取,看看能不能读取到
package com.banmoon;
import com..CustomProperties;
import slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.Resource;
@Slf4j
@SpringBootApplication
public class DjMain implements CommandLineRunner {
@Resource
private CustomProperties customProperties;
public static void main(String[] args) {
SpringApplication.run();
}
@Override
public void run(String... args) throws Exception {
log.info("customProperties1: {}", customProperties.getProperty1());
log.info("customProperties2: {}", customProperties.getProperty2());
log.info("moreProperties: {}", customProperties.getMoreProperties());
}
}
这段代码就是启动类,直接启动获取看看结果
总结一下,它可以允许开发者在bean
的初始化前后对bean
进行一些操作,那么主要可以用它来做些什么事情?我简单列举一下
- 就像我上面那样,修改了
bean
的属性 - 包装
bean
的方法,就像AOP
那样 - 指定一些特定的
bean
初始化前后,需要做其他额外的操作
这边还需要再强调的事
- 你的
BeanPostProcessor
得在包扫描当中,这点应该明白 - 如果不加条件判断要处理的特定
bean
,所有的bean
的都会受影响;就像我上面那样进行判断,对特定的bean
进行操作即可
好了,通过本文的讲解以及demo
的演示,相信大家已经对BeanPostProcessor
的功能、使用有了深入的理解
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:GraphRAG vs 传统 RAG:如何通过知识图谱提升 AI 检索能力
下一篇:《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
推荐阅读
留言与评论(共有 14 条评论) |
本站网友 贾大山 | 9分钟前 发表 |
value2现在我们写一个bean | |
本站网友 哈尔滨癫痫病医院 | 30分钟前 发表 |
那么首先 | |
本站网友 一岁半的宝宝早教 | 28分钟前 发表 |
修改了bean的属性包装bean的方法 | |
本站网友 金湖网 | 16分钟前 发表 |
那么主要可以用它来做些什么事情?我简单列举一下就像我上面那样 | |
本站网友 上海派 | 30分钟前 发表 |
{}" | |
本站网友 海通证券官方网 | 28分钟前 发表 |
在其中实现了postProcessAfterInitialization方法代码语言:javascript代码运行次数:0运行复制package com.; import slf4j.Slf4j; import org.jetbrains.; import org.springframework.beans.BeansException; import org.springframework.beans..BeanPostProcessor; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Objects; @Slf4j @Component public class CustomBeanPostProcessor implements BeanPostProcessor { private final List<String> CUSTOM_PROPERTIES = new ArrayList<String>() {{ add("value"); add("value4"); }}; @Override public Object postProcessAfterInitialization(@otull Object bean | |
本站网友 千瓦 | 10分钟前 发表 |
代码我们先看看看这个接口的源码 | |
本站网友 北京瑜伽 | 24分钟前 发表 |
那么我们该如何去使用它呢?二 | |
本站网友 大梁骨 | 25分钟前 发表 |
Spring中的BeanPostProcessor有什么作用 一 | |
本站网友 好大夫在线咨询 | 2分钟前 发表 |
那么这个接口有什么作用呢?简单说下 | |
本站网友 偃师论坛 | 22分钟前 发表 |
那么主要可以用它来做些什么事情?我简单列举一下就像我上面那样 | |
本站网友 中国济宁 | 14分钟前 发表 |
代码我们先看看看这个接口的源码 | |
本站网友 狮山二手房网 | 6分钟前 发表 |
直接启动获取看看结果image-2025010422545861三 |