Spring Boot làm cho việc cấu hình Spring dễ dàng hơn với tính năng cấu hình tự động của nó. Các tính năng này phần lớn được sử dụng thông qua các annotation mà Spring Boot cung cấp.
Trong bài viết chúng ta sẽ cùng nhau tìm hiểu các annotation của Spring Boot được định nghĩa trong org.springframework.boot.autoconfigure và org.springframework.boot.autoconfigure.condition package.
@SpringBootApplication
Chúng ta sử dụng annotation này cho Main class của một ứng dụng Spring Boot.
@SpringBootApplication class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
@SpringBootApplication đóng gói 3 annotation @Configuration, @EnableAutoConfiguration và@ComponentScan bên trong. Vì vậy, đừng có sử dụng @SpringBootApplication với một trong 3 annotation trên nhé, ngố lắm.
@EnableAutoConfiguration
@Configuration @EnableAutoConfiguration class ExampleConfig {}
Auto-configuration Condition
Thông thường khi chúng ta viết các cấu hình riêng của mình sử dụng @Configuration trên class hoặc @Bean trên method và chúng ta muốn sử dụng chúng dựa trên các điều kiện nhất định. Thì ở trong phần này chúng ta sẽ cùng nhau tìm hiểu các annotation cho phép đặt các điều kiện trên các cấu hình của mình.
@ConditionalOnClass & @ConditionalOnMissingClass
Sử dụng các annotation này, Spring boot sẽ chỉ sử dụng đánh đánh đó là các auto-configuration bean nếu class được liệt kê trong annotation có mặt
@Configuration @ConditionalOnClass(DataSource.class) class MySQLAutoconfiguration { //... }
@ConditionalOnBean & @ConditionalOnMissingBean
Chúng ta có thể sử dụng các này khi chúng ta muốn xác định các điều kiện dựa trên sự hiện diện hoặc vắng mặt của một bean cụ thể.
@Bean @ConditionalOnBean(name = "dataSource") LocalContainerEntityManagerFactoryBean entityManagerFactory() { // ... }
@ConditionalOnResource
Chúng ta khởi tạo một bean nếu resource chỉ định được tìm thấy
@ConditionalOnResource(resources = "classpath:mysql.properties") Properties additionalProperties() { // ... }
@ConditionalOnWebApplication & @ConditionalOnNotWebApplication
@ConditionalOnWebApplication HealthCheckController healthCheckController() { // ... }
@ConditionalExpression
Sử dụng annotation này cho các điều kiện phức tạp hơn. Spring boot sẽ sử dụng các auto-configuation bean này dựa trên các biểu thức trả về giá trị Boolean.
@Bean @ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}") DataSource dataSource() { // ... }
@Conditional
@Conditional(HibernateCondition.class) Properties additionalProperties() { //... }
Tóm lược
Như vậy chúng ta đã tìm hiểu sơ qua các khái niệm cơ bản của những annotation trong Spring Boot. Trong đấy, @SpringBootApplication thường mọi người không chú ý đến nhiều do vậy dẫn đến việc hiểu không kỹ và sử dụng sai hoàn toàn. Có những người đã dùng @SpringBootApplication rồi còn quất thêm @EnableAutoConfiguration hoặc @ComponentScan, thật không thể tin nỗi.
Nguồn tham khảo
https://www.baeldung.com/spring-boot-annotations#condition-property