Sự khác biệt giữa các chú thích @Component, @Rep repository & @Service trong Spring là gì?


2104

Có thể @Component, @Repository@Servicecác chú thích có thể được sử dụng thay thế cho nhau trong Spring hoặc chúng có cung cấp bất kỳ chức năng cụ thể nào ngoài hoạt động như một thiết bị ký hiệu không?

Nói cách khác, nếu tôi có một lớp Dịch vụ và tôi thay đổi chú thích từ @Servicesang @Component, liệu nó có còn hoạt động theo cùng một cách không?

Hay chú thích cũng ảnh hưởng đến hành vi và chức năng của lớp?


8
Là một nhà phát triển với nền tảng của Microsoft, tôi nhớ lại định nghĩa ngữ nghĩa của các dịch vụ trong khung MS SmartClientSoftwareFactory cũ (hiện là một khung phức tạp không dùng nữa cho các ứng dụng máy tính để bàn phân tán). Định nghĩa đó (được tài liệu độc đáo bởi Rich Newman) định nghĩa các dịch vụ là các đối tượng tái sử dụng không trạng thái, tốt nhất là với phạm vi đơn lẻ, được sử dụng để thực hiện các hoạt động logic nghiệp vụ trên các đối tượng khác được truyền dưới dạng đối số. Tôi có xu hướng xem các dịch vụ mùa xuân theo cùng một cách
Ivaylo Slavov

3
Không thành vấn đề !! Bất cứ điều gì phù hợp với bạn :) Tôi luôn ghét điều này về Spring rằng họ luôn có xu hướng xác định "quy tắc" cho bạn, điều này chỉ thêm giá trị tầm thường vào ứng dụng của bạn. Chưa kể Spring đi kèm với đống lớn của riêng nó.
TriCore

30
@TriCore Sprting là một khung, xác định "quy tắc" cho bạn là công việc của nó :)
Walfrat

Câu trả lời:


1502

Từ tài liệu mùa xuân :

Các @Repositorychú thích là một dấu hiệu cho bất kỳ lớp mà thực hiện tốt vai trò hoặc khuôn mẫu của một kho lưu trữ (còn gọi là Data Access Object hoặc DAO). Trong số các ứng dụng của điểm đánh dấu này là dịch tự động các ngoại lệ, như được mô tả trong Dịch ngoại lệ .

Spring cung cấp thêm chú thích khuôn mẫu: @Component, @Service, và @Controller. @Componentlà một bản mẫu chung cho bất kỳ thành phần nào do Spring quản lý. @Repository, @Service@Controllerlà các chuyên môn @Componentcho các trường hợp sử dụng cụ thể hơn (tương ứng trong các lớp trình bày, dịch vụ và trình bày). Vì vậy, bạn có thể chú thích các lớp thành phần của bạn với @Component, nhưng, bằng cách chú thích chúng với @Repository, @Servicehoặc @Controller thay vào đó, lớp học của bạn là phù hợp đúng cách hơn để xử lý bằng các công cụ hoặc liên kết với các khía cạnh.

Ví dụ, các chú thích khuôn mẫu này tạo ra các mục tiêu lý tưởng cho các điểm cắt. @Repository, @Service@Controllercũng có thể mang các ngữ nghĩa bổ sung trong các phiên bản tương lai của Spring Framework. Vì vậy, nếu bạn đang lựa chọn giữa việc sử dụng @Componenthoặc @Servicecho lớp dịch vụ của mình, @Servicerõ ràng là sự lựa chọn tốt hơn. Tương tự, như đã nêu trước đó, @Repositoryđã được hỗ trợ làm điểm đánh dấu cho bản dịch ngoại lệ tự động trong lớp lưu giữ lâu bền của bạn.

┌──────────────┬─────────────────────────────────────────────────────┐
 Annotation    Meaning                                             
├──────────────┼─────────────────────────────────────────────────────┤
  @Component   generic stereotype for any Spring-managed component 
  @Repository  stereotype for persistence layer                    
  @Service     stereotype for service layer                        
  @Controller  stereotype for presentation layer (spring-mvc)      
└──────────────┴─────────────────────────────────────────────────────┘

6
Sẽ có ý nghĩa khi thêm @Controll (hoặc @Component) vào @WebServlet? Đây không phải là bộ điều khiển Spring MVC, nhưng đó là kết hợp gần nhất về mặt khái niệm. Còn bộ lọc servlet thì sao?
Rick

1
"@Rep repository đã được hỗ trợ làm điểm đánh dấu cho bản dịch ngoại lệ tự động trong lớp kiên trì của bạn." nghĩa là?
Jack

9
Nó đề cập đến thực tế là các chú thích này là mục tiêu tốt cho AOP và trong khi các chú thích khác chưa xác định một điểm nhấn, chúng có thể làm điều đó trong tương lai. Mặt khác, @Rep repository đã là mục tiêu cho một điểm cắt hiện tại. Điểm cắt đó được sử dụng cho các bản dịch ngoại lệ, nghĩa là dịch các ngoại lệ dành riêng cho công nghệ sang các bản dịch dựa trên Spring chung chung hơn, để tránh khớp nối chặt chẽ.
stivlo

3
@stivlo: Tôi đã thực sự cố gắng để hiểu thuật ngữ 'khuôn mẫu', vẫn không hiểu. Bạn có thể vui lòng giúp tôi hiểu thuật ngữ này? Nó giúp ích rất nhiều và cảm ơn bạn rất nhiều
Premraj

2
@xenoterracide Thực tế không có nhiều sự khác biệt. Một cái gì đó chú thích với @Service cũng là một @Component(vì @Servicechú thích bản thân được chú thích với @Component). Theo như tôi biết, không có gì trong khuôn khổ Spring sử dụng một cách rõ ràng thực tế rằng một cái gì đó là một @Service, vì vậy sự khác biệt thực sự chỉ là khái niệm.
Jesper

801

Vì nhiều câu trả lời đã nêu rõ những chú thích này được sử dụng cho mục đích gì, chúng tôi sẽ tập trung vào một số khác biệt nhỏ trong số chúng.

Đầu tiên là sự tương đồng

Điểm đáng chú ý đầu tiên một lần nữa là liên quan đến quét tự động phát hiện và tiêm phụ thuộc cho BeanDefDef tất cả các chú thích này (viz., @Component, @Service, @Repousing, @Contoder) là như nhau. Chúng ta có thể sử dụng cái này thay cho cái khác và vẫn có thể đi được.


Sự khác nhau giữa @Component, @Rep repository, @Controll và @Service

@Component

Đây là một chú thích khuôn mẫu có mục đích chung chỉ ra rằng lớp là một thành phần mùa xuân.

Điều đặc biệt về @Component
<context:component-scan> chỉ quét@Componentvà không tìm kiếm@Controller,@Service@Repositorynói chung. Chúng được quét bởi vì bản thân chúng được chú thích@Component.

Chỉ cần có một cái nhìn tại @Controller, @Service@Repositoryđịnh nghĩa chú thích:

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Repository {
    ….
}

 

@Component
public @interface Controller {
    
}

Do đó, không sai khi nói điều đó @Controller, @Service@Repositorylà những loại @Componentchú thích đặc biệt . <context:component-scan>chọn chúng và đăng ký các lớp sau của chúng dưới dạng đậu, giống như chúng được chú thích @Component.

Chú thích loại đặc biệt cũng được quét, bởi vì bản thân chúng được chú thích với @Componentchú thích, có nghĩa là chúng cũng @Componentlà s. Nếu chúng tôi xác định chú thích tùy chỉnh của riêng mình và chú thích nó @Component, nó cũng sẽ được quét với<context:component-scan>


@Kho

Điều này là để chỉ ra rằng lớp định nghĩa một kho lưu trữ dữ liệu.

@Rep repository có gì đặc biệt?

Ngoài việc chỉ ra, đây là Cấu hình dựa trên Chú thích , @Repositorycông việc của chúng là bắt các ngoại lệ cụ thể của nền tảng và ném lại chúng như một trong những ngoại lệ không được kiểm soát thống nhất của Spring. Đối với điều này, chúng tôi được cung cấp PersistenceExceptionTranslationPostProcessor, rằng chúng tôi bắt buộc phải thêm vào ngữ cảnh ứng dụng Mùa xuân của chúng tôi như thế này:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Bộ xử lý bài bean này thêm một trình cố vấn cho bất kỳ bean nào được chú thích @Repositoryđể bất kỳ trường hợp ngoại lệ cụ thể nào được bắt gặp và sau đó được ném lại như một trong những ngoại lệ truy cập dữ liệu không được kiểm soát của Spring.


@ Trình điều khiển

Các @Controllerchú thích chỉ ra rằng một lớp học đặc biệt phục vụ vai trò của một bộ điều khiển. Các @Controllerchú thích đóng vai trò như một khuôn mẫu cho lớp chú thích, cho thấy vai trò của nó.

@Controll có gì đặc biệt?

Chúng tôi không thể chuyển đổi chú thích này với bất kỳ khác như @Servicehay @Repository, mặc dù họ trông giống nhau. Bộ điều phối quét các lớp được chú thích @Controllervà phát hiện các phương thức được chú thích bằng @RequestMappingcác chú thích bên trong chúng. Chúng ta có thể sử dụng @RequestMappingtrên / chỉ trong các phương pháp đó mà lớp học được chú thích với @Controllervà nó sẽ không làm việc với @Component, @Service, @Repositoryvv ...

Lưu ý: Nếu một lớp đã được đăng ký như một bean thông qua bất kỳ phương thức thay thế nào, như thông qua @Beanhoặc thông qua @Component, @Servicev.v ... chú thích, thì @RequestMappingcó thể được chọn nếu lớp cũng được chú thích bằng @RequestMappingchú thích. Nhưng đó là một kịch bản khác.


@Dịch vụ

@Service Bean giữ logic nghiệp vụ và gọi các phương thức trong lớp kho lưu trữ.

@Service có gì đặc biệt?

Ngoài thực tế là nó được sử dụng để chỉ ra rằng, nó đang nắm giữ logic kinh doanh, không có gì khác đáng chú ý trong chú thích này; nhưng ai biết được, Spring có thể thêm một số đặc biệt bổ sung trong tương lai.


Còn gì nữa không

Tương tự như trên, trong tương lai Mùa xuân có thể thêm chức năng đặc biệt dành cho @Service, @Controller@Repositorydựa trên công ước layering của họ. Do đó, luôn luôn là một ý tưởng tốt để tôn trọng quy ước và sử dụng nó phù hợp với các lớp.


'PersistenceExceptionTranslationPostProcessor' sẽ được đăng ký tự động nếu phát hiện JPA.
Olga

21
Giải thích tuyệt vời. Bạn đã xóa tan rất nhiều hiểu lầm của tôi. Đến từ một trường đại học nơi chúng tôi xây dựng tất cả các dự án của mình từ dưới lên, tôi gặp khó khăn tại sao Ứng dụng Mùa xuân chỉ hoạt động mặc dù bạn không tự liên kết chương trình với nhau. Các chú thích có rất nhiều ý nghĩa bây giờ, cảm ơn bạn!
NodziGames

Vậy thì chú thích @Service có ý nghĩa gì đối với Hibernate (Lớp liên tục), bên cạnh tính năng DI còn gì về Proxy lớp liên tục để tìm nạp và ánh xạ một số loại thực thể cho DTO tương ứng? Lớp này rất quan trọng đối với tính năng động trong lớp Kiên trì. Nếu ai đó biết sâu sắc nó ảnh hưởng đến JPA như thế nào thì nó sẽ rất hữu ích)))
Musa

1
Có một số thông tin sai lệch nhỏ về @Controllerchú thích. Không bắt buộc nếu lớp được chú thích @RequestMappingvà bean của lớp này được tạo theo bất kỳ cách nào. Bất kỳ bean nào được chú thích bằng @Controller OR @RequestMapping sẽ tham gia vào ánh xạ yêu cầu của Spring MVC. Ví dụ, điều này có thể hữu ích để tạo bộ điều khiển theo chương trình (ví dụ: sử dụng @Beancác phương thức) và đồng thời để ngăn chặn Spring cố gắng tạo chúng bằng cách quét gói (nếu gói không thể loại trừ khỏi quá trình quét).
Ruslan Stelmachenko

1
đây phải là câu trả lời được bình chọn hàng đầu - trả lời tất cả các câu hỏi và đi khá sâu. @stivlo không giải thích nhiều về câu hỏi OP đầu tiên - sự khác biệt về kỹ thuật.
kiedysktos

430

Chúng gần giống nhau - tất cả đều có nghĩa là lớp học là một hạt đậu mùa xuân. @Service, @Repository@Controllerlà chuyên ngành @Components. Bạn có thể chọn để thực hiện các hành động cụ thể với họ. Ví dụ:

  • @Controller đậu được sử dụng bởi spring-mvc
  • @Repository đậu đủ điều kiện để dịch ngoại lệ liên tục

Một điều nữa là bạn chỉ định các thành phần theo ngữ nghĩa cho các lớp khác nhau.

Một điều @Componentcung cấp là bạn có thể chú thích các chú thích khác với nó, và sau đó sử dụng chúng theo cách tương tự như @Service.

Ví dụ gần đây tôi đã thực hiện:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Vì vậy, tất cả các lớp được chú thích @ScheduledJoblà đậu mùa xuân và ngoài ra còn được đăng ký là công việc thạch anh. Bạn chỉ cần cung cấp mã xử lý chú thích cụ thể.


1
@Component có nghĩa là chỉ một hạt đậu mùa xuân, có mục đích nào khác cho nó không?
kapil das

21
Đậu @Component có thể tự động phát hiện bằng container mùa xuân. Bạn không cần xác định bean trong tập tin cấu hình, nó sẽ được tự động phát hiện khi chạy bởi Spring.
Akash5288

1
Tôi khá thích @Component chung ... đặc biệt là trong combo với @Scope (proxyMode = ScopedProxyMode.//MODE)
Eddie B

365

@Component tương đương với

<bean>

@Service, @Contoder, @Rep repository = {@Component + một số chức năng đặc biệt hơn}

Điều đó có nghĩa là Dịch vụ, Bộ điều khiển và Kho lưu trữ có chức năng giống nhau.

Ba chú thích được sử dụng để phân tách "Lớp" trong ứng dụng của bạn,

  • Bộ điều khiển chỉ làm những việc như gửi, chuyển tiếp, gọi phương thức dịch vụ, v.v.
  • Dịch vụ giữ logic kinh doanh, tính toán, vv
  • Kho lưu trữ là các DAO (Đối tượng truy cập dữ liệu), chúng truy cập cơ sở dữ liệu trực tiếp.

Bây giờ bạn có thể hỏi tại sao tách chúng ra: (Tôi giả sử bạn biết lập trình hướng AOP-Aspect)

Giả sử bạn chỉ muốn theo dõi Hoạt động của Lớp DAO. Bạn sẽ viết một lớp Aspect (Một lớp) thực hiện ghi nhật ký trước và sau khi mọi phương thức DAO của bạn được gọi, bạn có thể thực hiện điều đó bằng cách sử dụng AOP khi bạn có ba Lớp riêng biệt và không bị trộn lẫn.

Vì vậy, bạn có thể thực hiện ghi nhật ký DAO "xung quanh", "trước" hoặc "sau" các phương thức DAO. Bạn có thể làm điều đó bởi vì bạn đã có một DAO ở nơi đầu tiên. Những gì bạn vừa đạt được là Tách các mối quan tâm hoặc nhiệm vụ.

Hãy tưởng tượng nếu chỉ có một chú thích @Controll, thì thành phần này sẽ có chức năng gửi đi, logic nghiệp vụ và truy cập cơ sở dữ liệu tất cả các mã hỗn hợp, rất bẩn!

Trên đây là một kịch bản rất phổ biến, có nhiều trường hợp sử dụng nhiều hơn về lý do tại sao phải sử dụng ba chú thích.


6
Tôi có một câu hỏi cơ bản - các chú thích được sử dụng bởi cơ chế mùa xuân hay chúng chỉ dành cho lập trình viên để nhớ những đoạn mã đó làm gì?
dùng107986

25
@ user107986 Chúng chủ yếu để Lập trình viên nhớ các lớp trong ứng dụng. Tuy nhiên @Respositorycũng có tính năng dịch ngoại lệ tự động. Giống như khi một ngoại lệ xảy ra trong một @Repositorythường có một trình xử lý cho ngoại lệ đó và không cần thêm các khối bắt thử trong lớp DAO. Nó được sử dụng cùng với PersistenceExceptionTranslationPostProcessor
Oliver

bạn có thể vui lòng viết mã mẫu làm thế nào để viết Điểm chung cho tất cả lớp "@Rep repository" không. Chúng tôi sử dụng biểu thức hoặc sử dụng tên bean nhưng làm thế nào chúng tôi có thể nói lời khuyên này sẽ áp dụng cho tất cả các lớp "@Rep repository". Tôi đã cố gắng lấy mẫu này nhưng không thể tìm thấy. Sự giúp đỡ của bạn thực sự được đánh giá cao.
Moni

Ngoài ra, trong khi tất cả các chú thích hiện đang hoạt động giống nhau về chức năng, có thể chức năng cụ thể cho một thuộc tính nhất định có thể được thêm vào trong tương lai.
Cod3Citrus

224

Trong mùa xuân @Component, @Service, @Controller, và @Repositoryđược chú thích định kiến được sử dụng cho:

@Controller:trong đó việc ánh xạ yêu cầu của bạn từ trang trình bày được thực hiện, tức là lớp trình bày sẽ không đi đến bất kỳ tệp nào khác, nó đi thẳng đến @Controllerlớp và kiểm tra đường dẫn được yêu cầu trong @RequestMappingchú thích được viết trước khi gọi phương thức nếu cần.

@Service: Tất cả logic nghiệp vụ đều có ở đây tức là tính toán liên quan đến Dữ liệu và tất cả. Chú thích này của lớp nghiệp vụ trong đó người dùng của chúng tôi không trực tiếp gọi phương thức kiên trì nên sẽ gọi phương thức này bằng cách sử dụng chú thích này. Nó sẽ yêu cầu @Rep repository theo yêu cầu của người dùng

@Repository: Đây là lớp Kiên trì (Lớp truy cập dữ liệu) của ứng dụng được sử dụng để lấy dữ liệu từ cơ sở dữ liệu. tức là tất cả các hoạt động liên quan đến cơ sở dữ liệu được thực hiện bởi kho lưu trữ.

@Component - Chú thích các thành phần khác của bạn (ví dụ các lớp tài nguyên REST) ​​với bản mẫu thành phần.

Chỉ ra rằng một lớp chú thích là một " thành phần ". Các lớp như vậy được coi là ứng cử viên để tự động phát hiện khi sử dụng cấu hình dựa trên chú thích và quét đường dẫn lớp.

Các chú thích cấp lớp khác cũng có thể được coi là xác định một thành phần, điển hình là một loại thành phần đặc biệt: ví dụ: chú thích @Rep repository hoặc chú thích @Aspect của AspectJ.

nhập mô tả hình ảnh ở đây


24
những câu trả lời này đều hay và tất cả nhưng tôi khá chắc chắn điều mà hầu hết chúng ta muốn là một số ví dụ mã về các tính năng mà các thành phần như dịch vụ cung cấp mà chúng ta có thể đưa vào đầu một cách cụ thể hơn là chỉ mô tả chung như "logic kinh doanh" đối tượng này. mặt khác, chúng tôi vẫn cho rằng "ồ thật tuyệt và mọi thứ nhưng tôi vẫn có thể áp dụng cùng một mã cho thành phần"
dtc

2
Không phải tất cả logic kinh doanh nên đi vào dịch vụ! Các dịch vụ, về mặt DDD, chỉ nên chứa logic miền ảnh hưởng đến nhiều hơn một thực thể. Xem câu trả lời stackoverflow.com/a/41358034/238134
deamon

@deamon Có nhưng nó phụ thuộc vào cách tiếp cận của nhà phát triển
Harshal Patil

4
@HarshalPatil Tất nhiên bạn có thể viết một ứng dụng với tất cả logic kinh doanh trong các dịch vụ, nhưng điều đó sẽ dẫn đến một mô hình miền thiếu máu và nó sẽ khiến cho việc thực thi các ràng buộc và tính nhất quán đối với các thực thể trở nên khó khăn.
deamon

1
Tất nhiên nó phụ thuộc vào cách tiếp cận của nhà phát triển. Mọi thứ đều như vậy. Nếu bạn tiếp cận vấn đề không chính xác, tức là viết bất cứ điều gì bạn muốn mà không có cấu trúc và nói đó là "cách tiếp cận của bạn" - mặc dù điều đó không làm cho nó đúng. "Đúng" và "sai", tất nhiên, được sử dụng như các thuật ngữ để mô tả các thực tiễn phát triển phần mềm tốt như RẮN và các nguyên tắc khác, so với các thực tiễn phần mềm xấu như "Tôi chỉ muốn nó như thế bây giờ" và tương tự.
milosmns

71

Spring 2.5 giới thiệu các chú thích rập khuôn hơn nữa: @Component, @Service và @Controll. @Component phục vụ như một bản mẫu chung cho bất kỳ thành phần nào do Spring quản lý; trong khi đó, @Rep repository, @Service và @Controll đóng vai trò là các chuyên môn của @Component cho các trường hợp sử dụng cụ thể hơn (ví dụ: trong các lớp trình bày, dịch vụ và trình bày tương ứng). Điều này có nghĩa là bạn có thể chú thích các lớp thành phần của mình bằng @Component, nhưng bằng cách chú thích chúng với @Rep repository, @Service hoặc @Contoder, các lớp của bạn phù hợp hơn để xử lý bằng các công cụ hoặc liên kết với các khía cạnh. Ví dụ, các chú thích khuôn mẫu này tạo ra các mục tiêu lý tưởng cho các điểm cắt. Tất nhiên, cũng có thể @Rep repository, @Service và @Controll có thể mang các ngữ nghĩa bổ sung trong các bản phát hành tương lai của Spring Framework. Như vậy nếu bạn đang đưa ra quyết định giữa việc sử dụng @Component hoặc @Service cho lớp dịch vụ của mình, @Service rõ ràng là lựa chọn tốt hơn. Tương tự, như đã nêu ở trên, @Rep repository đã được hỗ trợ làm điểm đánh dấu cho bản dịch ngoại lệ tự động trong lớp lưu giữ lâu bền của bạn.

@Component  Indicates a auto scan component.
@Repository  Indicates DAO component in the persistence layer.
@Service  Indicates a Service component in the business layer.
@Controller  Indicates a controller component in the presentation layer.

tham khảo: - Tài liệu mùa xuân - Quét đường dẫn, các thành phần được quản lý và viết cấu hình bằng Java


48

Về mặt kỹ thuật @Controller, @Service, @Repositorytất cả đều giống nhau. Tất cả đều kéo dài @Component.

Từ mã nguồn Spring:

Chỉ ra rằng một lớp chú thích là một "thành phần". Các lớp như vậy được coi là ứng cử viên để tự động phát hiện khi sử dụng cấu hình dựa trên chú thích và quét đường dẫn lớp.

Chúng ta có thể trực tiếp sử dụng @Componentcho mỗi và mọi đậu, nhưng đối với sự hiểu biết tốt hơn và khả năng bảo trì của một ứng dụng lớn, chúng tôi sử dụng @Controller, @Service, @Repository.

Mục đích của mỗi chú thích:

  1. @Controller-> Các lớp được chú thích với điều này, được dự định để nhận một yêu cầu từ phía khách hàng. Yêu cầu đầu tiên đến với Bộ điều phối Servlet, từ đó nó chuyển yêu cầu đến bộ điều khiển cụ thể bằng cách sử dụng giá trị của @RequestMappingchú thích.
  2. @Service-> Các lớp được chú thích với điều này, nhằm thao túng dữ liệu mà chúng tôi nhận được từ máy khách hoặc tìm nạp từ cơ sở dữ liệu. Tất cả các thao tác với dữ liệu nên được thực hiện trong lớp này.
  3. @Repository-> Các lớp được chú thích với điều này, được dự định để kết nối với cơ sở dữ liệu. Nó cũng có thể được coi là lớp DAO (Đối tượng truy cập dữ liệu). Lớp này chỉ được giới hạn ở các thao tác CRUD (tạo, truy xuất, cập nhật, xóa). Nếu bất kỳ thao tác nào là bắt buộc, dữ liệu sẽ được gửi trở lại lớp @Service.

Nếu chúng ta trao đổi vị trí của họ (sử dụng @Repositorythay thế @Controller), ứng dụng của chúng tôi sẽ hoạt động tốt.

Mục đích chính của việc sử dụng ba khác nhau @annotationslà cung cấp Modularity tốt hơn cho ứng dụng Enterprise.


2
bạn có ý nghĩa gì bằng cách thay thế những nơi thay thế? controller and repository
Ashish Kamble

46

Sử dụng @Service@Repositorychú thích là quan trọng từ quan điểm kết nối cơ sở dữ liệu.

  1. Sử dụng @Servicecho tất cả các loại kết nối DB dịch vụ web của bạn
  2. Sử dụng @Repositorycho tất cả các kết nối DB DB được lưu trữ của bạn

Nếu bạn không sử dụng các chú thích thích hợp, bạn có thể phải đối mặt với các ngoại lệ cam kết bị ghi đè bởi các giao dịch rollback. Bạn sẽ thấy các ngoại lệ trong quá trình kiểm tra tải căng thẳng có liên quan đến việc khôi phục các giao dịch JDBC.


@Rep repository có thể được sử dụng cho các cuộc gọi RestAPI thay vì các hoạt động DB không?
Nayeem

@Nayeem về mặt kỹ thuật, bạn có thể chú thích các dịch vụ dưới dạng bộ điều khiển và kho lưu trữ dưới dạng dịch vụ, việc tiêm phụ thuộc sẽ hoạt động giống nhau. Nhưng tại sao bạn sẽ làm điều đó? Nếu nó không hoạt động với các thực thể cơ sở dữ liệu - thì đó không phải là kho lưu trữ và @Repositoryđược thiết kế đặc biệt để hoạt động với lớp kiên trì. Nếu bạn đang làm việc với api còn lại - bạn đang làm việc với DTO chứ không phải DAO.
Ben

28

@Rep repository @Service@Controll được dùng làm chuyên môn của @Component để sử dụng cụ thể hơn trên cơ sở đó, bạn có thể thay thế @Service thành @Component nhưng trong trường hợp này bạn mất chuyên môn.

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.

27

tất cả các chú thích này là loại chú thích loại âm thanh nổi, sự khác biệt giữa ba chú thích này là

  • Nếu chúng ta thêm @Component thì nó cho biết vai trò của lớp là một lớp thành phần, điều đó có nghĩa là nó là một lớp bao gồm một số logic, nhưng nó không cho biết liệu một lớp có chứa một logic kinh doanh cụ thể hoặc kiên trì hay logic điều khiển nên chúng ta không sử dụng trực tiếp chú thích @Component này
  • Nếu chúng ta thêm chú thích @Service thì nó sẽ nói rằng vai trò của lớp bao gồm logic nghiệp vụ
  • Nếu chúng ta thêm @Rep repository trên đầu lớp thì nó báo rằng một lớp bao gồm logic bền vững
  • Ở đây @Component là một chú thích cơ sở cho các chú thích @ Service, @ Rep Storage và @Controll

ví dụ

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • Bất cứ khi nào chúng tôi thêm @Servicehoặc @Repositroyhoặc @Controllerchú thích theo @Componentchú thích mặc định sẽ tồn tại trên đầu lớp

23

Spring cung cấp bốn loại khác nhau của thành phần tự chú thích quét, họ là @Component, @Service, @Repository@Controller. Về mặt kỹ thuật, không có sự khác biệt giữa chúng, nhưng mọi chú thích quét thành phần tự động nên được sử dụng cho mục đích đặc biệt và trong lớp được xác định.

@Component: Nó là một chú thích quét thành phần tự động cơ bản, nó chỉ ra lớp chú thích là một thành phần quét tự động.

@Controller: Lớp được chú thích chỉ ra rằng nó là thành phần của bộ điều khiển và chủ yếu được sử dụng ở lớp trình bày.

@Service: Nó chỉ ra lớp chú thích là một thành phần Dịch vụ trong lớp nghiệp vụ.

@Repository: Bạn cần sử dụng chú thích này trong lớp kiên trì, hoạt động này giống như kho lưu trữ cơ sở dữ liệu.

Người ta nên chọn một hình thức chuyên biệt hơn @Componenttrong khi chú thích lớp của họ vì chú thích này có thể chứa hành vi cụ thể trong tương lai.


20

Chúng tôi có thể trả lời điều này theo tiêu chuẩn java

Đề cập đến JSR-330, hiện được hỗ trợ bởi mùa xuân, bạn chỉ có thể sử dụng @Namedđể xác định một bean (Bằng cách nào đó @Named=@Component). Vì vậy, theo tiêu chuẩn này, có vẻ như không có sử dụng để xác định định kiến (như @Repository, @Service, @Controller) để loại đậu.

Nhưng người dùng mùa xuân những chú thích khác nhau này khác nhau cho việc sử dụng cụ thể, ví dụ:

  1. Giúp các nhà phát triển xác định một danh mục tốt hơn cho người có thẩm quyền. Việc phân loại này có thể trở nên hữu ích trong một số trường hợp. (Ví dụ khi bạn đang sử dụng aspect-oriented, đây có thể là một ứng cử viên sáng giá pointcuts)
  2. @Repository chú thích sẽ thêm một số chức năng cho bean của bạn (một số bản dịch ngoại lệ tự động cho lớp lưu giữ bean của bạn).
  3. Nếu bạn đang sử dụng spring MVC, @RequestMappingchỉ có thể được thêm vào các lớp được chú thích bởi @Controller.

Về điểm thứ 3 của bạn. Đo không phải sự thật. Tôi cũng có thể thêm chú thích @RequestMapping vào các phương thức trong lớp dịch vụ (ý tôi là các lớp được chú thích bằng @Service).
Rahul Gupta

19

Chú thích các thành phần khác với @Component, ví dụ các lớp Tài nguyên REST.

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@Component là một bản mẫu chung cho bất kỳ thành phần nào được quản lý Spring.

@Controll, @Service và @Rep repository là các Chuyên ngành của @Component cho các trường hợp sử dụng cụ thể.

@Component vào mùa xuân

"Chuyên môn thành phần"


18

Không có sự khác biệt giữa @Component, @Service, @Controller, @Repository. @Componentlà chú thích chung để thể hiện thành phần của MVC của chúng tôi. Nhưng sẽ có một số thành phần như là một phần của ứng dụng MVC của chúng tôi như các thành phần lớp dịch vụ, các thành phần lớp liên tục và các thành phần lớp trình bày. Vì vậy, để phân biệt chúng, người mùa xuân cũng đã đưa ra ba chú thích khác.

  • Để thể hiện các thành phần lớp kiên trì: @Repository
  • Để biểu diễn các thành phần của lớp dịch vụ: @Service
  • Để biểu diễn các thành phần của lớp trình bày: @Controller
  • hoặc nếu không bạn có thể sử dụng @Componentcho tất cả chúng.

17

Ngay cả khi chúng tôi trao đổi @Component hoặc @Rep repository hoặc @service

Nó sẽ hoạt động giống nhau, nhưng một khía cạnh là họ sẽ không thể bắt được một số ngoại lệ cụ thể liên quan đến DAO thay vì Kho lưu trữ nếu chúng tôi sử dụng thành phần hoặc dịch vụ @


15

Trong Spring 4, phiên bản mới nhất:

Chú thích @Rep repository là một điểm đánh dấu cho bất kỳ lớp nào đáp ứng vai trò hoặc bản mẫu của kho lưu trữ (còn được gọi là Đối tượng truy cập dữ liệu hoặc DAO). Trong số các ứng dụng của điểm đánh dấu này là bản dịch tự động các trường hợp ngoại lệ như được mô tả trong Phần 20.2.2, bản dịch Exception bản dịch.

Spring cung cấp các chú thích rập khuôn hơn nữa: @Component, @Service và @Controll. @Component là một bản mẫu chung cho bất kỳ thành phần nào do Spring quản lý. @Rep repository, @Service và @Controll là các chuyên môn của @Component cho các trường hợp sử dụng cụ thể hơn, ví dụ, trong các lớp trình bày, dịch vụ và trình bày tương ứng. Do đó, bạn có thể chú thích các lớp thành phần của mình bằng @Component, nhưng bằng cách chú thích chúng với @Rep repository, @Service hoặc @Contoder, các lớp của bạn phù hợp hơn để xử lý bằng các công cụ hoặc liên kết với các khía cạnh. Ví dụ, các chú thích khuôn mẫu này tạo ra các mục tiêu lý tưởng cho các điểm cắt. Cũng có thể @Rep repository, @Service và @Controll có thể mang các ngữ nghĩa bổ sung trong các bản phát hành tương lai của Spring Framework. Như vậy nếu bạn chọn giữa sử dụng @Component hoặc @Service cho lớp dịch vụ của mình, @Service rõ ràng là lựa chọn tốt hơn. Tương tự, như đã nêu ở trên, @Rep repository đã được hỗ trợ làm điểm đánh dấu cho bản dịch ngoại lệ tự động trong lớp lưu giữ lâu bền của bạn.


15

@Component : bạn chú thích một lớp@Component , nó nói với hibernate rằng đó là Bean.

@ Lưu trữ : bạn chú thích một lớp @Repository, nó nói với hibernate nó là một lớp DAO và coi nó là lớp DAO. Có nghĩa là nó làm cho các ngoại lệ không được kiểm tra (được ném từ các phương thức DAO) đủ điều kiện để dịch sang SpringDataAccessException .

@ Dịch vụ : Điều này cho biết ngủ đông, đây là lớp Dịch vụ nơi bạn sẽ có@Transactional các chú thích lớp Dịch vụ, do đó, hibernate coi nó như một thành phần Dịch vụ.

Cộng @Servicelà trước @Component. Giả sử tên lớp bean là CustomerService, vì bạn đã không chọn cách cấu hình bean XML nên bạn đã chú thích bean với @Componentđể chỉ ra nó là Bean. Vì vậy, trong khi lấy đối tượng bean CustomerService cust = (CustomerService)context.getBean("customerService");Theo mặc định, Spring sẽ viết thường ký tự đầu tiên của thành phần - từ 'Dịch vụ khách hàng' sang 'Dịch vụ khách hàng'. Và bạn có thể truy xuất thành phần này với tên 'customerService'. Nhưng nếu bạn sử dụng @Servicechú thích cho lớp bean, bạn có thể cung cấp một tên bean cụ thể bằng cách

@Service("AAA")
public class CustomerService{

và bạn có thể lấy đối tượng bean bằng cách

CustomerService cust = (CustomerService)context.getBean("AAA");

13

@Component là chú thích chung cấp cao nhất làm cho đậu chú thích được quét và có sẵn trong thùng chứa DI

@Repository là chú thích chuyên biệt và nó mang lại tính năng chuyển đổi tất cả các ngoại lệ không được kiểm tra từ các lớp DAO

@Servicelà chú thích chuyên ngành. hiện tại nó không mang lại bất kỳ tính năng mới nào nhưng nó làm rõ ý định của bean

@Controll là chú thích chuyên biệt giúp bean MVC nhận biết và cho phép sử dụng chú thích thêm như @RequestMapping và tất cả như vậy

Dưới đây là chi tiết


11

A @Serviceđể trích dẫn tài liệu mùa xuân,

Chỉ ra rằng một lớp chú thích là một "Dịch vụ", ban đầu được xác định bởi Domain-Driven Design (Evans, 2003) là "một hoạt động được cung cấp dưới dạng một giao diện độc lập trong mô hình, không có trạng thái đóng gói." Cũng có thể chỉ ra rằng một lớp là "Mặt tiền dịch vụ doanh nghiệp" (theo nghĩa của mẫu J2EE) hoặc một cái gì đó tương tự. Chú thích này là một bản mẫu có mục đích chung và các nhóm riêng lẻ có thể thu hẹp ngữ nghĩa của họ và sử dụng khi thích hợp.

Nếu bạn nhìn vào thiết kế hướng tên miền bởi eric evans,

DỊCH VỤ là một hoạt động được cung cấp dưới dạng một giao diện độc lập trong mô hình, không đóng gói trạng thái, như MỤC TIÊU và ĐỐI TƯỢNG GIÁ TRỊ làm. DỊCH VỤ là một mô hình phổ biến trong các khung kỹ thuật, nhưng chúng cũng có thể áp dụng trong lớp miền. Dịch vụ tên nhấn mạnh mối quan hệ với các đối tượng khác. Không giống như MỤC TIÊU và ĐỐI TƯỢNG GIÁ TRỊ, nó được định nghĩa hoàn toàn theo những gì nó có thể làm cho khách hàng. DỊCH VỤ có xu hướng được đặt tên cho một hoạt động, thay vì một thực thể, một động từ chứ không phải là một danh từ. DỊCH VỤ vẫn có thể có một định nghĩa trừu tượng, có chủ ý; nó chỉ có một hương vị khác với định nghĩa của một vật thể. DỊCH VỤ vẫn phải có trách nhiệm xác định và trách nhiệm đó và giao diện hoàn thành nó phải được xác định là một phần của mô hình miền. Tên hoạt động phải xuất phát từ NGÔN NGỮ UBIQUITOUS hoặc được đưa vào đó. Các tham số và kết quả phải là các đối tượng miền. DỊCH VỤ nên được sử dụng một cách thận trọng và không được phép tước bỏ ĐỐI TƯỢNG VÀ ĐỐI TƯỢNG GIÁ TRỊ của tất cả các hành vi của họ. Nhưng khi một hoạt động thực sự là một khái niệm miền quan trọng, DỊCH VỤ tạo thành một phần tự nhiên của THIẾT KẾ MODEL-DRIVEN. Được khai báo trong mô hình dưới dạng DỊCH VỤ, thay vì là một đối tượng giả mạo không thực sự đại diện cho bất cứ điều gì, hoạt động độc lập sẽ không đánh lừa bất cứ ai. DỊCH VỤ tạo thành một phần tự nhiên của THIẾT KẾ MODEL-DRIVEN. Được khai báo trong mô hình dưới dạng DỊCH VỤ, thay vì là một đối tượng giả mạo không thực sự đại diện cho bất cứ điều gì, hoạt động độc lập sẽ không đánh lừa bất cứ ai. DỊCH VỤ tạo thành một phần tự nhiên của THIẾT KẾ MODEL-DRIVEN. Được khai báo trong mô hình dưới dạng DỊCH VỤ, thay vì là một đối tượng giả mạo không thực sự đại diện cho bất cứ điều gì, hoạt động độc lập sẽ không đánh lừa bất cứ ai.

Repositorytheo Eric Evans,

REPOSITORY đại diện cho tất cả các đối tượng thuộc một loại nhất định dưới dạng một tập hợp khái niệm (thường được mô phỏng). Nó hoạt động như một bộ sưu tập, ngoại trừ với khả năng truy vấn phức tạp hơn. Các đối tượng thuộc loại thích hợp được thêm và xóa, và máy móc đằng sau REPOSITORY chèn chúng hoặc xóa chúng khỏi cơ sở dữ liệu. Định nghĩa này tập hợp một tập hợp trách nhiệm gắn kết để cung cấp quyền truy cập vào gốc rễ của AGGREGATE từ vòng đời đầu đến cuối.


11

Có đủ câu trả lời ở đây để giải thích những gì khác biệt giữa các thành phần-kho lưu trữ-dịch vụ-chú thích. Tôi muốn chia sẻ sự khác biệt giữa@Controller & @RestController

@Controller đấu với RestController

@RestController:

nhập mô tả hình ảnh ở đây

  • Chú thích này là một phiên bản chuyên biệt trong @Controllerđó thêm @Controller@ResponseBodychú thích tự động. vì vậy chúng tôi không phải thêm @ResponseBodyvào các phương pháp ánh xạ của chúng tôi. Điều đó có nghĩa @ResponseBodylà hoạt động mặc định.
  • Nếu bạn sử dụng, @RestControllerbạn không thể trả về chế độ xem (Bằng cách sử dụng Viewresolvertrong Spring / Spring-Boot)
  • @RestControllercũng chuyển đổi để đáp ứng JSON/XML automaticallynhư @ResponseBodylàm cho đối tượng trở về một cái gì đó có thể là trong cơ thể,e.g. JSON or XML

@Controller

nhập mô tả hình ảnh ở đây

  • @Controllerđược sử dụng để đánh dấu các lớp là Spring MVC Controller. Chú thích này chỉ là một phiên bản chuyên biệt @Componentvà nó cho phép các lớp trình điều khiển được tự động phát hiện dựa trên quét đường dẫn lớp.
  • @Controller bạn có thể trả về một khung nhìn trong Spring web MVC.

Xem chi tiết hơn


9

Kho lưu trữdịch vụ là con của chú thích thành phần . Vì vậy, tất cả chúng là Thành phần . Kho lưu trữdịch vụ chỉ cần mở rộng nó. Thật là chính xác? Dịch vụ chỉ có sự khác biệt về ý thức hệ: chúng tôi sử dụng nó cho các dịch vụ. Kho lưu trữ có xử lý ngoại lệ cụ thể.


6

Giải thích các bản mẫu:

  • @Service- Chú thích tất cả các lớp dịch vụ của bạn với @Service. Lớp này biết đơn vị công việc. Tất cả logic kinh doanh của bạn sẽ nằm trong các lớp Dịch vụ. Nói chung các phương thức của lớp dịch vụ được bảo hiểm theo giao dịch. Bạn có thể thực hiện nhiều cuộc gọi DAO từ phương thức dịch vụ, nếu một giao dịch thất bại, tất cả các giao dịch sẽ quay trở lại.
  • @Repository- Chú thích tất cả các lớp DAO của bạn với @Rep repository. Tất cả logic truy cập cơ sở dữ liệu của bạn phải ở trong các lớp DAO.
  • @Component - Chú thích các thành phần khác của bạn (ví dụ các lớp tài nguyên REST) ​​với bản mẫu thành phần.
  • @Autowired - Để Spring tự động kết nối các loại đậu khác vào các lớp của bạn bằng cách sử dụng chú thích @Autowired.

@Componentlà một bản mẫu chung cho bất kỳ thành phần nào do Spring quản lý. @Repository, @Service@Controllerlà các chuyên ngành của@Component cho các trường hợp sử dụng cụ thể hơn, ví dụ, trong các lớp trình bày, dịch vụ và trình bày tương ứng.

Ban đầu đã trả lời ở đây .


5

Sự khác biệt giữa các chú thích @Component, @Rep repository, @Controll & @Service

@Component - chung chung và có thể được sử dụng trên toàn ứng dụng.
@Service - chú thích các lớp ở cấp lớp dịch vụ.
@Controll - chú thích các lớp ở cấp lớp trình bày, chủ yếu được sử dụng trong Spring MVC.
@Rep repository - chú thích các lớp ở lớp kiên trì, sẽ đóng vai trò là kho lưu trữ cơ sở dữ liệu.

@Controller= @Component (Chú thích nội bộ) + Tính năng của lớp trình bày
@Service= @Component (Chú thích bên trong) + Tính năng của lớp dịch vụ
@Component= Thành phần thực tế (Đậu)
@Repository= @Component (Chú thích nội bộ) + Tính năng của lớp dữ liệu (sử dụng để xử lý Đậu miền)


3

Trong khung mùa xuân cung cấp một số loại chú thích đặc biệt, được gọi là chú thích rập khuôn. Sau đây là: -

@RestController- Declare at controller level.
@Controller  Declare at controller level.
@Component  Declare at Bean/entity level.
@Repository  Declare at DAO level.
@Service  Declare at BO level.

các chú thích được khai báo ở trên là đặc biệt bởi vì khi chúng ta thêm <context:component-scan>vào tệp xxx-servlet.xml, spring sẽ tự động tạo đối tượng của các lớp được chú thích với chú thích ở trên trong giai đoạn tạo / tải ngữ cảnh.


2

@Component, @ Repository, @ Service, @Controller:

@Componentlà một ấn tượng chung cho các thành phần do quản lý mùa xuân @Repository, @Service@Controller@Componentchuyên ngành để biết thêm công dụng cụ thể:

  • @Repository cho sự kiên trì
  • @Service cho các dịch vụ và giao dịch
  • @Controller cho bộ điều khiển MVC

Tại sao sử dụng @Repository, @Service, @Controllerqua@Component ? Chúng ta có thể đánh dấu các lớp thành phần của mình bằng @Component, nhưng nếu thay vào đó, chúng ta sử dụng phương án thay thế phù hợp với chức năng dự kiến. Các lớp học của chúng tôi phù hợp hơn với chức năng dự kiến ​​trong từng trường hợp cụ thể.

Một lớp được chú thích @Repositorycó bản dịch tốt hơn và xử lý lỗi có thể đọc được với org.springframework.dao.DataAccessException. Lý tưởng để thực hiện các thành phần truy cập dữ liệu (DataAccessObject hoặc DAO).

Một lớp chú thích có @Controllervai trò điều khiển trong ứng dụng Spring Web MVC

Một lớp chú thích có @Servicevai trò trong các dịch vụ logic nghiệp vụ, ví dụ mẫu Mặt tiền cho Trình quản lý DAO (Mặt tiền) và xử lý giao dịch


2

Các câu trả lời được trình bày ở đây phần lớn là đúng về mặt kỹ thuật, nhưng mặc dù danh sách phản hồi dài và điều này sẽ ở dưới cùng, tôi nghĩ rằng nó cũng đáng để đưa ra một phản hồi thực sự chính xác ở đây, chỉ trong trường hợp ai đó vấp phải nó và học được điều gì đó có giá trị từ nó Không phải là những câu trả lời còn lại đều sai, chỉ là họ không đúng. Và, để ngăn chặn lũ troll, vâng, tôi biết rằng về mặt kỹ thuật những chú thích này thực sự giống nhau và có thể hoán đổi cho nhau ngay cả mùa xuân 5. Bây giờ, để có câu trả lời đúng:

Ba chú thích này là những thứ hoàn toàn khác nhau và không thể thay thế cho nhau. Bạn có thể nói rằng bởi vì có ba trong số họ chứ không phải chỉ một. Chúng không có ý định hoán đổi cho nhau, chúng chỉ được thực hiện theo cách thanh lịch và tiện lợi.

Lập trình hiện đại là phát minh, nghệ thuật, kỹ thuật và giao tiếp, với các tỷ lệ khác nhau. Các bit giao tiếp thường rất quan trọng vì mã thường được đọc thường xuyên hơn nhiều so với văn bản của nó. Là một lập trình viên, bạn không chỉ cố gắng giải quyết vấn đề kỹ thuật, bạn còn cố gắng truyền đạt ý định của mình tới các lập trình viên tương lai đọc mã của bạn. Những lập trình viên này có thể không chia sẻ ngôn ngữ mẹ đẻ của bạn, cũng như môi trường xã hội của bạn và có thể họ sẽ đọc mã của bạn trong 50 năm trong tương lai (điều đó không khó xảy ra như bạn nghĩ). Thật khó để giao tiếp hiệu quả trong tương lai. Do đó, điều quan trọng là chúng tôi sử dụng ngôn ngữ giao tiếp rõ ràng nhất, hiệu quả nhất, chính xác nhất và có sẵn cho chúng tôi.

Ví dụ, điều quan trọng @Repositorylà được sử dụng khi chúng ta viết một kho lưu trữ, thay vì @Component. Cái sau là một sự lựa chọn rất kém của chú thích cho một kho lưu trữ bởi vì nó không chỉ ra rằng chúng ta đang xem một kho lưu trữ. Chúng ta có thể giả định rằng một kho lưu trữ cũng là một bean-bean, nhưng không phải là một thành phần là một kho lưu trữ. Với @Repositorychúng tôi đang được rõ ràng và cụ thể trong ngôn ngữ của chúng tôi. Chúng tôi nói rõ rằng đây là một kho lưu trữ. Với@Componentchúng tôi sẽ để người đọc quyết định loại thành phần nào họ đang đọc và họ sẽ phải đọc cả lớp (và có thể là một cây của các lớp con và giao diện) để suy ra ý nghĩa. Lớp học sau đó có thể bị người đọc hiểu sai trong tương lai xa vì không phải là một kho lưu trữ và chúng tôi sẽ chịu trách nhiệm một phần cho lỗi này bởi vì chúng tôi, người biết rõ rằng đây là một kho lưu trữ, không thể nói cụ thể bằng ngôn ngữ của chúng tôi và giao tiếp hiệu quả ý định của chúng tôi.

Tôi sẽ không đi vào các ví dụ khác, nhưng sẽ nói rõ nhất có thể: những chú thích này là những thứ hoàn toàn khác nhau và nên được sử dụng một cách thích hợp, theo ý định của chúng. @Repositorylà cho các kho lưu trữ và không có chú thích nào khác là chính xác. @Servicelà cho các dịch vụ và không có chú thích nào khác là chính xác. @Componentdành cho các thành phần không phải là kho lưu trữ cũng như dịch vụ và để sử dụng một trong hai thành phần này vào vị trí của nó cũng sẽ không chính xác. Nó có thể biên dịch, nó thậm chí có thể chạy và vượt qua các bài kiểm tra của bạn, nhưng nó sẽ sai và tôi sẽ nghĩ ít hơn về bạn (một cách chuyên nghiệp) nếu bạn làm điều này.

Có những ví dụ về điều này trong suốt mùa xuân (và lập trình nói chung). Bạn không được sử dụng @Controllerkhi viết API REST, vì @RestControllercó sẵn. Bạn không được sử dụng @RequestMappingkhi @GetMappingthay thế hợp lệ. V.v. v.v. Bạn phải chọn ngôn ngữ chính xác và chính xác nhất có thể để truyền đạt ý định của mình đến độc giả, nếu không, bạn đang đưa rủi ro vào hệ thống của mình và rủi ro phải trả giá.


nói tốt và điểm tốt!
Andy

1

Để đơn giản hóa hình minh họa này, chúng ta hãy xem xét tính kỹ thuật theo trường hợp sử dụng, Những chú thích này được sử dụng để được tiêm và như tôi đã nói theo nghĩa đen là " Được sử dụng để tiêm ", nghĩa là, nếu bạn biết cách sử dụng Tiêm phụ thuộc "DI" và bạn nên, sau đó bạn sẽ luôn tìm kiếm các chú thích này và bằng cách chú thích các lớp với các Loại âm thanh nổi này , bạn đang thông báo cho bộ chứa DI để quét chúng để sẵn sàng tiêm ở những nơi khác, đây là mục tiêu thực tế.

Bây giờ hãy di chuyển đến từng người; đầu tiên @Service , Nếu bạn đang xây dựng một số logic cho trường hợp kinh doanh cụ thể, bạn cần tách riêng nó ở một nơi chứa logic kinh doanh của bạn, dịch vụ này là Class bình thường hoặc bạn có thể sử dụng nó làm giao diện nếu bạn muốn và nó được viết như điều này

@Service
public class Doer {
   // Your logic 
}

// To use it in another class, suppose in Controller 
@Controller
public class XController {
 // You have to inject it like this 
 @Autowired 
 private Doer doer;
}

Tất cả đều giống nhau khi bạn tiêm chúng, @Rep repository là giao diện áp dụng triển khai cho mẫu thiết kế Kho lưu trữ mẫu , thường được sử dụng khi bạn đang xử lý một số kho lưu trữ dữ liệu hoặc cơ sở dữ liệu và bạn sẽ thấy rằng, nó chứa nhiều sẵn sàng thực hiện để bạn xử lý các hoạt động cơ sở dữ liệu; nó có thể là CrudRep repository , JpaRep repository , v.v.

// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}

Cuối cùng là @Component , đây là hình thức chung cho các loại đậu đã đăng ký trong Spring, đó là mùa xuân luôn tìm kiếm đậu được đánh dấu bằng @Component để đăng ký, sau đó cả @Service và @Repousing đều là những trường hợp đặc biệt của @Component, tuy nhiên trường hợp sử dụng phổ biến cho thành phần là khi bạn đang làm một cái gì đó hoàn toàn là kỹ thuật không phải để bao gồm trường hợp kinh doanh trực tiếp! như định dạng ngày hoặc bàn giao cơ chế tuần tự hóa yêu cầu đặc biệt, v.v.


0

@Component đóng vai trò là chú thích @Bean trong lớp cấu hình, đăng ký bean trong ngữ cảnh mùa xuân. Ngoài ra, nó là cha mẹ cho chú thích @Service, @Rep repository và @Controll.

@Service , mở rộng chú thích @Component và chỉ có sự khác biệt về tên.

@Rep repository - mở rộng chú thích @Component và dịch tất cả các ngoại lệ cơ sở dữ liệu sang DataAccessException .

@Controll - hoạt động như bộ điều khiển trong mẫu MVC. Bộ điều phối sẽ quét các lớp chú thích như vậy để tìm các phương thức được ánh xạ, phát hiện các chú thích @RequestMapping.


-13
@Component
@Controller
@Repository
@Service
@RestController

Đây là tất cả các chú thích StereoType. Đây là hữu ích cho việc tạo các lớp của chúng tôi dưới dạng đậu mùa xuân trong thùng chứa ioc,

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.