スイープエレメント(スプリングデフォルトby金英漢)


スイープエレメント


これまで設定情報AppConfigでスプリング空席が登録されていた.このようにすると,スプリング空席が多ければ多いほど,設定情報が大きくなり,繰返し回数も多くなる.従って、設定情報なしでスプリングシート、すなわち走査素子を登録する方法がある.もちろん,依存関係は情報を設定することなく登録できる機能も提供する.
構成部品スキャンを適用するには、新しい設定情報クラスAutoAppConfigを作成します.@スプリングは、ComponentScanを貼り付けると、構成部品スキャンを使用していると認識されます.不要なスプリングシートの登録を避けるためにexcludeFilterを適用してフィルタを設定した.(必須じゃない!!)
    @Configuration
    @ComponentScan(
            excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
    Configuration.class))
    public class AutoAppConfig {
    
    }
コンポーネントスキャンでは、@コンポーネント付きクラスがスプリング空席として登録されます.そこで、登録したいインプリメンテーションクラスに@Componentを貼り付けます.
まず、repositoryはmemorymemberとして指定され、discountpolicyはクラスごとに操作説明を追加してレートで適用します.
  @Component
  public class MemoryMemberRepository implements MemberRepository {}
  @Component
  public class RateDiscountPolicy implements DiscountPolicy {}
コンストラクション関数の上に@Autowiredを追加して、コンポーネント宣言と注入依存性をメンバーサービスのインプリメンテーションに追加します.これにより、MemberRepositoryタイプに一致するスプリングシートが検索され、注入されます.今はMemoryMemberRepositoryです.
  @Component
  public class MemberServiceImpl implements MemberService {
  
      private final MemberRepository memberRepository;
      
      @Autowired
      public MemberServiceImpl(MemberRepository memberRepository) {
          this.memberRepository = memberRepository;
      }
}
OrderServiceを同じ原則で登録します.
  @Component
  public class OrderServiceImpl implements OrderService {
  
      private final MemberRepository memberRepository;
      private final DiscountPolicy discountPolicy;
      
      @Autowired
      public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
          this.memberRepository = memberRepository;
          this.discountPolicy = discountPolicy;
      }
}
構成部品をスキャンした後、スプリングブランクリポジトリは次のようになります.デフォルトでは、クラス名には前の文字のみが小文字で登録されます.

素子走査範囲
構成部品スキャンの範囲は、通常、設定ファイル(AutoAppConfig)の場所からナビゲートされます.したがって、すべてのアイテムの構成部品をスキャンする場合は、最上位レベルに設定ファイルを作成するだけです.ナビゲーションの場所を決定するには、basepackagesオプションを使用して次のように設定します.今の状況はハローcoreを含むすべてのサブパッケージに移動します.
@ComponentScan(
          basePackages = "hello.core",
}
スイープエレメント
コンポーネントスキャンのターゲットは@Componentを含むすべてのターゲットです.したがって、スキャンターゲットには、@Controller、@Service、@Repository、@Configurationも含まれます.これはすべてのノイズに@Componentが含まれているためです.ここで注意したいのは、継承関係がないことを宣言することです.Springが提供する機能はjava言語ではなく、特定の言語が他の言語と一緒にいることです.
重複登録との競合
同名のSpringBinを登録したらどうなりますか?
名前が「自動登録」および「自動登録」の場合、「空」を呼び出すと次のエラーが発生します.
ConflictingBeanDefinitionException
手動登録頻度が自動登録頻度と競合する場合、手動登録頻度は自動登録頻度を上書きし、優先度を有します.そして、どのような置き換えが行われているか(フレンドリーなスプリング)をログで教えてくれます.👍)
   Overriding bean definition for bean 'memoryMemberRepository' with a different 
   definition: replacing
しかし、開発者が望むのではなく、大量のスプリングシートを管理すると、このようなオーバーシュートはかえってデバッグを困難にする...
このため、スプリングガイドはデフォルト値を次のエラーに変更します.間違った情報は本当に親切です.
 Consider renaming one of the beans or enabling overriding by setting
 spring.main.allow-bean-definition-overriding=true
上書きする場合はset(application.properties)でspringを使用します.main.プロンプトallow-bean-definition-上書き値をtrueに設定します.実際、このように設定すれば、エラーは発生せず、手動で登録すると優先権が得られます!