当前位置: 首页 > news >正文

Hutool中SpringUtil中的一个坑-所有路由消失

问题场景

Spring boot 2.7.18
使用Hutool文档中使用方法

@ComponentScan(basePackages={"cn.hutool.extra.spring"})
@Import(cn.hutool.extra.spring.SpringUtil.class)

在主入口定义,会导致路由全部消失,接口访问404。

解决方案

使用提供的@EnableSpringUtil注解或者新建个配置类,将两个注解放到上面。

原因分析

ComponentScan 注解 与 @Import 注解

@ComponentScan 用于自动检测和注册带有特定注解的类为bean。这些注解通常包括但不限于 @Component , @Service , @Repository , 和 @Controller 。当一个配置类上使用了 @ComponentScan ,Spring会扫描指定的包及其子包,并将所有带有上述注解的类作为bean注册到IoC容器中。

  • @ComponentScan主要用于自动发现和注册组件
  • @Impoert适用于导入特定的配置类和静态bean定义,便于模块化配置

怀疑是@SpringApplication中的@ComponentScan同主入口的@ComponetScan相冲突

BeanFactoryPostProcessor

允许开发者在Spring IoC容器初始化之前对BeanFactory进行修改,是最早要执行的方法。该接口只有一个方法需要实现

public interface BeanFactoryPostProcessor {void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

这个函数允许访问并修改BeanFactory的内容,这个方法调用发生在所有bean实例化之前,可以进行配置。

ApplicationContextAware

使一个类能够获得整个Spring应用上下文(ApplicationContext)的引用。通常,当一个类实现了ApplicationContextAware接口后,Spring容器会在初始化该类的实例时自动调用一个回调方法,将当前的ApplicationContext实例注入给该类。

SpringUtil的代码

通过实现上面两个BeanFactoryPostProcessorApplicationContextAware的接口,可以实现Util方法,不用实例化,直接调用静态方法

@Component
public class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextAware {/*** "@PostConstruct"注解标记的类中,由于ApplicationContext还未加载,导致空指针<br>* 因此实现BeanFactoryPostProcessor注入ConfigurableListableBeanFactory实现bean的操作*/private static ConfigurableListableBeanFactory beanFactory;/*** Spring应用上下文环境*/private static ApplicationContext applicationContext;@SuppressWarnings("NullableProblems")@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {SpringUtil.beanFactory = beanFactory;}@SuppressWarnings("NullableProblems")@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {SpringUtil.applicationContext = applicationContext;}/*** 获取{@link ApplicationContext}** @return {@link ApplicationContext}*/public static ApplicationContext getApplicationContext() {return applicationContext;}/*** 获取{@link ListableBeanFactory},可能为{@link ConfigurableListableBeanFactory} 或 {@link ApplicationContextAware}** @return {@link ListableBeanFactory}* @since 5.7.0*/public static ListableBeanFactory getBeanFactory() {final ListableBeanFactory factory = null == beanFactory ? applicationContext : beanFactory;if (null == factory) {throw new UtilException("No ConfigurableListableBeanFactory or ApplicationContext injected, maybe not in the Spring environment?");}return factory;}/*** 获取{@link ConfigurableListableBeanFactory}** @return {@link ConfigurableListableBeanFactory}* @throws UtilException 当上下文非ConfigurableListableBeanFactory抛出异常* @since 5.7.7*/public static ConfigurableListableBeanFactory getConfigurableBeanFactory() throws UtilException {final ConfigurableListableBeanFactory factory;if (null != beanFactory) {factory = beanFactory;} else if (applicationContext instanceof ConfigurableApplicationContext) {factory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();} else {throw new UtilException("No ConfigurableListableBeanFactory from context!");}return factory;}

在Bean注册时,已经完成了BeanFactory的实例化,可以直接调用getBean等方法了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker安装elasticsearch(es)最新版本
  • 3.5.3、查找和排序算法-插入类排序和选择类排序
  • Dify中语音和文字间转换问题的一种暂时注释方式
  • 大模型算法面试题(十七)
  • Django实战:开启数字化任务管理的新纪元
  • C/C++编程-算法学习-数字滤波器
  • 日常踩坑---ljmp在BIOS中的使用
  • pytest-html报告修改与汉化
  • CTF-NSSCTF[NISACTF 2022]
  • 探索PostgreSQL的GUI工具:提升数据库管理效率
  • 小阿轩yx-部署 KVM 虚拟化平台
  • Elasticsearch跨集群搜索
  • 搜维尔科技:Haption Virtuose 6D遥操作控制人形机器人操作
  • 【Linux-IMX6ULL-阻塞与非阻塞】
  • org.eclipse.jgit 简单总结
  • es6
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • javascript数组去重/查找/插入/删除
  • Mybatis初体验
  • React 快速上手 - 07 前端路由 react-router
  • SQLServer之创建显式事务
  • Tornado学习笔记(1)
  • Vue组件定义
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 回顾 Swift 多平台移植进度 #2
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 面试总结JavaScript篇
  • 悄悄地说一个bug
  • 一道闭包题引发的思考
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ![CDATA[ ]] 是什么东东
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define与typedef区别
  • #if和#ifdef区别
  • $NOIp2018$劝退记
  • %check_box% in rails :coditions={:has_many , :through}
  • (4)事件处理——(7)简单事件(Simple events)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (第一天)包装对象、作用域、创建对象
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (七)Activiti-modeler中文支持
  • (四)stm32之通信协议
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一一四)第九章编程练习
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .net 中viewstate的原理和使用
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @EnableConfigurationProperties注解使用
  • [001-03-007].第07节:Redis中的管道
  • [AIGC] Spring Interceptor 拦截器详解