Cấu hình Xml so với cấu hình dựa trên chú thích [đã đóng]


131

Trong một vài dự án lớn, tôi đã làm việc gần đây, dường như ngày càng trở nên quan trọng để chọn cái này hay cái kia (XML hoặc Chú thích). Khi các dự án phát triển, tính nhất quán là rất quan trọng đối với khả năng bảo trì.

Câu hỏi của tôi là: những lợi thế của cấu hình dựa trên XML so với cấu hình dựa trên chú thích và những lợi thế của cấu hình dựa trên chú thích so với cấu hình dựa trên XML là gì?


Giả sử bạn có nghĩa là chú thích như @Component@Autowired, đây là một sự phân đôi giả. Có nhiều cách khác để tạo cấu hình của bạn, bao gồm JavaConfigGroovy config.
thịt xông khói


Vui lòng kiểm tra cái này quá stackoverflow.com/questions/8428439/ Quảng cáo
pramodc84

Câu trả lời:


199

Các chú thích có công dụng của chúng, nhưng chúng không phải là viên đạn bạc để giết cấu hình XML. Tôi khuyên bạn nên trộn hai!

Chẳng hạn, nếu sử dụng Spring, việc sử dụng XML cho phần tiêm phụ thuộc trong ứng dụng của bạn là hoàn toàn trực quan. Điều này làm cho các phụ thuộc của mã ra khỏi mã sẽ sử dụng nó, ngược lại, sử dụng một số loại chú thích trong mã cần các phụ thuộc làm cho mã nhận biết về cấu hình tự động này.

Tuy nhiên, thay vì sử dụng XML để quản lý giao dịch, việc đánh dấu một phương thức là giao dịch bằng chú thích có ý nghĩa hoàn hảo, vì đây là thông tin mà một lập trình viên có thể muốn biết. Nhưng một giao diện sẽ được đưa vào dưới dạng SubtypeY thay vì SubtypeX không nên được đưa vào lớp, bởi vì nếu bây giờ bạn muốn tiêm SubtypeX, bạn phải thay đổi mã của mình, trong khi bạn đã có hợp đồng giao diện trước mọi cách, vì vậy với XML, bạn chỉ cần thay đổi ánh xạ XML và việc này khá nhanh chóng và không gây đau đớn.

Tôi chưa sử dụng các chú thích JPA, vì vậy tôi không biết chúng tốt như thế nào, nhưng tôi sẽ lập luận rằng việc để ánh xạ của các hạt đậu vào cơ sở dữ liệu trong XML cũng tốt, vì đối tượng không quan tâm đến thông tin của nó đến từ đâu , nó chỉ nên quan tâm những gì nó có thể làm với thông tin của nó. Nhưng nếu bạn thích JPA (tôi không có bất kỳ kinh nghiệm nào với nó), bằng mọi cách, hãy dùng nó.

Nói chung: Nếu một chú thích cung cấp chức năng và hoạt động như một nhận xét trong chính nó và không buộc mã xuống một số quy trình cụ thể để hoạt động bình thường mà không có chú thích này, thì hãy đi chú thích. Ví dụ, một phương thức giao dịch được đánh dấu là giao dịch không giết chết logic vận hành của nó và cũng đóng vai trò là một nhận xét cấp mã tốt. Mặt khác, thông tin này có thể được biểu thị tốt nhất dưới dạng XML, vì mặc dù cuối cùng nó sẽ ảnh hưởng đến cách mã hoạt động, nhưng nó sẽ không thay đổi chức năng chính của mã và do đó không thuộc về các tệp nguồn.


Cảm ơn câu trả lời tuyệt vời! Tôi đã gặp một số khó khăn khi quyết định sử dụng. Câu trả lời SO này nói rằng họ thúc đẩy việc tách rời trong khi bài đăng trên blog này nói rằng họ thúc đẩy sự kết hợp chặt chẽ! Câu trả lời của bạn thực sự làm rõ vấn đề cho tôi.
Mikayla Maki

5
Tôi sẽ tóm tắt lời khuyên này như: sử dụng các chú thích cho AOP (ví dụ: các giao dịch có thể được coi là một khía cạnh), nhưng không sử dụng nó để tiêm phụ thuộc.
thịt xông khói

1
Có phải câu trả lời này vẫn còn thời sự (2015)?
sp00m

1
trong hầu hết các trường hợp, đối với hầu hết mọi người dường như chú thích được ưa thích hơn
Junchen Liu

31

Có một vấn đề rộng hơn ở đây, đó là dữ liệu meta được gắn ngoài và nội tuyến. Nếu mô hình đối tượng của bạn chỉ tồn tại theo một cách, thì dữ liệu meta được nội tuyến (tức là chú thích) nhỏ gọn hơn và dễ đọc hơn.

Tuy nhiên, nếu mô hình đối tượng của bạn được sử dụng lại trong các ứng dụng khác nhau theo cách mà mỗi ứng dụng muốn duy trì mô hình theo các cách khác nhau, thì việc đưa ra dữ liệu meta (tức là mô tả XML) trở nên phù hợp hơn.

Không ai tốt hơn, và vì vậy cả hai đều được hỗ trợ, mặc dù các chú thích là thời trang hơn. Do đó, các khung làm việc mới như JPA có xu hướng chú trọng hơn vào chúng. Các API trưởng thành hơn như Hibernate bản địa cung cấp cả hai, vì người ta biết rằng không ai là đủ.


13

Tôi luôn nghĩ về chú thích như một số loại chỉ số của những gì một lớp có khả năng, hoặc cách nó tương tác với người khác.

Mặt khác, cấu hình XML của Spring chỉ là cấu hình đó

Chẳng hạn, thông tin về ip và cổng của proxy, chắc chắn sẽ đi vào một tệp XML, đó là cấu hình thời gian chạy.

Sử dụng @Autowire, @Elementđể chỉ ra khuôn khổ phải làm gì với lớp là sử dụng tốt các chú thích.

Đặt URL vào @Webservicechú thích là phong cách xấu.

Nhưng đây chỉ là ý kiến ​​của tôi. Ranh giới giữa tương tác và cấu hình không phải lúc nào cũng rõ ràng.


Cấu hình dựa trên chú thích và chú thích (cấu hình Java) là hai điều khác nhau và OP hỏi về sau này trong khi bạn nói về cái trước.
May mắn

6

Tôi đã sử dụng Spring được vài năm rồi và số lượng XML cần thiết chắc chắn trở nên tẻ nhạt. Giữa các lược đồ XML mới và hỗ trợ chú thích trong Mùa xuân 2.5, tôi thường làm những việc sau:

  1. Sử dụng "quét thành phần" để tự động tải các lớp sử dụng @Rep repository, @Service hoặc @Component. Tôi thường đặt cho mỗi bean một tên và sau đó nối chúng lại với nhau bằng cách sử dụng @Resource. Tôi thấy rằng hệ thống ống nước này không thay đổi rất thường xuyên nên chú thích có ý nghĩa.

  2. Sử dụng không gian tên "aop" cho tất cả AOP. Điều này thực sự hoạt động tuyệt vời. Tôi vẫn sử dụng nó cho các giao dịch vì đặt @Transactional ở mọi nơi là một trở ngại. Bạn có thể tạo các phím tắt được đặt tên cho các phương thức trên bất kỳ dịch vụ hoặc kho lưu trữ nào và nhanh chóng áp dụng lời khuyên.

  3. Tôi sử dụng LocalContainerEntityManagerFactoryBean cùng với HibernateJpaVendorAd CHƯƠNG để định cấu hình Hibernate. Điều này cho phép Hibernate dễ dàng tự động khám phá các lớp @Entity trên đường dẫn lớp. Sau đó, tôi tạo một bean sessionFactory có tên bằng cách sử dụng "Factory-bean" và "Factory-method" đề cập đến LCEMFB.


5

Một phần quan trọng trong việc sử dụng một cách tiếp cận chỉ chú thích là khái niệm "tên đậu" ít nhiều biến mất (trở nên không đáng kể).

Các "tên đậu" trong Spring tạo thành một mức độ trừu tượng bổ sung đối với các lớp thực hiện. Với các hạt XML được định nghĩa và được tham chiếu liên quan đến tên đậu của chúng. Với các chú thích, chúng được tham chiếu bởi lớp / giao diện của chúng. (Mặc dù tên bean tồn tại, bạn không cần biết nó)

Tôi tin tưởng mạnh mẽ rằng việc loại bỏ những thứ trừu tượng không cần thiết sẽ đơn giản hóa các hệ thống và cải thiện năng suất. Đối với các dự án lớn, tôi nghĩ rằng lợi nhuận bằng cách loại bỏ XML có thể là đáng kể.


5

Tôi nghĩ rằng khả năng hiển thị là một chiến thắng lớn với cách tiếp cận dựa trên XML. Tôi thấy rằng XML không thực sự tệ đến vậy, được cung cấp các công cụ khác nhau để điều hướng các tài liệu XML (tức là cửa sổ Cấu trúc tệp của Visual Studio + ReSharper).

Bạn chắc chắn có thể thực hiện một cách tiếp cận hỗn hợp, nhưng điều đó có vẻ nguy hiểm đối với tôi nếu chỉ bởi vì, có khả năng, nó sẽ gây khó khăn cho các nhà phát triển mới trong một dự án để tìm ra nơi các đối tượng khác nhau được định cấu hình hoặc ánh xạ.

Tôi không biết; Cuối cùng, Địa ngục XML dường như không tệ với tôi.


4

Nó phụ thuộc vào những gì bạn muốn cấu hình, bởi vì có một số tùy chọn không thể được cấu hình với các chú thích. Nếu chúng ta nhìn thấy nó từ phía của chú thích:

  • cộng: chú thích ít nói
  • trừ: chú thích ít nhìn thấy hơn

Tùy bạn, điều gì quan trọng hơn ...

Nói chung, tôi khuyên bạn nên chọn một cách và sử dụng tất cả trên một số phần kín của sản phẩm ...

(với một số trường hợp ngoại lệ: ví dụ: nếu bạn chọn các cấu hình dựa trên XML, bạn có thể sử dụng chú thích @Autowire. Nó được trộn, nhưng cách này giúp cả khả năng đọc và bảo trì)


4

Có các khía cạnh khác để so sánh như tái cấu trúc và thay đổi mã khác. khi sử dụng XML, cần phải có nhiều nỗ lực để thực hiện tái cấu trúc vì bạn phải chăm sóc tất cả nội dung XML. Nhưng nó rất dễ dàng khi sử dụng Chú thích.

Cách ưa thích của tôi là cấu hình dựa trên Java mà không có chú thích (hoặc tối thiểu). http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java


3

Tôi có thể sai, nhưng tôi nghĩ Chú thích (như trong [Thuộc tính] của Java là thuộc tính biên dịch thời gian và XML là tùy chọn thời gian chạy. Điều đó với tôi nói rằng không tương đương và có những ưu và nhược điểm khác nhau.


Thực tế là các chú thích là một thứ thời gian biên dịch là một pro của cấu hình dựa trên chú thích, tuy nhiên cả chú thích và xml đều là các phương thức để cấu hình và trong bối cảnh này chúng đạt được cùng một thứ. ví dụ. cấu hình ánh xạ ngủ đông trong tệp xml trái ngược với sử dụng chú thích trên lớp.
abarax

Ahhh, tôi thấy sự nhầm lẫn của tôi. Câu hỏi đánh lừa tôi nghĩ rằng nó đang mô tả cấu hình của dữ liệu ở trên và ngoài siêu dữ liệu lớp.
ARKBAN

3

Tôi cũng nghĩ rằng một hỗn hợp là điều tốt nhất, nhưng nó cũng phụ thuộc vào loại tham số cấu hình. Tôi đang làm việc trong một dự án Seam cũng sử dụng Spring và tôi thường triển khai nó đến các máy chủ thử nghiệm và phát triển khác nhau. Thế là tôi đã chia tay:

  • Cấu hình cụ thể của máy chủ (Giống như đường dẫn tuyệt đối đến tài nguyên trên máy chủ): Tệp XML Spring
  • Tiêm đậu làm thành viên của các loại đậu khác (hoặc sử dụng lại giá trị Spring XML được xác định trong nhiều loại đậu): Chú thích

Sự khác biệt chính là bạn không phải biên dịch lại mã cho tất cả các cấu hình máy chủ thay đổi, chỉ cần chỉnh sửa tệp xml. Cũng có lợi thế là một số thay đổi cấu hình có thể được thực hiện bởi các thành viên trong nhóm, những người không hiểu tất cả các mã liên quan.


2

Trong phạm vi của bộ chứa DI, tôi coi DI dựa trên chú thích đang lạm dụng việc sử dụng chú thích Java. Bằng cách nói rằng, tôi không khuyên bạn nên sử dụng nó rộng rãi trong dự án của bạn. Nếu dự án của bạn thực sự cần sức mạnh của container DI, tôi khuyên bạn nên sử dụng Spring IoC với tùy chọn cấu hình dựa trên Xml.

Nếu chỉ vì mục đích kiểm tra đơn vị, các nhà phát triển nên áp dụng mô hình Dependency Injection trong mã hóa của họ và tận dụng các công cụ giả định như EasyMock hoặc JMock để tránh sự phụ thuộc.

Bạn nên cố gắng tránh sử dụng DI container trong bối cảnh sai của nó.


2

Thông tin cấu hình luôn được liên kết với một thành phần Java cụ thể (lớp, phương thức hoặc trường) là một ứng cử viên tốt được thể hiện bằng các chú thích. Các chú thích hoạt động đặc biệt tốt trong trường hợp này khi cấu hình là cốt lõi của mục đích của mã. Do những hạn chế về chú thích, nó cũng tốt nhất khi mỗi thành phần chỉ có thể có một cấu hình. Nếu bạn cần xử lý nhiều cấu hình, đặc biệt là các cấu hình có điều kiện trên bất kỳ thứ gì bên ngoài lớp Java có chứa một chú thích, các chú thích có thể tạo ra nhiều vấn đề hơn những gì chúng giải quyết. Cuối cùng, các chú thích không thể được sửa đổi mà không biên dịch lại mã nguồn Java, do đó, bất kỳ thứ gì cần được cấu hình lại trong thời gian chạy đều không thể sử dụng các chú thích.

Vui lòng tham khảo các liên kết sau đây. Chúng có thể hữu ích quá.

  1. Chú thích so với XML, ưu điểm và nhược điểm
  2. http://www.ibm.com/developerworks/l Library / j-cwt08025 /

1

Đây là câu hỏi 'Cấu hình so với Công ước' cổ điển. Hương vị cá nhân quyết định câu trả lời trong hầu hết các trường hợp. Tuy nhiên, cá nhân tôi thích Cấu hình (tức là dựa trên XML) hơn Công ước. IMO IDE đủ mạnh mẽ để vượt qua một số địa ngục XML mà mọi người thường liên kết với tòa nhà và duy trì cách tiếp cận dựa trên XML. Cuối cùng, tôi tìm thấy những lợi ích của Cấu hình (như xây dựng các tiện ích để xây dựng, duy trì và triển khai tệp cấu hình XML) vượt xa Công ước về lâu dài.


6
Tôi nghĩ rằng 'Cấu hình so với Công ước' là trực giao cho vấn đề này. Cả hai chú thích và tệp XML đều có nhiều mặc định (quy ước) hợp lý giúp đơn giản hóa đáng kể việc sử dụng chúng. Sự khác biệt thực sự là thời gian biên dịch so với thời gian chạy và trong mã so với hết mã.
HDave

1

Tôi sử dụng cả hai. Chủ yếu là XML, nhưng khi tôi có một nhóm các hạt thừa kế từ một lớp chung và có các thuộc tính chung, tôi sử dụng các chú thích cho các lớp đó, trong siêu lớp, vì vậy tôi không phải đặt các thuộc tính giống nhau cho mỗi hạt. Bởi vì tôi là một người thích kiểm soát, tôi sử dụng @Resource (name = "giới thiệu") thay vì chỉ tự động hóa công cụ (và tự cứu mình rất nhiều rắc rối nếu tôi cần một bean khác cùng loại như được giới thiệu ban đầu) .


1

Có một số ưu và nhược điểm của cấu hình chú thích từ kinh nghiệm của tôi:

  • Khi nói đến cấu hình JPA vì nó được thực hiện một lần và thường không được thay đổi thường xuyên, tôi thích gắn với cấu hình chú thích. Có thể có một mối quan tâm về khả năng nhìn thấy một bức tranh lớn hơn về cấu hình - trong trường hợp này tôi sử dụng sơ đồ MSQLWorkbench.
  • Cấu hình Xml là rất tốt để có được một bức tranh lớn hơn về ứng dụng nhưng có thể rất khó tìm thấy một số lỗi cho đến khi chạy. Trong trường hợp này, chú thích Spring @Configuration nghe có vẻ là một lựa chọn tốt hơn vì nó cũng cho phép bạn nhìn thấy một bức tranh lớn hơn và cũng cho phép xác thực cấu hình về thời gian biên dịch.
  • Đối với cấu hình Spring, tôi thích kết hợp cả hai cách tiếp cận: sử dụng chú thích @Configuration với giao diện Dịch vụ và truy vấn và cấu hình xml cho dataSource và công cụ cấu hình mùa xuân như bối cảnh: thành phần quét cơ sở = "..."
  • Nhưng cấu hình xml bit chú thích java khi nói đến cấu hình luồng (Spring Web Flow hoặc Lexaden Web Flow) vì điều cực kỳ quan trọng là nhìn thấy một bức tranh lớn hơn về toàn bộ quy trình kinh doanh. Và nghe có vẻ rườm rà khi thực hiện theo cách tiếp cận chú thích.

Tôi thích kết hợp cả hai cách tiếp cận - chú thích java và xml tối thiểu cần thiết để giảm thiểu địa ngục cấu hình.


1

Đối với Spring Framework, tôi thích ý tưởng có thể sử dụng chú thích @Component và thiết lập tùy chọn "quét thành phần" để Spring có thể tìm thấy các hạt java của tôi để tôi không phải xác định tất cả các bean của mình trong XML, cũng như trong JavaConfig. Ví dụ, đối với các java java đơn không trạng thái mà chỉ cần kết nối với các lớp khác (thông qua một giao diện lý tưởng) thì phương pháp này hoạt động rất tốt. Nói chung, đối với đậu mùa xuân, phần lớn tôi đã chuyển từ Spring XML DSL để xác định các bean và bây giờ ủng hộ việc sử dụng JavaConfig và Spring Annotations vì bạn có một số thời gian biên dịch kiểm tra cấu hình của bạn và một số hỗ trợ tái cấu trúc mà bạn không ' Với cấu hình Spring XML. Tôi kết hợp cả hai trong một số trường hợp hiếm hoi nhất định mà tôi thấy rằng JavaConfig / Chú thích không thể thực hiện những gì có sẵn bằng cấu hình XML.

Đối với ORM Hibernate (chưa sử dụng JPA) Tôi vẫn thích các tệp ánh xạ XML vì các chú thích trong các lớp mô hình miền ở một mức độ nào đó vi phạm Kiến trúc sạch , một kiểu kiến ​​trúc phân lớp mà tôi đã áp dụng trong vài năm qua. Sự vi phạm xảy ra bởi vì nó yêu cầu Lớp lõi phụ thuộc vào những thứ liên quan liên tục như thư viện Hibernate hoặc JPA và nó làm cho mô hình miền POJO trở nên ít kiên trì hơn một chút. Trong thực tế, Lớp lõi hoàn toàn không phụ thuộc vào bất kỳ cơ sở hạ tầng nào khác.

Tuy nhiên, nếu Kiến trúc sạch không phải là "tách trà" của bạn thì tôi có thể thấy chắc chắn có những lợi thế (như sự tiện lợi và khả năng bảo trì) của việc sử dụng các chú thích Hibernate / JPA trong các lớp mô hình miền trên các tệp ánh xạ XML riêng biệt.

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.