7

Tôi đang cố gắng sử dụng Vùng chứa khung IoC Spring để tạo một thể hiện của lớp ThreadPoolExecutor.CallerRunsPolicy. Trong Java, tôi muốn làm điều đó theo cách này ...Làm thế nào để tạo một bean Spring từ một hàm tạo lớp bên trong tĩnh?

import java.util.concurrent.RejectedExecutionHandler; 
import java.util.concurrent.ThreadPoolExecutor; 
... 
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); 

Nhưng khi tôi cố gắng làm việc tương đương trong mùa xuân, nó ném một CannotLoadBeanClassException.

<beans> 
    <bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy"/> 
</beans> 

Thông thường hơn: trong ứng dụng SpringContext XML, bạn có thể gọi một hàm tạo của lớp bên trong tĩnh như thế nào?

Trả lời

13

Tôi nghĩ lý do nó không được làm việc là vì mùa xuân là không thể hiểu nó như là một lớp bên trong tĩnh. Có lẽ điều này có thể làm việc:

<beans> 
    <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> 
</beans> 
+1

đọc lại câu hỏi và mẫu mã ban đầu Tôi nhận ra rằng vẽ không cố gắng gọi một phương thức tĩnh nào cả; chỉ là hàm tạo của một lớp lồng nhau. Cú pháp '$' là đúng để sử dụng ở đây, tôi đã sử dụng nó trước đây. –

+0

Điều đó đã hoạt động, cảm ơn Ankit. Tài liệu Spring có tại đây: http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class và nó nói "để định cấu hình định nghĩa bean cho lớp bên trong tĩnh, bạn phải sử dụng tên nhị phân của lớp bên trong. " – Drew

1

Sử dụng the factory-method attribute:

Định nghĩa bean sau xác định rằng đậu sẽ được tạo ra bằng cách gọi một nhà máy-phương pháp. Định nghĩa không chỉ định kiểu (lớp) của đối tượng được trả về, chỉ có lớp chứa phương thức factory. Trong ví dụ này, phương thức createInstance() phải là một phương thức tĩnh.

<bean id="clientService" class="examples.ClientService" 
    factory-method="createInstance"/> 
+0

tôi đã cố gắng một vài biến thể của "nhà máy-method" nhưng điều đó không làm việc ở đây vì ThreadPoolExecutor.CallerRunsPolicy là một cũ constructor Java thông thường. Đây là một lớp tĩnh. – Drew

+0

Thực tế là CRP là một lớp lồng nhau tĩnh không quan trọng ở đây. Trong khi ví dụ của matt b cho một phương pháp tĩnh là chính xác, bạn không thực sự cần phải gọi một phương pháp tĩnh ở đây ... chỉ là một constructor đồng bằng ol '. Điều đó đang được nói, tôi muốn được tò mò để xem phần còn lại của các chi tiết của các CouldLoadBeanClassException. – RonU

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