为了账号安全,请及时绑定邮箱和手机立即绑定

Springboot框架学习:入门到实践

标签:
SpringBoot
概述

本文介绍了Spring Boot的核心功能、优势和特点,包括自动配置、起步依赖、嵌入式Web服务器等。文章详细讲解了如何使用IDEA创建Spring Boot项目以及Maven和Gradle构建工具的使用方法,并涵盖了Spring Boot RESTful API开发和数据库访问等常用功能。

Spring Boot简介
什么是Spring Boot

Spring Boot是基于Spring框架开发的一个模块,它简化了基于Spring的应用程序的开发过程,使开发者可以快速地搭建和部署独立的、生产级别的应用。Spring Boot的核心功能是通过约定优于配置的方式,极大地减少了项目的配置工作,使得开发者可以更加专注于业务逻辑的实现。

Spring Boot通过提供自动配置、起步依赖、健康检查等一系列功能,使得开发人员能够专注于业务逻辑的实现,而不需要过多地关注底层的配置和依赖管理。这使得开发过程变得更加高效和简洁。

Spring Boot的优势和特点
  1. 自动配置:Spring Boot通过约定优于配置的方式,自动配置了许多常见的场景,如数据源、安全、缓存等。开发者只需要提供必要的配置信息,Spring Boot会自动完成其他配置。

  2. 起步依赖:提供了许多起步依赖(Starter),这些起步依赖自动管理依赖版本,避免了版本冲突的问题。例如spring-boot-starter-web包含了构建一个Web应用所需的所有依赖。

  3. 嵌入式Web服务器:默认集成嵌入式的Tomcat、Jetty或Undertow服务器,可以直接运行在生产环境中,不再需要传统的部署模式(如WAR文件部署到应用服务器)。

  4. 健康检查:内置了一些健康检查的功能,如应用运行状态、数据库连接、外部服务调用等的健康检查。

  5. 生产就绪的功能:提供了一系列生产级别的功能,如性能指标、健康指标、外部配置等。

  6. 简化部署:支持jar包形式的部署,可以独立运行,也可以通过Docker等容器技术进行部署。
Spring Boot vs Spring MVC

Spring MVC是Spring框架的一部分,专注于Web应用的开发,提供了灵活的MVC架构。而Spring Boot则是构建在Spring框架之上的,它不仅包括了Spring MVC,还集成了许多其他Spring模块,如Spring Data JPA、Spring Security等,提供了大量的自动化配置和起步依赖,使得开发过程更加简洁高效。

示例代码

// Spring MVC 示例代码
@Controller
public class HelloController {
    @RequestMapping("/")
    public String greeting(@RequestParam(value = "name", defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name);
        return "hello";
    }
}

// Spring Boot 示例代码
@RestController
public class HelloController {
    @GetMapping("/")
    public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return "Hello, " + name;
    }
}
Spring Boot项目搭建
使用IDEA创建Spring Boot项目
  1. 安装IDEA:确保已经安装了IntelliJ IDEA,可以从官网下载最新版本。

  2. 创建项目:启动IDEA,选择File -> New -> Project,选择Spring Initializr。

  3. 配置项目信息:选择语言(Java),选择依赖管理(Maven或Gradle),输入项目名称、语言版本、Spring Boot版本等。

  4. 选择依赖:在依赖选择界面,选择所需的依赖,例如Web、JPA、Security等。

  5. 生成项目:点击Finish,IDEA会自动生成项目结构和必要的配置文件。

示例代码

<!-- 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.5.0</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
Maven和Gradle构建工具简介

Maven

Maven是一个项目管理和构建工具,使用POM(Project Object Model)文件来管理项目的构建、依赖和版本信息。Maven的好处在于统一了软件项目的构建过程,使得团队协作更加方便。

Gradle

Gradle是一个基于Apache Ant和Apache Maven概念的构建工具,可以替代Apache Ant和Maven,它使用Groovy语言来定义构建脚本。Gradle的优势在于它能够并行执行任务,提高了构建速度,并且依赖管理和构建模型更加灵活。

添加依赖和配置项目
  1. 添加依赖:在pom.xml文件中添加所需的依赖,例如Web、JPA、Security等。

  2. 配置项目:在application.propertiesapplication.yml文件中配置项目相关的信息,例如数据库连接信息、端口号等。

示例代码

# application.yml 示例
spring:
  application:
    name: demo-app
  datasource:
    url: jdbc:mysql://localhost:3306/demo
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
server:
  port: 8080
核心配置

application.properties与application.yml配置文件介绍

application.properties

application.properties文件以键值对的形式存储配置信息,例如:

spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root

application.yml

application.yml文件使用YAML语法,结构更加清晰:

spring:
  datasource:
   url: jdbc:mysql://localhost:3306/demo
   username: root
   password: root

常用的Spring Boot配置项

  1. 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root
  1. 应用服务器配置
server.port=8080
server.servlet.context-path=/api
  1. 日志配置
logging.level.root=INFO
logging.file.name=app.log

自定义配置文件和环境变量配置

自定义配置文件

自定义配置文件可以放在src/main/resources目录下,例如application-dev.properties用于开发环境,application-prod.properties用于生产环境。

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

环境变量配置

可以使用环境变量覆盖配置文件中的值,例如:

export SPRING_DATASOURCE_URL=jdbc:mysql://production-db:3306/prod
Spring Boot常用功能
Spring Boot RESTful API开发

示例代码

@RestController
public class UserController {
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // 从数据库中获取用户
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // 保存用户到数据库
    }
}
数据库访问与Spring Data JPA入门

示例代码

实体类

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

    // Getters and Setters
}

仓库接口

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

服务类

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

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

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

控制器

@RestController
public class UserController {
    @Autowired
    private UserService userService;

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

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }
}
异常处理与全局异常捕获

示例代码

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        return new ResponseEntity<>(ex.getBindingResult().toString(), HttpStatus.BAD_REQUEST);
    }
}
Spring Boot项目部署
Spring Boot应用打包
  1. 打包命令:使用mvn packagegradle build命令打包项目,生成的jar文件位于targetbuild/libs目录下。

  2. 运行jar文件:可以使用java -jar命令运行打包后的jar文件。

示例代码

# 打包命令
mvn package

# 运行jar文件
java -jar target/demo-0.0.1-SNAPSHOT.jar
部署到Tomcat和Spring Boot内置的Tomcat
  1. 部署到Tomcat:将打包的war文件放到Tomcat的webapps目录下,启动Tomcat即可。

  2. 使用Spring Boot内置的Tomcat:可以在Spring Boot应用中直接运行,不需要额外配置Tomcat服务器。

示例代码

// 使用内置的Tomcat服务器
public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
使用Docker部署Spring Boot应用
  1. 创建Dockerfile:编写Dockerfile文件,定义构建镜像的步骤。

  2. 构建镜像:使用docker build命令构建镜像。

  3. 运行镜像:使用docker run命令运行镜像。

示例代码

Dockerfile

FROM openjdk:11-jre-slim
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建镜像

docker build -t demo:latest .

运行镜像

docker run -p 8080:8080 demo:latest
实践案例:构建一个简单的博客系统
需求分析和系统设计
  • 功能需求:用户注册、登录、发布文章、查看文章、评论文章等。
  • 系统架构:前后端分离,前端使用Vue.js,后端使用Spring Boot。
功能实现

用户管理

实体类

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

    // Getters and Setters
}

仓库接口

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

服务类

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

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

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

控制器

@RestController
public class UserController {
    @Autowired
    private UserService userService;

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

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

文章管理

实体类

@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    private String author;

    // Getters and Setters
}

仓库接口

public interface ArticleRepository extends JpaRepository<Article, Long> {
}

服务类

@Service
public class ArticleService {
    @Autowired
    private ArticleRepository articleRepository;

    public Article createArticle(Article article) {
        return articleRepository.save(article);
    }

    public List<Article> getAllArticles() {
        return articleRepository.findAll();
    }
}

控制器

@RestController
public class ArticleController {
    @Autowired
    private ArticleService articleService;

    @PostMapping("/articles")
    public Article createArticle(@RequestBody Article article) {
        return articleService.createArticle(article);
    }

    @GetMapping("/articles")
    public List<Article> getAllArticles() {
        return articleService.getAllArticles();
    }
}

评论管理

实体类

@Entity
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;
    private String author;

    @ManyToOne
    private Article article;

    // Getters and Setters
}

仓库接口

public interface CommentRepository extends JpaRepository<Comment, Long> {
}

服务类

@Service
public class CommentService {
    @Autowired
    private CommentRepository commentRepository;

    public Comment createComment(Comment comment) {
        return commentRepository.save(comment);
    }

    public List<Comment> getCommentsForArticle(Long articleId) {
        return commentRepository.findByArticleId(articleId);
    }
}

控制器

@RestController
public class CommentController {
    @Autowired
    private CommentService commentService;

    @PostMapping("/articles/{articleId}/comments")
    public Comment createComment(@PathVariable Long articleId, @RequestBody Comment comment) {
        comment.setArticle(articleService.getArticle(articleId));
        return commentService.createComment(comment);
    }

    @GetMapping("/articles/{articleId}/comments")
    public List<Comment> getCommentsForArticle(@PathVariable Long articleId) {
        return commentService.getCommentsForArticle(articleId);
    }
}
测试与部署

测试

  1. 单元测试:编写单元测试代码,测试各个服务类和控制器的功能。

  2. 集成测试:编写集成测试代码,测试整个系统的功能。

部署

  1. 打包:使用mvn package打包项目。

  2. 运行:使用java -jar命令运行打包后的jar文件。

  3. 部署:可以部署到本地的Tomcat服务器,也可以使用Docker进行部署。

示例代码

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testCreateUser() {
        User user = new User();
        user.setName("Test User");
        user.setEmail("test@example.com");

        User createdUser = userService.createUser(user);
        assertNotNull(createdUser.getId());
    }
}

集成测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ArticleServiceTest {
    @Autowired
    private ArticleService articleService;

    @Test
    public void testCreateArticle() {
        Article article = new Article();
        article.setTitle("Test Article");
        article.setContent("This is a test article.");

        Article createdArticle = articleService.createArticle(article);
        assertNotNull(createdArticle.getId());
    }
}

部署

# 打包命令
mvn package

# 运行jar文件
java -jar target/blog-0.0.1-SNAPSHOT.jar
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消