Mùa xuân - Nhầm lẫn về cấu hình?


9

Ở đâu đó tôi đọc Spring cung cấp sự tiện lợi về cấu hình. Nhưng Spring folks đang mang lại rất nhiều thay đổi về cấu hình, đến nỗi tôi thực sự bối rối khi sử dụng cấu hình xml hoặc chú thích.

Tôi muốn bất cứ ai đề xuất một phương pháp chắc chắn hoặc quy tắc ngón tay cái trong việc sử dụng xml và chú thích.


Các ví dụ tại SO để chỉ ra rằng nhiều người mới bắt đầu như tôi đang bị lẫn lộn về cấu hình.

  • liên kết-1

    Tôi dường như không nắm bắt được chức năng đằng sau <context:annotation-config><context:component-scan>.

    Từ những gì tôi đã đọc, họ dường như xử lý các chú thích khác nhau (@Required, @Autowired, v.v so với @Component, @Rep repository, @Service, v.v.) nhưng cũng từ những gì tôi đã đọc, họ đăng ký các lớp xử lý bài bean tương tự.

    Để làm tôi bối rối hơn nữa, có một annotation-configthuộc tính trên <context:component-scan>...

  • liên kết 2

    Tôi vẫn có thẻ quét thành phần:

    <context:component-scan base-package="com.mycompany.maventestwebapp" />

    nhưng tôi cũng có một thẻ khác (trông giống như có nhiệm vụ tương tự), thẻ này:

    <annotation-driven />

    Sự khác biệt giữa hai thẻ này là gì? Một điều "lạ" khác là ví dụ trước (không sử dụng thẻ điều khiển chú thích) rất giống với dự án được tạo bởi STS bằng dự án Spring MVC Template nhưng nếu tôi xóa thẻ điều khiển chú thích khỏi cấu hình của nó nộp dự án không chạy và đưa ra lỗi sau: Trạng thái HTTP 404 - ...

Spring 3.2 không còn cần cglib để ủy quyền, nhưng các phiên bản thấp hơn sử dụng cglib. Một trích dẫn từ blog Springsource

Để tạo ra các proxy như vậy, Spring sử dụng thư viện của bên thứ ba có tên là cglib. Thật không may, dự án này không hoạt động nữa. Trong Spring 3.2, rất có khả năng Spring sẽ sử dụng Javassist thay vì theo mặc định.

Những điều này có đủ để gợi ý rằng Spring là sự nhầm lẫn về cấu hình?


1
"Spring folks đang mang lại rất nhiều thay đổi về cấu hình" - bạn có thể vui lòng cho một ví dụ không? Điều đó sẽ giúp người đọc hiểu rõ hơn vấn đề của bạn và trả lời câu hỏi của bạn
gnat

9
Câu hỏi không phải là tốt, nhưng tiêu đề chắc chắn là buồn cười.
Florian Margaine

1
@gnat trong quá trình dạy bản thân vào mùa xuân, tôi đã đi vòng quanh và bắt gặp những điều tương tự được thể hiện theo nhiều cách khác nhau. tài liệu về mùa xuân nói một cách làm, một số hướng dẫn nói cách khác, cả hai đều đúng, đường cong học tập rất cao. Câu hỏi duy nhất của tôi là .. có tài liệu rõ ràng nào cho thấy tất cả các cách có thể làm một việc duy nhất vào mùa xuân ?

1
@tito câu hỏi khi bạn nêu nó trong các bình luận, "có tài liệu nào không", nghe có vẻ như là một yêu cầu tài nguyên. Yêu cầu tài nguyên không hoàn toàn được chào đón tại Lập trình viên . Theo như tôi hiểu, người ta thà trình bày một vấn đề tiềm ẩn thay vào đó (theo như tôi có thể thấy, bạn đã làm điều đó trong văn bản câu hỏi, "bị nhầm lẫn khi sử dụng") - một vấn đề được giải quyết với tài nguyên cụ thể được yêu cầu
gnat

2
@tito Tôi nghĩ vấn đề của bạn là trộn các hướng dẫn cũ với tài liệu mới. Mùa xuân đã trở nên rất "quy ước về cấu hình", nơi bạn không cần thể hiện nhiều như trước. Tuy nhiên, các hướng dẫn cũ (đặc biệt là trước 3.1) làm rất nhiều thứ không cần thiết.
Matsemann

Câu trả lời:


5

Spring nhằm mục đích cung cấp cho bạn một khung công tác có "quy ước về cấu hình". Tuy nhiên, thực tế là các ứng dụng Spring cần một lượng cấu hình nhất định.

Trong Spring 2.5.x và các phiên bản trước đó, thành ngữ phổ biến là cung cấp cấu hình này thông qua XML. Với Spring 3.0+, cách thành ngữ là sử dụng các chú thích (điều mà Java EE6 / 7 cũng khuyến khích).

Là một lưu ý phụ, thật buồn cười khi thấy một thực thể JPA được chú thích, thật dễ dàng để thêm hơn 4 chú thích vào một trường ....


mức độ cấu hình cần thiết đã vượt xa tầm với của một nhà phát triển thời gian nhỏ như tôi, người phải loay hoay với N số khung để hoàn thành dự án.

1
Tôi đã có các phương pháp với mười chú thích, mỗi chú thích thực hiện một điều hữu ích khác nhau
Donal Fellows

1
Mặt khác, cũng có thể có một thực thể JPA với một chú thích @Entity trên lớp và không có gì khác. Nếu đó không phải là quy ước về cấu hình, tôi không biết nó là gì. Nếu bạn cảm thấy cần phải có mọi thứ hoạt động chính xác theo cách bạn muốn, đừng phàn nàn rằng bạn kết thúc với rất nhiều cấu hình - hãy vui mừng vì điều đó hoàn toàn có thể.
Michael Borgwardt

2
Tôi không hiểu tại sao 4 chú thích làm bạn buồn, tệp xml tương đương sẽ trông như thế nào?
NimChimpsky

Ôi, XML sẽ còn xa, tệ hơn nhiều :-)
Martijn Verburg

0
<annotation-driven />

Bạn phải xác định lược đồ XML xuất phát từ đâu.

Rất có thể là trong bối cảnh của chiến lược xử lý giao dịch JPA khi xác định Trình quản lý giao dịch (xem 9.5.6. Sử dụng @Transactional trong tài liệu của Spring)

Khi bạn xác định xử lý giao dịch theo hướng chú thích - Spring AOP tự động tạo các khía cạnh cho phương thức của bạn để bắt đầu (hoặc kiểm tra giao dịch hiện tại) trước khi gọi phương thức và sau đó cam kết (hoặc khôi phục trong trường hợp ngoại lệ) sau khi phương thức ngà kết thúc.


0

Tôi đã thấy rằng việc tạo các chú thích dựa trên việc tạo IoC / Bean rất tiện lợi khi bạn có một triển khai đơn lẻ nhưng có thể cần phải trao đổi nó.

Tương thích với một tình huống mà bạn có thể cần phải sử dụng lại một bean liên tục với các lớp / trường hợp phụ thuộc khác nhau.

Trong những trường hợp đó, tôi khai báo bean trong config và thường thực hiện tiêm constructor của bất kỳ phụ thuộc nào tôi cần. Sau đó, trong lớp sẽ sử dụng (các) hạt đậu nói trên @Autowirevà sau đó @Qualifier("")- đó là cách các nhà máy được cho là hoạt động.

Một singleton là một phương thức nhà máy chỉ trả về 1 kết quả. Khi điều này không áp dụng một cách cẩn thận đó là khi bạn cần trộn nó lên.

Đối với việc sử dụng quét thành phần so với không thực sự phải tuân theo các tiêu chí trên và phán đoán tốt. Tôi thường rất rõ ràng về quét thành phần gói. Bằng cách đó, tôi có thể tạo một bối cảnh ứng dụng khác để thử nghiệm, nơi tôi có thể giả định các phụ thuộc bên ngoài (như db) trong khi vẫn kiểm tra phần còn lại của thiết lập IoC của mình.

Ngoài ra, tôi không @Componentcó bất kỳ mã thư viện nào trong dự án của mình. Bạn không bao giờ biết khi nào / làm thế nào bạn sẽ cần sử dụng một hạt trong đó và nếu bạn @Component, bạn có thể vô tình nhặt nó trong một lần quét và bạn hạn chế khả năng sử dụng lại. Đối với những trường hợp này, tôi thường có một bối cảnh ứng dụng được xác định trong thư viện với một số mặc định khai báo bean tiện dụng mà dự án chính của tôi CÓ THỂ bao gồm nhập khẩu vào bối cảnh ứng dụng của nó.

Không có tôn giáo ở đây. Chỉ cần kinh nghiệm để truyền lại


0

Spring cung cấp các tùy chọn, ban đầu chỉ có hệ thống dây dựa trên xml. Sau này chú thích dựa trên hệ thống dây điện đã được thêm vào.
Bây giờ có thể (và nhiều người làm như vậy) để sử dụng kết hợp cả hai.
Có rất nhiều tài liệu đi kèm với Spring và / hoặc có thể tải xuống từ trang web Springsource. Có đào tạo chuyên nghiệp (chưa bao giờ thực hiện, không thể đảm bảo) và khá nhiều cuốn sách hay (Tôi thích APress 'Pro Spring, chọn bản phát hành phù hợp cho phiên bản Mùa xuân bạn đang sử dụng).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.