2013-07-23 36 views
6

Hôm nay, chúng tôi thấy mô hình này trong mã của chúng tôi:Tìm đậu singleton stateful

class Foo { 
    private List<String> errors; 

    public void addError(String error) { ... } 
    public List<String> getErrors(); 
} 

Mặc dù mã dường như làm việc, đây là một Spring bean singleton và nó tiêm ở một số nơi độc lập và người tiêu dùng của bean giả sử rằng mỗi người đều có danh sách lỗi riêng. Vì vậy, điều này giới thiệu các lỗi tinh tế.

Giải pháp rõ ràng là giáo dục các nhà phát triển để tránh loại lỗi này nhưng tôi đã tự hỏi liệu có một công cụ phân tích mã tĩnh hoặc thời gian chạy có thể tìm thấy loại lỗi này hay không.

Ví dụ: trình xử lý hậu đậu có thể phân tích bean trước khi được trả lại và tìm kiếm các trường riêng tư không phải là @Autowired.

+0

Chúng tôi có thể sử dụng @postConstruct để đặt lại trường riêng tư đó không? – sreeprasad

+0

@SREEPRASADGOVINDANKUTTY: Bạn có thể thử nhưng nó sẽ không hoạt động vì '@ PostConstruct' sẽ chỉ được gọi một lần khi tạo Foo. Bạn không thể sử dụng '@ PostConstruct' trong bean A để đặt lại trường vì nó cũng sẽ xóa danh sách cho bean B. –

+0

Mặc dù không phải là một cách rất sạch sẽ, bạn có thể thử APO mùa xuân, thêm afterAdvice và trong phương pháp đó bạn có thể kiểm tra các lĩnh vực này. –

Trả lời

1

Sau khi rót một số bộ não hơn (chúng ta và của những người khác) về vấn đề này, chúng tôi đã đưa ra cách tiếp cận này:

  1. Cài đặt một BeanPostProcessor mà làm cho chắc chắn rằng tất cả đậu singleton (tức là nơi phạm vi trong đậu định nghĩa là Singleton) có chú thích tùy chỉnh @Stateless trên loại bean thực tế.

    Chúng tôi đã chọn chú thích tùy chỉnh thay vì sử dụng lại @Singleton vì chúng tôi cũng cần chức năng này ở nơi khác.

    Nếu chú thích bị thiếu, nhà máy sẽ phát ra lỗi.

  2. Trong thử nghiệm đơn vị, chúng tôi sử dụng ClassPathScanningCandidateComponentProvider với chú thích tùy chỉnh để xác định tất cả các lớp trên đường dẫn lớp. Sau đó chúng tôi có thể thực hiện các thử nghiệm phức tạp và tốn kém để đảm bảo rằng bean không có trạng thái thay đổi sau cấu hình ban đầu (tức là sau khi autowiring đã xảy ra).

Bước thứ hai có thể trở nên dễ dàng hơn một chút nếu chúng tôi chuyển trường tự động vào hàm tạo nhưng chúng tôi không thích các phương thức cần nhiều, nhiều đối số. Nó sẽ là tốt đẹp nếu Java hoặc một IDE có thể tạo ra các nhà xây dựng từ mã bean. Vì đó không phải là trường hợp, chúng tôi dính vào các lĩnh vực autowired và/hoặc setters.

0

Bạn có thể tạo thử nghiệm JUnit để tải cấu hình ứng dụng của bạn. này có thể kết hợp ListableBeanFactory từ đây:

Can I dynamically create a List by scanning the beans in a spring configuration file?

với 'isSingleton' check here:

How to enforce a prototype scope of Spring beans

tức là danh sách tất cả các hạt cà phê trong bối cảnh ứng dụng, sau đó kiểm tra để xem cái nào người độc thân.

Điều này sẽ cho phép bạn tìm thấy tất cả các hạt đơn ... mặc dù nó sẽ không thực sự ngăn chặn trường hợp lỗi của bạn, nơi ai đó đối xử với một trong những đơn như thể nó không.

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