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%2B8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver#mybatis的额外配置
mybatis:configuration:map-underscore-to-camel-case: truetype-aliases-package: com.sxt.sringboot.entitymapper-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%2B8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver#mybatis的额外配置
mybatis:configuration:map-underscore-to-camel-case: truetype-aliases-package: com.sxt.sringboot.entitymapper-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 {@Autowiredprivate 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 {@Autowiredprivate CompanyDao companyDao;@Overridepublic List<Company> findAll(Company o) {List<Company> list = new ArrayList<>();list = companyDao.findAll(o);return list;}
​@Overridepublic 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP_MM_组织数据

在SAP的物料管理模块&#xff08;MM&#xff0c;Materials Management&#xff09;中&#xff0c;组织数据&#xff08;Organizational Data&#xff09;是系统配置的基础结构&#xff0c;用来支持业务流程的高效运行。组织数据定义了不同业务操作的层级和关系&#xff0c;确保…

ubuntu下载离线软件包及依赖

目录 一、前言 二、正文 1.准备环境 2.开始下载 3.后续工作 三、总结 一、前言 由于给客户提供的设备机不允许上网&#xff0c;那么所有待安装的软件包及依赖库都需要提前下载好&#xff0c;然后通过局域网传过去再安装。 另外&#xff0c;软件包可能还依赖其他的库&…

C++模拟实现stack容器适配器

源代码&#xff08;CSTL库中的stack容器适配器是通过deque实现的&#xff0c;这里使用vector容器实现&#xff09; #include <iostream> #include <vector> #include <list> using namespace std;namespace mystack {//栈的设计采用适配器模式&#xff1a;即…

Mac安装tomcat

代码 brew install tomcat 运行结果如下&#xff1a; 如果要启动输入&#xff1a; brew services start tomcat

新书推荐—华为HCIA路由交换技术实战

新书推荐—华为HCIA路由交换技术实战 由HCIE认证讲师、技术能手、ICT大赛优秀指导教师、教学名师、国家规划教材作者联袂编撰&#xff0c;让学习不再是“硬”茬&#xff0c;而是“嗨”起来&#xff01; 《华为HCIA路由交换技术实战》 作者黄君羡组编正月十六工作室书号978-7-12…

半个月获邀请函|在读博士公派新加坡南洋理工大学联合培养

J同学计划先申报CSC联培博士&#xff0c;如若获批&#xff0c;再走本校的联培资助项目。我们仅用半个月时间&#xff0c;就为其申请到新加坡南洋理工大学&#xff0c;因导师接收名额有限制&#xff0c;其又热心推荐了另一位指导导师&#xff0c;最终J同学如愿获得学校资助出国联…

职校老师的工资待遇怎么样

工资水平一直是教师们关注的焦点&#xff0c;毕竟&#xff0c;工资不仅关系到个人的生活品质&#xff0c;还影响着教师的职业满意度和工作动力。职校教师的工资待遇究竟是怎样的呢&#xff1f; 职校教师的工资水平受多种因素影响&#xff0c;包括地区、学校类型、个人资历和教学…

备份服务器的安全风险以及如何通过TDE透明加密提升安全性

备份服务器的潜在安全风险主要包括以下几个方面&#xff1a; 1. 数据泄露风险&#xff1a; 备份数据可能包含敏感信息&#xff0c;如用户个人信息、商业机密等。如果备份数据未经适当保护&#xff0c;例如存储在不安全的位置或未加密&#xff0c;黑客或未授权的人员可能会获取…

AppInventor2 表格布局的外面的黑框怎么去掉?

问&#xff1a;表格布局的外面的黑框怎么去掉啊&#xff1f; 答&#xff1a;这个黑框是界面设计的布局位置示意&#xff0c;实际 App 测试时并没有框。 来源&#xff1a;AppInventor2 表格布局的外面的黑框怎么去掉&#xff1f; - App应用开发 - 清泛IT社区&#xff0c;为创新…

ELT 同步 MySQL 到 Doris

如何基于 Flink CDC 快速构建 MySQL 到 Doris 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步和分库分表同步的功能。 本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 准备阶段 # 准备一台已经…

vscode中更改 git托管的项目里的文件 不显示在 修改项 changes里面

目录 一、问题 二、原因及解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.在vscode中修改 从 git拉取下来的代码&#xff0c;本地不显示被修改的文件&#xff1b;文件夹只有最外层显示红色修改图标;但是里面的被修改的文件也没有被…

lambda函数和map函数

文章目录 一、lambda1.简单的lambda函数2.作为匿名函数传递给其他函数3.与条件表达式结合使用 二、map1.应用普通函数2.使用 lambda 函数3.应用内置函数 三、举例 一、lambda Lambda函数是一种匿名函数&#xff0c;也被称为"lambda表达式"。它是一种简洁的方式来定义…

[nextjs]路由拦截守卫踩坑

Next.js v14 App Router模式 next想实现类似vue这种路由拦截器&#xff0c;其实使用next.js自带的中间件就行了。 现在遇到一个问题是有些页面需要登录后才能访问&#xff0c; 比如 const needLoginRoutes [/\/account/g, /\/deposit/g];...// 中间件里if (needLoginRoutes.…

IO系列(十) -TCP 滑动窗口原理解析

一、摘要 之前在知乎上分享网络编程知识文章的时候&#xff0c;有个网友私信给我留言了一条“能不能写一篇关于 TCP 滑动窗口原理的文章”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清澈的小沟&#…

Compose 中的 touch 事件

在 Android 原生开发中对 View 的 touch 事件处理有这么几种方式&#xff1a; setOnClickListener&#xff1a;监听点击事件setOnTouchListener&#xff1a;监听 touch 事件自定义View&#xff1a;覆写 dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 等方法 方式…

【PostgreSQL】 JSON数组 提取根据索引提取对象和字段

在 PostgreSQL 中处理 JSON 数组&#xff1a;按索引提取对象和字段 在现代应用程序中&#xff0c;JSON 数据格式因其灵活性和可读性广泛应用。PostgreSQL 作为一个强大的关系型数据库管理系统&#xff0c;提供了强大的 JSON 数据类型和函数支持&#xff0c;使得在数据库中存储…

SD-WAN:跨国公司的组网方式

在经济全球化的时代&#xff0c;跨国企业需要与国外客户、供应商和合作伙伴进行快速的互动和沟通&#xff0c;并且会在国外建立办公指点&#xff0c;传统的WAN&#xff08;大面积网络&#xff09;架构已不能满足快速、可靠、安全的网络通信需求&#xff0c;可以采用SD-WAN的方式…

怎么将3D模型转换立面图---模大狮模型网

在建筑设计、室内设计以及产品建模等领域&#xff0c;经常需要将3D模型转换为立面图以进行展示、分析或交流。立面图能够清晰地呈现物体的外观和结构&#xff0c;是设计和施工中不可或缺的一部分。 一、导出3D模型 首先&#xff0c;需要将3D模型导出为CAD软件能够识别的格式。…

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

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

29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…