2012-11-08 13 views
14

z konfiguracją Java, próbuję przekonwertować mapę, która odwzorowuje wyliczenia na odwołania do komponentów bean, aby była w czystej konfiguracji Java (obecnie w XML & działa), ale nie może znaleźć niczego w dokumentacji;Wiosenna konfiguracja Java - w jaki sposób utworzyć mapę wyliczeń dla fasoli - referencje

Obecnie mój XML wygląda tak;

<util:map id="colourHanders" key-type="com.example.ColourEnum" 
      value-type="com.example.ColourHandler"> 
    <entry key="white" value-ref="whiteColourHandler"/> 
    <entry key="blue" value-ref="blueColourHandler"/> 
    <entry key="red" value-ref="redColourHandler"/> 
</util:map> 

Jestem pewien, że jest to łatwe, ale znowu, nie mogę znaleźć nic na ten temat, w jaki sposób przedstawiają to w czystej Javie (więc nie mam żadnych plików konfiguracyjnych XML) ..

Uwaga; że ColourHandler fasola są tworzone przy użyciu @Component adnotacji, np ..

@Component 
public class RedColourHandler implements ColourHander{ 
..... 
} 

i mapa colourHandlers jest wymieniony jako tak;

@Resource(name="colourHandlers") 
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers; 

Dzięki

Ian.

+0

to, co próbowałeś? Jaki błąd to spowodował? –

+0

Przepraszamy - to działa bardzo dobrze w XML i obecnie nadal używam reprezentacji i importowania XML, ale chcę przekonwertować go na czystą Javę i nie mam plików konfiguracyjnych XML – Ian

Odpowiedz

14

Prawdopodobnie chcesz coś takiego:

@Configuration 
public class MyConfiguration { 
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteHandler()); 
     // etc 
     return map; 
    } 

    @Bean public ColourHandler whiteHandler() { 
     return new WhiteHandler(); 
    } 
} 

Jeśli chcesz zachować swoje ładowarki jak @Component s, a następnie można autowire je w klasie konfiguracji:

@Configuration 
public class MyConfiguration { 
    @Autowired private WhiteColourHandler whiteColourHandler; 

    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteColourHandler); 
     return map; 
    } 
} 
+0

To działa, ale są dwie wady: Map pobiera prototyp i nie nastąpi automatyczne tworzenie "WhiteHandler". –

+2

Nie, 'whiteHandler()' dostarczy singleton, który zostanie podłączony do mapy.Spring używa cglib do przepisywania klas @ @ Configuration, więc kod w twoim pliku źródłowym nie jest kodem, który zostanie wykonany. – hertzsprung

+0

Nie dotyczy to połączeń w klasie. cglib tylko chroni połączenia z zewnątrz, Spring nie analizuje przepływu kodu wewnątrz metod. –

1

To jest rzeczywiście dość proste, ale musisz wiedzieć, jak:

@Autowired private ColourHandler whiteColourHandler; 
... 

public Map<ColourEnum, ColourHandler> getColourHander() { 
    Map<ColourEnum, ColourHandler> result = ...; 
    map.put(ColourEnum.white, whiteColourHandler); 
    ... 
    return map; 
} 

Sztuką jest to, że możesz wprowadzić fasolę do konfiguracji.

1

podobne do przyjętego odpowiedź wyjątkiem, że zamiast elementów autowiring można zadeklarować fasoli w klasie konfiguracji jak zwykle i przekazać je jako argumenty do metody Mapa Fasola:

@Configuration 
public class MyConfiguration { 
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(ColourHandler whiteHandler) { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteHandler); 
     return map; 
    } 

    @Bean public ColourHandler whiteHandler() { 
     return new WhiteHandler(); 
    } 
} 

Należy również zauważyć, że Wstrzyknięcie mapy jako @Resource nie wymaga parametru "nazwa" adnotacji, jeśli nazwa pola jest zgodna z tą samą konwencją nazewnictwa, co definicja komponentu bean.

czyli to będzie działać bez parametru name:

@Resource 
private Map<ColourHandlerEnum, ColourHandler> colourHandlers; 

ale to wymagałoby go:

@Resource(name="colourHandlers") 
private Map<ColourHandlerEnum, ColourHandler> handlers; 
0

Skoro masz już unikalną klasę/@ komponent dla każdego ColorHandler, ja po prostu pozwól wiosce dowiedzieć się, co należy użyć (nie ma potrzeby wstrzykiwania @Autowire ani dodatkowych metod tworzenia):

@Configuration 
public class MyConfiguration { 
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(
      WhiteColourHandler whiteHandler, 
      BlueColourHandler blueHandler, 
      RedColourHandler redHandler) { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteHandler); 
     map.put(BLUE, blueHandler); 
     map.put(RED, redHandler); 
     return map; 
    } 
} 
Powiązane problemy