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

前言

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

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

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

代码示例

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

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

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

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

实现代码示例

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


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.stereotype.Component;

/**
 * @author liuya
 */
@Component
public class RemoveRegistryBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        String[] names = registry.getBeanDefinitionNames();
        for (String name : names) {
            if (name.contains("taskSendMessageListener") || name.contains("globalListener") || name.contains("executionSendMessageListener") || name.contains("processCallbackMesController")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.system.flow")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.system.modules.message")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.graphics.task")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.graphics.bimlight.location")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.graphics.bimlight.sectioning")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.graphics.modules")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.ubw.job")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.ubw.listener")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.ubw.msg")) {
                registry.removeBeanDefinition(name);
            }
            if (name.contains("org.springblade.ubw.service")) {
                registry.removeBeanDefinition(name);
            }
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

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

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

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

@SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration.class}) 移除
ProcessEngineServicesAutoConfiguration自动配置类代码,还有剔除,项目中引用flowable的项目类的注入,就可以正常启动了。

相关知识

BeanDefinitionRegistryPostProcessor是Spring框架中的一个扩展接口,用于在Bean定义注册过程中对Bean定义进行修改和自定义操作。下面是对BeanDefinitionRegistryPostProcessor的详细解释:

解释:


BeanDefinitionRegistryPostProcessor是一个特殊的BeanFactoryPostProcessor,它允许在Spring容器加载Bean定义后,在将这些定义转化为实际的Bean实例之前,对Bean定义进行进一步的修改、添加或删除操作。

特点:

  • 在Spring容器启动阶段执行:BeanDefinitionRegistryPostProcessor是在Bean定义加载到Spring容器之后,Bean实例化之前调用的。
  • 修改Bean定义:可以通过实现该接口来动态修改或增加Bean定义,例如修改Bean的属性值、更改Bean的作用域、添加额外的Bean定义等。
  • 扩展Spring功能:通过使用BeanDefinitionRegistryPostProcessor,开发者可以在Spring容器启动过程中插入自定义逻辑,以满足特定需求。


使用方法:


要使用BeanDefinitionRegistryPostProcessor,需要按照以下步骤进行操作:

  • 创建一个类并实现BeanDefinitionRegistryPostProcessor接口。
  • 实现接口中的postProcessBeanDefinitionRegistry()方法,该方法在所有Bean定义加载到Spring容器之后被调用,可以在此方法中修改Bean定义。
  • 注册该类到Spring容器中,可以通过@Component注解或配置文件等方式进行注册。


应用场景:


BeanDefinitionRegistryPostProcessor常用于以下场景:

  • 动态注册Bean定义:根据条件动态地向Spring容器中注册Bean定义。
  • 修改Bean定义属性:对已有的Bean定义进行修改,如更改作用域、属性值等。
  • 注册自定义的Bean后处理器:在该阶段可以手动注册自定义的Bean后处理器,以扩展Spring框架的功能。


总结:


BeanDefinitionRegistryPostProcessor是Spring框架提供的一个扩展接口,它允许在Bean定义加载完毕后,在实例化Bean之前对Bean定义进行进一步的修改和自定义操作。通过实现该接口,开发者可以动态注册Bean定义、修改Bean属性,或注册自定义的Bean后处理器。这为开发者提供了更高程度的灵活性和定制性。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰山AI

原创不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值