Heim  >  Artikel  >  Java  >  Wie löscht SpringBoot unnötige Beans in referenzierten JAR-Paketen?

Wie löscht SpringBoot unnötige Beans in referenzierten JAR-Paketen?

王林
王林nach vorne
2023-05-14 20:07:092130Durchsuche

Vorwort

Das Unternehmen hat ein Projekt, die Zeit ist relativ knapp und einige der Projektanforderungen stimmen mit einigen Funktionen früherer Projekte überein Integrieren Sie direkt das vorherige Maven-Projekt mit mehreren Modulen. Einige der Module werden direkt in Form von JAR-Paketen in neue Projekte eingeführt. Dies spart zwar viel Entwicklungszeit, führt jedoch auch dazu, dass das Projekt die zugehörigen Abhängigkeiten importieren muss jar, was dazu führt, dass das Projekt aufgebläht wird und langsam startet. Gibt es eine Möglichkeit, dafür zu sorgen, dass das Projekt nur die benötigten Beans lädt?

Natürlich können wir den Quellcode direkt ändern und neu verpacken, um das Problem zu lösen, aber diese Methode ist zu mühsam.

Durch die Baidu-Methode kann die Abfrage mithilfe der @ComponentScan-Annotation in der Springboot-Startup-Klasse implementiert werden Ich habe es oft implementiert und fand es nutzlos. Es stellte sich heraus, dass Beans außerhalb des Projektpakets normalerweise über die Spring-SPI-Methode spring.factories in ein anderes Projekt geladen werden.

spring.factories erstellt einige im JAR definierte Beans, z. B. das Erzwingen formatierter Rückgabewerte

Später habe ich das mithilfe von BeanDefinitionRegistryPostProcessor direkt nach dem Parsen der Registrierungsinformationen festgestellt Entfernen Sie die Bean einfach direkt, damit die Bean nicht erstellt wird.

BeanDefinitionRegistryPostProcessor erbt BeanFactoryPostProcessor, um diese Beans zu verwalten

Implementierungscodebeispiel

Erstellen Sie eine neue RemoveRegistryBeanFactoryPostProcessor-Klasse im Projekt. Der Code lautet wie folgt# 🎜 🎜 #

@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX,
        pattern = {"com.xx.controller","com.xx.xx"})})
#🎜 🎜# Natürlich gibt es einige automatische Konfigurationscodes, die gelöscht werden müssen. Wir können die Konfiguration über

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 {
    }
}

abschließen. Die Projektstartgeschwindigkeit ist viel schneller, viele JAR-Abhängigkeiten haben wurden entfernt und viele nutzlose Tabellen, z. B. Tabellen im Zusammenhang mit Flowable-Workflows, wurden beim Starten des Projekts automatisch abgefragt Dadurch wurde die Datenbank nicht gestartet. Durch

entfernt @SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration.class}) den automatischen Konfigurationsklassencode von ProcessEngineServicesAutoConfiguration und eliminiert die Injektion von Projektklassen, die auf Flowable verweisen das Projekt, und es kann normal starten.

Das obige ist der detaillierte Inhalt vonWie löscht SpringBoot unnötige Beans in referenzierten JAR-Paketen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen