• 如何在springboot项目中删除引用jar包中的无用bean


    前言

    公司有个项目,时间比较赶,而且项目的部分需求,和之前做的项目部分功能一样,为了赶速度和直接将之前多模块的maven项目中的部分模块,直接以jar包的形式引入到新项目中了,虽然省去了不少开发时间,但是造成项目需要导入引入项目jar的相关依赖,导致项目臃肿,启动很慢。有没有办法让项目只加载自己需要的bean呢?

    当然我们可以直接修改源代码重新打包引入去解决,但是这个办法太多麻烦。

    通过百度的手段,查询可以在springboot启动类上用@ComponentScan注解去实现

    代码示例

    1. @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX,
    2. pattern = {"com.xx.controller","com.xx.xx"})})

    但是经过实现很多次发现没用,原来项目包以外的bean一般是通过 通过spring SPI spring.factories的方法把Bean加载到另一个项目当中去。

    spring.factories会创建一些jar中的定义的bean,比如强制格式化返回值

    后来发现通过使用BeanDefinitionRegistryPostProcessor,直接在 解析完bean的注册信息后,直接移除就行,这样就不会创建bean。BeanDefinitionRegistryPostProcessor继承BeanFactoryPostProcessor能够管理这些bean

    实现代码示例

    在项目中新建 RemoveRegistryBeanFactoryPostProcessor类,代码如下

    1. import org.springframework.beans.BeansException;
    2. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    3. import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    4. import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
    5. import org.springframework.stereotype.Component;
    6. /**
    7. * @author liuya
    8. */
    9. @Component
    10. public class RemoveRegistryBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    11. @Override
    12. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    13. String[] names = registry.getBeanDefinitionNames();
    14. for (String name : names) {
    15. if (name.contains("taskSendMessageListener") || name.contains("globalListener") || name.contains("executionSendMessageListener") || name.contains("processCallbackMesController")) {
    16. registry.removeBeanDefinition(name);
    17. }
    18. if (name.contains("org.springblade.system.flow")) {
    19. registry.removeBeanDefinition(name);
    20. }
    21. if (name.contains("org.springblade.system.modules.message")) {
    22. registry.removeBeanDefinition(name);
    23. }
    24. if (name.contains("org.springblade.graphics.task")) {
    25. registry.removeBeanDefinition(name);
    26. }
    27. if (name.contains("org.springblade.graphics.bimlight.location")) {
    28. registry.removeBeanDefinition(name);
    29. }
    30. if (name.contains("org.springblade.graphics.bimlight.sectioning")) {
    31. registry.removeBeanDefinition(name);
    32. }
    33. if (name.contains("org.springblade.graphics.modules")) {
    34. registry.removeBeanDefinition(name);
    35. }
    36. if (name.contains("org.springblade.ubw.job")) {
    37. registry.removeBeanDefinition(name);
    38. }
    39. if (name.contains("org.springblade.ubw.listener")) {
    40. registry.removeBeanDefinition(name);
    41. }
    42. if (name.contains("org.springblade.ubw.msg")) {
    43. registry.removeBeanDefinition(name);
    44. }
    45. if (name.contains("org.springblade.ubw.service")) {
    46. registry.removeBeanDefinition(name);
    47. }
    48. }
    49. }
    50. @Override
    51. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    52. }
    53. }

    当然还有部分自动配置类的代码需要删除bean注册,我们可以通过

    @SpringBootApplication(exclude = {})的方式去实现,代码如下:
    1. @EnableAsync
    2. @EnableScheduling
    3. @SpringBootApplication(exclude = {DllInitLoader.class,ProcessEngineServicesAutoConfiguration.class})
    4. public class UnifyWorkFaceApplication {
    5. public static void main (String[] args) {
    6. BladeApplication.run("work-face", UnifyWorkFaceApplication.class, args);
    7. }
    8. }

    配置完毕,项目启动速度快了很多,也去除了很多jar依赖,还删除了很多无用表,比如flowable工作流的相关表,之前项目启动时老是自动去查询工作流的相关表,导致删除数据库的工作流的表项目就会启动不起来,现在通过

    @SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration.class}) 移除
    ProcessEngineServicesAutoConfiguration自动配置类代码,还有剔除,项目中引用flowable的项目类的注入,就可以正常启动了。
  • 相关阅读:
    【1656. 设计有序流】
    全栈软件开发人员提问常用的ChatGPT通用提示词模板
    山西电力市场日前价格预测【2023-11-07】
    软考高级 | 系统架构设计师笔记(一)
    使用 Netty 实现简易版 Dubbo RPC 远程调用过程
    JDK中线程池的使用
    前端在登录时将用户密码加密
    ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
    4.1 网络基础之网络IO
    C语言接口与实现:创建可重用软件的技术
  • 原文地址:https://blog.csdn.net/weixin_40986713/article/details/125411748