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

Springboot企业级开发资料详解

拉风的咖菲猫
关注TA
已关注
手记 333
粉丝 44
获赞 212
概述

本文全面介绍了Spring Boot企业级开发资料,涵盖了Spring Boot的基础概念、核心特性、项目创建与配置、数据库集成、RESTful API设计、安全性与认证以及日志管理和监控等方面的内容。通过丰富的示例和配置说明,帮助开发者快速掌握Spring Boot在企业级应用中的实际应用。此外,文章还详细讲解了Spring Boot与多种监控工具的集成方法,确保开发者能够全面了解和使用Spring Boot的各项功能。Spring Boot企业级开发资料旨在为开发者提供一个详尽的指南,助力他们构建高效、稳定的Spring Boot应用程序。

Spring Boot快速入门

Spring Boot简介

Spring Boot 是Spring框架的一个子项目,其主要目的是简化基于Spring的应用程序的开发,使得开发者只需很少的配置便能快速实现开发、打包、部署和运行。Spring Boot通过提供一套默认配置来降低Spring框架的使用门槛,允许开发者专注于应用程序的逻辑而不是配置。

Spring Boot采用了约定优于配置的原则,这意味着开发者可以跳过传统Spring配置文件的繁琐过程。它还提供了自动配置功能,使得配置过程更加简单,例如可以通过注解自动配置数据库连接、服务器端口、静态资源位置等。

Spring Boot核心特性

Spring Boot的核心特性包括以下几个方面:

  1. 自动配置:Spring Boot会根据添加的依赖来自动配置Spring应用程序。
  2. 独立运行:通过集成Spring Boot Starter Web,你可以将应用程序打包为一个可执行的JAR文件,并使用内置的Tomcat、Jetty或Undertow作为服务器。
  3. 内嵌Web容器:支持内嵌的Tomcat、Jetty或Undertow服务器,使得应用程序可以作为一个独立的可执行文件运行。
  4. 生产就绪功能:提供了集合的生产和监控工具,如Actuator和Admin。
  5. 简化嵌入式数据库的使用:Spring Boot允许开发者很容易地使用嵌入式数据库,如H2、HSQL或SQLite。
  6. 外部化配置:支持从外部配置文件(例如application.yml或application.properties)读取配置。
  7. 嵌入式文档:提供了开发、测试和生产环境下的集成测试支持。
  8. 健康检查和监控:提供了生产就绪功能,如Spring Boot Actuator来提供运行时监控和健康检查。

创建第一个Spring Boot项目

创建第一个Spring Boot项目是一个简单的步骤。这里介绍如何使用Spring Initializr快速创建一个简单的Spring Boot项目。

  1. 访问Spring Initializr网站(https://start.spring.io/),选择项目的基本设置,如Spring Boot版本、项目语言(Java)、项目中的依赖(例如Web、Thymeleaf、JPA等)。
  2. 生成项目后,将其下载并解压到本地。
  3. 进入项目解压后的目录,使用IDE(如IntelliJ IDEA或Spring Tool Suite)打开项目。
  4. 编写Hello World应用代码。

下面是一个简单的Hello World示例代码:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@RestController
class HelloController {

    @GetMapping("/")
    public String index() {
        return "Hello, World!";
    }
}

在上面的代码中,@SpringBootApplication注解是一个组合注解,包含@Configuration@EnableAutoConfiguration@ComponentScanDemoApplication类是应用程序的入口点,其中main方法启动了Spring Boot应用。HelloController是一个控制器类,通过@GetMapping注解处理根路径的GET请求,返回字符串Hello, World!

Spring Boot项目结构与配置

项目目录结构

一个标准的Spring Boot项目结构如下:

src/main/java
    com/example/demo
        DemoApplication.java
        Controller.java
        Service.java
        Repository.java
src/main/resources
    application.properties
    application.yml
    logback-spring.xml
    static/
        css/
            style.css
        js/
            script.js
        images/
            logo.png
src/test/java
    com/example/demo
        DemoApplicationTests.java
  • src/main/java:存放Java源代码,包括应用程序主类、控制器、服务和仓库接口等。
  • src/main/resources:存放资源文件,如配置文件(application.properties或application.yml)、静态资源文件、日志配置文件等。
  • src/test/java:存放测试代码,如单元测试、集成测试等。

配置文件详解

Spring Boot支持多种配置文件格式:.properties.yml。在资源目录下通常会找到application.propertiesapplication.yml文件。这些文件用于应用程序配置,如端口、数据库连接、消息队列等。

application.properties 示例

# Server configuration
server.port=8080

# Database configuration
spring.datasource.url=jdbc:mysql://localhost:3306/dbname
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# JPA configuration
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

application.yml 示例

server:
  port: 8080

spring:
  datasource:
  url: jdbc:mysql://localhost:3306/dbname
  username: root
  password: root
  driver-class-name: com.mysql.jdbc.Driver
 jpa:
  show-sql: true
  hibernate:
   ddl-auto: update
   dialect: org.hibernate.dialect.MySQL5Dialect

属性配置

Spring Boot支持使用@Value注解注入属性值,如下例所示:

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Value("${app.message}")
    private String message;

    @GetMapping("/")
    public String index() {
        return message;
    }
}

application.properties中配置属性:

app.message=Hello, World!

application.yml中配置属性:

app:
 message: Hello, World!
数据库集成与操作

数据库连接配置

数据库连接配置通常在application.propertiesapplication.yml中。这里是一个MySQL数据库的配置示例:

application.properties 示例

spring.datasource.url=jdbc:mysql://localhost:3306/dbname
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

application.yml 示例

spring:
 datasource:
  url: jdbc:mysql://localhost:3306/dbname
  username: root
  password: root
  driver-class-name: com.mysql.jdbc.Driver

JPA和MyBatis的使用

在Spring Boot中,使用JPA和MyBatis可以简化数据库操作。下面分别介绍这两种方式的使用方法。

JPA使用示例

  1. pom.xmlbuild.gradle中添加JPA依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  1. 创建实体类:
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.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
}
  1. 创建仓库接口:
package com.example.demo;

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {
}
  1. 创建服务类:
package com.example.demo;

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

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

MyBatis使用示例

  1. pom.xmlbuild.gradle中添加MyBatis依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mybatis</artifactId>
</dependency>
  1. 创建数据库映射文件(Mapper XML):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.UserMapper">

    <select id="getUserById" resultType="com.example.demo.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

</mapper>
  1. 创建接口:
package com.example.demo;

import java.util.List;

public interface UserMapper {
    User getUserById(Long id);
}
  1. 创建配置类:
package com.example.demo;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan("com.example.demo")
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    // DataSource configuration
}

数据库事务管理

Spring Boot提供了一种简单的方式来管理数据库事务。可以在服务类中使用@Transactional注解,通常用于异常发生时回滚事务。

package com.example.demo;

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

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        try {
            userRepository.save(user);
            // Simulate an exception
            throw new RuntimeException("Transaction rollback");
        } catch (RuntimeException e) {
            // Handle exception
        }
    }
}
RESTful API设计与开发

创建RESTful服务

创建RESTful服务的基本步骤包括定义资源、创建控制器来处理HTTP请求,并使用Spring MVC来映射HTTP请求。

创建资源

创建一个简单的用户资源类:

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.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
}

创建控制器

创建控制器处理HTTP请求:

package com.example.demo;

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

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/")
    public Iterable<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping("/")
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return userRepository.save(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}

使用Spring MVC进行请求处理

在Spring Boot中,控制器类使用@RestController注解标记为RESTful控制器,并使用@GetMapping@PostMapping@PutMapping@DeleteMapping注解映射HTTP请求。在上述示例中,UserController类中的每个方法都处理特定的HTTP请求。

常见问题及解决技巧

  1. 跨域问题:如果应用程序需要支持跨域请求,可以在控制器或全局配置中添加跨域配置。
package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}
  1. 请求映射问题:确保请求映射的URL路径和控制器方法的注解匹配。可以通过Spring Boot的调试日志查看请求如何被映射到控制器方法。

  2. 错误处理:可以使用@ControllerAdvice类处理全局异常。
package com.example.demo;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseEntity<ErrorDetails> handleException(Exception ex) {
        ErrorDetails error = new ErrorDetails();
        error.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        error.setMessage(ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

class ErrorDetails {
    private int code;
    private String message;

    // Getters and Setters
}
安全性与认证

基本认证与令牌认证

基本认证和令牌认证是两种常见的认证方式。基本认证通过HTTP头发送用户名和密码,令牌认证则是通过访问令牌(如JWT)进行认证。

基本认证

配置Spring Boot使用基本认证:

package com.example.demo;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/public").permitAll()
                .anyRequest().authenticated()
            .and()
                .httpBasic();
    }
}

令牌认证

使用JWT进行令牌认证:

  1. 添加JWT依赖:
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
  1. 创建JWT工具类:
package com.example.demo;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtil {

    private static final String SECRET = "secret";
    private static final long EXPIRATION = 3600000;

    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
    }

    public String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

使用Spring Security进行安全设置

Spring Security是一个强大的安全框架,可以与Spring Boot无缝集成。下面是一个简单的示例,展示如何配置Spring Security以保护API端点。

配置Spring Security

  1. 添加Spring Security依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 创建自定义的安全配置:
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.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/public").permitAll()
                .anyRequest().authenticated()
            .and()
                .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}
  1. 创建JWT过滤器:
package com.example.demo;

import com.example.demo.auth.JwtUtil;
import com.example.demo.auth.JwtUser;
import com.example.demo.auth.TokenUserDetailsService;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private TokenUserDetailsService tokenUserDetailsService;
    private JwtUtil jwtUtil;

    public JwtAuthenticationFilter(TokenUserDetailsService tokenUserDetailsService, JwtUtil jwtUtil) {
        this.tokenUserDetailsService = tokenUserDetailsService;
        this.jwtUtil = jwtUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            String jwt = token.substring(7);
            if (jwtUtil.validateToken(jwt)) {
                JwtUser jwtUser = tokenUserDetailsService.loadUserByUsername(jwtUtil.getUsernameFromToken(jwt));
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        chain.doFilter(request, response);
    }
}

创建JWT认证服务

创建JWT认证服务类:

package com.example.demo.auth;

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 TokenUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // Simulate loading user from database
        return User.withDefaultPasswordEncoder()
                .username(username)
                .password("password")
                .roles("USER")
                .build();
    }
}

CSRF保护

CSRF(跨站请求伪造)攻击是常见的攻击方式之一,Spring Security提供了内置的CSRF保护机制。在安全性配置中启用CSRF保护:

package com.example.demo;

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() // Disabling CSRF for simplicity, in production you should enable it
            .authorizeRequests()
                .antMatchers("/api/public").permitAll()
                .anyRequest().authenticated()
            .and()
                .addFilterBefore(new JwtAuthenticationFilter(tokenUserDetailsService, jwtUtil), UsernamePasswordAuthenticationFilter.class);
    }
}
日志管理和监控

日志配置与管理

Spring Boot允许开发者通过配置文件来管理日志。

使用Logback配置

src/main/resources目录下,创建一个logback-spring.xml文件,例如:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

使用Log4j2配置

src/main/resources目录下,创建一个log4j2.xml文件,例如:

<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

应用监控与诊断

Spring Boot Actuator提供了一套丰富的生产就绪功能,如健康检查、配置属性、环境信息等。

启用Actuator

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

通过访问/actuator路径下的各种端点来监控和诊断应用程序的状态。例如,访问/actuator/health可以获取应用程序的健康状态。

常用工具介绍

Micrometer

Micrometer是一个度量库,提供了多种后端度量系统的适配器,如Prometheus、InfluxDB、Graphite等。通过在项目中添加Micrometer依赖,可以轻松地将应用程序的度量指标发送到各种监控工具。

Prometheus

Prometheus是一个开源的监控系统和时间序列数据库,广泛用于监控应用程序的性能和健康状况。Spring Boot Actuator提供了与Prometheus集成的功能,可以通过访问/actuator/prometheus端点来获取度量数据。

Grafana

Grafana是一个强大的开源仪表盘和图形编辑器,可以轻松地与各种数据源(如Prometheus、InfluxDB等)进行集成,创建自定义的监控仪表盘。

通过结合使用这些工具,可以有效地监控和诊断Spring Boot应用程序的性能和运行状态。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP