2016-07-10 12 views
0

以下のクラスが与えられたら、Compositeクラスのインスタンスを2つ、つまりFooAとFooBで構成したいと思います。 Bean構成ファイルでSpring Boot:同じクラスの2つの異なる種類を設定してください

interface IFoo { } 
class FooA implements IFoo { } 

class FooB implements IFoo {} 

class Composite { 

    private IFoo foo; 
    public void setFoo(IFoo foo) { 
     this.foo = foo; 
    } 
} 

、私はこれを行うだろう:私は春ブーツでも同様に簡潔な方法でこれを実現するにはどうすればよい

<bean id="fooA", class="FooA"/> 
<bean id="fooB", class="FooB"/> 
<bean id="compositeA" class="Composite"> 
    <property name="foo" value-ref="fooA"/> 
</bean> 

<bean id="compositeB" class="Composite"> 
    <property name="foo" value-ref="fooB"/> 
</bean> 

を?あなたの豆xmlファイルの代わりに@Configuration注釈付きクラスと

答えて

1

ほとんど私が想像と全く同じ方法、

@Configuration 
public class SpringConfig { 

    @Bean 
    @Qualifier("compositeA") 
    public Composite compositeA() { 
     Composite c = new Composite(); 
     c.setFoo(fooA()); 
     return c;    
    } 

    @Bean 
    @Qualifier("compositeB") 
    public Composite compositeB() { 
     Composite c = new Composite(); 
     c.setFoo(fooB()); 
     return c; 
    } 

    @Bean 
    public FooA fooA() { 
     return new FooA(); 
    } 

    @Bean 
    public FooB fooB() { 
     return new FooB(); 
    } 
} 
+0

にビーンのメソッド本体の両方を削減、コンポジットに引数としてIFooを取るコンストラクタを与えるでしょう@予選は私が逃したものです!それで、私はより簡潔なアプローチを見ています: – foundart

0

修飾子アノテーションでstringy05が指摘し、私は次のことをやりました。 FooAとFooBは@ConfigurationファイルのBeanとして指定する必要はありません。 (私は最初の場所で行われているはず)の追加簡潔にするために

// FooA.java 
@Component 
public class FooA implements IFoo {} 

// FooB.java 
@Component 
public class FooB implements IFoo {} 


// Inside a class annotated as @Configuration 
@Bean 
public Composite compA(@Qualifier("fooA")IFoo foo) { 
    Composite c= new Composite(); 
    c.setFoo(foo); 
    return c; 
} 

@Bean 
public Composite compB(@Qualifier("fooB")IFoo foo) { 
    Composite c= new Composite(); 
    c.setFoo(foo); 
    return c; 
} 

、私はこのように

return new Composite(foo); 
関連する問題