2012-03-11 20 views
6

Như trong tiêu đề ở trên, tôi đang bối rối về ưu nhược điểm giữa việc tiêm applicationContext bằng cách trực tiếp @Autowired annnotation hoặc thực hiện giao diện ApplicationContextAware trong một bean mùa xuân đơn.Thực hành tốt nhất của ứng dụng tiêmTiếp theo trong Spring3

Bạn thích cái nào trong trường hợp nào và tại sao? Cảm ơn.

Trả lời

9

Thực ra, cả hai đều xấu. Cả hai đều buộc ứng dụng của bạn vào khung công tác Spring, do đó đảo ngược toàn bộ khái niệm đảo ngược kiểm soát. Trong một thế giới lý tưởng, ứng dụng của bạn sẽ không nhận thức được được quản lý bởi một ApplicationContext nào cả.

Khi bạn đã chọn vi phạm nguyên tắc này, việc bạn làm như thế nào cũng không quan trọng. ApplicationContextAware là phiên bản cũ đã có khoảng at least since Version 2.0. @Autowired là một cơ chế mới hơn nhưng chúng hoạt động theo cách tương tự. Tôi có thể đi với ApplicationContextAware, bởi vì nó ngữ nghĩa làm rõ nó là gì.

+0

Cảm ơn. Nhưng nếu đậu, mà applicationContext đang được tiêm vào nó, đã là một bean mùa xuân chưa? Bạn có nghĩ rằng nó vẫn là một sự vi phạm? Btw, thực sự là hầu hết các loại đậu tôi có là một hạt đậu mùa xuân trong ứng dụng của tôi, đó là lý do tại sao tôi chỉ là một chút nhầm lẫn về đề cập của bạn: 'buộc ứng dụng của bạn vào khung Spring'. Có đúng trong mọi trường hợp hay trong trường hợp chỉ khi tôi có một ứng dụng được phân tách một phần khỏi khung công tác mùa xuân và tôi sử dụng mùa xuân chỉ cho một số loại đậu để đạt được một số chức năng? – Javatar

+0

Điều đó tùy thuộc vào những gì bạn gọi là Spring Bean. Nếu bạn có đồng bằng Java Beans được quản lý bởi Spring từ bên ngoài, ứng dụng của bạn không bị ràng buộc với Spring và có thể bạn sẽ mất ít hơn một ngày để chuyển sang một Container IOC khác. Đó là một cực đoan (trong đó, được cấp, bạn sẽ hầu như không bao giờ tìm thấy), cực đoan khác là những gì bạn đang mô tả: tiêm phụ thuộc thông qua dịch vụ định vị, hoặc như tôi gọi nó: Inversion of Inversion of Control. Chỉ cần thử và làm điều đó chỉ khi bạn thực sự phải. –

+0

Lý do chính dẫn đến câu hỏi của tôi là tiêm một hạt đậu nguyên mẫu vào một chiếc đậu có vỏ đơn. Đó là lý do tại sao tôi phải lấy bean từ applicationContext (hoặc BeanFactory) cho mỗi phương thức gọi. Btw, mỗi lớp theo gói gốc của tôi (có nghĩa là tất cả các lớp) đều nằm dưới sự kiểm soát mùa xuân. Vì vậy, câu hỏi cuối cùng, bạn có thể giải thích chi tiết hơn về bạn đề cập đến: 'nó ngữ nghĩa làm rõ nó là gì.'? Cảm ơn bạn rất nhiều trước một lần nữa. – Javatar

0

Vì bạn là không mở rộng bất kỳ lớp học mùa xuân nào, ứng dụng của bạn luôn tách biệt khỏi khung. Hầu hết các trường hợp bạn sẽ không muốn tiêm ApplicationContext như nó, nhưng sẽ cần phải tiêm đậu được xác định trong ApplicationContext.

Trường hợp tốt nhất là luôn luôn dính vào mức tối thiểu, cho đến khi và trừ khi bạn có bất kỳ yêu cầu cụ thể và điều này rất đơn giản với mùa xuân.

Vì vậy, một trong hai,

  1. Chú thích đậu của bạn và scan chúng trong application context, sau đó sử dụng @Autowire để dây chúng lên.

  2. Sử dụng application context để ngắt kết nối bean của bạn (cấu hình kiểu xml cũ). Bạn cũng có thể sử dụng @Autowire với phương pháp này.

Khi muốn kiểm soát vòng đời, bạn có thể đọc API và tùy chỉnh, nhưng hầu hết các cài đặt chung này sẽ thực hiện công việc.

Dưới đây là một số ví dụ.

  1. Spring Auto-Wiring Beans with @Autowired annotation
  2. Spring Auto-Wiring Beans XML Style
  3. Spring IoC container API Docs
+0

Cảm ơn bạn đã bình luận của bạn, nhưng tôi có đủ kiến ​​thức về mùa xuân về trường hợp phổ biến và autowiring :) Lý do chính relavent cho câu hỏi của tôi là khả năng tiêm một mẫu thử nghiệm đậu vào một singleton scoped bean. Trong trường hợp đó, chỉ cần tiêm đậu bình thường không hoạt động như mong đợi, vì vậy tôi sẽ nhận được bean từ applicationContext (hoặc BeanFactory tốt hơn) cho mỗi phương thức gọi. – Javatar

+0

"Vì bạn không mở rộng bất kỳ lớp học mùa xuân nào, ứng dụng của bạn luôn tách biệt khỏi khung công tác". Đây không phải là sự thật. Chỉ cần tiêm ApplicationContext gắn ứng dụng vào Spring. Nó sẽ không biên dịch nếu Spring không có mặt –

2

Như @Sean Patrick Floyd nói, nhu cầu của ApplicationContext thường là do một thiết kế xấu. Nhưng đôi khi bạn không có lựa chọn nào khác. Trong những trường hợp đó, tôi thích sử dụng @Autowired vì đây là cách tôi tiêm tất cả các thuộc tính khác. Vì vậy, nếu tôi sử dụng @Autowired để tiêm MyRepository, tại sao tôi không thể sử dụng nó cho ApplicationContext hoặc bất kỳ bean Spring nào khác?

Tôi chỉ sử dụng giao diện Spring cho những thứ tôi không thể thực hiện với chú thích, ví dụ BeanNameAware.

2

Nếu bạn cần lấy nguyên mẫu trong một đĩa đơn thì bạn có thể sử dụng phương pháp tiêm. Về cơ bản, bạn tạo một phương thức trừu tượng trả về đối tượng mà bạn cần và spring sẽ trả về nguyên mẫu mỗi khi bạn gọi phương thức đó. Bạn xác định "tra cứu-phương pháp" trong cấu hình mùa xuân của bạn.Dưới đây là một số liên kết: http://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-injection-spring