2012-10-16 49 views
25

Tôi đang đọc sách Pro Spring 3. Nó có một đoạn nào đó thực sự làm tôi bối rối. Đoạn văn nói về việc tự động vào mùa xuân. Dưới đây là một đoạn trích:Khi nào sử dụng autowiring trong Spring

Trong hầu hết các trường hợp, câu trả lời cho câu hỏi liệu bạn nên sử dụng autowiring chắc chắn là “không!” Autowiring có thể giúp bạn tiết kiệm thời gian trong các ứng dụng nhỏ, nhưng trong nhiều trường hợp, nó dẫn thực hành không tốt và là không linh hoạt trong các ứng dụng lớn. Sử dụng byName có vẻ như một ý tưởng tốt là , nhưng nó có thể dẫn bạn cung cấp cho lớp học của bạn thuộc tính nhân tạo tên để bạn có thể tận dụng chức năng tự động. Toàn bộ ý tưởng đằng sau mùa xuân là bạn có thể tạo ra các lớp học của bạn như thế nào bạn thích và có mùa xuân làm việc cho bạn, không phải ... Điện thoại

... chi phí.

Tôi đã luôn sử dụng thẻ @Autowired trong các ứng dụng tôi đã tạo. Ai đó có thể giải thích những gì là sai với nó và những gì tôi nên sử dụng để thay thế?

Một ví dụ nhỏ về cách tôi xử lý hầu hết mọi thứ bây giờ là:

@Service("snippetService") 
public class SnippetService { 

    @Autowired 
    private TestService testService; 

    public Snippet getSnippet() { 
     return testService.getSnippet(); 
    } 
}  

Đang sử dụng autowiring như thế này "sai" hay tôi thiếu cái gì?

+0

Tôi không phải là người dùng Spring, nhưng tôi quen thuộc với Guice và CDI. Những khung đó thực chất không có gì ngoài việc tự động; cho mỗi trang web được chèn chú thích, khuôn khổ sẽ đi và tìm một thứ gì đó có thể tiêm, dựa trên loại và trên bất kỳ trình độ nào hiện diện, sau đó tiêm nó. Mọi người đã xây dựng các ứng dụng thực sự khá lớn bằng cách sử dụng phương pháp này; tôi làm việc trên một. Tôi không tin rằng họ đã gặp phải những vấn đề được tiên đoán bởi những kẻ cuồng nhiệt mùa xuân. –

+0

Tuy nhiên, hãy báo trước: các khung công tác này không thực hiện tự động theo nghĩa 'autowire =" byType "'. Nếu, như @mrembisz nói, bài báo đặc biệt cảnh báo chống lại điều đó, thì kinh nghiệm từ Guice và CDI không liên quan. –

Trả lời

23

Tôi tin rằng có hai điều nhầm lẫn ở đây. Có nghĩa là gì bởi 'autowiring' trong chương này là đánh dấu đậu để phát hiện tự động và tiêm phụ thuộc. Điều này có thể đạt được thông qua thiết lập thuộc tính bean "autowire".

Điều này thực tế trái ngược với việc sử dụng @Autowired nơi bạn chỉ định rõ ràng trường hoặc setter cho việc tiêm phụ thuộc.

Hãy xem tại đây: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-autowire.

Để giải thích nó, giả sử bạn có

public class SnippetService { 

    private TestService testService; 

    public Snippet getSnippet() { 
     return testService.getSnippet(); 
    } 

    public void setTestService(TestService testService) { 
     this.testService = testService; 
    } 
} 

Nếu bạn định nghĩa một bean:

<bean class="mypackage.SnippetService" autowire="byType"/> 

mùa xuân sẽ cố gắng tiêm đậu kiểu phù hợp, TestService trong trường hợp này, bằng cách gọi setTestService setter .Mặc dù bạn không sử dụng @Autowired. Điều này thực sự là nguy hiểm vì một số người định cư có thể không có nghĩa là sẽ được gọi vào mùa xuân.

Nếu bạn đặt autowire = "no", không có gì sẽ được tiêm trừ khi được đánh dấu như vậy với @Autowired, @Resource, @Inject.

+1

Điều đó có ý nghĩa hơn. Tôi đã có tình trạng này chỉ đi lên. Tôi muốn đọc các giá trị từ một tệp thuộc tính và đưa chúng vào một bean. Cách duy nhất tôi có thể tìm ra cách thực hiện điều này khi khởi động ứng dụng là kết nối bean trong XML (và tiêm các thuộc tính). Tôi đã sử dụng thuộc tính "byName" (vì bean cũng được đánh dấu là @Component) và sau đó sử dụng @Autowired @Qualifier ("nameIChose") khi tiêm bean vào một lớp khác. Đó là bean duy nhất tôi đã viết rằng tôi kết nối với XML. – Marvo

+0

Cảm ơn rất nhiều vì đã làm rõ! – geoffreydv

+0

Tôi đã tìm thấy autowiring hữu ích trong trường hợp tôi đã có một bean nhà máy chế tạo một bean khác (tên của lớp thực hiện được mô tả trong thuộc tính hệ thống, vì vậy tôi không thể định nghĩa tất cả các dây trong XML). Tôi thường thích làm cho hệ thống dây điện của tôi rõ ràng mặc dù; nó đơn giản hóa việc bảo trì dài hạn nếu mọi thứ rõ ràng. –

3

Không có gì sai với những gì bạn có, đặc biệt nếu bạn bắt đầu với một triển khai TestService. Tuy nhiên, như Johan đã đề cập, tốt hơn nên sử dụng @javax.annotation.Resource cũng cho phép bạn cụ thể hơn nếu bạn cần (ví dụ sử dụng thuộc tính name hoặc thuộc tính type).

+2

Việc sử dụng '@ Qualifier' không được khuyến khích vì lợi ích của' @ Resource' –

+0

Đúng vậy, cảm ơn vì đã chỉ ra nó. –

+0

Vì container Spring IoC triển khai JSR 250, điều này có làm cho một trường hợp sử dụng @Resource mọi lúc thay vì @Autowired? Chỉnh sửa: dường như nó phụ thuộc (ngạc nhiên!) Bài đăng trên diễn đàn thú vị http://forum.springsource.org/showthread.php?48563-Autowired-and-Resource-difference – dardo

2

Vấn đề duy nhất tôi thấy ở đây là bạn đang mất kiểm soát một chút. Ví dụ: giả sử bạn có hai hoặc nhiều phiên bản TestService trong cấu hình ứng dụng của bạn và bạn muốn sử dụng một trong số chúng. Có Autowire làm cho việc này phức tạp hơn việc sử dụng cấu hình XML để tiêm cho bạn. Đây là những gì cuốn sách của bạn đang cố gắng chỉ ra rằng nó trở nên khó khăn/phức tạp hơn trong ứng dụng lớn, nơi nhu cầu đó thường xuyên hơn.

Nếu bạn không có những tình huống như vậy, tôi nghĩ nó ổn.

+1

Nhưng những gì bạn làm trong tình huống đó là sử dụng chú giải @Qualifier để chỉ ra loại đậu nào bạn muốn. – Marvo

+0

Tôi không nói rằng bạn không thể làm điều đó. Tất cả tôi có nghĩa là: các tập tin cấu hình đã được có nghĩa là để tiêm và sử dụng các phụ thuộc bên ngoài. Bằng cách sử dụng 'chú thích', chúng ta đưa nó vào chính lớp thực hiện. Điều này trở nên khó khăn/phức tạp hơn trong các ứng dụng lớn hơn. –

+1

Tôi nghĩ đó là chủ quan. Tôi thấy không cần phải duy trì các tập tin XML cồng kềnh lớn khó khăn hơn nhiều. Và nếu một triển khai mới cho một giao diện cụ thể là bắt buộc, tôi sẽ phải thay đổi XML và lớp; với autowiring, tôi chỉ đơn giản là sẽ thay thế các lớp học. Một thay đổi ít hơn, một lỗi ít có thể xảy ra hơn. – Marvo

0

Tự động thông qua XML là hoàn toàn an toàn và hữu ích nếu bạn thực hiện tự động xây dựng dựa trên đặc biệt nếu bạn đặt cộng tác viên riêng tư cuối cùng.

Tôi rất ngạc nhiên khi tác giả nói rằng khi tôi làm điều này ở trên một dự án mùa xuân cực lớn 2.5 một vài năm trước. (tại thời điểm hỗ trợ chú thích không hoạt động trong JBoss)

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