Trong phần này, chúng ta sẽ tìm hiểu các annotations có sẵn trong Spring Framework.
I. Core Spring Framework Annotations
@Required
Annotation này được áp dụng trên các phương thức setter bean. Hãy xem xét một kịch bản mà bạn cần phải thực thi thuộc tính required. Annotation @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 (configuration) với thuộc tính required. Nếu không, một ngoại lệ (exception) thuộc kiểu BeanInitializationException sẽ được ném ra.
@Autowired
Annotation này được áp dụng trên các fields, phương thức setter, và contructors. Chúng ta sử dụng @Autowired để đánh dấu 1 dependency mà Spring sẽ resolve và inject. Nó sẽ tự động liên kết các bean được sử dụng trong các class với các bean được Spring Container sinh ra và quản lý.
Khi bạn sử dụng @Autowired trên fields và truyền values cho fields bằng tên của thuộc tính, Spring sẽ tự động gán các trường với các giá trị được truyền.
Bạn thậm chí có thể sử dụng @Autowired trên các thuộc tính private, như hiển thị bên dưới.
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 theo kiểu tự động trên phương thức (method). 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 phương thức setter, nơi bạn có thể thêm mã tùy chỉnh của mình, như khởi tạo bất kỳ thuộc tính nào khác với thuộc tính này.
Bây giờ, nếu BeanA autowires interface này, Spring sẽ không biết nên thực hiện một trong 2 cách triển khai nào.
Một giải pháp cho vấn đề này là sử dụng annotation @Qualifier .
Dưới đây là một ví dụ:
public class Customer {
private Person person;
@Autowired
public void setPerson (Person person) {
this.person=person;
}
}
Khi bạn sử dụng @Autowired trên một constructor, constructor sẽ injection tại thời điểm tạo đối tượng. Nó chỉ ra rằng, constructor sẽ autowire khi được sử dụng như một bean. Một điều cần lưu ý ở đây là chỉ có một constructor của bất kỳ lớp bean nào có thể mang chú thích @Autowired.@Component public class Customer { private Person person; @Autowired public Customer (Person person) { this.person=person; } }
@Qualifier
Annotation này được sử dụng cùng với annotation @Autowired. Khi bạn cần kiểm soát nhiều hơn quá trình tiêm phụ thuộc, thì @Qualifier có thể được sử dụng.
@Qualifier có thể được chỉ định trên các đối số của constructor riêng lẻ hoặc tham số phương thức. Annotation này được sử dụng để tránh nhầm lẫn xảy ra khi bạn tạo nhiều hơn một bean cùng loại. Hãy xem xét ví dụ sau, trong đó giao diện BeanInterface được triển khai bởi hai bean BeanB1 và BeanB2 .
@Component public class BeanB1 implements BeanInterface { // } @Component public class BeanB2 implements BeanInterface { // }
Một giải pháp cho vấn đề này là sử dụng annotation @Qualifier .
Với annotation @Qualifier được thêm vào, Spring sẽ biết bean nào sẽ được autowire, trong đó beanB2 là tên của BeanB2 .@Component public class BeanA { @Autowired @Qualifier("beanB2") private BeanInterface dependency; ... }
@Configuration
Annotation này được sử dụng trên các class define beans. @Configuration là một tệp tương tự cho tệp cấu hình XML - đó là cấu hình sử dụng class Java. Class 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 dependencies.Dưới đâ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
Annotation này được sử dụng với annotation @Configuration cho phép Spring biết các packages để quét các thành phần chú thích. @ComponentScan cũng được sử dụng để xác định các gói cơ sở sử dụng basePackageClasses hoặc basePackage để quét các thuộc tính. Nếu các packages cụ thể không được xác định, quá trình quét sẽ xảy ra từ package của class khai báo chú thích này.
@Bean
Annotation này được sử dụng ở cấp method. Chú thích @Bean làm việc 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à configure các dependencies. Các phương pháp như vậy sẽ được chú thích bằng @Bean . Phương thức được chú thích với annotation này hoạt động như bean ID - nó sẽ tạo và trả về bean thực sự.
Dưới đâ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
Annotation này được sử dụng trên các classes component. Mặc định, tất cả các dependencies sẽ được tự động created và configured khi khởi động. Nhưng nếu bạn muốn khởi tạo 1 cách lười biếng, thì bạn có thể sử dụng annotation @Lazy trên đầu class. Điều này có nghĩa là bean sẽ được tạo và khởi tạo chỉ khi nó được yêu cầu lần đầu tiên. Bạn cũng có thể sử dụng annotation này trên các class @Configuration . Điều này chỉ ra rằng, tất cả các phương thức @Bean trong đó có @Configuration nên được khởi tạo một các lười biếng.
@Value
Annotation này được sử dụng ở các field, constructor parameter, và method parameter. Annotation @value cho thấy một biểu hiện giá trị mặc định cho trường hoặc tham số để khởi tạo property. Vì annotation @Autowired bảo Spring đưa đối tượng vào một đối tượng khác khi nó tải bối cảnh ứng dụng của bạn, bạn cũng có thể sử dụng annotation @Value để đưa các giá trị từ tệp thuộc tính vào thuộc tính của bean. Nó hỗ trợ cả # { ... } và $ { ... } .
II. Spring Framework Stereotype Annotations
@Component
Annotation này được sử dụng trên các class để chỉ ra một thành phần Spring. Các annotation @Component đánh dấu class Java là một bean hoặc nói đó là 1 component để các component-scanning của Spring có thể thêm vào bối cảnh ứng dụng
@Controller
Annotation @Controller được sử dụng để chỉ ra class là một Spring controller. Annotation này có thể được sử dụng để xác định các bộ điều khiển cho Spring MVC hoặc Spring WebFlux.
@Service
Annotation này được sử dụng trên 1 class. Dùng để đánh dấu một class Java mà thực hiện một số dịch vụ, chẳng hạn như thực hiện logic kinh doanh, thực hiện các tính toán và gọi API bên ngoài. Annotation này là một hình thức chuyên biệt của annotation @Component dự định sẽ được sử dụng trong các lớp dịch vụ.
@Repository
Annotation này được sử dụng trên các class Java dùng để truy cập trực tiếp vào cơ sở dữ liệu. Annotation @Repository hoạt động như đánh dấu cho bất kỳ class mà thực hiện tốt vai trò của repository hoặc Data Access Object.
Annotation 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.
III. Spring Boot Annotations
@EnableAutoConfiguration
Annotation này thường được đặt trên các class main application. Annotation @EnableAutoConfiguration ngầm định nghĩa một cơ sở "search package". Chú thích này báo cho Spring Boot bắt đầu thêm các bean dựa trên cài đặt đường dẫn class (classpath settings), các bean khác và các cài đặt thuộc tính khác nhau.
@SpringBootApplication
Annotation này được sử dụng trên các class ứng dụng trong khi thiết lập dự án Spring Boot. Class được chú thích với annotation này phải được giữ trong package base. Một điều mà @SpringBootApplication thực hiện là quét thành phần (component scan). Nhưng nó sẽ chỉ quét các gói phụ của nó. Ví dụ, nếu bạn đặt class được chú thích bằng @SpringBootApplication trong com.example sau đó @SpringBootApplication sẽ quét tất cả các gói phụ của nó, chẳng hạn như com.example.a, com.example.b, và com.example.a.x .
@SpringBootApplication là một chú thích nâng cao bao gồm tất cả các annotations sau đây:
- @Configuration
- @EnableAutoConfiguration
- @ComponentScan