Chào các bạn, trong bài viết này mình sẽ cùng các bạn tạo một ứng dụng Spring Boot đơn giản cho những người mới học, mới tiếp cận với Framework này.
#Chúng ta code cái gì?
Chúng ta sẽ xây dựng một ứng dụng web (web application) đơn giản với Spring Boot. Khi ứng dụng chạy chúng ta truy cập vào đường dẫn http://localhost:8080/hello-spring-boot thì trình duyệt sẽ trả về một đoạn text với nội dung nào đó.
#Các công cụ cần thiết.
+ IDE: Eclipse (Java EE) hoặc IntelliJ Idea (Các bạn có thể dùng bất cứ IDE nào các bạn thích)
+ JDK: Ở đây mình dùng JDK 11 (các bạn có thể dùng JDK 8 hoặc các phiên bản > JDK 11)
+ Build tools: Trong bài viết này mình sử dụng Maven (các bạn có thể sử dụng Gradle)
+ Hệ điều hành: Ubuntu (version 20.04) (các bạn có thể sử dụng Window hay Mac OS với những công cụ tương ứng bên trên)
#Khởi tạo ứng dụng Spring Boot.
Cách 1: Có rất nhiều cách để tạo ứng dụng Spring Boot, bạn có thể tạo một ứng dụng maven thuần bằng Eclipse, InteliJ Idea... rồi thêm các dependencies vào file pom.xml.
Cách 2: (Recommended) Bạn có thể tạo vào trang: Spring Initializr để tạo mới một project Spring Boot như sau:
Cách 4: Trong bài viết này mình sử dụng Eclipse đã cài Spring tools plugin nên mình sẽ tạo trực tiếp trên Eclipse, các bạn có thể tham khảo ở bài viết sau (update...)
#Code thôi nào!
Đây là cấu trúc cơ bản của một ứng dụng Spring Boot sử dụng Maven và Java:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.laptrinhb2a</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-world</name>
<description>Hello World project Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Bây giờ mình sẽ viết lớp HomeController là một controller để điều hướng các requests sao cho khi chúng ta truy cập vào URL: http://localhost:8080/hello-spring-boot thì sẽ gọi đến hàm index() trong lớp này và trả về một đoạn text trên trình duyệt.
package com.laptrinhb2a.helloworld.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@RequestMapping(method = RequestMethod.GET, value = "/hello-spring-boot")
public String index() {
return "Hello Spring Boot App with Maven";
}
}
Một class nếu được đánh dấu bằng annotation @RestController (được kết hợp bởi @Controller và @ResponseBody) sẽ trả về data dạng JSON (XML) thay vì trả về view(HTML, CSS, JS)
@RequestMapping có chức năng map các URL với phương thức tương ứng. Trong ví dụ này request method là GET, đường dẫn là "/hello-spring-boot". Tức là khi bạn vào đường dẫn http://localhost:8080/hello-spring-boot thì ứng dụng sẽ trả về giá trị mà hàm index() trả về.
Ở đây hàm index trả về một chuỗi String có nội dung là: Hello Spring Boot App with Maven và hiển thị nó trên giao trình duyệt.
Bây giờ bạn mở file HelloWorldApplication.java và chạy nó như một file .java có chứa hàm main() bình thường.
package com.laptrinhb2a.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
Đây chính là logs do ứng dụng sinh ra nếu build thành công.
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.2)
2021-02-17 12:56:05.017 INFO 13031 --- [ main] c.l.helloworld.HelloWorldApplication : Starting HelloWorldApplication using Java 11.0.10 on canhnd with PID 13031 (/home/canhnd/Documents/spring-boot/hello-world/target/classes started by canhnd in /home/canhnd/Documents/spring-boot/hello-world)
2021-02-17 12:56:05.020 INFO 13031 --- [ main] c.l.helloworld.HelloWorldApplication : No active profile set, falling back to default profiles: default
2021-02-17 12:56:05.955 INFO 13031 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-02-17 12:56:05.964 INFO 13031 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-02-17 12:56:05.966 INFO 13031 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-02-17 12:56:06.042 INFO 13031 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-02-17 12:56:06.042 INFO 13031 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 971 ms
2021-02-17 12:56:06.210 INFO 13031 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-17 12:56:06.382 INFO 13031 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-02-17 12:56:06.396 INFO 13031 --- [ main] c.l.helloworld.HelloWorldApplication : Started HelloWorldApplication in 1.77 seconds (JVM running for 2.575)
Bây giờ các bạn mở terminal lên gõ: curl localhost:8080/hello-spring-boot thì sẽ nhận được dòng chữ: Hello Spring Boot App with Maven
Hoặc các bạn có thể vào thẳng trình duyệt và gõ: localhost:8080/hello-spring-boot thì cũng nhận được kết quả tương tự.
#Góc thắc mắc
Vậy là xong rồi à! Mình tin chắc nhiều bạn còn đang thắc mắc là làm sao mà có thể đơn giản như thế. Bình thường chúng ta phải cấu hình rất nhiều, đằng này chả thấy làm gì chỉ thấy viết vài ba dòng code là ok rồi. 😁😁😁 Đó chính là Spring Boot!
Những công việc cấu hình phức tạp hầu như được Spring Boot lo hết. Chúng ta chỉ việc tập trung vào giải quyết yêu cầu nghiệp vụ của ứng dụng.
Vậy trong ứng dụng Hello World đơn giản này Spring Boot đã thay chúng ta làm những gì? Mình sẽ viết thêm vào file HelloWorldApplication.java như sau:
package com.laptrinhb2a.helloworld;
import java.util.Arrays;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
System.out.println("--> Spring Boot Beans:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
};
}
}
@SpringBootApplication là một annotation có chức năng tương tự với các annotaion sau:
@Configuration : một class được đánh dấu annotation này sẽ được hiểu là một bean trong application context.
@EnableAutoConfiguration : Spring Boot sẽ tự động thêm các beans được định nghĩa trong classpath settings, các beans do người dùng định nghĩa và rất nhiều những cài đặt khác.
@ComponetScan : Annotation này có tác dụng quét (scan) tất cả các package cấp thấp hoặc ngang với file HelloWorldApplication.java để tìm các class được đánh dấu là một controller.
Interface CommandLineRunner được đánh dấu là một bean và được khởi chạy khi khi khởi chạy ứng dụng. Có chức năng liệt kê tất cả các beans được chúng ta định nghĩa hoặc là được thêm mặc định bởi Spring Boot. Các beans được sắp xếp và in ra theo thứ bảng chữ cái. (logs khác dài nên mình đã rút gọn lại)
--> Spring Boot Beans:
applicationAvailability
applicationTaskExecutor
basicErrorController
beanNameHandlerMapping
beanNameViewResolver
characterEncodingFilter
commandLineRunner
conventionErrorViewResolver
defaultServletHandlerMapping
defaultViewResolver
dispatcherServlet
....
themeResolver
tomcatServletWebServerFactory
tomcatServletWebServerFactoryCustomizer
tomcatWebServerFactoryCustomizer
viewControllerHandlerMapping
viewNameTranslator
viewResolver
webServerFactoryCustomizerBeanPostProcessor
websocketServletWebServerCustomizer
welcomePageHandlerMapping
#Kết Luận:
Các framework nói chung và Spring Boot nói riêng được sinh ra giúp chúng ta tập trung hơn vào việc giải quyết bussiness logic của ứng dụng mà không phải cấu hình quá nhiều.
Nhưng để hiểu được các khái niệm phía sau cũng như sử dụng một cách thành thạo framework này thì chúng ta phải nắm được nhiều khái niệm cơ bản.
Một bài viết chưa thể cover hết được mọi khía cạnh, nên nếu có thiếu sót mong mọi người góp ý để mình chỉnh sửa cải thiện. Thanks all!
#Tham khảo
Không có nhận xét nào: