第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

SpringBoot3+JDK17搭建后端項目實戰(zhàn):從零開始的全面教程

標簽:
雜七雜八

概述

本文详细介绍了如何使用Spring Boot 3与JDK 17构建后端项目,从环境准备、基础项目创建、数据访问、安全性增强,到集成测试与应用部署,直至性能优化和功能扩展策略。通过本指南,开发者能够从零开始,系统性地构建高效率、安全的后端服务,覆盖从初始环境搭建到后期优化的全过程。

引入与准备环境

1.1 Spring Boot 3 与 JDK 17 的背景和优势

Spring Boot 3 是Spring框架的新版本,它提高了开发效率、简化了配置,并提供了更好的性能和安全性。JDK 17 版本带来了多项改进和稳定性提升,如改进的垃圾回收器、更好的并发支持和安全增强功能。

1.2 环境搭建

为了开始你的后端项目,你需要安装Java JDK 17,并配置Spring Boot 3环境。确保你的开发环境支持这些最新技术。

安装 JDK 17:

# 对于 Linux 用户
sudo apt-get update
sudo apt-get install default-jdk

# 或者
sudo yum update
sudo yum install java-17-openjdk-devel

# 对于 macOS 用户
brew install adoptopenjdk/adoptopenjdk/adoptopenjdk17

# 对于 Windows 用户
https://jdk.java.net/17/

配置 Spring Boot 3:
Spring Boot 3 提供了自动启动、自动配置和依赖注入的功能。你可以通过添加相应的依赖和配置来使用它。

1.3 开发工具介绍

推荐使用 IntelliJ IDEA 或 Eclipse 来进行 Spring Boot 项目的开发。以下是 IntelliJ IDEA 的快速配置指南:

IntelliJ IDEA 配置:

  1. 打开 IntelliJ IDEA,选择 "Welcome" 模块。
  2. 在欢迎页面,选择 "Create a new project",然后选择 "Other"。
  3. 从列表中选择 "Gradle Project",点击 "Next"。
  4. 输入项目名称和保存位置,选择项目类型(如 "Spring Initializr"),然后点击 "Next"。
  5. 配置项目设置(如 "Spring Boot Version"、"GroupId"、"ArtifactId"),然后点击 "Finish"。

1.4 开发工具配置指南

IntelliJ IDEA:

  • 在 IDE 中,打开项目设置(File > Project Structure)。
  • 选择 "Modules",然后添加新的依赖(如 "Spring Web"、"Spring Data JPA")。
  • 选择 "Dependencies",添加你的项目依赖。

Eclipse:

  • 新建 Spring Boot 项目,选择 "Spring Initializr"。
  • 选择 "Spring Initializr",添加必要的依赖(如 "Spring Web"、"Spring Data JPA")。
  • 完成模板选择后,生成项目结构。

创建基础项目

2.1 从零开始创建 Spring Boot 3 项目

使用 Spring Initializr 生成一个简单的 Spring Boot 项目:

# 通过命令行创建项目
mvn spring-boot:generate -Dpackage=com.example.myapp -Ddependencies=spring-boot-starter-web,spring-boot-devtools

# 或者使用 Intellij IDEA 或 Eclipse 的 Spring Initializr 插件

2.2 添加基本依赖

添加 Spring Web、Spring Data JPA 依赖:
pom.xml 文件中添加以下依赖:

<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>
</dependencies>

2.3 编写第一个控制器

创建 Controller 类:
在项目中创建一个 UserController 类,添加一个用于处理 HTTP 请求的 GET 方法:

package com.example.myapp.controller;

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

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

    @GetMapping
    public String getHello() {
        return "Hello from Spring Boot!";
    }
}

运行项目:
使用 mvn spring-boot:run 命令启动项目,然后在浏览器中访问 http://localhost:8080/users 来验证你的控制器是否成功运行。

数据访问与实体设计

3.1 设计数据库表结构

假设我们需要一个简单的用户表,包含 ID、用户名(username)和电子邮件(email)字段:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);

3.2 创建实体类

User 实体类:

package com.example.myapp.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 email;

    // 构造函数、getters、setters 省略
}

3.3 配置数据库连接

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

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

3.4 实现数据交互

UserRepository 接口定义:

package com.example.myapp.repository;

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

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

实现数据库操作:
创建 UserServiceImpl 类并实现基本的用户操作方法:

package com.example.myapp.service;

import com.example.myapp.entity.User;
import com.example.myapp.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;

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

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

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

集成测试与自动化测试

4.1 添加单元测试

使用 JUnit 和 Mockito 进行单元测试:

UserRepository 测试:

package com.example.myapp.repository;

import com.example.myapp.entity.User;
import com.example.myapp.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testFindUserById() {
        User user = new User();
        user.setId(1L);
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        assertEquals(user, userRepository.findById(1L).orElse(null));
    }
}

IntegrationTest:

package com.example.myapp.test;

import com.example.myapp.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
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(controllers = UserController.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetHello() throws Exception {
        mockMvc.perform(get("/users"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello from Spring Boot!"));
    }
}

安全性与应用部署

5.1 实现 JWT 认证

JWT(JSON Web Token)是一种开放标准,供各方以一种安全、自包含的方式在各方之间传递信息。以下是使用 JWT 实现认证基础步骤:

添加依赖:
pom.xml 中添加 Spring Security 和 JWT 相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>
<dependency>
    <groupId>com.nimbusds</groupId>
    <artifactId>nimbus-jose-jwt</artifactId>
    <version>9.22.0</version>
</dependency>

辅助类与配置:

JWTUtil.java:

package com.example.myapp.security;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JWTUtil {

    @Value("${jwt.secret}")
    private String secret;

    private static final long EXPIRATION = 1000 * 60 * 60 * 24 * 7; // 一周

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

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

SecurityConfig.java:

package com.example.myapp.security;

import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.crypto.HMACSigner;
import com.nimbusds.jwt.JWTClaimsSet;
import com.nimbusds.jwt.SignedJWT;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/api/auth/**").permitAll()
                .anyRequest().authenticated();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Bean
    public AuthenticationManager customAuthenticationManager() throws Exception {
        return authenticationManager();
    }

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

5.2 应用部署

选择合适的云服务提供商(如 AWS、Azure 或 Google Cloud)进行部署,并根据需要配置环境变量(如数据库连接字符串、JWT 秘钥等):

构建 Docker 容器:
使用 Docker 构建和运行容器:

# 构建 Docker 镜像
docker build -t myapp .

# 运行容器
docker run -p 8080:8080 myapp

部署到云服务器或容器服务时,请确保所有依赖关系都正确打包并可用,以便在目标环境中无缝运行。

优化与扩展

6.1 性能优化策略

性能优化是持续的过程,可能涉及资源管理、代码优化和并发控制。以下是一些一般性建议:

  • 资源管理:监控和优化数据库查询、内存使用和CPU负载。
  • 并发编程:使用线程池、异步编程(如 Java 8 的 CompletableFuture)来处理高并发请求。
  • 监控和日志:实施监控工具(如 Prometheus、Grafana)和日志系统(如 ELK Stack)来实时监控应用性能和稳定性。

6.2 功能扩展

集成消息队列(如 RabbitMQ)

package com.example.myapp.amqp;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class RabbitMQSender {

    public void sendMessage(String queueName, String message) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(queueName, false, false, false, null);
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

缓存(如 Redis)

使用 Redis 作为缓存层可以提高数据访问速度:

package com.example.myapp.cache;

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

@Service
public class CacheService {

    private final RedisTemplate<String, Object> redisTemplate;

    @Autowired
    public CacheService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Cacheable(value = "userCache", key = "#userId")
    public User loadUserFromCache(Long userId) {
        return (User) redisTemplate.opsForValue().get(userId.toString());
    }

    public void saveUserToCache(User user) {
        redisTemplate.opsForValue().set(user.getId().toString(), user);
    }
}

6.3 处理并发问题与异步编程

在高并发环境中,合理设计并发逻辑是关键。使用线程池、异步编程框架(如 CompletableFuture)可以有效管理并发任务。

通过本教程,你已经从零开始构建了使用 Spring Boot 3 和 JDK 17 的后端项目,从环境搭建、基础项目创建、数据访问、安全实现、部署优化到功能扩展,覆盖了整个项目开发过程。随着项目发展,持续优化和扩展功能将帮助你的应用更好地适应用户需求和业务场景。

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消