Maison  >  Article  >  Java  >  Comment SpringBoot supprime-t-il les beans inutiles dans les packages jar référencés ?

Comment SpringBoot supprime-t-il les beans inutiles dans les packages jar référencés ?

王林
王林avant
2023-05-14 20:07:092130parcourir

Avant-propos

L'entreprise a un projet pressé, et certaines des exigences du projet sont les mêmes que certaines des fonctions du projet précédent Afin de suivre la vitesse, certains modules du projet précédent. Les projets maven multi-modules ont été directement emballés dans jar Le formulaire a été introduit dans le nouveau projet. Bien que cela ait permis d'économiser beaucoup de temps de développement, cela a également obligé le projet à importer les dépendances associées du jar du projet, ce qui a entraîné la suppression du projet. gonflé et lent à démarrer. Existe-t-il un moyen de faire en sorte que le projet charge uniquement les beans dont il a besoin ?

Bien sûr, nous pouvons directement modifier le code source, le reconditionner et l'importer pour résoudre le problème, mais cette méthode est trop gênante.

Grâce à la méthode de Baidu, la requête peut être implémentée à l'aide de l'annotation @ComponentScan sur la classe de démarrage Springboot

Exemples de code

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

Mais après de nombreuses implémentations, il s'est avéré inutile. généralement passé par Spring SPI Spring. La méthode des usines charge le Bean dans un autre projet.

spring.factories créera des beans définis dans le pot, par exemple en forçant les valeurs de retour formatées

Plus tard, j'ai découvert qu'en utilisant BeanDefinitionRegistryPostProcessor, après avoir analysé les informations d'enregistrement du bean, il suffit de le supprimer directement, de sorte que le bean ne sera pas créé.

BeanDefinitionRegistryPostProcessor hérite de BeanFactoryPostProcessor pour gérer ces beans

Exemple de code d'implémentation

Créez une nouvelle classe RemoveRegistryBeanFactoryPostProcessor dans le projet, le code est le suivant

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

Bien sûr, il existe des codes pour les classes de configuration automatique qui doivent supprimer les enregistrements de beans , nous pouvons terminer la configuration via

@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);
    }
}

, la vitesse de démarrage du projet est beaucoup plus rapide, de nombreuses dépendances jar ont été supprimées et de nombreuses tables inutiles ont été supprimées, telles que les tables associées du workflow fluide dans le passé. Les tables du flux de travail étaient toujours automatiquement interrogées au démarrage du projet, ce qui entraînait le travail de suppression de la base de données. Le projet de table de flux ne démarrera pas. Supprimez maintenant le code de la classe de configuration automatique ProcessEngineServicesAutoConfiguration via

@SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration. class}), et éliminez également l'injection de classes de projet qui font référence à Flowable dans le projet, et tout fonctionnera normalement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer