ホームページ >Java >&#&チュートリアル >SpringBoot は参照された jar パッケージ内の不要な Bean をどのように削除しますか?
この会社はスケジュールが厳しいプロジェクトを抱えており、プロジェクトの要件の一部は前のプロジェクトの機能の一部と同じです。速度の向上により、以前のマルチモジュール Maven プロジェクトの一部のモジュールが直接転送され、jar パッケージの形式で新しいプロジェクトに直接導入されました。これにより、開発時間が大幅に節約されますが、プロジェクトで関連するモジュールをインポートする必要も生じます。プロジェクト jar の依存関係が原因で、プロジェクトが肥大化し、起動が遅くなります。プロジェクトに必要な Bean だけをロードさせる方法はありますか?
もちろん、ソースコードを直接修正して再パッケージ化してインポートすることで問題を解決することもできますが、この方法は面倒すぎます。
Baidu のメソッドを通じて、スプリングブート スタートアップ クラスの @ComponentScan アノテーションを使用してクエリを実装できます
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = {"com.xx.controller","com.xx.xx"})})
しかし、多くの実装の後、それは次のとおりであることが判明しました。パッケージ外の元のプロジェクト Bean は、通常、Spring SPI spring.factories メソッドを通じて別のプロジェクトにロードされます。
spring.factories は、フォーマットされた戻り値を強制するなど、jar で定義されたいくつかの Bean を作成します。
その後、BeanDefinitionRegistryPostProcessor を使用すると、解析後に Bean 登録情報を直接削除できることがわかりました。問題ありません。Bean は作成されません。
BeanDefinitionRegistryPostProcessor は、これらの Bean を管理するために BeanFactoryPostProcessor を継承します
プロジェクト内に新しい 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 { } }
Ofもちろん、いくつかの自動構成があります。クラス コードは 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 依存関係が削除され、多くの無駄なテーブルが削除されます。フローブルワークフロー関連テーブルなど 以前は、プロジェクト開始時にワークフローの関連テーブルが自動的にクエリされていたため、データベースを削除したワークフローのテーブルプロジェクトは開始されませんでしたが、現在は経由するようになりました。
@SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration.class}) ProcessEngineServicesAutoConfiguration 自動構成クラスのコードに加えて、プロジェクト内の Flowable を参照するプロジェクト クラスの削除と挿入も行われ、正常に起動できます。
以上がSpringBoot は参照された jar パッケージ内の不要な Bean をどのように削除しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。