2016-07-10 13 views
0

Angesichts der folgenden Klassen möchte ich 2 Instanzen der Composite-Klasse, eine mit FooA und eine mit FooB konfigurieren.Spring Boot: Konfigurieren Sie 2 verschiedene Sorten der gleichen Klasse

interface IFoo { } 
class FooA implements IFoo { } 

class FooB implements IFoo {} 

class Composite { 

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

In einer Bean-Konfigurationsdatei, würde ich dies tun:

<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> 

Wie kann ich dies in eine ähnlich prägnanten Weise in Spring-Boot erreichen?

Antwort

1

ziemlich genau die gleiche Art und Weise ich mir vorstellen würde, mit einem @Configuration kommentierte Klasse anstelle Ihrer Bohnen XML-Datei

@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

@ Qualifier ist was ich vermisst habe! Damit sehe ich einen prägnanteren Ansatz: – foundart

0

Mit dem Qualifier Anmerkung von stringy05 wies darauf hin, ich habe folgendes getan. FooA und FooB müssen in der @Configuration-Datei nicht als Beans angegeben werden.

// 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; 
} 

Weitere Kürze (die ich in erster Linie getan haben sollte), ich gebe Verbund einen Konstruktor, IFoo als Argument, wodurch beide Bean Verfahren Körper

return new Composite(foo); 
Verwandte Themen