Written By : Nguyễn Mạnh Cường

(đã biên dịch và bổ sung thêm)

Email liên hệ: ngmanhcuong2001@gmail.com
Nguồn bài viết gốc : https://springframework.guru/spring-framework-annotations/

Giải thích các Annotations trong SpringBoot

Chú thích của Spring Framework

Ngôn ngữ lập trình Java cung cấp hỗ trợ cho các chú thích từ Java 5.0. Các khung công tác Java hàng đầu đã nhanh chóng chấp nhận các chú thích và Spring Framework bắt đầu sử dụng các chú thích từ bản phát hành 2.5. Do cách chúng được định nghĩa, các chú thích cung cấp rất nhiều ngữ cảnh trong phần khai báo của chúng.

Trước khi có chú thích, hành vi của Spring Framework được kiểm soát phần lớn thông qua cấu hình XML. Ngày nay, việc sử dụng các chú thích cung cấp cho chúng ta những khả năng to lớn trong cách chúng ta định cấu hình các hành vi của Spring Framework.

Trong bài đăng này, chúng ta sẽ xem xét các chú thích có sẵn trong Spring Framework.

Chú thích của Core Spring Framework

@Required

Chú thích này được áp dụng trên các phương thức bean setter. Hãy xem xét một tình huống mà bạn cần thực thi một thuộc tính bắt buộc. Chú thích @Required chỉ ra rằng bean bị ảnh hưởng phải được điền vào thời điểm cấu hình với thuộc tính bắt buộc. Nếu không, một ngoại lệ của kiểu BeanInitializationException sẽ được ném ra.

@Autowired

Chú thích này được áp dụng trên các trường, phương thức setter và hàm tạo. Chú thích @Autowired mong muốn đưa sự phụ thuộc vào đối tượng một cách ngầm định.

Khi bạn sử dụng @Autowired trên các trường và chuyển các giá trị cho các trường bằng tên thuộc tính, Spring sẽ tự động gán các trường với các giá trị được truyền vào.

Bạn thậm chí có thể sử dụng @Autowired trên các thuộc tính riêng tư, như được hiển thị bên dưới. (Đây là một ví dụ rất tệ!)

public class Customer {
    @Autowired                               
    private Person person;                   
    private int type;
}

Khi bạn sử dụng @Autowired trên các phương thức setter, Spring sẽ cố gắng thực hiện tự động tạo by Type trên phương thức. Bạn đang hướng dẫn Spring rằng nó nên khởi tạo thuộc tính này bằng cách sử dụng phương thức setter, nơi bạn có thể thêm mã tùy chỉnh của mình, giống như khởi tạo bất kỳ thuộc tính nào khác với thuộc tính này.

public class Customer {                                                                                         
    private Person person;
    @Autowired                                                                                                      
    public void setPerson (Person person) {
     this.person=person;
    }
}

LƯU Ý: Kể từ Spring 4.3, @Autowired đã trở thành tùy chọn trên các lớp có một hàm tạo duy nhất. Trong ví dụ trên, Spring vẫn sẽ đưa vào một phiên bản của lớp Person nếu bạn bỏ qua chú thích @Autowired mong muốn.

@Qualifier

Chú thích này được sử dụng cùng với chú thích @Autowired. Khi bạn cần kiểm soát nhiều hơn quá trình tiêm phụ thuộc, @Qualifier có thể được sử dụng. @Qualifier có thể được chỉ định trên các tham số phương thức hoặc đối số phương thức khởi tạo riêng lẻ. Chú thích này được sử dụng để tránh nhầm lẫn xảy ra khi bạn tạo nhiều bean cùng loại và chỉ muốn nối một trong số chúng với một thuộc tính.
Hãy xem xét một ví dụ trong đó một giao diện BeanInterface được thực hiện bởi hai bean BeanB1
BeanB2.

@Component
public class BeanB1 implements BeanInterface {
  //
}
@Component
public class BeanB2 implements BeanInterface {
  //
}

Bây giờ nếu BeanA tự động cài đặt giao diện này, Spring sẽ không biết sẽ đưa vào một trong hai triển khai nào.
Một giải pháp cho vấn đề này là sử dụng chú thích @Qualifier.

@Component
public class BeanA {
  @Autowired
  @Qualifier("BeanB2")
  private BeanInterface dependency;
  ...
}

Với chú thích @Qualifier được thêm vào, Spring bây giờ sẽ biết bean nào để tự động truyền tải trong đó beanB2 là tên của BeanB2.

@Configuration

Chú thích này được sử dụng trên các lớp định nghĩa các bean. @Configuration là một tệp cấu hình tương tự cho XML - nó là cấu hình sử dụng lớp Java. Lớp Java được chú thích bằng @Configuration là một cấu hình của chính nó và sẽ có các phương thức để khởi tạo và cấu hình các phần phụ thuộc.
Đây là một ví dụ:

@Configuration
public class DataConfig{ 
  @Bean
  public DataSource source(){
    DataSource source = new OracleDataSource();
    source.setURL();
    source.setUser();
    return source;
  }
  @Bean
  public PlatformTransactionManager manager(){
    PlatformTransactionManager manager = new BasicDataSourceTransactionManager();
    manager.setDataSource(source());
    return manager;
  }
}

@ComponentScan

Chú thích này được sử dụng với chú thích @Configuration để cho phép Spring biết các gói để quét các thành phần được chú thích. @ComponentScan cũng được sử dụng để chỉ định các gói cơ sở bằng cách sử dụng các thuộc tính basePackageClasses hoặc basePackage để quét. Nếu các gói cụ thể không được xác định, quá trình quét sẽ xảy ra từ gói của lớp khai báo chú thích này.

@Bean

Chú thích này được sử dụng ở cấp phương pháp. Chú thích @Bean hoạt động với @Configuration để tạo Spring bean. Như đã đề cập trước đó, @Configuration sẽ có các phương thức để khởi tạo và cấu hình các phần phụ thuộc. Các phương thức như vậy sẽ được chú thích bằng @Bean. Phương thức được chú thích với chú thích này hoạt động như là bean ID và nó tạo và trả về bean thực.
Đây là một ví dụ:

@Configuration
public class AppConfig{
  @Bean
  public Person person(){
    return new Person(address());
  }
  @Bean
  public Address address(){
    return new Address();
  }
}

@Lazy

Chú thích này được sử dụng trên các lớp thành phần. Theo mặc định, tất cả các phụ thuộc tự động mong muốn được tạo và định cấu hình khi khởi động. Nhưng nếu bạn muốn khởi tạo bean một cách lười biếng, bạn có thể sử dụng chú thích @Lazy trên lớp. Điều này có nghĩa là bean sẽ chỉ được tạo và khởi tạo khi nó được yêu cầu lần đầu tiên. Bạn cũng có thể sử dụng chú thích này trên các lớp @Configuration. Điều này chỉ ra rằng tất cả các phương thức @Bean trong @Configuration đó phải được khởi tạo một cách lười biếng.

@Value

Chú thích này được sử dụng ở cấp trường, tham số hàm tạo và tham số phương thức. Chú thích @Value cho biết biểu thức giá trị mặc định cho trường hoặc tham số để khởi tạo thuộc tính. Khi chú thích @Autowosystem yêu cầu Spring đưa đối tượng vào một đối tượng khác khi nó tải ngữ cảnh ứng dụng của bạn, bạn cũng có thể sử dụng chú thích @Value để đưa các giá trị từ tệp thuộc tính vào thuộc tính bean. Nó hỗ trợ cả trình giữ chỗ # {…}
$ {…}.

Chú thích khuôn mẫu Spring Framework

@Component

Chú thích này được sử dụng trên các lớp để chỉ ra một thành phần Spring. Chú thích @Component đánh dấu lớp Java là một thành phần bean hoặc say để cơ chế quét thành phần của Spring có thể thêm vào ngữ cảnh ứng dụng.

@Controller

Chú thích @Controller được sử dụng để chỉ ra lớp là một bộ điều khiển Spring. Chú thích này có thể được sử dụng để xác định bộ điều khiển cho Spring MVC hoặc Spring WebFlux.

@Service

Chú thích này được sử dụng trên một lớp. @Service đánh dấu một lớp Java thực hiện một số dịch vụ, chẳng hạn như thực thi logic nghiệp vụ, thực hiện các phép tính và gọi các API bên ngoài. Chú thích này là một dạng chuyên biệt của chú thích @Component nhằm mục đích sử dụng trong lớp dịch vụ.

@Repository

Chú thích này được sử dụng trên các lớp Java truy cập trực tiếp vào cơ sở dữ liệu. Chú thích @Repository hoạt động như điểm đánh dấu cho bất kỳ lớp nào đáp ứng vai trò của kho lưu trữ hoặc Đối tượng truy cập dữ liệu.

Chú thích này có tính năng dịch tự động. Ví dụ: khi một ngoại lệ xảy ra trong @Repository, có một trình xử lý cho ngoại lệ đó và không cần thêm khối try catch.

Chú thích khởi động mùa xuân

@EnableAutoConfiguration

Chú thích này thường được đặt trên lớp ứng dụng chính. Chú thích @EnableAutoConfiguration xác định ngầm một “gói tìm kiếm” cơ sở. Chú thích này yêu cầu Spring Boot bắt đầu thêm các bean dựa trên cài đặt classpath, các bean khác và các cài đặt thuộc tính khác nhau.

@SpringBootApplication

Chú thích này được sử dụng trên lớp ứng dụng trong khi thiết lập một dự án Spring Boot. Lớp được chú thích bằng @SpringBootApplication phải được giữ trong gói cơ sở. Một thứ mà @SpringBootApplication thực hiện là quét thành phần. Nhưng nó sẽ chỉ quét các gói con của nó. Ví dụ: nếu bạn đặt lớp được chú thích bằng @SpringBootApplication trong com.example thì @SpringBootApplication sẽ quét tất cả các gói con của nó, chẳng hạn như com.example.a, com.example.bcom.example.a.x.

@SpringBootApplication là một chú thích tiện lợi bổ sung tất cả những điều sau:

@Configuration

@EnableAutoConfiguration

@ComponentScan

Spring MVC và REST Chú thích

@Controller

Chú thích này được sử dụng trên các lớp Java đóng vai trò bộ điều khiển trong ứng dụng của bạn. Chú thích @Controller cho phép tự động phát hiện các lớp thành phần trong classpath và tự động đăng ký định nghĩa bean cho chúng. Để kích hoạt tính năng tự động phát hiện các bộ điều khiển được chú thích như vậy, bạn có thể thêm chức năng quét thành phần vào cấu hình của mình. Lớp Java được chú thích bằng @Controller có khả năng xử lý nhiều ánh xạ yêu cầu.
Chú thích này có thể được sử dụng với Spring MVC và Spring WebFlux.

@RequestMapping

Chú thích này được sử dụng cả ở cấp độ lớp và phương thức. Chú thích @RequestMapping được sử dụng để ánh xạ các yêu cầu web lên các lớp xử lý cụ thể và các phương thức xử lý. Khi @RequestMapping được sử dụng ở cấp độ lớp, nó tạo ra một URI cơ sở mà bộ điều khiển sẽ được sử dụng. Khi chú thích này được sử dụng trên các phương thức, nó sẽ cung cấp cho bạn URI mà trên đó các phương thức xử lý sẽ được thực thi. Từ đó, bạn có thể suy ra rằng ánh xạ yêu cầu cấp lớp sẽ không thay đổi trong khi mỗi phương thức xử lý sẽ có ánh xạ yêu cầu riêng của chúng.

Đôi khi bạn có thể muốn thực hiện các hoạt động khác nhau dựa trên phương thức HTTP được sử dụng, mặc dù URI yêu cầu có thể giữ nguyên. Trong những tình huống như vậy, bạn có thể sử dụng thuộc tính phương thức của @RequestMapping với giá trị phương thức HTTP để thu hẹp các phương thức HTTP nhằm gọi các phương thức của lớp của bạn.

Dưới đây là một ví dụ cơ bản về cách một bộ điều khiển cùng với ánh xạ yêu cầu hoạt động:

@Controller
@RequestMapping("/welcome")
public class WelcomeController{
  @RequestMapping(method = RequestMethod.GET)
  public String welcomeAll(){
    return "welcome all";
  }  
}

Trong ví dụ này, chỉ các yêu cầu GET tới / welcome được xử lý bởi phương thức welcomeAll ().
Chú thích này cũng có thể được sử dụng với Spring MVC và Spring WebFlux.

@CookieValue

Chú thích này được sử dụng ở cấp tham số phương thức. @CookieValue được sử dụng làm đối số của phương thức ánh xạ yêu cầu. Cookie HTTP được liên kết với tham số @CookieValue cho một tên cookie nhất định. Chú thích này được sử dụng trong phương thức được chú thích bằng @RequestMapping.
Để nhận giá trị của cookie, hãy sử dụng @CookieValue như sau:

@RequestMapping("/cookieValue")
  public void getCookieValue(@CookieValue "JSESSIONID" String cookie){
}