회사에서 진행 중인 프로젝트가 있는데, 프로젝트의 요구 사항 중 일부가 이전 프로젝트의 일부 기능과 동일합니다. 속도를 높이기 위해 이전 다중 모듈의 일부 모듈을 변경했습니다. Maven 프로젝트가 jar에 직접 패키징되었습니다. 양식이 새 프로젝트에 도입되어 개발 시간이 많이 절약되었지만 프로젝트가 프로젝트 jar의 관련 종속성을 가져와야 했기 때문에 프로젝트가 비대해지고 느려졌습니다. 시작한다. 프로젝트에 필요한 Bean만 로드하도록 하는 방법이 있습니까?
물론 소스코드를 직접 수정하고 리패키징하고 임포트하여 문제를 해결할 수도 있지만 이 방법은 너무 번거롭습니다.
Baidu의 방법을 통해 springboot 시작 클래스의 @ComponentScan 주석을 사용하여 쿼리를 구현할 수 있습니다.
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = {"com.xx.controller","com.xx.xx"})})
그러나 여러 번 구현한 후 프로젝트 패키지 외부의 Bean은 쓸모가 없다는 것이 밝혀졌습니다. 일반적으로 spring SPI spring을 통해 전달됩니다. 팩토리 메소드는 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}) 또한 프로젝트에서 흐름을 참조하는 프로젝트 클래스의 삽입을 제거하면 모든 것이 정상적으로 시작됩니다.
위 내용은 SpringBoot는 참조된 jar 패키지에서 쓸모 없는 빈을 어떻게 삭제합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!