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

SpringBoot3资料:入门级教程与实战指南

标签:
杂七杂八

概述

SpringBoot3资料全面覆盖从简介与安装到实战应用,包括核心概念、版本对比、环境配置、控制器与视图渲染、权限控制、数据库集成、管理RESTful API、安全认证与授权、用户管理系统实现、集成Swagger UI、发送邮件与定时任务,以及资源与进阶学习路径。本资料为SpringBoot3开发者提供从入门到进阶的完整解决方案。

SpringBoot3简介与安装

SpringBoot3核心概念

SpringBoot3 是 Spring Framework 的一个子项目,旨在简化 Spring 的开发过程,通过默认配置和自动配置减少开发者在配置文件上的工作量。它使用约定优于配置的哲学,使得开发者可以快速构建和部署应用。

版本对比

SpringBoot3 在发行之后,版本更新会紧随 Spring Framework 的发展,引入新特性、改进性能和修复问题。开发者可以根据项目需求和稳定性选择合适的版本。

安装与配置SpringBoot3环境

为了使用 SpringBoot3,你需要确保你的系统已安装 Java 开发工具包(JDK)和一个 IDE 或文本编辑器。接下来,按照以下步骤安装 SpringBoot3:

  1. 下载 SpringBoot 框架:访问 Apache Maven 的官方仓库,下载 SpringBoot 相关的 jar 包。
  2. IDE 配置
    • 在你的开发环境中(如 IntelliJ IDEA、Eclipse 等)创建一个新的 Maven 项目。
    • 添加 SpringBoot 配置文件 pom.xml,添加依赖,例如:
      <dependencies>
       <!-- SpringBoot Starter Web -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
      </dependencies>
    • 配置完毕后,运行项目即可看到 SpringBoot 的 "Hello World"。

SpringBoot3基本项目构建

创建初始SpringBoot项目

使用 SpringBoot 支持的 IDE 插件或 CLI 工具快速生成一个项目框架。

使用 SpringBoot CLI 创建项目

通过命令行操作创建项目:

mvn spring-boot:repackage

这将创建一个包含 SpringBoot 所需所有依赖的项目。

配置项目启动类

在生成的项目中,找到 src/main/java 目录下的 Application.java 文件,这是应用程序的入口点:

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

}

使用SpringBoot的自动配置功能

SpringBoot 会自动配置大部分依赖,如日志、Web 服务器、异常处理等,无需额外配置。例如,使用 Logback 作为日志系统需要进行的配置已经由 SpringBoot 自动完成。

Controller与视图渲染

Controller的定义与使用

控制器(Controller)负责处理用户请求并调用相应的服务层方法返回数据。

package com.example.demo.controller;

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

@RestController
public class WelcomeController {

    @GetMapping("/hello")
    public String welcome() {
        return "Hello from SpringBoot!";
    }

}

HTML与Thymeleaf模板渲染

为了展示数据,我们可以使用 Thymeleaf 模板引擎在 HTML 文件中渲染数据。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>SpringBoot Demo</title>
</head>
<body>
    <div th:text="${message}">Hello World!</div>
</body>
</html>

权限控制与拦截器

为了实现权限控制,可以使用 SpringSecurity。以下是一个简单的配置示例:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user")
            .password(passwordEncoder().encode("password"))
            .roles("USER")
            .and()
            .withUser("admin")
            .password(passwordEncoder().encode("admin"))
            .roles("ADMIN");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

SpringBoot3集成与使用

数据库连接与JPA集成

使用 SpringBoot 和 JPA 可以方便地与数据库进行交互。

package com.example.demo.config;

import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableJpaRepositories(basePackages = "com.example.demo.repository")
@EnableTransactionManagement
public class DBConfig {

    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }

    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactory.setDataSource(dataSource());
        entityManagerFactory.setPackagesToScan("com.example.demo.entity");
        Properties jpaProperties = new Properties();
        jpaProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        jpaProperties.setProperty("hibernate.show_sql", "true");
        entityManagerFactory.setJpaProperties(jpaProperties);
        return entityManagerFactory;
    }

    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

}

使用SpringBoot管理RESTful API

创建 RESTful API 可以通过创建控制器并添加相应的请求处理器来实现。

package com.example.demo.controller;

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

@RestController
public class DataController {

    @GetMapping("/api/data")
    public String getData() {
        return "Data fetched successfully!";
    }

}

添加SpringBoot安全认证与授权

package com.example.demo.config;

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.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }

}

SpringBoot3实战应用

实现一个简单的用户管理系统

用户模型
package com.example.demo.entity;

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 username;
    private String password;

    // 构造函数、getter和setter

}
用户服务
package com.example.demo.service;

import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;

import java.util.List;

public class UserService {

    private final UserRepository userRepository;

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

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

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

    // 其他用户操作方法

}
用户控制器
package com.example.demo.controller;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {

    private final UserService userService;

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

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

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

}

集成Swagger UI进行API文档展示

添加 Swagger 依赖并在项目中配置:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

在配置类中添加 Swagger 配置:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.restdocs.payload.JsonFieldType;
import org.springframework.restdocs.request.RequestDocumentation;
import org.springframework.restdocs.request.SetRequestFieldsOperation;
import org.springframework.restdocs.snippet.Snippet;
import org.springframework.restdocs.snippet.SnippetRegistry;
import org.springframework.restdocs.webmvc.MockMvcRestDocumentation;
import org.springframework.restdocs.webmvc.RestDocumentationNamespace;
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.access.intercept.FilterSecurityInterceptor;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor.SecurityMetadataSource;

@Configuration
@EnableWebSecurity
public class SwaggerConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
            .paths(PathSelectors.any())
            .build();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.apply(new MockMvcRestDocumentation("docs", new MockMvcDocumentationConfigCustomizer()))
            .and()
            .addFilterBefore(getSecurityMetadataSource(), FilterSecurityInterceptor.class);
    }

    private SecurityMetadataSource getSecurityMetadataSource() {
        return new SecurityMetadataSource() {
            @Override
            public Set<String> resourceNames() {
                return Set.of("/api/data");
            }

            @Override
            public Set<String> operationIds(String resourceId) {
                return Set.of("getData");
            }

            @Override
            public Set<JsonFieldType> operationParameters(String resourceId) {
                return Set.of(JsonFieldType.STRING);
            }

            @Override
            public String documentationPaths() {
                return "/api/data";
            }
        };
    }

    @Bean
    public Docket mockMvcDocumentation() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build();
    }

    @Bean
    public MockMvcDocumentationConfigCustomizer mvcDocumentationConfigCustomizer() {
        return new MockMvcDocumentationConfigCustomizer() {
            @Override
            public void customize(SnippetRegistry registry) {
                registry.addSnippet(new SetRequestFieldsOperation("username", "John Doe"));
            }
        };
    }
}

使用SpringBoot发送邮件与定时任务

发送邮件

使用 JavaMailSender 发送邮件:

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

@Service
public class MailService {

    private final JavaMailSender mailSender;

    @Autowired
    public MailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendEmail(String to, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        mailSender.send(message);
    }

}

定时任务

使用 Quartz 定时任务框架:

package com.example.demo.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class GreetingJob extends QuartzJobBean implements Job {

    @Override
    protected void executeInternal(JobExecutionContext context) {
        System.out.println("Hello from a SpringBoot scheduled job!");
    }

}

SpringBoot3资源与进阶学习

重要文档与官方示例

访问 SpringBoot 官方文档Spring 官方文档 获取详细指南和示例代码。

社区论坛与开发者交流

加入 Spring 社区 GitHub 仓库、Slack 频道或 Stack Overflow 以获取实时帮助和交流经验。

推荐后续学习路径与资源

  • 在线课程:访问 慕课网,寻找 SpringBoot 相关课程,如《SpringBoot实战》等。
  • 博客与文章:阅读 Spring 和 SpringBoot 的官方博客,以及技术博客如 JetBrainsDZone 上关于 Spring 的文章。
  • 扩展学习:深入学习 Spring 的其他模块,如 Spring Security、Spring Data 等,以增强应用的复杂度和安全性。

使用 SpringBoot 开发现代化、高效的应用程序是一个值得探索的领域。通过遵循以上指南,你可以在 SpringBoot 的帮助下构建出功能丰富、易于维护的 Web 应用。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消