springboot1:项目启动
1.启动springboot引入的依赖(pom.xml的配置)
- 引入父项目(依赖管理)
父项目的父项目中声明了所有需要依赖的版本号(自动版本仲裁机制)
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version></parent>
- 如果需要其他版本
在父项目的父项目中查找到对应依赖的version版本的key
然后在当前pom.xml中的key中规定版本号即可(例如mysql驱动)
<properties><myesql.version>5.0<mysql.version>
</properties>
- starter场景启动器
引入starter场景启动器,已经包含所有常规需要的依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
+所有场景底层依赖
都有spring-boot-starter的依赖,此为springboot自动配置的核心依赖
- 简化打包部署策略
用了一下后可以直接打包成jar包直接在目标服务器上执行
<build >
<plugins>
<plugin >
<groupId> org.springframework.boot </groupId >
<artifactId> spring- boot-maven- plugin </artifactId >
</plugin>
</plugins>
</build >
2.springboot配置好依赖后
- 书写主程序
用@SpringBootApplication来声明为一个主程序类 - 默认扫描:主程序所在的包以及其下面的子包会被默认扫描
用@springbootapplication自定义扫描包 - 注意
- 容器的重要性:
各种配置文件都是映射到某一个类中,配置文件的值绑定到某一个类中,然后该类在容器中创建对象 - 按需加载:
spring-boot-autoconfigure包中虽然包含有很多类,但是如果没有引入对应的依赖,里面的类也不会装配
- 容器的重要性:
3.容器功能的组件配置
- @Configuration设置当前类为配置类(用来导入bean的或者初始化等同于xml文件)
- 参数proxyBeanMethods = false,表明我们当前的类为正常类,可以通过方法获取一个新的组件(调用方法返回为新创建)
- 参数proxyBeanMethods = true,表明我们当前类为代理类,装入容器时运用代理类装入,调用方法时用代理类的方法,即会到容器中查找(调用方法返回仍为容器中)
- 使用中:组件依赖设置为true,其他为false
- @bean 设置当前类中的方法(方法名为bean id 返回类型为bean 的类型 返回值为具体组件)
- @Impont({User.class,DBHelper.class}) 声明在配置类中
导入这两个类到容器中(调用无参构造) - @ConditionalOnMissingBean(name = “tom”)声明在当前类中
只有当bean中没有tom时,才会注入当前类中的bean - @ImportResource(“classpath:beans.xml”) 声明在配置文件中
引入原生的配置文件- 里面可以配置各种bean
- @Component @ConfigurationProperties(prefix = “mycar”) 两者都声明在当前类中
为当前类自动装配并且运用springboot的配置文件中的mycar.属性来初始化bean - @EnableConfigurationProperties(car.Class) 声明在配置类中@ConfigurationProperties(prefix = “mycar”)声明在当前类中
4.自动配置原理
4.1拆分注解
- @SpringBootApplication可分为一下注解
- @SpringBootConfiguration 代表当前是一个配置类
- @EnableAutoConfiguration
- @AutoConfigurationPackage 自动配置包
给容器中导入指定包下的所有组件
利用Registere给容器中导入一系列组件,传入参数为当前主类名,然后再register中会将该类所在的包下的所有组件批量注册 - @Import({AutoConfigurationImportSelector.class})给容器中批量导入组件
利用getAutoConfigurationEntry(annotationMetadata)方法中获取候选配置组件,里面会默认扫描当前所有包中的META-INF/spring.factories的文件,spring-boot-autoconfigure中的META-INF/spring.factory下写死了启动的容器中加载的配置组件(?AutoConfiguration),其包有127个场景自动配置默认全部加载,最终按需配置 - 按需配置:里面全都有按条件加载的注解,并不能完全装在ConditionalOnMissingBean(name = “tom”)声明在当前类中
- @AutoConfigurationPackage 自动配置包
- @ComponentScan(com.atguigu.boot) 代表一个包扫描
指定扫描的包
4.2注解底层
- 例如是否导入DispacherServlet组件
- 找到@SpringBootApplication下的@EnableAutoConfiguration 下的@Import({AutoConfigurationImportSelector.class})中默认扫描
- 找到spring-boot-autoconfigure中的默认扫描位置中中找到了DispacherServletAutoconfigure
- 在包中找到了DispacherServletAutoconfigure的配置类
- 在配置类中看是否满足按需加载的条件(满足)
- 配置类中有一个@bean就返回了DispacherServlet类型的组件
这个bean中已经配置好了关于DispacherServlet的配置 - 故导入了DispacherServlet
- 例如是否导入文件解析器组件(防止用户配置的上传解析器名字不符合规范)
- 前面寻找方式一样
- 最后再配置类中有一个@bean返回了一个文件解析器组件
- 其中要求容器中有这个类型的组件
- 容器中没有默认名的这个组件
- @bean的方法传入文件解析器类型的组件(@bean的形参传入的对象默认都会在容器中寻找)
- 该@bean直接返回了该组件(并且修改了名字为默认名)
- 例如是否导入文件解析器(用户有了就用用户的,没有则创建)
- 前面寻找方式相同
- 最后判断@ConditionOnMissiongBean没有则创建,有则不创建
- 总结
- springboot先加载所有的自动配置类
- 每个自动配置类按照条件进行生效,默认都会绑定配置中指定的值。即properties和配置类(bean)进行了绑定。注意:该值可以在我们的application.properties中进行配置(全都有默认值)
- 每个生效的配置类会给容器中装配很多组件
- 只要容器中有这些组件,这些功能就有
- 只要用户有自己配置的,则以用户的为准
- 获取值
- autoconfiguration(加载配置类)
- 组件(配置类生效后创建bean)
- ?properties也为一个配置类(bean的默认值从?properties配置类中获取)
- 最终回归到application.properties的配置的前缀中
- 例如获取缓存的配置
- 找到依赖包的spring-boot-autoconfigure-2.3.4.RELEASE.jar
- 其下的META-INF/spring.factories包含了导入的配置
- 在org中找到cache下的CacheAutoConfiguration
- CacheAutoConfiguration的配置文件@EnableConfigurationProperties({CacheProperties.class})
- 然后找到CacheProperties类
@ConfigurationProperties(prefix = “spring.cache”) - 最终我们只需要在application.properties中写spring.cache.XXX来配置即可
- 找到依赖包的spring-boot-autoconfigure-2.3.4.RELEASE.jar
4.3最佳实践
- 引入场景依赖
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter - 查看自动配置(选底层原理)
debug=true 开启自动配置
\negetive不生效 \positive生效 - 是否需要修改
- 参照文档修改配置
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
例如:如下可以自定义启动图片
自己分析 绑定了哪些前缀(观看源码)
- 自定义或者替换组件
- @bean,@conponent
- 自定义器
- 参照文档修改配置
5.开发技巧
5.1 lombok
- 开发javabean 有参无参 setget 重写tostring
- 在Controller中引入slf4j的日志功能
- 步骤
- 引入依赖
- 安装插件plugin(在setting中的插件搜索下载)
- 使用注解
- @Data 生成get set方法
- @ToString 生成tostring方法
- @AllArgsConstructor和@NoArgsConsturctor为有参无参构造器(定制构造器自己写)
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
5.2 dev-tools
- 热更新 项目实时改变 ctrl F9即可实时改变(重写编译一遍)
严格意义上检测到文件有变化 则重启
如果是静态文件,则不重启,直接用 - 使用:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>
5.3 spring initializr(项目初始化向导)
- 直接可以选择依赖
- 直接帮我们创建好文件结构
- 创建springboot的核心配置文件
- 创建了主程序
springboot1:项目启动相关推荐
- 为什么当项目启动后执行两次过滤器 再进行访问资源时执行一次过滤器
为什么当项目启动后执行两次过滤器 再进行访问资源时执行一次过滤器 粗线的理解,启动项目后进行了两次请求,访问两次过滤器.访问资源时只进行一次请求,所以访问一次过滤器. 于是为了更加清楚地看清在启动项目 ...
- 智汇医工 创享未来:国家标准《健康医疗信息安全指南》验证项目启动会成功举办...
为贯彻落实国家大数据战略,推进健康医疗大数据工作的开展,数据科学研究院于2019年01月19日联合项目申请方--北京清华长庚医院.清华大学软件学院.临床医学院--召开了国家标准<健康医疗信息安全 ...
- 配置项目启动的时候就加载 servlet
load-on-startup值为0 就是在项目启动的时候自动加载该servlet
- web项目启动时 初始化加载系统参数 获取无法自动注入的服务
2019独角兽企业重金招聘Python工程师标准>>> 在web.xml里面配置监听 项目启动时 直接初始化上下文 <listener><display-name& ...
- Eclipse项目启动不了
当你的Eclipse项目启动不了多半是[eclipse工程jdk版本]的问题 在eclipse中项目jdk版本不匹配的时候需要修改项目工程的jdk版本,但是网上的一些版本修改不是很完全,经过一些摸索之 ...
- springboot2.X 在项目启动后执行一段自定义代码
场景: 项目需要在项目启动后从数据库初始化一些数据进入redis , 但是没有很适合 的监听器去实现 , 监听 老是在dao初始化之前触发. 解决方法:自定义类实现 ApplicationRunner ...
- springboot:SpringBoot项目启动成功,但无法访问且提示404
当SpringBoot项目启动成功后,访问controller下的接口却发现无法访问,且提示status=404 我的项目中controller下只有一个测试接口,接口名为MainController ...
- 项目启动时socket自动启动_spring boot 项目在启动时调用接口
1.环境 目前开发的项目使用的spring boot(2.1.4.RELEASE)+ssm 2. 需求 现在有一个数据处理任务的接口,在spring boot项目启动后,可以手动的去启动任务,但是这样 ...
- Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源
在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资 ...
最新文章
- 【精简教程版】100行代码入手天池CV赛事
- shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性...
- 京东数据驱动下的个性化推荐
- raspberry树莓派NFS搭建
- 使用Lua编写whireshark插件
- 什么是微调(Fine Tune)?什么时候使用什么样的微调?【数据量和数据相似度决定】
- 网页版深度学习模型编辑器,搭建运行样样都行,还能3D可视化
- 互联网大厂“抢填”高考志愿
- matlab prn文件,PRN文件扩展名 - 什么是.prn以及如何打开? - ReviverSoft
- 实测 | 分羹无线市场 天融信无线AP究竟有多强?
- 第二类增值电信业务经营许可证在哪里办?
- 如何让win7在桌面显示ie图标
- 小程序对企业、商家有哪些方面的好处?
- 如何在SVN中忽略某个文件或文件夹
- 要闻君说:阿里云联合8家芯片模组商推出“全平台通信模组”;北汽与小桔车服联合“京桔”;IBM要帮助印度公司打造5G战略!...
- 【文本展开收起】uniapp—实现文本的展开与收起功能
- 指纹识别属于计算机技术,指纹识别技术主要涉及四个功能,是哪四个呢?
- android pixelflinger 研究,Android Pixelflinger 研究
- 【diffusion】扩散模型详解!理论+代码
- 画图时屏幕闪烁的原因和解决方法
热门文章
- COBIT+2019框架治理和管理目标(资料下载)
- JSP页面传值到JSP页面
- python实现多张多格式图片转PDF并打包成exe
- DC中wire_load_model与wire_load_mode
- 如何使用GoldWave合成音乐?
- 帮忙写基于SSM框架的购物商城管理系统
- [前端工坊]第二届京东技术节-前端技术实践专场
- 计算机毕业设计Python+uniapp联影医疗器械管理系统小程序(小程序+源码+LW)
- Scrapy框架的使用之Scrapy爬取新浪微博
- python用途谷歌浏览器-python调用chrome ie等浏览器