Springboot 实战运用

一,基本配置

1,pom文件配置介绍

1.1继承
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

Spring Boot 的父级依赖,只有继承它项目才是 Spring Boot 项目。

spring-boot-starter-parent 是一个特殊的 starter,它用来提供相关的 Maven 默认依赖。使

用它之后,常用的包依赖可以省去 version 标签

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

web项目的启动依赖

1.3插件
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>

spring-boot-maven-plugin 插件是将 springboot 的应用程序打包成 jar 包的插件。将所有

应用启动运行所需要的 jar 包都包含进来,从逻辑上将具备了独立运行的条件。当运行"mvn

package"进行打包后,使用"java -jar"命令就可以直接运行。

2.启动类与启动器

启动类与启动器的区别: 启动类表示项目的启动入口

启动器表示 jar 包的坐标

2.1启动类

Spring Boot 的启动类的作用是启动 Spring Boot 项目,是基于 Main 方法来运行的。

注意:启动类在启动时会做注解扫描(@Controller、@Service、@Repository......),扫描

位置为同包或者子包下的注解,所以启动类的位置应放于包的根下。

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@MapperScan("com.rojer.springboot.mapper")
@SpringBootApplication
public class SpringbootApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
​
}
2.2启动器

Spring Boot 将所有的功能场景都抽取出来,做成一个个的 starter(启动器),只需要在项

目里面引入这些 starter 相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景,

在 jar 包管理上非常方便,最终实现一站式开发。

如:

spring-boot-starter

这是 Spring Boot 的核心启动器,包含了自动配置、日志和 YAML。

spring-boot-starter-actuator

帮助监控和管理应用。

spring-boot-starter-web

支持全栈式 Web 开发,包括 Tomcat 和 spring-webmvc。

spring-boot-starter-amqp

通过 spring-rabbit 来支持 AMQP 协议(Advanced Message Queuing Protocol)。

spring-boot-starter-aop

支持面向切面的编程即 AOP,包括 spring-aop 和 AspectJ。

3.yml文件的配置

3.1格式要求
  • 大小写敏感

  • 使用缩进来代表层级关系

  • 相同部分只出现一次

3.2yml文件存放位置
  • 当前项目根目录中

  • 当前项目根目录下的一个/config 子目录中

  • 项目的 resources 即 classpath 根路径中

  • 项目的 resources 即 classpath 根路径下的/config 目录中

3.3 yml实际配置
#配置端口
server:
  port: 8080
​
spring:
  servlet:
    multipart:
      #配置单个上传文件大小的限制
      max-file-size: 3MB
      #配置在一次请求中上传文件的总容量
      max-request-size: 10MB
  #配置数据源
  datasource:
    url: jdbc:mysql://localhost:3306/product?useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  #mybatis的额外配置
mybatis:
  configuration:
    map-underscore-to-camel-case: true
  type-aliases-package: com.sxt.sringboot.entity
  mapper-locations: classpath:mapper/*.xml

4.bootstrap文件配置

4.1bootstrap介绍和特征

Spring Boot 中有两种上下文对象,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从 额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一 个环境,它是任何 Spring 应用程序的外部属性的来源。bootstrap 里面的属性会优先加载, 它们默认也不能被本地相同配置覆盖。

  • boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载。

  • boostrap 里面的属性不能被覆盖。

5.spring boot核心注解介绍

5.1@SpringBootApplication

是 SpringBoot 的启动类。

此注解等同于@Configuration+@EnableAutoConfiguration+@ComponentScan 的组合。

5.2@SpringBootConfiguration

@SpringBootConfiguration 注解是@Configuration 注解的派生注解,跟@Configuration

注解的功能一致,标注这个类是一个配置类,只不过@SpringBootConfiguration 是 springboot

的注解,而@Configuration 是 spring 的注解

5.3@Configuration

通过对 bean 对象的操作替代 spring 中 xml 文件

5.4@EnableAutoConfiguration

Spring Boot 自动配置(auto-configuration):尝试根据你添加的 jar 依赖自动配置你的

Spring 应用。是@AutoConfigurationPackage 和@Import(AutoConfigurationImportSelector.class)

注解的组合。

5.5@AutoConfigurationPackage

@AutoConfigurationPackage 注解,自动注入主类下所在包下所有的加了注解的类

(@Controller,@Service 等),以及配置类(@Configuration)

5.6@Import({AutoConfigurationImportSelector.class})

直接导入普通的类

导入实现了 ImportSelector 接口的类

导入实现了 ImportBeanDefinitionRegistrar 接口的类

5.7@ComponentScan

组件扫描,可自动发现和装配一些 Bean。

5.8@ConfigurationPropertiesScan

@ConfigurationPropertiesScan 扫描配置属性。@EnableConfigurationProperties 注解的作

用是使用 @ConfigurationProperties 注解的类生效。

二,基本业务的实现

1,修改pom文件加入相关依赖

<dependencies>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.11</version>
        </dependency>
<!--        数据库坐标驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
<!--        Druid数据源依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--        导入mybatis包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
    </dependencies>

2,编辑yml文件,建立基本配置,如配置端口,数据源等

#配置端口
server:
  port: 8080
​
spring:
  servlet:
    multipart:
      #配置单个上传文件大小的限制
      max-file-size: 3MB
      #配置在一次请求中上传文件的总容量
      max-request-size: 10MB
  #配置数据源
  datasource:
    url: jdbc:mysql://localhost:3306/product?useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  #mybatis的额外配置
mybatis:
  configuration:
    map-underscore-to-camel-case: true
  type-aliases-package: com.sxt.sringboot.entity
  mapper-locations: classpath:mapper/*.xml

3,修改启动类,使其扫描mapper包

@MapperScan("com.rojer.springboot.mapper")
@SpringBootApplication
public class SpringbootApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
​
}

4,建立controller层,mapper接口,service接口,service实现类

controller层

/**
 *公司controller层
 */
@RestController
@RequestMapping("/back/Company")
public class CompanyController {
    @Autowired
    private CompanyService companyService;
    @PostMapping("/CompanyUpdate")
    public CommonResult companyUpdate(Company company){
        companyService.update(company);
        return CommonResult.success();
    }
    @PostMapping("/CompanyFindAll")
    public CommonResult companyFindAll(Company company){
        List<Company> all = companyService.findAll(company);
        return CommonResult.success(all);
    }
}

mapper接口

/**
 * 公司mapper接口
 */
public interface CompanyDao extends BaseDao<Company> {
//    使用注释方法
    @Override
    @Update("UPDATE `company_information` SET `name` = #{name}, `englishName` = #{englishName},`phone` = #{phone}, `mail` = #{mail}, `fax` = #{fax}, `address` = #{address}, `logo` = #{logo} WHERE (`id` = 1)")
    void update(Company company);
​
    @Override
    @Select("select * from company_information where id = #{id}")
    List<Company> findID(Company company);
​
    @Override
    @Select("select * from company_information ")
    List<Company> findAll(Company company);
}

service接口

/**
 * 公司service接口
 */
public interface CompanyService extends BaseSerice<Company>{
}

service实现类

/**
 * 公司service实现类
 */
@Service
public class CompanyServiceImpl implements CompanyService {
    @Autowired
    private CompanyDao companyDao;
    @Override
    public List<Company> findAll(Company o) {
        List<Company> list = new ArrayList<>();
        list = companyDao.findAll(o);
        return list;
    }
​
    @Override
    public List<Company> findID(Company o) {
        List<Company> id = companyDao.findID(o);
        return id;
    }
}

三,springboot 如何实现自动装配

补充1:pagehelper的使用

使用pagehelper助手,其sql语句并不会直接发送给到数据库进行查询,而是会先经过mybatis的拦截器,拦截器会截取sql语句。

如:String sql = select * from users 对这句sql进行分页查询时

拦截器会拦截这句sql,转变为 String sql = select * from users limit (curPage-1)*pageSize,pageSize 然后再进行查询。

是一种实际的查询,并不是把所有数据查到放于内存中,在内存里进行分页输出。

补充2:beanFactory和factoryBean 的区别

区别:BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似

自动装配

根据名字实现自动装配是@EnableAutoConfiguration注解,点击进来。

.再点进

图中loadmetadata的方法是加载项目的基本配置数据信息,而getAutoConfigurationEntry方法则是自动装配的逻辑,继续点进去

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return EMPTY_ENTRY;
   }
   AnnotationAttributes attributes = getAttributes(annotationMetadata);
   //这里加载了文件
   List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
   configurations = removeDuplicates(configurations);
   Set<String> exclusions = getExclusions(annotationMetadata, attributes);
   checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   configurations = getConfigurationClassFilter().filter(configurations);
   fireAutoConfigurationImportEvents(configurations, exclusions);
   return new AutoConfigurationEntry(configurations, exclusions);
}

方法中加载文件

其实到这一步基本清楚了,做的这些事情都是在加载类,那么自动装配到底加载的是什么类呢,这里从外部传入的factoryname是Enableautoconfiguration.class

点进去加载逻辑可以看到是在加载FACTORIES_RESOURCE_LOCATION路径下的类。

会自动扫描所有项目下FACTORIES_RESOURCE_LOCATION这个路径下的类,那么这个路径是啥?

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
总结:

到这里基本清楚了,springboot的自动装配就是通过自定义实现ImportSelector接口,从而导致项目启动时会自动将所有项目META-INF/spring.factories路径下的配置类注入到spring容器中,从而实现了自动装配。

相关的starter和自定义starter都是根据这个实现的。后续有空的话还会写一下如何实现自定义starter的随笔。 系统默认的META-INF/spring.factories路径下配置为

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
​
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
​
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.autoconfigure.integration.IntegrationPropertiesEnvironmentPostProcessor
​
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
​
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
​
# Auto Configure

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/660480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB分类与判别模型算法:基于模糊神经网络的嘉陵江水质评价【含Matlab源码 MX_004期】

算法思路介绍&#xff1a; 基于模糊神经网络的水质预测系统&#xff0c;整体思路分为以下几个模块&#xff1a; 1. 数据准备模块 加载数据&#xff1a;从文件中加载训练和测试数据&#xff0c;包括输入数据和输出数据。数据归一化&#xff1a;对加载的数据进行归一化处理&am…

第十九节:带你梳理Vue2: 父组件向子组件传参(props传参)

1. 组件嵌套 1.1 组件的嵌套使用 之前有说过,Vue组件跟Vue实例是一样的,因此在Vue中一个组件中也可以定义并使用自己的局部组件,这就是组件的嵌套使用 例如:示例代码如下: <div id"app"><!-- 3. 使用组件 --><my-component></my-component&…

教学基本功包括什么技能有哪些

教师的工作不仅仅是传授知识&#xff0c;更多是引导学生探索&#xff0c;激发他们的创造力。要做到这一点&#xff0c;需要具备一些基本技能。 扎实的专业知识。这是教师的根基&#xff0c;如果教师自己对所教的科目都不熟悉&#xff0c;那么教学就会失去方向。不断学习更新自己…

告别虚拟机,在Windows10启动Linux子系统

背景 如果要在自己的windows电脑安装一个Linux系统,一般是用虚拟机软件例如VMware软件来创建。但是这种方式显得非常的笨重。而Windows10自带的Linux子系统则非常的方便。 分析 在Windows10中启用子系统的方式来安装Linux,用于学习和开发是非常方便的。子系统的实用就和一个…

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…

3D模型三角面转四角面操作指南---模大狮模型网

在3D建模的过程中&#xff0c;三角面(Triangles)和四角面(Quads)是两种常见的多边形类型。虽然三角面在渲染速度和计算效率上有其优势&#xff0c;但四角面在模型编辑和纹理映射上通常更为方便。因此&#xff0c;将三角面转换为四角面是建模过程中常见的需求。 一、选择合适的建…

py黑帽子学习笔记_scapy

简介 代码简洁&#xff1a;相比于前两个博客总结&#xff0c;很多socket操作&#xff0c;如果使用scapy仅需几行代码即可实现 获取邮箱身份凭证 编写基础嗅探器&#xff0c;脚本可显示任何收到的一个包的详细情况 直接运行 尝试监听邮件收发&#xff0c;监听指定端口&#x…

高性价比、超强功能的开源工单解决方案

在企业日常运营中&#xff0c;工单管理系统是不可或缺的工具。高效的工单管理不仅能提升工作效率&#xff0c;还能显著提高客户满意度。今天&#xff0c;我们为您推荐搭贝工单派单系统——一款超高性价比、功能齐全的开源工单管理系统。 &#x1f50d; 为什么选择搭贝工单派单…

通过vlan实现同一网段下的网络隔离

现有两个电脑通过交换机直接连接在一起 pc1&#xff1a; pc2&#xff1a; 正常状态下是可以ping成功的 现在先进入交换机命令行界面&#xff0c;创建两个vlan <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]vlan 10 [Huawei-vlan10…

Python面向对象学习笔记

Python面向对象编程 记录人&#xff1a; 李思成 时间&#xff1a; 2024/05/01至2024/05/23 课程来源&#xff1a; B站Python面向对象 1.面向对象编程概述 官方概述 程序是指令的集合&#xff0c;运行程序时&#xff0c;程序中的语句会变成一条或多条指令&#xff0c;然后…

数组-给出最大容量,求能获得的最大值

一、问题描述 二、解题思路 这个题目其实是求给出数组中&#xff0c;子数组和不大于M中&#xff0c;和最大值的子数组。 求子数组使用双指针就可以解决问题&#xff0c;相对比较简单。&#xff08;如果是子序列&#xff0c;则等价于0-1背包问题&#xff0c;看题目扩展中的问题…

Node性能如何进行监控以及优化?

一、 是什么 Node作为一门服务端语言&#xff0c;性能方面尤为重要&#xff0c;其衡量指标一般有如下&#xff1a; CPU内存I/O网络 CPU 主要分成了两部分&#xff1a; CPU负载&#xff1a;在某个时间段内&#xff0c;占用以及等待CPU的进程总数CPU使用率&#xff1a;CPU时…

Vue 3 教程:核心知识

Vue 3 教程&#xff1a;核心知识 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 Compo…

JDK8新特性之lambda表达式

大家好&#xff0c;这里是教授.F 目录 引入&#xff1a; 什么情况下使用/使用前提&#xff1a; 标准格式&#xff1a; 实现原理&#xff1a; 省略格式&#xff1a; 引入&#xff1a; lambda表达式就是简介的书写我们的匿名内部类。Lambda相当于对接口的抽象方法的重写。 什…

盐化行业数字化转型规划详细方案(124页PPT)

方案介绍&#xff1a; 本项目旨在通过引入先进的信息技术和数字化手段&#xff0c;对盐化行业的生产、管理、销售等各个环节进行全面优化和升级&#xff0c;实现生产效率提升、成本降低、产品质量提升、市场竞争力增强等目标。此外环保水平得到提升&#xff0c;降低企业的环保…

Opencv图像处理技术(图像轮廓)

1图像轮廓概念&#xff1a; 图像轮廓是指图像中连续的像素边界&#xff0c;这些边界通常代表了图像中的物体或者物体的边缘。在数字图像处理中&#xff0c;轮廓是由相同像素值组成的曲线&#xff0c;它们连接相同的颜色或灰度值&#xff0c;并且具有连续性。轮廓可以用来描述和…

滴滴一季度营收同比增长14.9%至491亿元 经调整EBITA盈利9亿元

【头部财经】5月29日&#xff0c;滴滴在其官网发布2024年一季度业绩报告。一季度滴滴实现总收入491亿元&#xff0c;同比增长14.9%&#xff1b;经调整EBITA&#xff08;非公认会计准则口径&#xff09;盈利9亿元。其中&#xff0c;中国出行一季度实现收入445亿元&#xff0c;同…

VSCode小技巧,忽略不想格式化的代码行

零&#xff0e;格式化工具文档 1 . Black Ignoring sections功能 2 . autopep8 disabling-line-by-line功能&#xff1b;&#xff1b;–line-range选项 3 . Prettier prettier-ignore功能(例&#xff1a;适用于JS的// prettier-ignore&#xff0c;适用于CSS的/* prettier-igno…

02_变量提升与函数提升及其优先级(JS高级)

目录 一、 变量提升与函数提升 为什么要进行变量提升和函数提升 1.1 变量提升 1.2 函数提升 1.3 变量提升与函数提升的优先级 二、执行上下文 三、执行上下文栈 四、习题 一、 变量提升与函数提升 为什么要进行变量提升和函数提升 JS引擎在读取js代码的过程中&#xf…

Dinky MySQLCDC 整库同步到 Doris

资源&#xff1a;flink 1.17.0、dinky 1.0.2、doris-2.0.1-rc04 问题&#xff1a;Cannot deserialize value of type int from String &#xff0c;detailMessageunknowndatabases &#xff0c;not a valid int value 2024-05-29 16:52:20.136 ERROR org.apache.doris.flink.…