Header Ads

Seo Services

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: (RecommendedBạn có thể tạo vào trang: Spring Initializr để tạo mới một project Spring Boot như sau:


(1) - Build tools: Maven
(2) - Ngôn ngữ lập trình: Java (11)
(3) - Spring Boot version: (2.4.2)
(4) - Cấu trúc project
(5) - Dependencies: Các bạn bấm ADD DEPENDENCIES để thêm dependencies vào file pom.xml.
(6) - Bấm GENERATE trang web sẽ sinh ra một file .zip. Các bạn tải về giải nén rồi import vào Eclipse hoặc InteliJ chúng ta được một ứng dụng Spring Boot.

Cách 3: Sử dụng Spring Boot CLI (Spring Boot Command Line Interface) để tạo ứng dụng Spring Boot. Các bạn có thể cài SDKMan sau đó cài Spring Boot CLI như sau (Mình hướng dẫn trên Ubuntu)

- Cài SDKMan:
    +) sudo apt install curl
    +) curl -s "https://get.sdkman.io" | bash
- Cài Spring Boot CLI:
    +) Setup Java Home: export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    +) Cài Spring Boot CLI: sdk install springboot
- Khởi tạo ứng dụng Spring Boot bằng Spring CLI:
    +) spring init --dependencies=<dependencies> <project-name>
        VD: spring init --dependencies=web hello-world   

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:


Nội dung file pom.xml như sau:
<?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@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

https://spring.io/guides/gs/spring-boot/

Không có nhận xét nào:

Được tạo bởi Blogger.