2012-11-08 30 views
14

với cấu hình dựa trên Java, tôi đang cố chuyển đổi bản đồ thành các bản đồ enums thành bean trong cấu hình java thuần túy (hiện tại trong công việc XML &) dường như không tìm thấy gì trong tài liệu;Cấu hình Spring Java - cách tạo bản đồ enums cho các tài liệu tham khảo

Hiện tại, XML của tôi giống như vậy;

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

tôi chắc chắn rằng nó rất dễ dàng nhưng một lần nữa, không thể tìm thấy bất cứ điều gì về vấn đề làm thế nào để đại diện này trong tinh khiết Java (vì vậy tôi không có bất kỳ tập tin cấu hình XML) ..

Ghi chú; các ColourHandler đậu được tạo ra bằng cách sử dụng chú thích @Component, ví dụ ..

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

và bản đồ của colourHandlers được tham chiếu như vậy;

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

Cảm ơn,

Ian.

+0

những gì bạn đã thử? Nó tạo ra lỗi gì? –

+0

Xin lỗi - đây là công việc rất có trong XML và hiện tại tôi vẫn đang sử dụng biểu diễn XML và nhập nhưng tôi muốn chuyển đổi sang Java thuần và không có tệp cấu hình XML – Ian

Trả lời

14

Bạn có thể muốn một cái gì đó như thế này:

@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(); 
    } 
} 

Nếu bạn cần để giữ cho bộ xử lý của bạn như @Component s, sau đó bạn có thể autowire chúng vào lớp cấu hình:

@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

Công việc này nhưng có hai nhược điểm: và không có autowiring của 'WhiteHandler' sẽ xảy ra. –

+2

Không, 'whiteHandler()' sẽ cung cấp một singleton sẽ được nối vào Bản đồ.Spring sử dụng cglib để viết lại các lớp '@ Configuration', vì vậy mã trong tệp nguồn của bạn không phải là mã được thực thi. – hertzsprung

+0

Điều đó không đúng đối với các cuộc gọi trong lớp học. cglib chỉ bảo vệ các cuộc gọi từ bên ngoài, Spring không phân tích luồng mã bên trong các phương thức. –

1

Đây thực sự là khá đơn giản nhưng bạn cần phải biết cách:

@Autowired private ColourHandler whiteColourHandler; 
... 

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

Bí quyết là bạn có thể tiêm đậu vào một cấu hình.

1

Tương tự như câu trả lời chấp nhận ngoại trừ việc, thay vì thành phần autowiring, bạn có thể khai báo đậu trong lớp cấu hình như bình thường và vượt qua chúng như các đối số cho phương thức Map đậu:

@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(); 
    } 
} 

Cũng lưu ý rằng việc tiêm bản đồ dưới dạng @Resource không cần tham số "tên" của chú thích nếu tên trường tuân theo quy ước đặt tên giống như định nghĩa bean.

tức này sẽ làm việc mà không có tham số và tên:

@Resource 
private Map<ColourHandlerEnum, ColourHandler> colourHandlers; 

nhưng điều này sẽ đòi hỏi nó:

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

Vì bạn đã có một độc đáo lớp/@ Component cho mỗi ColorHandler, tôi sẽ chỉ hãy để Spring tìm ra những gì cần sử dụng (không cần phải tiêm @Autowire hay bất kỳ phương pháp tạo bổ sung nào):

@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; 
    } 
} 
Các vấn đề liên quan