2016-10-27 1 views
3

beanをEmployee beanのコンストラクタにautowiredしました。 Employee beanのインスタンスを取得するときに、Addressのインスタンスを取得する必要があります。しかし、Springコンテナは、引数を持たないコンストラクタEmployeeを使用してインスタンスを返します。以下は、私のコードは、これは動作するはずSpringはBeanをロードするための自動構築コンストラクタを使用していません

public class Address { 
    public void print(){ 
     System.out.println("inside address"); 
    } 
} 

public class Employee { 

    private Address address; 

    @Autowired 
    public Employee(Address address){ 
     this.address = address; 
    } 

    public Employee(){} 

    public Address getAddress(){ 
     return address; 
    } 
} 

@Configuration 
@ComponentScan(basePackages={"com.spring"}) 
public class ApplicationConfig { 

    @Bean 
    public Employee employee(){ 
     return new Employee(); 
    } 

    @Bean 
    public Address address(){ 
     return new Address(); 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class); 
     Employee employee = (Employee)context.getBean("employee"); 
     // Here add is null !! 
     Address add = employee.getAddress(); 
    } 
} 
+0

@Autowiredは「プライベートアドレスのアドレス」 –

+0

に置かれるべき@FeiyuZhouが、私はコンストラクタでBeanを注入します。 –

+0

no-argsコンストラクタを使用して新しいEmploye()を返す設定ファイルに@Beanアノテーションを使用してBeanを登録しているので、それは驚くべきことではありません。 – pzeszko

答えて

2

引数なしのコンストラクタが使用されている:

@Bean 
public Employee employee() { 
    return new Employee(); 
} 

手動ではなく、春はあなたのためにそれを作成したよりも、Employeeインスタンスを作成しているので、それは、address()を複数回呼び出します実際return the same beanで、むしろ複数の新しいインスタンスよりも、だった場合

@Bean 
public Employee employee() { 
    return new Employee(address()); 
} 

注:、あなたも自分Addressに合格する必要がありますあなたの懸念

それ以外の場合は、Employee@Componentという注釈が付けられます。その後、Springによって自動的にBeanが作成され、Address依存関係に結び付けられます。コンポーネントのスキャンを有効にしているので、無料で入手できます(スキャンするパッケージにEmployeeがあると仮定します)。このルートに行くと、コンフィグクラスからemployee() bean定義を削除することができます。そうしないと、もう一方の設定が上書きされる可能性があります。

+0

それを試したことはありませんでしたが、彼はメソッドシグネチャにAddress引数を追加することもできると思います。@Bean Employee employee(アドレスアドレス){return new Employee(address);} – pzeszko

+0

@pzeszkoええ、私はすぐにはそれのドキュメントを参照していませんでしたが、うまくいくと思います。 – nbrooks

0

@Component public class Employee{ ... }

です。それはあなたが呼んでいる1(new Employee())ですので、

0

あなたはSpring MVCのプロジェクトで作業する場合、あなたはあなただけの春Iocのがちょうどを追加して作業する場合、あなたは、@Autowiredを使用することができ、この注釈<context:annotation-config>を追加する必要があなたのapplicationContext.xmlをで注釈を有効にする必要があります@従業員アドレスのコンポーネントクラス

関連する問題