Hướng dẫn sử dụng Spring Boot
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Spring Boot là gì?

Spring Boot là một Project nằm trên tầng IO Execution (Tầng thực thi) của Spring IO Framework.

Spring Boot là một bước tiếp theo của Spring, để làm cho Spring dễ dàng hơn trong việc thiết lập và phát triển ứng dụng. Với Spring Boot các cấu hình Spring được giảm thiểu tối đa. Spring Boot hỗ trợ các bộ chứa nhúng (embedded containers) điều này cho phép các ứng dụng web có thể chạy độc lập mà không cần phải trên khai lên các Web Server.

Bạn có thể dùng spring boot để tạo ứng dụng Java Web chạy bằng command line 'java -jar' hoặc xuất khẩu ra file war để triển khai lên Web Server như thông thường. Spring Boot cung cấp cho bạn một "CLI Tool" để chạy các kịch bản Spring (spring scripts).
Spring Boot có thể giải thích một cách đơn giản bởi hình minh họa dưới đây:

Dưới đây là các lợi ích của Spring Boot:

  1. Nó rất dễ dàng để phát triển các ứng dụng dựa trên Spring với Java hoặc Groovy.
  2. Nó giảm thiểu thời gian phát triển và tăng năng xuất
  3. Nó tránh việc phải viết nhiều mã nguyên mẫu (boilerplate Code), Annotations và các cấu hình XML.
  4. Nó dễ dàng để bạn tương tác các ứng dụng Spring Boot với các hệ sinh thái của Spring như Spring JDBC, Spring ORM, Spring Data, Spring Security etc.
  5. Nó đi theo cách tiếp  cận “Nguyên tắc cấu hình mặc định” để giảm thiểu thời gian và nỗ lực cần thiết để phát triển ứng dụng.
  6. Nó cung cấp các Server nhúng (Embedded HTTP servers) như là Tomcat, Jetty .... để phát triển và test các ứng dụng web nhanh chóng và dễ dàng.
  7. Nó cung cấp công cụ CLI (Command Line Interface) dể phát triển và test các ứng dụng Spring Boot(Java hoặc Groovy) từ các dòng lệnh (command prompt) rất dễ dàng và nhanh chóng.
  8. Nó cung cấp rất nhiều các plugin để phát triển và test các ứng dụng Spring Boot nhanh chóng sử dụng các công cụ Build như Maven và Gradle
  9. Nó cung cấp nhiều plugin để làm việc với các các bộ nhúng và các Database lưu trữ trên bộ nhớ (in-memory Databases) một cách dễ dàng.

Bạn cần gì để bắt đầu với Spring Boot?

Spring Boot ra đời dựa trên ý tưởng làm đơn giản hóa Spring Framework, tất cả các ứng dụng Spring rồi sẽ được tạo bởi Spring Boot, và đây là thời điểm bắt đầu, các IDE mới chỉ bắt đầu hỗ trợ tạo ứng dụng Spring Boot. Các hướng dẫn Spring vẫn sử dụng các cách truyền thống, và cần thời gian để thay đổi. Và bạn cần phải biết cách tạo một ứng dụng Spring truyền thống.

Bạn có thể bắt đầu với Spring Framework tại đây:
Spring cho người mới bắt đầu:
Spring MVC cho người mới bắt đầu:

2- Mục tiêu của tài liệu

Trong tài liệu này tôi sẽ tạo một ứng dụng Hello Spring Boot, nó là một ứng dụng Web đơn giản sử dụng Spring Boot, và sẽ chạy ứng dụng này một cách độc lập mà không cần phải triển khai lên Web Server.

Spring Tool Suite (STS)

Để xây dựng các ứng dụng Spring Boot trên IDE Eclipse bạn cần phải cài đặt Spring Tool Suite, đây là một Plugin mở rộng hỗ trợ cho lập trình Spring trên Eclipse.

Nếu bạn chưa cài đặt, hãy xem hướng dẫn tại đây:
Đây là hình ảnh project sau khi hoàn thành:
Xem trước ứng dụng:

3- Tạo Spring Boot Project

Trên Eclipse tạo một project sử dụng Spring Tool Suite (STS):
  • File/New/Other...
  • Name: HelloSpringBoot
  • Group: org.o7planning
  • Artifact: HelloSpringBoot
  • Package: org.o7plannng.hellospringboot
  • Group Id: org.o7planning
  • Artifact Id: HelloSpringBoot
  • Packing: war
Project đã được tạo ra, dưới đây là cấu trúc mặc định của Project.

Build Project:

Bạn cần Build project và đảm bảo rằng mọi thứ hoàn hảo.

Bạn nhận được lỗi?

Nếu bạn nhận được lỗi khi chạy "Maven Install", hãy xem thêm cách xử lý ở phụ lục của tài liệu này:

4- Một vài giải thích về Spring Boot

Ở bước trên bạn vừa tạo ra một Spring Boot Project, hãy xem nội dung pom.xml:

pom.xml

Có 3 điểm cần chú ý trong pom.xml (1),(2), (3) như hình minh họa dưới đây, Spring Boot giúp bạn đơn giản hơn trong việc khai báo các thư viện Spring.

spring-boot-starter-parent

spring-boot-starter-parent là một project sẵn có trong Spring Boot. Các thư viện phụ thuộc cơ bản đã được khai báo trong spring-boot-starter-parent, project của bạn chỉ cần thừa kế nó. Chỉ cần khai báo <parent> trong file pom.xml của project của bạn.
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
    <!-- lookup parent from repository -->
    <relativePath/>
</parent>
Bạn có thể ghi đè các phụ thuộc mặc định của Spring Boot. Chủ đề này được nói rõ hơn tại đây:
  • TODO

spring-boot-starter-web

Các "Starter" khác chỉ đơn giản là cung cấp phụ thuộc mà bạn có khả năng cần thiết khi phát triển một loại hình cụ thể của ứng dụng. Chẳng hạn khi bạn phát triển một ứng dụng web, bạn cần một phụ thuộc  spring-boot-starter-web.
<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>

spring-boot-maven-plugin

Spring-boot-maven-plugin là plugin cung cấp các thư viện cần thiết giúp project của bạn có thể chạy trực tiếp mà không cần triển khai trên một Web Server. Nó giúp tạo ra một file jar có thể thực thi (Executable)
<plugins>

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>

        <!-- ... -->

</plugins>

5- Chạy Spring Boot project

Ở bước trên bạn đã tạo ra HelloSpringBoot project bởi Eclipse & Spring Tool Suite, và chưa có bất kỳ thay đổi nào. Tất cả mọi thứ được tạo ra mặc định. Bây giờ bạn cần một vài bước để chạy ứng dụng.
Ứng dung HelloSpringBoot của bạn đã chạy, bạn có thể chạy thử đường dẫn:
Có thông báo lỗi "404 Not found" khi bạn chạy đường dẫn trên, tuy nhiên không có vấn đề gì nghiêm trọng bởi vì project của bạn chưa có bất kỳ trang nào.
Tạo file hello.html trong thư mục webapp:
hello.html

<h1>Hello Spring Boot!</h1>
Và chạy lại ứng dụng với đường dẫn:

Run Configuration...

Bạn có thể thay đổi các thông số cho Server chẳng hạn cổng, contextPath,... Các vấn đề này được đề cập tại phần phụ lục ở cuối tài liệu này.

6- Spring Boot chạy thế nào?

Khi bạn tạo một "Spring Boot Web Appp", có 2 class được tạo ra (generate) bởi công cụ "Spring Tool Suite":
  • ServletInitializer

  • HelloSpringBootApplication

Ứng dụng của bạn được bắt đầu bởi việc thực thi class HelloSpringBootApplication. Class này được chú thích bởi @SpringBootApplication.
HelloSpringBootApplication.java
package org.o7planning.hellospringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloSpringBootApplication.class, args);
    }
   
}
Chú thích @SpringBootApplication là tương đương với việc sử dụng @Configuration, @EnableAutoConfiguration@ComponentScan với các thuộc tính mặc định của chúng.
Như vậy @SpringBootApplication giúp bạn tự động cấu hình Spring, và tự động quét (Scan) toàn bộ project để tìm ra các thành phần Spring (Controller, Bean, Service,...)
Class ServletInitializer giúp khởi tạo ứng dụng Web, đăng ký các nguồn tài nguyên web vào ứng dụng Spring.
ServletInitializer.java
package org.o7planning.hellospringboot;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(HelloSpringBootApplication.class);
    }

}

7- Spring MVC trong Spring Boot

Trong ví dụ dưới đây có sử dụng JSTL vì vây bạn cần khai báo các phụ thuộc trong pom.xml:
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <scope>provided</scope>
</dependency>
pom.xml đầy đủ:
pom.xml
<?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>org.o7planning</groupId>
    <artifactId>HelloSpringBoot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>HelloSpringBoot</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</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-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
       
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
       
        <!-- To use JSTL -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
       
        <!-- To use JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

 
Bạn cần cấu hình ViewResolver.
WebMvcConfig.java
package org.o7planning.hellospringboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

    }

}
HelloWorldController.java
package org.o7planning.hellospringboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello(Model model) {
       
        model.addAttribute("greeting", "Hello Spring Boot MVC");
       
        return "helloworld";
       
    }

}
/WEB-INF/pages/helloworld.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Strig Boot Spring MVC - HelloWorld</title>
</head>


<body>
    <h1>${greeting}</h1>
</body>


</html>
Chạy lại ứng dụng Spring Boot, và truy cập địa chỉ:

8- Phụ lục: Cấu hình Server

Ở trên bạn đã chạy ứng dụng Spring Boot, bạn có thể thay đổi các các cấu hình Server, chẳng hạn Port, contextPath, ....
Thay đổi Server HTTP Port:
Bạn có thể thay đổi các thuộc tính khác nếu muốn, Eclipse sẽ gợi ý các thuộc tính có thể thay đổi và ý nghĩa của chúng.

9- Phu lục: Xử lý lỗi

Khi bạn tạo mới Spring Boot Project thành công, và bạn chưa có bất kỳ thay đổi gì nhưng project báo lỗi thiếu thư viện.
Bạn có thể xem các nguyên nhân lỗi trên Tab Problems.
 
Description    Resource    Path    Location    Type
The container 'Maven Dependencies' references non existing library
'D:\DevPrograms\Repository\org\springframework\boot\spring-boot-autoconfigure\1.4.1.RELEASE\spring-boot-autoconfigure-1.4.1.RELEASE.jar'   
HelloSpringBoot        Build path    Build Path Problem
Nguyên nhân có thể là các file jar download từ Maven Repository về máy địa phương đã bị lỗi, và không thể đọc được bởi ứng dụng. Bạn cần xóa các thư mục địa phương để ứng dụng download lại các file jar này.
Xóa thư mục:
  • D:\DevPrograms\Repository\org\springframework\boot\spring-boot-autoconfigure