Spring ComponentScanとComponent


Component Sacn


  • これまで、ユーザーはAppConfig classで@Beanとして空を管理する必要がありました.しかし、これは開発者にとって面倒で、漏れたら大きな障害になります.したがって、Springには@ComponentScanと@Componentコメントが用意されており、@Beanを使用して登録することなくSpringBeanとして自動的に登録できます.

  • 素子スキャンを使用するとDIがぼやけてしまいます.これまで,我々は手動で依存関係を注入してきたが,Benは自動的に登録され,依存関係を確立できる部分が消えることを意味している.したがって@Autowiredコメントはサポートされています.@Autowiredについては、後で学習します.

  • コンポーネントスキャンの適用 既存のAppConfigのようにDIを設定せずに@Beanとして登録します.@ComponentSacnのみで終了しますが、私と同じ例を作成している場合は、必ずexcluddeFilterと入力してください.これは、AppConfigというSpringコンテナを作成し、同時に登録しないように設定したためです.
    @Configuration 
    @ComponentScan( 
    //우리가 이미 등록해놓은 AppConfig를 등록하지 않도록
    excludeFilters = @ComponentScan.Filter(
      type = FilterType.ANNOTATION, 
      classes = Configuration.class) 
    ) 
    public class AutoAppConfig { }

  • AppConfigと同じ場所にAutoAppConfigクラスを作成し、次のように設定します.

  • コンポーネントを適用して、管理する空のクラスに@Componentを貼り付けてみます.これにより、@ComponentScanはSpringコンテナに登録できます.また、ここでコンテナを登録する場合、デフォルトの空の名前ポリシーがあり、最初の文字を小文字に変換すると、すべての文字が空になります.上記の例では、MemberServiceImpl->MemberServiceImplとして登録されています.また、空の名前を直接登録することもできます.@Component(「空の名前」)に登録すると、@Beanに登録したときに名前を変更するように使用できます.
    @Component 
    public class MemberServiceImpl implements MemberService{
      private final MemberRepository memberRepository;
    
      @Autowired public MemberServiceImpl(MemberRepository memberRepository) {
      	this.memberRepository = memberRepository; 
      } 
    
      @Override 
      public void join(Member member) {
      	memberRepository.save(member); 
      } 
    
      @Override public Member findMember(Long memberId) {
      	return memberRepository.findById(memberId); 
      } 
    
      //테스트용 
      public MemberRepository getMemberRepository(){
      	return memberRepository; 
      } 
    }

  • コンポーネントスキャンのナビゲーション位置はbasepackagesで指定できます.プロジェクト構造が本当に必要な場合は、それを使用することをお勧めします.BasePackagesのデフォルト値は@ComponentScanのクラスのpackage値をdefaultとして使用するため、Spring Bootでデフォルトで提供されているプロジェクト構造をプロジェクトの最上位に指定することを通常お勧めします.
  • @ComponentScan( basePackages = "hello.core", }

  • @Contorller, @Service, @Repository@SpringBootApplication @Service

  • ここでプロジェクトをしたり、会社でプロジェクトをしたりすることを学んだ人は?私たちのプロジェクトは@Componentも@ComponentSacnも書いていませんが、いったいどうやってスプリング容器を使ったのでしょうか.うちの会社は単一の色調でデザインされているのではなく、無限にオブジェクトを生成しているのでしょうか??终わりを感じるかもしれない本当はそうじゃないSpringBootプロジェクトの場合、最初の@SpringBootアプリケーションには@ComponentScan、@Controllerおよび@Service、および@Repositoryには@Componentが含まれます.

  • Filter
  • includeFilters
  • 素子スキャンに追加
  • excludeFiltersincludeFilters@Componentがあれば自動的にスキャンされるので使用する必要はありません.excludedFiltersなら実務でたまに使う!
  • 素子スキャンから除外
  • filter使い方:
  • @ComponentScan(
      includeFilters = @Filter(
        type = FilterType.ANNOTATION, 
        classes = IncludeComponent.class
      ),
    
      excludeFilters = @Filter(
        type = FilterType.ANNOTATION, 
        classes = ExcludeComponent.class
      ) 
    )
  • フィルタタイプオプション
  • ANNOTATION:デフォルト値で、音響効果を認識して動作します.
  • ASSIGNABLE TYPE:指定タイプとサブタイプを認識して動作します.
  • ASPECTJ:AsspectJモード使用
  • REGEX:正規表現
  • CUSTOM:タイプフィルタというインターフェースで処理

  • フィルタを使用して、構成部品のスキャンターゲットに追加または除外できます.

  • 重複登録との競合
  • 自動空登録+自動空登録
  • 手動空登録+自動空登録2回の場合、手動空登録が優先され、自動空が上書きされます.springのみで実行すると実行されますが、最近のspringbootではエラーとみなされます.これは、設定が歪んでしまい、開発者が捉えにくいバグが発生するためです.
  • 1「競合bean定義Exception例外」が発生します.空の名前を変更する必要があります.

  • 素子スキャンで同じ名前の空を繰り返し登録したらどうなりますか?
  • 출처 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8