@ComponentScanと@Componentの後ろのマジック

ZAK ZAK:

私はまだ深さで春の依存性注入を学んでいます。

私の最初のクラスは、私は豆をロードし、管理するコンテナに宣言した構成クラスは、注釈付きメソッドで宣言されています。

package ioc.question_004;

import ioc.commun.Person;
import ioc.commun.Profession;
import org.springframework.context.annotation.*;

@Configuration
public class MyConfiguration {

    @Bean
    public Profession profession(){
        return Profession.builder()
                     .name("professor")
                     .description("professor in the university")
                     .build();
    }

    @Bean
    public Person person(){
        return Person.builder()
                     .name("Bagna")
                     .age(52)
                     .profession(profession())
                     .build();
    }

}

私の第二のクラスは、それが好きに見える、daoRepositoryです。

package ioc.question_008.dao;

import ioc.commun.Person;
import lombok.*;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
@Builder
@Setter
@Getter
@EqualsAndHashCode
@ToString
public class MyDaoRepository implements dao {

    List<Person> personList = new ArrayList<>();

    @Override
    public boolean save( Person person ){
        return this.personList.add(person);
    }

    @Override
    public boolean delete( Person person ){
        return  this.personList.remove(person);
    }

}

次のように私の実行中のコードは次のとおりです。

@Configuration
@Import(MyConfiguration.class)
@ComponentScan(basePackageClasses = {MyDaoRepository.class} )
public class DependencyInjection {
    public static void main( String[] args ) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependencyInjection.class);
        dao myDaoRepository = (MyDaoRepository) context.getBean("myDaoRepository");
        System.out.println(myDaoRepository);
    }

}

魔法MyDaoRepositoryは、コンフィギュレーションクラスMyConfigurationで宣言さ@Bean人が含まれています。

MyDaoRepository(personList = [人(名前=バーニャ、年齢= 52、職業=職業(名=教授、説明=大学教授))])

私はそのために要求していない場合でも、コンテナが自動的にこのオブジェクトを注入していることthnik。いくつかの@Autowired注釈は、コンパイラによって追加されることがあります。よく分かりません。

あなたは、私が@Autowired注釈を自分で注射を行うように依頼しない限り、彼らは、コンテナ(例えば豆の人)に存在していても豆注入しないに春のコンテナを依頼することができますどのように私に説明してもらえます。

sfiss:

その理由は、コレクションとロンボク島の春のオートワイヤリングの組み合わせです Builder

まず、@Builderすべての引数のコンストラクタを追加しますMyDaoRepository(List<Person> list)

第二に、春には、自動的にあなたのファクトリメソッドを検知します@Bean public Person person()

コンストラクタは、コレクションを期待するので今、春がすべて蓄積しPerson、それがに見つけることができます-beans Listに応じてリストを設定し、コンストラクタに注入し、それを。

思う(しかし、それは、現在テストされていませんが、文書化し、ここで追加することを、)@Autowired(required = false)あなたにList<Person> personsそれはオプションであり、春になるではない、それジェクトように、そのマークとして、財産はあなたがこのケースで何をしたいです。(編集:私が間違っていた、あなたはまだ仕事に、このための引数なしのコンストラクタが必要ですが、どのなし@Autowired。注釈リストはとにかくそのように注入されませんでしたrequired=falseいかなる適切な時に、単純に例外を防ぐPersonBeanが見つかりません。)

EDIT:ようさんロディ、冷凍エンドウ豆のロディが、指摘、またあなたのBeanを作成するために、春に別のコンストラクタを追加することが可能であろう、とあなたのリポジトリに注釈を付けることにより、例えば @NoArgsConstructor

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231655&siteId=1