这篇文章主要讲解了“SpringBoot怎么删除引用jar包中的无用bean”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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的项目类的注入,就可以正常启动了。
感谢各位的阅读,以上就是“SpringBoot怎么删除引用jar包中的无用bean”的内容了,经过本文的学习后,相信大家对SpringBoot怎么删除引用jar包中的无用bean这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。