Automatic congifuration trong Spring Boot
Configuration (cấu hình) là thành phần trung tâm của Spring Framework. Mặc dù Spring Boot tự động cấu hình mọi thứ cho bạn nhưng vẫn phải có thứ gì đó cho Spring biết cách chạy ứng dụng của bạn. Bài này sẽ nói về cách mà Spring Boot tự động cấu hình như thế nào. Nếu có thời gian thì blog sẽ có bài nói về cách override auto-configuration của Spring Boot.
Khi thêm Spring Boot vào ứng dụng của bạn, có một file JAR tên là springboot-autoconfigure chứa các class cấu hình (configuration classes). Mỗi class trong các class này đều có sẵn trong application's classpath và đều có cơ hội đóng góp vào việc cấu hình ứng dụng của bạn.
Có một cấu hình cho Thymeleaf, một cấu hình cho Spring Data JPA, một cấu hình cho Spring MVC và một cấu hình cho hàng tá các thứ khác mà có thể bạn muốn hoặc không muốn sử dụng trong ứng dụng Spring của bạn.
Từ phiên bản Spring 4 đã hỗ trợ cấu hình có điều kiện. Cấu hình có điều kiện có sẵn trong ứng dụng, nhưng sẽ bị bỏ qua trừ khi đáp ứng được điều kiện được chỉ định.
Để thực hiện điều này, ta chỉ cần implement Condition interface và override matches() method.
Ví dụ, có lớp điều kiện đơn giản sau:
Ta có thể sử dụng lớp điều kiện trên khi khai báo các beans trong Java:
Trong trường hợp này, MyService sẽ chỉ được tạo nếu và chỉ nếu JdbcTemplateCondition thoả mãn. Có nghĩa là MyService bean sẽ chỉ được tạo nếu JdbcTemplate có sẵn trên classpath. Nếu không, khai báo bean sẽ bị bỏ qua.
Mặc dù điều kiện được hiển thị ở đây khá đơn giản, Spring Boot định nghĩa một số điều kiện thú vị hơn và áp dụng chúng cho các lớp cấu hình tự động trong Spring Boot. Spring Boot áp dụng cấu hình có điều kiện bằng cách định nghĩa một số conditional annotations đặc biệt và sử dụng chúng trong các lớp cấu hình của nó. Bảng sau liệt kê các chú thích có điều kiện mà Spring Boot cung cấp.
Cơ bản, bạn không bao giờ cần phải xem mã nguồn cho các lớp cấu hình tự động của Spring Boot. Nhưng để minh họa cách sử dụng annotation trong bảng trên, hãy xem đoạn trích này từ DataSourceAutoConfiguration (được cung cấp như một phần của thư viện cấu hình tự động của Spring Boot):
Như ta có thể thấy, DataSourceAutoConfiguration là một lớp được đánh dấu bởi @Configuration annotation (và một số thứ khác), trong đó, nó import một số cấu hình bổ sung từ các lớp cấu hình khác và định nghĩa một vài bean riêng của nó.
Điều quan trọng nhất cần lưu ý ở đây là DataSourceAutoConfiguration được đánh dấu bằng @ConditionalOnClass để yêu cầu cả DataSource và EmbeddedDatabaseType đều có sẵn trên classpath. Nếu chúng không có sẵn, thì điều kiện sai và bất kỳ cấu hình nào được cung cấp bởi DataSourceAutoConfiguration sẽ bị bỏ qua.
Trong DataSourceAutoConfiguration có một lớp JdbcTemplateConfiguration lồng nhau cung cấp cấu hình tự động của một JdbcTemplate bean:
JdbcTemplateConfiguration là một annotation với low-level @Conditional để yêu cầu rằng DataSourceAvailableCondition pass — về cơ bản yêu cầu DataSource bean sẵn có hoặc một nó sẽ được tạo ra bởi việc cấu hình tự động. Giả sử rằng một DataSource bean sẽ có sẵn, phương thức jdbcTemplate() của Bean đã định cấu hình một JdbcTemplate bean. Nhưng jdbcTemplate() được chú thích bằng @ConditionalOnMissingBean sao cho bean sẽ được cấu hình chỉ khi chưa có một bean kiểu JdbcOperations (interface mà JdbcTemplate implement).
Một số ví dụ về điều kiện trong cấu hình tự động:
■ Vì H2 có trong classpath, một embedded H2 database bean sẽ được tạo. Bean này thuộc loại javax.sql.DataSource, bean này sẽ được JPA implement (cụ thể là Hibernate) sử dụng để truy cập database.
■ Vì Hibernate Enity Manager có trên classpath (thông qua Spring Data JPA), auto-configuration sẽ cấu hình các beans cần cho việc hỗ trợ Hibernate, bao gồm LocalContainerEntityManagerFactoryBean và JpaVendorAdapter của Spring.
■ Vì Spring Data JPA có trên classpath, Spring Data JPA sẽ được cấu hình cho việc tự động tạo các repository implementations từ các repository interfaces.
■ Vì Thymeleaf có trên classpath, Thymeleaf sẽ được cấu hình như một view option cho Spring MVC, bao gồm một Thymeleaf template resolver, template engine và view resolver. Template resolver được cấu hình để resolve các template từ địa chỉ /templates.
■ Vì Spring MVC có trên classpath, DispatcherServlet của Spring sẽ được cấu hình và Spring MVC sẽ được enabled.
■ Vì đây là Spring MVC web application, một resource handler sẽ được đăng ký để xử lý các static content từ /static. Resource handler cũng sẽ xử lý static content từ /public, /resources và /META-INF/resources.
■ Vì Tomcat có trên classpath, một embedded Tomcat container sẽ được khởi chạy để lắng nghe request từ cổng 8080.
Vấn đề chính ở đây là, Spring Boot auto-configuration chịu trách nhiệm cấu hình Spring để bạn có thể tập trung vào việc viết ứng dụng của mình.
Nhận xét
Đăng nhận xét