继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SpringBoot企业级开发学习入门教程

慕斯王
关注TA
已关注
手记 365
粉丝 110
获赞 512
概述

Spring Boot 是一个由 Pivotal Team 发布的开源框架,旨在简化新 Spring 应用程序的搭建和开发过程,允许开发者专注于业务逻辑的实现。本文将详细介绍如何使用 Spring Boot 进行企业级开发,包括项目搭建、配置管理、核心功能和企业级实践。通过本文,读者将掌握 Spring Boot 在企业级开发中的应用,包括日志管理、异步处理、分布式会话管理以及安全和权限控制等。Spring Boot 企业级开发学习是每个开发者都应该掌握的技能。

SpringBoot简介

什么是SpringBoot

Spring Boot 是一个开源框架,旨在简化新 Spring 应用程序的初始搭建和开发过程。它允许开发者使用 Spring 框架快速开发独立的、生产级别的应用。Spring Boot 在 Spring 框架的基础上提供了自动配置的功能,使开发者能够更加专注于业务逻辑的实现,而不是复杂的配置工作。

SpringBoot的特点和优势

  1. 开箱即用: Spring Boot 提供了大量的默认配置,使得开发者能够快速搭建开发环境,减少配置文件的编写。
  2. 依赖管理: Spring Boot 为 Maven 和 Gradle 提供了统一的依赖版本管理,避免了不同版本依赖之间的兼容性问题。
  3. 自动配置: Spring Boot 能够根据添加的依赖自动配置所需的资源,大大减少了配置的工作量。
  4. 嵌入式的容器支持: Spring Boot 可以将应用打包为独立的可执行的 jar/war 文件,并内嵌了 Tomcat、Jetty 或者 Undertow,无需另外配置容器即可启动。
  5. 微服务支持: Spring Boot 与 Spring Cloud 结合,支持快速构建分布式系统和微服务。
  6. 健康检查和监控: Spring Boot 提供了对应用状态的健康检查功能,并支持各种监控工具进行集成。

如何开始第一个SpringBoot项目

为了创建第一个 Spring Boot 项目,你需要先安装 JDK 和 Maven 或 Gradle。以下是使用 Maven 创建 Spring Boot 项目的步骤:

  1. 创建项目:
    使用命令行或 IDE 创建一个新的 Maven 项目,并在 pom.xml 文件中添加 Spring Boot 的依赖。
<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.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  1. 编写主类:
    创建一个主类,使用 @SpringBootApplication 注解标记。
package com.example.demo;

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

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  1. 创建控制器:
    创建一个简单的控制器类,处理 HTTP 请求。
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot!";
    }
}
  1. 运行应用:
    执行 DemoApplication 类的 main 方法,启动应用。默认情况下,应用会在 8080 端口上运行。

SpringBoot项目搭建

使用IDEA创建SpringBoot项目

使用 IntelliJ IDEA 创建 Spring Boot 项目,可以利用 Spring Initializr 插件快速创建项目。

  1. 打开 IntelliJ IDEA,选择 "File" -> "New" -> "Project"。
  2. 在弹出的对话框中选择 "Spring Initializr",然后点击 "Next"。
  3. 输入项目基本信息,如 Group 和 Artifact。
  4. 选择合适的依赖,例如 "web",点击 "Next"。
  5. 输入项目名称,选择项目位置,点击 "Finish"。
  6. 项目创建完成后,IDEA 会自动下载并配置项目依赖。

Maven和Gradle构建工具的使用

Maven 和 Gradle 是两种流行的构建工具,用于管理项目依赖和构建过程。

Maven使用

Maven 使用 pom.xml 文件来管理项目的依赖和构建配置。以下是一个简单的 pom.xml 文件示例:

<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.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

使用 Maven 命令行构建和运行项目:

mvn clean install
mvn spring-boot:run
Gradle使用

Gradle 使用 build.gradle 文件来管理项目的依赖和构建配置。以下是一个简单的 build.gradle 文件示例:

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

使用 Gradle 命令行构建和运行项目:

./gradlew clean build
./gradlew bootRun

配置文件设置详解

Spring Boot 使用 application.propertiesapplication.yml 文件进行配置。以下是一些常用的配置项示例:

application.properties 示例
# 设置端口
server.port=8080

# 设置应用名称
spring.application.name=DemoApp

# 设置数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root

# 设置日志级别
logging.level.root=INFO
application.yml 示例
server:
  port: 8080
spring:
  application:
    name: DemoApp
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: root
logging:
  level:
    root: INFO

SpringBoot核心功能介绍

自动配置与起步依赖

Spring Boot 的自动配置功能会根据添加的依赖自动配置所需的资源。起步依赖 (Starter Dependencies) 包含了多个依赖项,可以快速搭建特定场景的开发环境。

自动配置示例

例如,添加 spring-boot-starter-web 依赖后,Spring Boot 会自动配置 Tomcat 和其他 Web 相关的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
起步依赖示例

起步依赖简化了依赖管理,例如 spring-boot-starter-data-jpa 包含了 JPA 和 Hibernate 的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

RESTful API开发

Spring Boot 通过 @RestController@RequestMapping 注解简化了 RESTful API 的开发。

控制器类示例
package com.example.demo;

import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {
    private Map<Long, String> users = new HashMap<>();

    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Long id) {
        return users.get(id);
    }

    @PostMapping("/users")
    public String createUser(@RequestBody String name) {
        long id = users.keySet().isEmpty() ? 1 : users.keySet().stream().max(Long::compare).get() + 1;
        users.put(id, name);
        return "User created with id: " + id;
    }
}

数据库集成与JPA使用

Spring Boot 通过 JPA 实现了数据库的持久化操作。以下是使用 JPA 进行数据库操作的示例。

实体类示例
package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String email;

    // 构造函数、getter 和 setter 方法
}
仓库接口示例
package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByName(String name);
}
服务类示例
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> findAllUsers() {
        return userRepository.findAll();
    }

    public User getUser(String name) {
        return userRepository.findByName(name).orElse(null);
    }
}
控制器示例
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.findAllUsers();
    }

    @GetMapping("/users/{name}")
    public User getUser(@PathVariable String name) {
        return userService.getUser(name);
    }
}

企业级开发实践

日志管理与配置

Spring Boot 提供了多种日志框架的支持,包括 Logback、Log4j2 和 JDK Logging。可以通过配置文件进行日志的管理和输出。

日志配置示例

application.properties 文件中配置日志级别:

# 设置日志级别
logging.level.root=INFO
logging.level.com.example=DEBUG

application.yml 文件中配置日志输出:

logging:
  level:
    root: INFO
    com.example: DEBUG
  file:
    name: ./logs/app.log
在代码中引用和配置日志级别

在服务类或控制器中使用注解来引用和配置日志级别:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
public class LoggingService {
    private static final Logger logger = LoggerFactory.getLogger(LoggingService.class);

    @Autowired
    public LoggingService() {
        logger.info("LoggingService is initialized");
    }

    public void logInfo(String message) {
        logger.info(message);
    }
}

异步处理与定时任务

Spring Boot 支持异步处理和定时任务,通过注解 @Async@Scheduled 实现。

异步处理示例
package com.example.demo;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {
    @Async
    public void executeAsyncTask() {
        // 异步执行的任务代码
    }
}
定时任务示例
package com.example.demo;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class ScheduledService {
    @Scheduled(fixedRate = 5000)
    public void scheduledTask() {
        System.out.println("Scheduled task executed at: " + new java.util.Date());
    }
}

分布式Session管理与缓存使用

Spring Boot 可以与 Redis 或其他缓存系统集成,实现分布式 Session 管理和缓存功能。

Redis缓存示例
package com.example.demo;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@Service
public class CacheService {
    @Cacheable(value = "userCache", key = "#id")
    public String getUserById(String id) {
        // 从数据库或远程服务获取用户信息
        return "User: " + id;
    }
}

@RestController
@RequestMapping("/api")
public class UserController {
    private final CacheService cacheService;

    @Autowired
    public UserController(CacheService cacheService) {
        this.cacheService = cacheService;
    }

    @GetMapping("/user/{id}")
    public String getUser(@PathVariable String id) {
        return cacheService.getUserById(id);
    }
}
分布式Session管理示例
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;

import java.util.HashMap;
import java.util.Map;

@Component
@SessionScope
public class SessionService {
    private Map<String, String> sessionMap = new HashMap<>();

    @Autowired
    public SessionService() {
        // 初始化sessionMap
    }

    public String getSession(String sessionId) {
        return sessionMap.get(sessionId);
    }

    public void setSession(String sessionId, String sessionData) {
        sessionMap.put(sessionId, sessionData);
    }
}

安全与权限控制

SpringSecurity基础

Spring Security 是一个强大的、高度可定制的认证框架,可以保护 Web 应用的安全性。

安全配置示例
package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
用户认证示例
package com.example.demo;

import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 从数据库或缓存加载用户信息
        return new User("user", "password", new String[] {"ROLE_USER"});
    }
}

身份认证与权限配置

可以使用 Spring Security 的 @PreAuthorize, @PostAuthorize, @Secured 等注解对方法和控制器进行权限控制。

身份认证示例
package com.example.demo;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class SecurityController {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/admin")
    public String getAdmin() {
        return "Admin Page";
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    @GetMapping("/user")
    public String getUser() {
        return "User Page";
    }
}

CSRF防护与安全配置

Spring Boot 默认启用了 CSRF 保护。可以在安全配置中进行进一步的设置。

CSRF防护示例
package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()  // 禁用 CSRF 保护
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }
}

部署与监控

应用打包与部署

Spring Boot 应用可以打包为可执行的 jar 或 war 文件,通过命令行或容器化部署。

打包示例

使用 Maven 打包:

mvn clean package

使用 Gradle 打包:

./gradlew clean build
执行示例

运行打包后的 jar 文件:

java -jar target/demo-0.0.1-SNAPSHOT.jar

使用Docker进行容器化部署

Docker 是一种容器化技术,可以将应用和其依赖打包成一个轻量级、可移植的容器。

Dockerfile 示例
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建与运行容器示例

构建 Docker 镜像:

docker build -t demo:latest .

运行 Docker 容器:

docker run -p 8080:8080 demo:latest

应用监控与日志收集

Spring Boot 提供了内置的监控功能,可以通过 Actuator 端点获取应用状态信息。

启用 Actuator 示例

pom.xmlbuild.gradle 文件中添加 Actuator 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

访问 Actuator 端点,如 /actuator/health 获取应用健康状态。

日志收集示例

使用 Logstash 和 Elasticsearch 收集应用日志:

application.properties 文件中配置 Logstash:

logging.file=/logs/app.log
logging.appender.logstash.type=org.springframework.boot.logging.logback.LogstashAppender
logging.appender.logstash.host=localhost
logging.appender.logstash.port=5000

application.yml 文件中配置 Elasticsearch:

logging:
  file: ./logs/app.log
  appender:
    logstash:
      type: org.springframework.boot.logging.logback.LogstashAppender
      host: localhost
      port: 5000
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP