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

Springboot项目开发实战:新手入门与初级教程

HUH函数
关注TA
已关注
手记 341
粉丝 66
获赞 315
概述

本文详细介绍了Springboot项目开发实战,包括环境搭建、项目创建、常用注解和RESTful服务开发等内容。文章还涵盖了数据访问与数据库集成、配置文件与属性注入以及日志管理和测试方法。通过本教程,读者可以快速掌握Spring Boot的基础开发技能。

Spring Boot项目开发实战:新手入门与初级教程
Spring Boot简介及环境搭建

Spring Boot简介

Spring Boot是一种基于Spring框架的简化开发方式,旨在使Java企业级应用开发更加简单快速。它通过约定优于配置的方式,自动配置了许多常用功能,如嵌入式Web服务器、安全、缓存、调度任务、错误处理、生产就绪指标等。Spring Boot具备以下特点:

  1. 自动配置:Spring Boot尽力自动配置应用程序所需的所有内容。
  2. 开箱即用:提供一系列的Starter依赖,可以实现快速开发。
  3. 嵌入式容器:支持内嵌的Tomcat, Jetty, Undertow等Web服务器。
  4. 无依赖树:支持热部署,无需重启应用服务器。

开发环境配置

开发Spring Boot应用程序需要安装以下环境:

  1. JDK:Java开发工具包,建议版本为1.8或更高版本。
  2. IDE:推荐使用IntelliJ IDEA或Eclipse,以获得最流畅的开发体验。
  3. MavenGradle:构建工具,用于管理依赖和构建项目。

创建第一个Spring Boot项目

首先,通过Spring Initializr或直接在IDE中创建一个新的Spring Boot项目。

使用Spring Initializr创建项目

  1. 打开浏览器,访问Spring Initializr
  2. 填写项目基本信息:
    • Project:选择Maven Project。
    • Language:选择Java。
    • Spring Boot:选择最新稳定版本(例如2.6.0)。
    • Dependencies:选择Web, JPA, Thymeleaf等需要的依赖。
  3. 点击"Generate"生成项目压缩包并下载。
  4. 解压并导入IDE中。

使用IDE创建项目

以IntelliJ IDEA为例:

  1. 打开IntelliJ IDEA,点击"New Project"。
  2. 选择"Maven"或"Gradle"。
  3. 添加父POM以启用Spring Boot支持:
    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.6.0</version>
    </parent>
  4. 添加必要的依赖项:
    <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-jpa</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-thymeleaf</artifactId>
       </dependency>
    </dependencies>
  5. 创建Application类:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
    }

完成以上步骤后,你的Spring Boot项目就创建成功了。

项目结构与常用注解

Spring Boot项目的基本结构

一个典型的Spring Boot项目结构如下:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── demo
│   │               ├── Application.java
│   │               ├── controller
│   │               │   └── HelloController.java
│   │               └── service
│   │                   └── HelloService.java
│   ├── resources
│   │   ├── application.properties
│   │   └── static
│   │       └── index.html
├── test
│   └── java
│       └── com
│           └── example
│               └── demo
│                   └── DemoApplicationTests.java

常用注解详解

Spring Boot中使用了大量的注解来简化配置和开发。以下是一些常用注解及其用途:

  1. @SpringBootApplication:组合了@Configuration, @EnableAutoConfiguration, 和@ComponentScan三个注解,用于标记主程序类。
  2. @Configuration:标记配置类,可以包含@Bean注解的成员方法。
  3. @EnableAutoConfiguration:启用自动配置,Spring Boot会根据类路径中的依赖来配置Spring应用。
  4. @ComponentScan:扫描指定包下的组件,如控制器、服务等。
  5. @RestController:标记控制器类,处理所有HTTP请求。
  6. @RequestMapping:标记控制器的方法或类,绑定到特定的HTTP请求。
  7. @Service:标记服务类,用于定义业务逻辑。
  8. @Repository:标记数据访问层,如DAO,实现数据操作。
  9. @Autowired:自动装配所需的bean。
  10. @Value:注入属性值,如配置文件中的属性。

使用Spring Boot Starter简化依赖管理

Spring Boot Starter是一系列预定义的依赖集合,可以快速集成常用功能。例如:

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

此依赖项包含Spring MVC和嵌入式Tomcat服务器,以及一些常用的功能,如HTTP客户端和JSON处理库。

通过使用spring-boot-starter,可以减少手动添加依赖的工作量,提高开发效率。

RESTful服务开发

创建RESTful控制器

RESTful服务是基于REST架构的Web服务。REST架构使用HTTP方法来描述资源的操作,如GET, POST, PUT, DELETE。

创建一个RESTful控制器,首先需要定义一个控制器类,并使用@RestController注解标记该类为控制器。

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

@RestController
@RequestMapping("/api/v1")
public class HelloController {

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

数据绑定与验证

数据绑定是将请求参数绑定到控制器方法的参数上。Spring Boot使用@RequestParam注解来实现这一功能。

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello(@RequestParam String name) {
        return "Hello, " + name;
    }
}

数据验证可以使用javax.validation包中的注解,如@NotNull, @Size等。

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

public class UserRequest {

    @NotBlank
    @Size(min = 2, max = 30)
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

错误处理与自定义异常

为了处理异常并返回合适的HTTP状态码和响应体,可以创建自定义异常类和全局异常处理器。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
    }
}

class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}
数据访问与数据库集成

Spring Data JPA简介

Spring Data JPA是Spring Data的一个实现,用于简化CRUD操作。它提供了一套模板方法和接口,使得数据库操作更加方便。

实体类

定义一个简单的实体类:

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;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

仓库接口

定义一个仓库接口,继承JpaRepository

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

public interface UserRepository extends JpaRepository<User, Long> {
}

数据库连接配置

application.propertiesapplication.yml文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update

使用JPA进行CRUD操作

使用定义好的仓库接口进行CRUD操作:

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

import java.util.List;
import java.util.Optional;

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

    @Autowired
    private UserRepository userRepository;

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

    @GetMapping("/{id}")
    public Optional<User> getUserById(@PathVariable Long id) {
        return userRepository.findById(id);
    }

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

    @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);
    }
}

事务管理可以通过@Transactional注解来实现:

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 addUser(User user) {
        userRepository.save(user);
    }
}

使用JPA进行复杂查询

例如,可以通过@Query注解执行自定义的SQL查询:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.email = :email")
    User findByEmail(@Param("email") String email);
}
配置文件与属性注入

使用application.properties和application.yml

Spring Boot支持使用application.propertiesapplication.yml文件来配置应用程序的各种属性。

application.properties示例

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update

application.yml示例

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: root
jpa:
    hibernate:
        ddl-auto: update

属性注入与动态配置

使用@Value注解注入属性值:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConfigProperties {

    @Value("${spring.datasource.url}")
    private String dbUrl;

    public String getDbUrl() {
        return dbUrl;
    }
}

通过@ConfigurationProperties注解进行动态配置:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

外部化配置

外部化配置使属性可以在不同的环境中(如开发、测试、生产)有不同的值。可以使用application-{profile}.properties文件来实现:

# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/devdb

在运行应用时指定配置文件:

java -jar myapp.jar --spring.profiles.active=dev
日志管理与测试

Spring Boot日志系统简介

Spring Boot使用Logback作为默认的日志实现,可以配置logback-spring.xml文件来自定义日志输出。

logback-spring.xml示例

<configuration>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

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

日志配置与使用

在代码中使用@Slf4j注解来自动生成Logger实例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoggingController {

    private static final Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @Autowired
    private UserService userService;

    @GetMapping("/log")
    public String logMessage() {
        logger.info("Logging a message");
        return "Logged a message";
    }
}

单元测试与集成测试入门

单元测试用于测试单个组件的功能,通常使用JUnit和Mockito进行。

单元测试示例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testAddUser() {
        User user = new User();
        user.setName("John Doe");
        user.setEmail("john.doe@example.com");

        User savedUser = userService.addUser(user);

        assertEquals("John Doe", savedUser.getName());
        assertEquals("john.doe@example.com", savedUser.getEmail());
    }
}

集成测试用于测试多个组件之间的交互,通常使用Spring Test和MockMvc。

集成测试示例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@WebMvcTest
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetUserById() throws Exception {
        mockMvc.perform(get("/api/users/1"))
                .andExpect(status().isOk())
                .andExpect(content().string("User{id=1, name='John Doe', email='john.doe@example.com'}"));
    }
}

完成以上步骤后,你就已经掌握了Spring Boot基础的开发和测试。希望这些内容对你有所帮助,祝你在Spring Boot开发之路上越走越远!

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