欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > Spring 重写内置 Bean(Controller、Service 等)

Spring 重写内置 Bean(Controller、Service 等)

2025/9/28 22:59:46 来源:https://blog.csdn.net/catoop/article/details/144110051  浏览:    关键词:Spring 重写内置 Bean(Controller、Service 等)

场景

  • svc1.jar 中有一个 TestController 类,当前源代码工程 demo 依赖了这个 svc1.jar
  • 当前 demo 工程启动正常,TestController 被初始化,TestController 中提供的接口 /svc1/test1/svc1/test2/svc1/test3 均可以正常访问。
  • 因接口 /svc1/test2 对应的方法中逻辑处理不满足需求,需要对这个方法进行重写处理。
  • 该接口在 svc1.jar 包,不能直接修改源代码。

处理方式

主要思路是在 Spring 注册 Bean 之后进行 PostProcessor 时,将已经注册的 svc1.jar 中的 TestController 从上下文中删除。使我们新创建的继承 TestController 的重写类能被正常加载实例化,而不出现 PathMapping 重复的报错冲突。

主要代码如下:

/*** 排除容器中的Bean* * @author 单红宇* @since 2024/11/28 13:14*/
@Slf4j
@Configuration
public class ExcludeComponentConfiguration implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {registry.removeBeanDefinition(getDefaultBeanName(FileController.class));registry.removeBeanDefinition(getDefaultBeanName(UserController.class));}/*** 根据类 class 获取 spring 默认的 beanName** @param clazz clazz* @return String*/private String getDefaultBeanName(Class<?> clazz) {// 测试内部类 AutowireUtils.ObjectFactoryDelegatingInvocationHandler 的默认 BeanName// StringUtils.uncapitalizeAsProperty(ClassUtils.getShortName(AutowireUtils.ObjectFactoryDelegatingInvocationHandler.class.getName()))// spring 6.0 之前使用 StringUtils.uncapitalize()return org.springframework.util.StringUtils.uncapitalizeAsProperty(ClassUtils.getShortName(clazz.getName()));}
}
/*** 重写FileController类* * @author 单红宇* @since 2024/11/28 12:03*/
@RestController //该注解必须要有,Mapping那些注解不需要
public class OverrideFileController extends FileController {@Overridepublic void fileDownload(@RequestParam("fileId") Long fileId,@RequestParam("isInline") Integer isInline,HttpServletResponse response, HttpServletRequest request) {System.out.println("override filedownload...");}}

(END)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com