Trong một thời gian dài, tôi tin rằng có một giá trị trong việc có một "cấu hình tập trung, khai báo, cấu hình" giống như các tệp xml mà tất cả chúng ta từng sử dụng. Sau đó, tôi nhận ra rằng hầu hết những thứ trong các tập tin không phải là cấu hình - nó không bao giờ được thay đổi ở bất cứ đâu sau khi phát triển. Sau đó, tôi nhận ra rằng "tập trung" chỉ có giá trị trong các hệ thống khá nhỏ - chỉ trong các hệ thống nhỏ, bạn mới có thể tìm kiếm toàn bộ tệp cấu hình . Và thực sự giá trị của việc hiểu toàn bộ hệ thống dây điện là gì, khi cùng một "dây dẫn" hầu hết được nhân đôi bởi các phụ thuộc trong mã? Vì vậy, thứ duy nhất tôi giữ là siêu dữ liệu (chú thích), vẫn là loại khai báo. Những không bao giờ thay đổi trong thời gian chạy và họ không bao giờ "cấu hình" dữ liệu mà ai đó sẽ thay đổi nhanh chóng - vì vậy tôi nghĩ việc giữ nó trong mã là tốt.
Tôi sử dụng hệ thống tự động hoàn toàn nhiều nhất có thể. Tôi thích nó. Tôi sẽ không trở lại mùa xuân kiểu cũ trừ khi bị đe dọa tại điểm súng. Lý do của tôi để thích hoàn toàn @Autowired
đã thay đổi theo thời gian.
Ngay bây giờ tôi nghĩ lý do quan trọng nhất để sử dụng tính năng tự động là có một sự trừu tượng hóa ít hơn trong hệ thống của bạn để theo dõi. "Tên đậu" đã hết hiệu lực. Hóa ra tên bean chỉ tồn tại vì xml. Vì vậy, một lớp đầy đủ của các hướng dẫn trừu tượng (nơi bạn sẽ nối tên bean "foo" vào bean "bar") đã biến mất. Bây giờ tôi nối trực tiếp giao diện "Foo" vào bean của mình và việc triển khai được chọn theo cấu hình thời gian chạy. Điều này cho phép tôi làm việc với mã khi truy tìm các phụ thuộc và triển khai. Khi tôi thấy một phụ thuộc tự động trong mã của mình, tôi chỉ cần nhấn phím "đi đến thực hiện" trong IDE của mình và đưa ra danh sách các triển khai đã biết. Trong hầu hết các trường hợp, chỉ có một triển khai và tôi vào thẳng lớp. Có thể' việc triển khai nào đang được sử dụng (tôi cho rằng điều ngược lại gần với sự thật hơn với hệ thống dây xml - thật buồn cười khi cách nhìn của bạn thay đổi!)
Bây giờ bạn có thể nói rằng đó chỉ là một lớp rất đơn giản, nhưng mỗi lớp trừu tượng mà chúng ta thêm vào hệ thống của chúng ta làm tăng sự phức tạp. Tôi thực sự không nghĩ rằng xml đã từng thêm bất kỳ giá trị thực nào vào bất kỳ hệ thống nào tôi đã làm việc cùng.
Hầu hết các hệ thống tôi từng làm việc chỉ có một cấu hình của môi trường thời gian chạy sản xuất. Có thể có các cấu hình khác để thử nghiệm và như vậy.
Tôi muốn nói rằng tự động hoàn toàn là ruby-on-rails của mùa xuân: Nó bao hàm khái niệm rằng có một mô hình sử dụng bình thường và phổ biến mà hầu hết các trường hợp sử dụng đều tuân theo. Với cấu hình XML, bạn cho phép sử dụng nhiều cấu hình nhất quán / không nhất quán có thể / có thể không được dự định. Tôi đã thấy rất nhiều cấu hình xml đi quá mức với sự không nhất quán - nó có được cấu trúc lại cùng với mã không? Nghĩ là không. Là những biến thể ở đó cho một lý do? Thường thì không.
Chúng tôi hầu như không sử dụng vòng loại trong cấu hình của mình và tìm các cách khác để giải quyết các tình huống này. Đây là một "nhược điểm" rõ ràng mà chúng tôi gặp phải: Chúng tôi đã thay đổi một chút cách chúng tôi viết mã để làm cho nó tương tác mượt mà hơn với chế độ tự động: Kho lưu trữ của khách hàng không còn thực hiện Repository<Customer>
giao diện chung mà chúng tôi tạo giao diện CustomerRepository
mở rộng Repository<Customer>
. Đôi khi cũng có một hoặc hai mẹo khi phân lớp. Nhưng nó thường chỉ hướng chúng ta theo hướng gõ mạnh hơn, mà tôi thấy hầu như luôn luôn là một giải pháp tốt hơn.
Nhưng vâng, bạn đang buộc vào một phong cách đặc biệt của DI mà chủ yếu là mùa xuân. Chúng tôi thậm chí không tạo ra các setters công khai cho các phụ thuộc nữa (Vì vậy, bạn có thể lập luận rằng chúng tôi +1 trong bộ phận đóng gói / ẩn thông tin) Chúng tôi vẫn có một số xml trong hệ thống của chúng tôi, nhưng về cơ bản xml chỉ chứa các dị thường. Tự động hoàn toàn tích hợp độc đáo với xml.
Điều duy nhất chúng ta cần bây giờ là @Component
, @Autowired
và phần còn lại được bao gồm trong một JSR (như JSR-250 ), vì vậy chúng ta không phải kết hợp với mùa xuân. Đây là cách mọi thứ đã xảy ra trong quá khứ (những java.util.concurrent
thứ nảy ra trong đầu), vì vậy tôi sẽ không hoàn toàn ngạc nhiên nếu điều này xảy ra một lần nữa.