利用BeanFactoryPostProcessor让Bean提前被创建

devtools/2024/10/11 5:29:25/

起因是bean的一些初始化方法里面,查询数据的时话,用到了Spring的一些Bean,采用的是静态调用。而这些bean还没有被始始化出来。导致空指针异常。需要提前把这部份bean创建好。虽然下面提出的解决方法能解决该问题。但仍然是不推荐的调用。不符合Spring正常的注入规则。而且此处没法用Depends之类的来处理

在某个InitializingBean的初始化方法中,调用了如下静态方法,导致不能正确的获取到SecretWrapperEnhancer对象,改造后如下:

@Overridepublic void afterPropertiesSet() {...//间接调用了SecretWrapperEnhancers.enhanceSecretWrapper...}publi
c class SecretWrapperEnhancers {private static List<SecretWrapperEnhancer> enhancers;public static void setEnhancers(List<SecretWrapperEnhancer> enhancers) {SecretWrapperEnhancers.enhancers = enhancers;}public static void enhanceSecretWrapper(SecretWrapper secretWrapper) {if (ZYListUtils.isEmptyList(enhancers)) {return;}// 旧有做法得到的是空的: List<SecretWrapperEnhancer> enhancers=SpringContextHolder.getBeans(SecretWrapperEnhancer.class);for (SecretWrapperEnhancer enhancer : enhancers) {if (enhancer.supportClass(secretWrapper.getModelClass())) {List<SecretModel> secretModels = enhancer.loadEnhanceModel(secretWrapper);secretWrapper.enhance(secretModels);}}}
}

只需要在postProcessBeanFactory中提前获取bean并设置即可,将bean的构建提到靠前的位置

public class PrepareCompleteAboutBeanProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {Map<String, SecretWrapperEnhancer> beansOfType = beanFactory.getBeansOfType(SecretWrapperEnhancer.class);Collection<SecretWrapperEnhancer> values = beansOfType.values();SecretWrapperEnhancers.setEnhancers(new ArrayList<>(values));}
}

http://www.ppmy.cn/devtools/46368.html

相关文章

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…

封装了一个iOS对号成功动画

基本思路其实很简单&#xff0c;就是通过贝塞尔曲线画出路径&#xff0c;然后 使用CAShapeLayer 渲染路径&#xff0c;然后通过strokeEnd 动画实现 路径的效果&#xff0c;这里注意&#xff0c;这个过程中过遇到过一个问题&#xff0c;就是 对号动画完成之后&#xff0c;整个对…

ABAP 借助公司封装的钉钉URL,封装的RFC给钉钉发送消息

FUNCTION ZRFC_BC_SMSSEND_DINGTALK. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" VALUE(DESTUSRID) TYPE CHAR255 *" VALUE(CONTENT) TYPE CHAR255 *&quo…

如何用结构化写好GPT的Prompt提示词

背景 最早接触 Prompt engineering 时, 学到的 Prompt 技巧都是: 你是一个 XX 角色…你是一个有着 X 年经验的 XX 角色…你会 XX, 不要 YY…对于你不会的东西, 不要瞎说!… 对比什么技巧都不用, 直接像使用搜索引擎一样提问, 上面的技巧对于回复的效果确实有着 明显提升. 在看…

创建线程的技术难点

在软件开发中&#xff0c;创建线程并正确地管理它们是一个复杂而关键的任务&#xff0c;涉及的技术难点主要有&#xff1a; 线程同步&#xff1a;当多个线程需要访问共享资源时&#xff0c;必须确保它们以某种方式同步&#xff0c;以避免数据不一致或其他并发问题。例如&#…

Ant Design Vue动态表头并填充数据

导语&#xff1a; 在开发过程中&#xff0c;我们常常会遇到需要展示大量数据的场景&#xff0c;例如商品信息、用户数据等。这些场景下&#xff0c;表格是一个很好的数据展示方式。Ant Design Vue是一款优秀的Vue UI组件库&#xff0c;它提供了丰富的组件&#xff0c;其中就包括…

构建体育直播平台源码:深度解析数据分析模块的核心展示内容

在现代的体育直播平台中&#xff0c;数据分析展示已经成为不可或缺的一部分。如下参考借助“东莞梦幻网络科技”提供的体育直播源码&#xff0c;打造的平台&#xff0c;并通过表格形式为用户列出以下数据分析内容&#xff1a; 1、积分排名&#xff1a;反映了各支队伍在赛季中的…

【JAVA】Java中MyBatis的QueryWrapper的使用

文章目录 前言一、函数解释二、代码实现三、总结 前言 在Java开发中&#xff0c;我们常常需要使用ORM框架来简化数据库操作。MyBatis是一个流行的ORM框架&#xff0c;而MyBatis-Plus是它的一个增强版&#xff0c;提供了更多的便利功能。在这篇博客中&#xff0c;我们将探讨如何…