post-image

Spring Boot @Bean là gì?

Spring Boot Starters & Common Configurations Spring Data JPA

Spring là một Framework Java application phổ biến và Spring Boot là một sự phát triển của Spring giúp tạo ra các ứng dụng độc lập với effot nhỏ nhất.

Annotation Spring Boot @Bean

Annotation Spring @Bean cho biết rằng một method tạo ra một bean sẽ được quản lý bởi Spring container. Nó là một annotation ở method. Trong khi cấu hình Java (@Configuration), phương thức được thực thi và giá trị trả về của nó được đăng ký dưới dạng bean trong BeanFactory.

Tổng hợp 200+ tài liệu, sách, bài thực hành, video hướng dẫn lập trình… từ cơ bản đến nâng cao

Spring Boot @Bean example

Core Spring Container tạo và quản lý bean. Trong ví dụ dưới đây, tôi sẽ hướng dẫn cách tạo một Spring bean với annotation @Bean

Ứng dụng này là ứng dụng Spring Boot dòng lệnh.

pom.xml src ├───main │ ├───java │ │ └───com │ │ └───hdd │ │ Application.java │ │ AppName.java │ └───resourcesapplication.propertieslogback.xml └───test └───java
Code language: CSS (css)

Đây là cấu trúc dự án của ứng dụng Spring Boot.

pom.xml

THAM GIA KHÓA HỌC LẬP TRÌNH

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hdd</groupId> <artifactId>springbootbean</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Code language: HTML, XML (xml)

Đây là tệp xây dựng Maven. Spring-boot-starter là phần khởi động cốt lõi bao gồm hỗ trợ cấu hình tự động, ghi nhật ký và YAML. Ứng dụng được đóng gói thành tệp JAR.

com/hdd/AppName.java

package com.hdd; interface AppName { String getName(); }
Code language: PHP (php)

Tôi có một interface đơn giản để xác định một contract. Nó được dùng để tạo một lớp ẩn danh và trả về tên application.

TÀI LIỆU HỌC LẬP TRÌNH

resources/application.properties.

spring.main.banner-mode=off spring.main.log-startup-info=false app.name=SpringBootBean
Code language: JavaScript (javascript)

application.properties chứa các config của ứng dụng. Có một số thuộc tính ứng dụng được tích hợp sẵn và chúng ta có thể tạo thuộc tính tùy chỉnh. Thuộc tính spring.main.banner-mode là thuộc tính tích hợp sẵn của Spring; tôi đã tắt nó đi. Cùng với thuộc tính spring.main.log-startup-info chúng ta có thể tắt thông báo ghi nhật ký khởi động. app.name là thuộc tính tình chỉnh của tôi có chứa tên application.

resources/logback.xml.

<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <logger name="org.springframework" level="ERROR"/> <logger name="com.hdd" level="INFO"/> </configuration>
Code language: HTML, XML (xml)

Trong file logback.xml, tôi config application logging. Tôi đã đặt level là ERROR. Bằng cách này, đầu ra sẽ không bị lộn xộn với các thông tin cần thiết. Dependency spring-boot-starter cho phép ghi logging.

com/hdd/Application.java

package com.hdd; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Application implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(Application.class); @Autowired private AppName appName; @Bean public AppName getAppName(@Value("${app.name}") String appName) { return () -> appName; } @Override public void run(String... args) throws Exception { logger.info("Application name: {}", appName.getName()); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Code language: JavaScript (javascript)

Trong Application, chúng ta có thể tạo bean, gọi phương thức của nó và thiết lập ứng dụng Spring Boot. Giao diện CommandLineRunner chỉ ra rằng một bean sẽ chạy khi nó được chứa trong SpringApplication. Nó có thể được sử dụng để tạo các ứng dụng dòng lệnh trong Spring Boot.

@SpringBootApplication public class Application implements CommandLineRunner {
Code language: PHP (php)

Chú thích @SpringBootApplication cho phép tự động cấu hình và quét thành phần.

@Autowired private AppName appName;
Code language: CSS (css)

Với chú thích @Autowosystem, tôi đưa bean AppName của chúng tôi vào field.

@Bean public AppName getAppName(@Value("${app.name}") String appName) { return () -> appName; }
Code language: JavaScript (javascript)

Ở đây tôi tạo bean AppName; bean được quản lý bởi Spring container. Trong khi chú thích @Component được sử dụng để trang trí các lớp được quét tự động bằng cách quét Spring, chú thích @Bean được sử dụng để khai báo rõ ràng việc tạo bean.

Chú thích @Value được sử dụng để đặt giá trị của thuộc tính app.name vào tham số appName.

logger.info("Application name: {}", appName.getName());
Code language: CSS (css)

Run project:

mvn -q spring-boot: run

Tổng kết

Trong hướng dẫn này, tôi đã tạo một Spring bean với chú thích @Bean. Chúc bạn thành công.

Tham khảo một số bài viết khác:

https://hocspringboot.net/2021/08/16/nhung-annotation-trong-spring-boot/

https://hocspringboot.net/2021/08/01/spring-data-jpa/

Leave a Reply

Your email address will not be published. Required fields are marked *