首页 > 其他分享 >Spring Boot 知识体系详解:原理、配置与开发实战

Spring Boot 知识体系详解:原理、配置与开发实战

时间:2024-12-25 19:19:49浏览次数:3  
标签:Spring Boot springframework 详解 import org public

一、概述

  1. 目的

    • Spring Boot的主要目的是简化Spring应用程序的初始搭建以及开发过程。它采用了“约定优于配置”的原则,减少了开发人员需要编写的样板代码(如配置文件)数量。例如,在传统的Spring应用中,要配置一个数据源,需要在XML配置文件或者Java配置类中进行大量的配置,包括数据库连接URL、用户名、密码等。而在Spring Boot中,只要在application.propertiesapplication.yml文件中简单地配置几行属性,就可以自动配置好数据源。
  2. 优势

    • 快速启动:可以通过Spring Initializr(https://start.spring.io/)快速创建一个Spring Boot项目的基础结构,包括项目的目录结构、依赖管理等。这使得开发者可以在短时间内开始编写业务逻辑代码。
    • 自动配置:根据项目中添加的依赖,Spring Boot会自动配置许多组件。比如,当你添加了spring - web依赖,它会自动配置一个嵌入式的Tomcat服务器,并且配置好Spring MVC的相关组件,使你能够轻松地开发Web应用。
    • 易于部署:可以将Spring Boot应用打包成一个可执行的JAR文件,这个JAR文件包含了所有运行应用所需的依赖(通过Maven或Gradle的插件实现)。这使得在不同的环境(如开发环境、测试环境、生产环境)中部署应用变得非常方便,只需要一个Java运行时环境就可以运行应用。
  3. 版本历史

    • Spring Boot的版本更新较为频繁。从早期版本到现在,它不断增加新的功能和优化。例如,在较新的版本中,对响应式编程的支持得到了加强,增加了与Spring Cloud等微服务框架更好的集成特性。

二、核心概念

  1. 启动类(主类)

    • 每个Spring Boot应用都有一个主类,这个主类通常使用@SpringBootApplication注解。这个注解是一个组合注解,它包含了@Configuration(表示这是一个配置类)、@EnableAutoConfiguration(开启自动配置)和@ComponentScan(扫描组件)。例如:
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @SpringBootApplication
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    
    • 在这里,SpringApplication.run方法用于启动Spring Boot应用,它会加载配置,扫描组件,并启动嵌入式服务器(如果是Web应用)等操作。
  2. 自动配置

    • Spring Boot的自动配置是基于条件注解(如@ConditionalOnClass@ConditionalOnMissingBean等)实现的。这些条件注解会根据类路径中的类是否存在、Bean是否已经存在等条件来决定是否进行配置。例如,当javax.servlet.Servlet类存在于类路径中(意味着这是一个Web应用),并且没有自定义的ServletWebServerFactory Bean,Spring Boot会自动配置一个嵌入式的Tomcat服务器。
    • 开发人员也可以通过在application.propertiesapplication.yml文件中设置属性来覆盖自动配置的某些部分。比如,你可以通过server.port = 8081来改变应用运行的端口号。
  3. 依赖管理

    • Spring Boot通过在pom.xml(如果使用Maven)或build.gradle(如果使用Gradle)文件中管理依赖。它有自己的“starter”依赖,这些starter依赖会自动引入一组相关的库,使得添加功能变得非常方便。例如,spring - boot - starter - web会引入Spring MVC、嵌入式Tomcat等相关的库,用于开发Web应用。
    • 版本管理也比较方便,Spring Boot会管理它所依赖的各种库的版本,避免了版本冲突的问题。通常,你只需要关注Spring Boot本身的版本升级,它会确保引入的依赖库的版本兼容性。

三、配置文件

  1. application.properties和application.yml

    • 格式区别application.properties是一种键值对的格式,例如server.port=8080。而application.yml是YAML格式,它的结构更加清晰,例如:
    server:
        port: 8080
    
    • 功能相同点:它们都用于配置Spring Boot应用的各种属性,包括服务器端口、数据库连接、日志级别等。这些配置属性可以覆盖Spring Boot的自动配置。
    • 加载顺序:如果同时存在application.propertiesapplication.ymlapplication.properties会先被加载,然后application.yml中的配置会覆盖相同属性的application.properties中的配置。
  2. 配置文件的层次性

    • Spring Boot支持多环境配置。可以通过application - {profile}.propertiesapplication - {profile}.yml的形式来配置不同环境(如devtestprod)下的属性。例如,application - dev.properties用于开发环境配置,application - prod.properties用于生产环境配置。
    • 在运行应用时,可以通过--spring.profiles.active=prod这样的命令行参数来指定使用哪个环境的配置文件。
  3. 自定义配置属性类

    • 可以通过@ConfigurationProperties注解来创建一个自定义的配置属性类。例如,如果你有一个配置属性用于存储数据库连接相关的信息,你可以这样定义:
    import org.springframework.boot.context.properties.ConfigurationProperties;
    @ConfigurationProperties(prefix = "myapp.database")
    public class DatabaseConfig {
        private String url;
        private String username;
        private String password;
        // 省略getter和setter方法
    }
    
    • 然后在application.propertiesapplication.yml中可以这样配置:
    myapp:
        database:
            url: jdbc:mysql://localhost:3306/mydb
            username: root
            password: 123456
    
    • 并且要在主类或者一个配置类中通过@EnableConfigurationProperties注解来启用这个自定义配置属性类,这样Spring Boot就可以将配置文件中的属性绑定到这个类的属性上。

四、Web开发

  1. MVC架构支持

    • Spring Boot对Spring MVC提供了很好的支持。可以通过创建@RestController@Controller注解的类来处理HTTP请求。例如:
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String sayHello() {
            return "Hello, World!";
        }
    }
    
    • 这里@RestController是一个组合注解,它包含了@Controller@ResponseBody,表示这个类中的方法返回的结果会直接作为HTTP响应的内容(如JSON格式的数据)。@GetMapping注解用于映射HTTP GET请求到sayHello方法。
  2. 模板引擎集成

    • Spring Boot可以很方便地集成各种模板引擎,如Thymeleaf、Freemarker等。以Thymeleaf为例,首先要在pom.xml中添加spring - boot - starter - thymeleaf依赖。然后可以在resources/templates目录下创建HTML模板文件。例如,一个简单的Thymeleaf模板文件index.html
    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>My Page</title>
    </head>
    <body>
        <p th:text="${message}"></p>
    </body>
    </html>
    
    • 可以在控制器中返回这个模板视图,并传递数据给它,如:
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    @Controller
    public class ThymeleafController {
        @GetMapping("/thymeleaf")
        public String thymeleafPage(Model model) {
            model.addAttribute("message", "This is a Thymeleaf page.");
            return "index";
        }
    }
    
  3. 文件上传和下载支持

    • 在Spring Boot中实现文件上传,可以在控制器方法中使用MultipartFile参数。例如:
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    @RestController
    public class FileUploadController {
        @PostMapping("/upload")
        public String uploadFile(@RequestParam("file") MultipartFile file) {
            if (!file.isEmpty()) {
                try {
                    // 处理文件保存等操作
                    return "File uploaded successfully.";
                } catch (Exception e) {
                    return "File upload failed: " + e.getMessage();
                }
            } else {
                return "Please select a file to upload.";
            }
        }
    }
    
    • 对于文件下载,可以通过设置Content - Disposition头和返回文件流的方式来实现。

五、数据访问

  1. 关系型数据库访问(以JPA为例)
    • 首先要在pom.xml中添加spring - boot - starter - data - jpa和相应的数据库驱动依赖(如mysql - connector - java)。然后可以通过定义实体类、Repository接口来进行数据库操作。例如,定义一个简单的实体类:
    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;
        // 省略getter和setter方法
    }
    
    • 再定义一个Repository接口来操作这个实体类:
    import org.springframework.data.jpa.repository.JpaRepository;
    public interface UserRepository extends JpaRepository<User, Long> {
    }
    
    • 可以在服务层或者控制器中注入UserRepository并使用它的方法(如savefindByIdfindAll等)来进行数据库操作。
  2. 非关系型数据库访问(以Redis为例)
    • 要添加spring - boot - starter - data - redis依赖。然后可以通过RedisTemplate来操作Redis。例如,在配置类中配置RedisTemplate
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    @Configuration
    public class RedisConfig {
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(redisConnectionFactory);
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            return template;
        }
    }
    
    • 之后可以在其他类中注入RedisTemplate并使用它来进行Redis操作,如setget等操作。

六、安全

  1. Spring Security集成

    • 添加spring - boot - starter - security依赖后,Spring Boot会自动配置基本的安全功能。默认情况下,会开启基于表单的认证,并且会生成一个随机的密码在控制台输出。
    • 可以通过自定义SecurityConfig类来配置安全规则。例如:
    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.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
               .authorizeRequests()
               .antMatchers("/public/**").permitAll()
               .anyRequest().authenticated()
               .and()
               .formLogin();
        }
    }
    
    • 这里配置了对/public/路径下的请求允许匿名访问,其他请求需要认证,并且使用表单登录的方式。
  2. 安全相关的配置属性

    • application.propertiesapplication.yml中可以配置许多安全相关的属性。例如,可以配置密码加密方式、会话管理等属性。security.user.name = adminsecurity.user.password = password可以用来设置默认的用户名和密码。

七、测试

  1. 单元测试
    • Spring Boot提供了很好的单元测试支持。可以使用@SpringBootTest注解来加载整个Spring Boot应用上下文进行测试。例如:
    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.*;
    @SpringBootTest
    public class MyServiceTest {
        @Autowired
        private MyService myService;
        @Test
        public void testMyServiceMethod() {
            String result = myService.myMethod();
            assertEquals("Expected Result", result);
        }
    }
    
    • 这里@Autowired注入了要测试的服务类MyService,然后在测试方法中调用服务类的方法并进行断言。
  2. 集成测试
    • 对于集成测试,除了@SpringBootTest,还可以使用@WebMvcTest(用于测试Web层)等注解。例如,使用@WebMvcTest来测试一个控制器:
    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(HelloController.class)
    public class HelloControllerTest {
        @Autowired
        private MockMvc mockMvc;
        @Test
        public void testHelloController() throws Exception {
            mockMvc.request(get("/hello"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello, World!"));
        }
    }
    
    • 这里@WebMvcTest指定了要测试的控制器类HelloControllerMockMvc用于模拟HTTP请求,然后通过andExpect方法来检查响应的状态码和内容。

八、监控与管理

  1. Actuator
    • Spring Boot Actuator是一个用于监控和管理Spring Boot应用的模块。添加spring - boot - starter - actuator依赖后,可以访问许多端点来获取应用的运行信息。例如,/health端点可以查看应用的健康状态,/metrics端点可以获取应用的各种指标(如内存使用情况、请求响应时间等)。
    • 这些端点可以通过HTTP请求访问,默认情况下,部分端点是安全的,需要认证才能访问。可以通过配置来改变端点的安全性和暴露的端点。
  2. 自定义监控指标
    • 可以通过实现CounterServiceGaugeService等接口或者使用Micrometer等工具来定义自己的监控指标。例如,使用Micrometer来记录一个方法的执行时间:
    import io.micrometer.core.instrument.Clock;
    import io.micrometer.core.instrument.MeterRegistry;
    import io.micrometer.core.instrument.Timer;
    import org.springframework.stereotype.Component;
    @Component
    public class MyMetricService {
        private final Timer timer;
        public MyMetricService(MeterRegistry meterRegistry) {
            this.timer = Timer.builder("my.method.timer")
               .description("Timer for my method")
               .register(meterRegistry);
        }
        public void myMethod() {
            try (Timer.Sample sample = Timer.start()) {
                // 执行方法逻辑
            } finally {
                sample.stop(timer);
            }
        }
    }
    
    • 这样就可以通过Actuator的/metrics端点来查看my.method.timer这个指标的相关数据。

标签:Spring,Boot,springframework,详解,import,org,public
From: https://www.cnblogs.com/java-note/p/18631269

相关文章

  • spring
    什么是spring(春天)?1.spring它是一款开源框架,它用来解决企业开发的复杂性。2.spring框架提供了两个核心技术:IOC和AOPIOC:控制反转。把创建对象的权力交于spring框架来创建。并且管理对象的生命周期AOP:面向切面编程。在不改变源码的基础可以对我们的代码进行扩展。3.spring框......
  • SpringBoot 集成RabbitMQ
    springboot集成MQ 配置文件配置类 发送者 消费者 调用   ......
  • 【开源-详解】基于51单片机的智能闹钟设计 - 第二节 - 硬件连接与模块函数解析
    51单片机智能闹钟--硬件连接与模块函数解析硬件准备:模块函数解析OLED驱动模块(调用部分)DHT11温湿度传感器(调用部分)DS1302时钟模块(调用部分)蜂鸣器模块(此处是无源蜂鸣器)空气质量检测模块(DO)按键模块小节总结硬件准备:使用到的模块:–DHT11温湿度传感器x1–MQ135空气......
  • springboot毕设 协同过滤的潮流商品推荐系统程序+论文
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为人们日常生活的重要组成部分。在海量商品信息中,如何精准地为用户推荐符合其兴趣和需求的商品,成为电商平台亟需解决的关键问题。潮流商品作为电商领域的一个热门分支,其推荐系统的构建尤为重要。......
  • springboot毕设 猫咖管理系统程序+论文
    系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,人们越来越注重休闲放松和与宠物的互动。猫咖作为一种结合了咖啡馆与猫咪陪伴的新型休闲场所,近年来在全球范围内迅速流行。猫咖不仅为顾客提供了一个品尝咖啡、享受美食的舒适环境,还允许顾客与店内温顺的猫咪进行......
  • 从源码角度查看SpringBoot是怎样获取到Bean的
    背景:我们都知道在SpringBoot启动类上添加@SpringBootApplication注解后执行main方法就可以自动启动服务Spring会自动帮我们找到需要管理的Bean的呢探究:经典的八股文AbstractApplicationContext#refresh()方法相信大家已经比较熟悉了进入invokeBeanFactoryPostProcess......
  • springboot毕设 协同过滤算法商品推荐系统程序+论文
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为人们日常生活的重要组成部分。在海量商品信息面前,用户往往难以快速找到符合自己兴趣和需求的商品。传统的搜索方式依赖于用户主动输入关键词,但这种方式往往受限于用户的表达能力和对商品描述的......
  • springboot毕设 健身房管理系统程序+论文
    系统程序文件列表开题报告内容研究背景随着健康意识的不断提升,健身已成为现代人生活中不可或缺的一部分。健身房作为提供健身服务的重要场所,其管理效率和服务质量直接影响到会员的健身体验和满意度。近年来,随着健身行业的快速发展,传统的人工管理方式已难以满足健身房日益增......
  • Spring事物this调用当前类中的带事务方法导致事物失效
    ApplicationContext获取代理后的当前类调用当前类的事物方法时,如果使用this会导致获取的MainService这个对象本身,而非事物AOP后的MainService代理对象,所以一定要用ApplicationContext从IOC容器中获取。MainService事务调用A和B方法packagecom.example.transactiondemo.service......
  • 项目管理专业人员PMP认证超全详解,打造职场核心竞争力!
    PMP认证介绍PMP®指的是项目管理专业人士资格认证,它是由美国计算机协会(ProjectManagementInstitute,简称PMI®)发起的,PMP®认证是严格评估项目管理人员知识技能是否具有高品质的资格认证考试。是目前全球项目管理方面含金量最高的资格认证,也是项目管理专业人士身份的象征。......