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@Component
và không tìm kiếm@Controller
,@Service
và@Repository
nó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
và @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
và @Repository
là những loại @Component
chú 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 @Component
chú thích, có nghĩa là chúng cũng @Component
là 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 , @Repository
cô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 @Controller
chú 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 @Controller
chú 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ư @Service
hay @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 @Controller
và phát hiện các phương thức được chú thích bằng @RequestMapping
các chú thích bên trong chúng. Chúng ta có thể sử dụng @RequestMapping
trên / chỉ trong các phương pháp đó mà lớp học được chú thích với @Controller
và nó sẽ không làm việc với @Component
, @Service
, @Repository
vv ...
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 @Bean
hoặc thông qua @Component
, @Service
v.v ... chú thích, thì @RequestMapping
có thể được chọn nếu lớp cũng được chú thích bằng @RequestMapping
chú 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
và @Repository
dự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.