2015-06-04 49 views
7

Tôi muốn khai báo tham chiếu phương thức Java 8 làm bean Spring. Cách dễ nhất để thực hiện điều này trong tệp Spring XML là gì?cách khai báo tham chiếu phương thức Java 8 trong tệp Spring XML?

Ví dụ, giả sử tôi có:

class Foo { 
    Foo(ToLongFunction<Bar> fn) { ... } 
} 

class Bar { 
    long getSize() { ... } 
} 

... và tôi muốn tạo một Foo mà có tài liệu tham khảo phương pháp Bar::getSize như là đối số nhà xây dựng.

Làm cách nào để khai báo cá thể Foo trong tệp XML bean bean?

+4

Tôi sẽ nói bạn không ... Tôi thực sự khuyên bạn nên sử dụng cấu hình dựa trên java thay vào đó .. –

+0

Cấu hình dựa trên Java không phải là một tùy chọn ngay bây giờ. – Kkkev

+0

nếu bạn không nhận được câu trả lời, hãy gọi phương thức chia nhỏ trong mã của bạn. – tgkprog

Trả lời

1

Giải pháp được đề xuất của tôi bên dưới có lẽ không phải là ý tưởng hay nhất, nhưng tôi đã tìm thấy câu hỏi thú vị và quyết định thử quay. Đây là điều tốt nhất tôi có thể nghĩ ra.

Tôi không biết liệu có cách nào để làm điều này trực tiếp trong thời điểm này (ngoài việc xác định một số loại bean nhà máy), nhưng bạn có thể làm điều đó bằng cách sử dụng hỗ trợ ngôn ngữ động, ví dụ với Groovy.

Ví dụ sau chạy cho tôi sử dụng phiên bản mới nhất của mùa xuân (tính đến nay 4.1.6)

Giả sử một bean như thế này

public class Foo { 

    private Function<String, String> task; 

    @Autowired 
    public Foo(Function<String, String> task){ 
     this.task = task; 
    } 

    public void print(String message) { 
     System.out.println(task.apply(message));  
    } 

} 

Sau đó, tôi có thể xác định một cấu hình XML như:

<lang:groovy id="func"> 
    <lang:inline-script> 
     <![CDATA[ 
       import java.util.function.Function 
       { text -> "Hello " + text } as Function 
     ]]> 
    </lang:inline-script> 
</lang:groovy> 

<bean id="foo" class="demo.services.Foo"> 
    <constructor-arg name="task" ref="func"/> 
</bean> 

Tất nhiên, cú pháp của lambda của bạn sẽ tùy thuộc vào ngôn ngữ bạn chọn. Tôi không có ý tưởng nếu Groovy có một cái gì đó giống như tham khảo phương pháp, nhưng bất kỳ tham chiếu phương pháp có thể được thể hiện với một lambda/đóng cửa như tôi đã làm ở trên.

Các vấn đề liên quan