SpringBoot简介
Spring Boot 是由 Pivotal 团队提供的全新框架。可以轻松创建独立的、生产级的基于 Spring 的应用程序。可用于快速开发扩展性强、微小项目、业界称之为:“微框架”。毋庸置疑SpringBoot的诞生不仅给传统的企业级项目与系统架构带来了全面改进以及升级的可能。同时也给Java程序员带来诸多益处。是Java开发的一大利器。
从最根本上来讲,Spring Boot 就是一些库的集合,它能够被任意项目的构建系统所使用。它使用 “习惯优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置)的理念让你的项目快速运行起来。用大佬的话来理解,就是 spring boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 maven 整合了所有的 jar 包,spring boot 整合了所有的框架,总结一下及几点:
springboot其实从真正意义上来说,不能称之为框架,它是基于spring的应用程序的脚手架(造好的轮子)。可用于快速开发扩展性强、微小项目。比如:摒弃了传统的开发模式大量xml配置的问题,依赖外部容器问题,以及依赖jar包的问题。说白了:就把程序员的开发工作从每天日常的开发中繁复问题全部解放,变得非常的和易用,让程序员更多的时间关注到业务,而不应该每天在做配置和大量的启动工作。所以这也就是说为什么springboot不是一个框架。
Springboot的特点
- 能够快速创建独立的Spring应用程序
- 内置Tomcat,Jetty或Undertow(无需部署WAR文件)
- 提供“starter”依赖项简化构建配置。
- 集成了大量的第三方库的配置,Springboot应用为这些第三方库提供了几乎零配置的开箱即用的能力
- 零配置。无冗余代码生成和XML 强制配置,遵循“约定大于配置” 。
- Spring Boot 不是Spring 的替代者,Spring 框架是通过 IOC 机制来管理 Bean 的。Spring Boot 依赖 Spring 框架来管理对象的依赖。Spring Boot 并不是Spring 的精简版本,而是为使用 Spring 做好各种产品级准备。
- 提供一系列大型项目通用的非功能特性(例如嵌入式服务器、安全性、指标、健康检查和外部化配置)提供生产就绪功能,例如指标、运行状况检查和外部化配置--Actual。
主要说明一下第三点:
依赖jar的完整的开发历程是
从jsp/servlet - ssh 这个时代依赖第三jar是通过:
- 手动 + 官网下载
- 2、下载好放入 /webroot/WEB-INF/lib
- 3、 很多框架的包相互依赖,每个jar官网都不一样
缺点:官网太多,网速太慢,包的依赖版本必须要匹配,非常耗时。
优点:版本是自己去查找,比较清晰,不需要额外在下载了。
-
ssh--ssm : 出现jar的依赖管理工具: ant -- > maven
- ant 使用非常的复杂,一般可配置太啰嗦
- maven 其实就是简单ant的版本,取代ant的繁复的配置和构建的问题。 maven不仅仅只是为了解决jar的依赖问题,还解决项目依赖和构建问题,以及jar仓库管理问题。
- gradle :服务anroid应用程序开发的包管理,但是有企业用,用并没有maven那么多。
缺点:需要额外学习maven, 学习成本变高, 它一定依赖网络
好处:不需要自己手动下载jar依赖,构建的问题。
没有解决:jar依赖的版本问题,比如如果你开发ssm项目,maven的pom.xml文件中就必须把spring的七大核心包都要进行依赖, spring.jar ---- fastjson.xml,文件上传:spring-web.jar common-fileuploader.jar,common-file.jar
-
springboot提供了 starter机制:默认装配配置类的问题 和 jar依赖的问题。
- spring-boot-starter-web.jar
- tomcat
- log
- spring-web spring-webmvc
- json 你需要额外学习maven, 学习成本变高, 它一定依赖网络好处:就程序员不需要在去关注,这个jar依赖另外一个jar包的问题,全部自动进行依赖匹配。如果没有这个机制,比如未来要依赖 mybatis-plus-boot-starter,你可以就自己去手动的依赖下面的包:
- mybatis-version
- mybatis-plus-version
- spring-jdbc--version
- myabtis-spring-version
- spring-boot-starter-web.jar
IDEA构建项目需要注意的地方
如果是第一次配置 Spring Boot 的话可能需要等待一会儿 IDEA 下载相应的 依赖包,默认创建好的项目结构如下:
这个标签是在配置 Spring Boot 的父级依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
下面的版本为什么不加version号:
<!--springboot的web的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
因为:spring-boot-starter-parent 是一个父工程,spring-boot-starter-web和spring-boot-starter-test等都是子工程,而子工程的版本都已经由父工程已经管理起来了
那什么情况下的依赖需要去指定版本号呢?
-
不想用这个版本号的时候
-
第三方开发的starter就必须指定版本号。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency
-
父工程没有提供的就必须指定版本号
-
首先我不加版本号,看能不能下载,如果能拿忽略
-
如果不加下载不下例子啊,我就就指定版本号。
-
-
可能版本出来冲突,也可能会指定版本号。
应用入口类 SpringbootApplication&核心注解
@SpringBootApplication : 是Sprnig Boot项目的核心注解,目的是开启自动配置。
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
1、ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
<component-scan base-package="com.xxx.service"></component-scan>
<component-scan base-package="com.xxx.dao"></component-scan>
<component-scan base-package="com.xxx.web"></component-scan>
上面的方式是传统的加载bean到springioc容器的方式,目的是告诉spring容器在启动的时候会去扫描上面的三个目录,然后找到这个包下所有的类,并且加了@Service ,@Conpoment、@Controller、@Repository等,会加入ioc容器,其它不会加载。
springboot的默认加载机制:是以当前启动的类包作为component-scan默认扫描的包。
2、@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,
并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
3,@EnableAutoConfiguration 简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
- @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
- @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,是把官方提供starter里面,内置的配置类的bean加载ioc容器冲
-
内部提供的配置类:xxxxAutoConfiguration 比如:
-
RedisAutoConfiguration 这些都配置类
自动配置幕后英雄:SpringFactoriesLoader详解
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类
上图就是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。
所以,@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
SpringBoot的全局配置文件
Spring Boot 使用一个全局的配置文件 application.properties 或 application.yml,放置在【src/main/resources】目录或者类路径的 /config 下。Spring Boot 不仅支持常规的 properties 配置文件,还支持 yaml 语言的配置文件。yaml 是以数据为中心的语言,在配置数据的时候具有面向对象的特征。Spring Boot 的全局配置文件的作用是对一些默认配置的配置值进行修改。
写法:
server:
port: 8081
上方的:value
的时候,一定至少要有一个空格。
总结:
传统的所谓spring的xml文件是指,用初始化bean的文件,而application.yml它仅仅只是一个属性配置文件。因为官方提供了很多的starter(我官方提供很多的配置类),但是这个配置的信息我是不可能写死的,所以我提供配置属性类,让你进行扩展和覆盖。所以这个application.yml是一个全局属性配置文件,在这里配置的信息是覆盖starter中提供配置的类的信息。
SpringBoot定制Banner
定制官网如下:Text to ASCII Art Generator (TAAG)
springboot可以自定义启动时的banner,这里弄的是一个佛祖头像,步骤很简单,首先在resources目录下,新建一个banner.txt文件。然后把下面的内容给复制进去:
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永无BUG 永不修改 //
结果如下;
可以通过配置进行关闭:
spring.main.banner-mode = off | console
-
off 是关闭
-
console 是打开
SpringBoot 关闭某个特定的配置
使用@EnableAutoConfiguration注解可以让SpringBoot根据当前应用项目所依赖的jar自动配置项目的相关配置.
如果开发者不需要SpingBoot的某一项,该如何实现呢?可以在@SpringBootApplication注解上进行关闭特定的自动配置,比如关闭:数据源
用途
如果未来你看到springboot中自己提供starter 提供几十个上百个配置类,如果有一些不想用,我想自己去写,怎么办呢?
-
你可以覆盖它
-
你可以先排除它,然后自己写。
举例子
面试题:如果在springBoot项目中,我们如何把官方提供好的配置类,排除掉?比如:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
上面的依赖是mybatis依赖,默认情况myabtis的依赖,是一定要初始化一个数据源
<bean id="dataSource" class="druid|c3p0"></bean>
<bean id="sqlSessionFactory" class="SqlSessionFactoryBean">
<propertity name="dataSource" ref="dataSource"/>
</bean>
这也就为什么,如果项目直接依赖了mybatis, 直接启动就报错原因:
Description:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
解决方案:排除数据源依赖:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
总结
-
在开发,如果你依赖一个starter,你肯定是要去使用配置信息。如果你不使用就不要去依赖。
-
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 去排除掉,但是不建议。
-
如果你一旦用了@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})就说明你肯定要覆盖,或者你想要重写它。你就选择剔除。
-
exclude 真正作用就是:不想用官方提供的,想自己造轮子。