Spring Boot Tự Động Cấu Hình và Thiết Lập Ứng Dụng

Tự động cấu hình trong Spring Boot

Spring Boot cung cấp cơ chế tự động cấu hình (auto-configuration) giúp giảm thiểu lượng code cấu hình thủ công. Cơ chế này dựa trên các thư viện có mặt trong classpath để suy luận và thiết lập môi trường ứng dụng phù hợp.

Lớp ứng dụng chính

Lớp chính của ứng dụng Spring Boot thường nằm ở package gốc (ví dụ: com.example.demo). Lớp này chứa phương thức main và được đánh dấu bằng các annotation đặc biệt để kích hoạt tính năng tự động cấu hình và quét component.

@RestController
@EnableAutoConfiguration
public class DemoApplication {

    @GetMapping("/")
    public String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

Trong đó:

  • @RestController@GetMapping là annotation từ Spring MVC.
  • @EnableAutoConfiguration cho phép Spring Boot tự động cấu hình dựa trên các dependency đã khai báo. Ví dụ, nếu có spring-boot-starter-web, Spring Boot sẽ cấu hình sẵn Tomcat và Spring MVC.

Các annotation cấu hình chính

Có ba annotation quan trọng thường được sử dụng trong lớp khởi tạo:

  • @Configuration: Đánh dấu lớp là nơi chứa các bean cấu hình.
  • @EnableAutoConfiguration: Kích hoạt cơ chế tự động cấu hình.
  • @ComponentScan: Quét các component (như @Service, @Repository, @Controller) trong cùng package hoặc sub-package.

Thay vì dùng riêng lẻ, bạn có thể thay thế bằng annotation tổng hợp:

@SpringBootApplication
@RestController
public class DemoApplication {

    @GetMapping("/")
    public String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplication tương đương với việc kết hợp @Configuration, @EnableAutoConfiguration@ComponentScan với cấu hình mặc định.

Xử lý tham số dòng lệnh

Để xử lý tham số truyền vào khi chạy ứng dụng, lớp chính có thể implement interface CommandLineRunner:

@Component
public class GreetingService {
    @Value("${app.name:Guest}")
    private String name;

    public String getGreeting() {
        return "Hello " + name;
    }
}

Tạo file application.properties:

app.name=SpringUser

Và cập nhật lớp chính:

@SpringBootApplication
@RestController
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private GreetingService greetingService;

    @GetMapping("/")
    public String home() {
        return "Hello World!";
    }

    @Override
    public void run(String... args) {
        System.out.println(greetingService.getGreeting());
        if (args.length > 0 && "exit".equals(args[0])) {
            throw new CustomExitException();
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

Khi chạy với tham số --app.name=Alice, kết quả in ra sẽ là Hello Alice.

Để điều khiển thứ tự thực thi của nhiều CommandLineRunner, bạn có thể dùng annotation @Order hoặc implement interface Ordered.

Tùy chỉnh và vô hiệu hóa auto-configuration

Nếu muốn loại bỏ một cấu hình tự động không mong muốn, bạn có thể sử dụng thuộc tính exclude trong @EnableAutoConfiguration:

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class CustomConfig {
}

Để xem báo cáo chi tiết về những cấu hình nào được áp dụng, chạy ứng dụng với tham số --debug.

Ví dụ với JPA và DataSource

Khi thêm dependency spring-boot-starter-data-jpa và driver cơ sở dữ liệu (ví dụ MySQL), Spring Boot sẽ tự động cấu hình:

  • DataSource
  • EntityManagerFactory
  • PlatformTransactionManager

Bạn chỉ cần khai báo thông tin kết nối trong application.properties:

spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=user
spring.datasource.password=pass

Spring Boot tự động chọn connection pool theo thứ tự ưu tiên: Tomcat JDBC → HikariCP → Commons DBCP2.

Các đối tượng như JdbcTemplate cũng được inject trực tiếp qua @Autowired mà không cần cấu hình thủ công.

Sử dụng cấu hình XML

Mặc dù Spring Boot khuyến khích dùng Java config, bạn vẫn có thể sử dụng file XML:

public static void main(String[] args) {
    SpringApplication.run("classpath:/application-context.xml", args);
}

Với nội dung application-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    <context:property-placeholder/>

    <bean id="greetingService" class="com.example.demo.GreetingService"/>
    <bean id="demoApplication" class="com.example.demo.DemoApplication"/>
</beans>

Tuy nhiên, cách tiếp cận này ít phổ biến trong các dự án Spring Boot hiện đại.

Thẻ: Spring Boot Auto Configuration Java Spring MVC jpa

Đăng vào ngày 11 tháng 6 lúc 02:32