Chú thích mùa xuân @Controller có giống với @Service không?


80

Chú thích mùa xuân có @Controllergiống với @Service?

Tôi có ý tưởng về @Controllercái mà có thể được sử dụng để URLlập bản đồ và gọi logic kinh doanh.

trong khi @Serviceđược sử dụng để chú thích lớp dịch vụ có chứa logic nghiệp vụ.

Tôi có thể sử dụng @Controllerthay vì @Servicechú thích lớp Dịch vụ không?

Câu trả lời:


124

Không, chúng khá khác biệt với nhau.

Cả hai đều là các chuyên ngành khác nhau của chú thích @Component (trên thực tế, chúng là hai cách triển khai khác nhau của cùng một giao diện) nên cả hai đều có thể được phát hiện bằng cách quét classpath (nếu bạn khai báo nó trong cấu hình XML của mình)

Chú thích @Service được sử dụng trong lớp dịch vụ của bạn và chú thích các lớp thực hiện các tác vụ dịch vụ, thường thì bạn không sử dụng nó nhưng trong nhiều trường hợp, bạn sử dụng chú thích này để thể hiện phương pháp hay nhất. Ví dụ, bạn có thể gọi trực tiếp một lớp DAO để duy trì một đối tượng trong cơ sở dữ liệu của bạn nhưng điều này thật kinh khủng. Nó là khá tốt để gọi một lớp dịch vụ gọi một DAO. Đây là một điều tốt để thực hiện phân tách các mối quan tâm.

@Controller annotation là một chú thích được sử dụng trong Spring MVC framework (thành phần của Spring Framework được sử dụng để triển khai Ứng dụng Web). Chú thích @Controller chỉ ra rằng một lớp cụ thể đóng vai trò của bộ điều khiển. Chú thích @Controller hoạt động như một khuôn mẫu cho lớp chú thích, cho biết vai trò của nó. Người điều phối quét các lớp được chú thích như vậy để tìm các phương thức được ánh xạ và phát hiện các chú thích @RequestMapping.

Vì vậy, nhìn vào kiến ​​trúc Spring MVC, bạn có một lớp DispatcherServlet (mà bạn khai báo trong cấu hình XML của mình) đại diện cho một bộ điều khiển phía trước gửi tất cả Yêu cầu HTTP tới các lớp bộ điều khiển thích hợp (được chú thích bởi @Controller). Lớp này thực hiện logic nghiệp vụ (và có thể gọi các dịch vụ) bằng phương thức của nó. Các lớp này (hoặc các phương thức của nó) thường được chú thích bằng chú thích @RequestMapping chỉ định HTTP Request được xử lý bởi bộ điều khiển và phương thức của nó.

Ví dụ:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

Lớp này là một bộ điều khiển.

Lớp này xử lý tất cả các Yêu cầu HTTP đối với thư mục "/ bổ nhiệm" "" và cụ thể là phương thức get là phương thức được gọi để xử lý tất cả Yêu cầu HTTP GET đối với thư mục "/ bổ nhiệm".

Tôi hy vọng rằng bây giờ nó là rõ ràng hơn cho bạn.


3
Giải thích rất hay. Một điểm cần đề cập, các lớp bộ điều khiển (tại) không cần phải có (tại) RequestMapping, (tại) RequestMapping cũng có thể là cấp phương thức.
máy chấm công

1
Tôi có thể trộn chúng theo định nghĩa lớp đơn không? Hay tốt hơn là triển khai chúng dưới dạng các lớp riêng biệt?
kensai 16/1017

37

Nếu bạn nhìn vào các định nghĩa của @Controller, @Servicechú thích, thì bạn sẽ thấy rằng đây là những loại @Componentchú thích đặc biệt .

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

Vậy sự khác biệt là gì?

@Controller

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ó.

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

Bạn không thể chuyển đổi chú thích này với bất kỳ chú thích nào khác @Servicehoặc @Repository, mặc dù chúng trông giống nhau. Người điều phối quét các lớp được chú thích @Controllervà phát hiện @RequestMappingcác chú thích bên trong chúng. Bạn chỉ có thể sử dụng @RequestMappingtrên @Controllercác lớp có chú thích.


@Dịch vụ

@Services giữ logic nghiệp vụ và phương thức gọi 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 nghiệp vụ, không có điểm đặc biệt nào đáng chú ý mà chú thích này cung cấp, nhưng ai biết được, mùa xuân có thể thêm một số đặc biệt bổ sung trong tương lai.

Câu trả lời được liên kết: Sự khác biệt giữa chú thích @Component, @Repository & @Service trong Spring là gì?


7

Không, @Controllerkhông giống với @Service, mặc dù cả hai đều là chuyên môn @Component, khiến cả hai đều là ứng cử viên để khám phá bằng cách quét classpath. Các @Servicechú thích được sử dụng trong lớp dịch vụ của bạn, và @Controllerlà dành cho bộ điều khiển Spring MVC trong lớp trình bày của bạn. Một @Controllerthường sẽ có một ánh xạ URL và được kích hoạt bởi một yêu cầu web.


5

@Service so với @Controller

@Service: class là "Business Service Facade" (theo nghĩa của các mẫu Core J2EE), hoặc một cái gì đó tương tự.

@Controller: Chỉ ra rằng một lớp được chú thích là "Bộ điều khiển" (ví dụ: bộ điều khiển web).

---------- Tìm ghi chú hữu ích trên các khuôn mẫu chính http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

Thành phần @interface

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

Chỉ ra rằng một lớp được 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 phân cách.

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, thường là một loại thành phần đặc biệt: ví dụ: chú thích @Repository hoặc chú thích @Aspect của AspectJ.

Bộ điều khiển @interface

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

Chỉ ra rằng một lớp được chú thích là "Bộ điều khiển" (ví dụ: bộ điều khiển web).

Chú thích này đóng vai trò là một chuyên môn hóa của @Component, cho phép các lớp triển khai được tự động phát hiện thông qua quét classpath. Nó thường được sử dụng kết hợp với các phương thức xử lý có chú thích dựa trên chú thích RequestMapping.

@ interface Service

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

Chỉ ra rằng một lớp được chú thích là một "Dịch vụ", ban đầu được định nghĩa bởi Thiết kế theo hướng miền (Evans, 2003) là "một hoạt động được cung cấp như một giao diện đứng riêng 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ụ kinh doanh" (theo nghĩa của các mẫu Core J2EE) hoặc một cái gì đó tương tự. Chú thích này là một khuô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 chúng và sử dụng khi thích hợp.

Chú thích này đóng vai trò là một chuyên môn hóa của @Component, cho phép các lớp triển khai được tự động phát hiện thông qua quét classpath.

Kho lưu trữ @interface

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

Chỉ ra rằng một lớp được chú thích là một "Kho lưu trữ", ban đầu được định nghĩa bởi Domain-Driven Design (Evans, 2003) là "một cơ chế để đóng gói hành vi lưu trữ, truy xuất và tìm kiếm mô phỏng một tập hợp các đối tượng". Các nhóm triển khai các mẫu J2EE truyền thống chẳng hạn như "Đối tượng Truy cập Dữ liệu" cũng có thể áp dụng khuôn mẫu này cho các lớp DAO, mặc dù vậy nên cẩn thận để hiểu sự khác biệt giữa Đối tượng Truy cập Dữ liệu và các kho lưu trữ kiểu DDD trước khi làm như vậy. Chú thích này là một khuô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 chúng và sử dụng khi thích hợp.

Do đó, một lớp được chú thích đủ điều kiện cho bản dịch Spring DataAccessException khi được sử dụng cùng với một PersistenceExceptionTranslationPostProcessor. Lớp chú thích cũng được làm rõ về vai trò của nó trong kiến ​​trúc ứng dụng tổng thể cho mục đích tạo công cụ, các khía cạnh, v.v.

Kể từ Spring 2.5, chú thích này cũng đóng vai trò là một chuyên môn hóa của @Component, cho phép các lớp triển khai được tự động phát hiện thông qua quét classpath.


1

Tôi đã trả lời câu hỏi tương tự ở đây Đây là liên kết

Không có cả hai đều khác nhau.

Chú thích @Service được sử dụng cho mục đích khác và @Controller sử dụng cho mục đích khác. Trên thực tế, các chú thích Spring @Component, @Service, @Repository và @Controller được sử dụng để phát hiện bean tự động bằng cách sử dụng quét classpath trong Spring framework, nhưng không có nghĩa là tất cả các chức năng đều giống nhau. @Service: Nó cho biết lớp được chú thích là một thành phần Dịch vụ trong lớp nghiệp vụ.

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


0

Không, bạn không thể họ khác nhau. Ví dụ: khi ứng dụng được triển khai, các ánh xạ bộ điều khiển của bạn sẽ bị khóa.

Tại sao bạn vẫn muốn, một bộ điều khiển không phải là một dịch vụ và ngược lại.


0

From Spring In Action

Như bạn có thể thấy, lớp này được chú thích bằng @Controller. Về bản thân, @Controller không làm được gì nhiều. Mục đích chính của nó là xác định lớp này như một thành phần để quét thành phần. Vì HomeController được chú thích bằng @Controller, quá trình quét thành phần của Spring sẽ tự động phát hiện ra nó và tạo ra một thể hiện của HomeController dưới dạng bean trong ngữ cảnh ứng dụng Spring.

Trên thực tế, một số chú thích khác (bao gồm @Component, @Service và @Repository) phục vụ một mục đích tương tự như @Controller. Bạn có thể chú thích HomeController hiệu quả tương tự với bất kỳ chú thích nào khác và nó sẽ vẫn hoạt động như cũ. Tuy nhiên, lựa chọn @Controller mô tả nhiều hơn về vai trò của thành phần này trong ứng dụng.


0

Bạn có thể khai báo @service@Controller .

Bạn KHÔNG thể khai báo @Controller@Service

@Dịch vụ

Nó là thường xuyên. Bạn chỉ đang khai báo lớp như một Thành phần.

@Controller

Nó đặc biệt hơn một chút so với Component. Người điều phối sẽ tìm kiếm @RequestMapping tại đây. Vì vậy, một lớp được chú thích bằng @Controller, sẽ được trao quyền bổ sung với việc khai báo các URL mà qua đó các API được gọi


0
  • Bộ điều khiển sẽ xử lý điều hướng giữa các chế độ xem khác nhau. Các ánh xạ yêu cầu ánh xạ của bạn được xử lý với sự trợ giúp của controller.
  • Dịch vụ tương tác trực tiếp với kho lưu trữ, nơi mà logic nghiệp vụ thường được thực hiện. Bạn có thể thêm, xóa, xóa, v.v. tại lớp dịch vụ
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.