Bug回顧録:Gradle/springマルチプロジェクト分割

2939 ワード

前言
最近、以前のpythonテクノロジースタックのプロジェクトをjavaテクノロジースタックに完全に移行し、移行後のプロジェクトはますます膨大になり、プロジェクトの分割に着手しました.
分割ステップ
共用する特定の業務に関係のない部分をcommonに分解し,他の2つの業務の1つはメイン業務officep,1つは付加業務findd,officep,finddはいずれもcommonに依存し,finddは同時にofficepに依存する.分割後のディレクトリ構造は次のように見えます.
  • common |-- build.gradle |-- src/main/java/com/uranome/fbs/common/
  • officep |-- build.gralde |-- src/main/java/com/uranome/fbs/officep/|-- src/main/java/com/uranome/fbs/officep/persistance/UserRepository.java
  • findd |-- build.gradle |-- src/main/java/|-- src/main/java/com/uranome/fbs/findd/service/EvaluationService.java
  • build.gradle
  • settings.gradle

  • バグの到来
    build.gradleとsettings.gradleファイルの作成は、公式doc Authoring Multi-Project Buildsを直接参照します.コンパイルは順調に完了し、officepプロジェクトも順調に起動できますが、finddプロジェクトの起動時にエラーが発生しました.EvaluationServiceのUserRepositoryのアセンブリに失敗しました.UserRepositoryというBeanが見つかりません.バグは常に暴風雨のように激しく、UserRepositoryが@Repositoryという注釈を加えたことを繰り返し確認した後もバグは存在した.
    バグの試行
    1.ComponentScanの修正com.uranome.fbs.officep.persistanceをfinddのComponentScanに追加し、テストの問題は依然として存在します.
    2.Entity Scanの追加
    Googleの後に注釈を追加します.
    @EntityScan({
        "com.uranome.fbs.findd",
        "com.uranome.fbs.officep.persistance",
    })
    

    今回投げ出した異常は以前とは違うが、まだ起きられない.
    考える
    私たちの既存の知識から、このバグの発生原因はbeanの自動組立失敗であるべきだと推測することができますが、現在から見れば、組立失敗は2つの原因にほかならない.
  • beanのクラスはスキャンされませんでした.
  • beanが存在するクラスはスキャンされたが、何らかの理由でbeanが作成されなかった.

  • 2日間にわたるGoogleの後もバグは解決されず、springのDI全体の流れを深く理解する必要があることに気づきました.
    その後はclone SpringBootの倉庫であり,runに従ってコード+デバッグを行い,org.springframework.context.annotation.ConfigurationClassParserdoProcessConfigurationClassメソッドでcom.uranome.fbs.officep.persistanceというパッケージを見たが,原因1は排除できることが分かった.次に理由2を検証すれば、すべてのsingleton beansはApplicationContextが保有しているDefaultListableBeanFactory.preInstantiateSingletonsで作成されます(この段落で私が何を言っているのか分からない場合は、Springソースコードで解読した文章を参考にしたり、ソースコードを自分で見たりすることができます).UserRepositoryというbeanが作成されていない理由は、isAbstractの判断から除外されているため、UserRepositoryはabstractであることを意味する.RepositoryはSpring JPAでinterface声明だったのを思い出してみると、abstractではないのがおかしいですね.
    バグが発生した原因を知り、グーグルで検索してようやく解決策を得た.Repositoryは、beanとして作成されるために特別な処理が必要であり、すなわち@EnableJpaRepositories注釈を追加する.
    バグの解決
    最終的に得られたコードは、次のようになります.
    src/main/java/com/uranome/fbs/findd/App.java
    @SpringBootApplication
    @ComponentScan({"com.uranome.fbs.common", "com.uranome.fbs.findd",
     "com.uranome.fbs.officep.persistance", "com.uranome.fbs.officep.service"})
    @EnableJpaRepositories({"com.uranome.fbs.findd", "com.uranome.fbs.officep.persistance"})
    @EntityScan({"com.uranome.fbs.findd", "com.uranome.fbs.officep.persistance"})
    public class App