一、SpringBoot是什么
spring boot只是一个配置工具,整合工具,辅助工具.
Spring Framework | Java EE 框架 |
---|---|
Spring Boot | 快速构建spring的应用 |
Spring Cloud | 构建spring boot分布式的环境 |
Springboot 2.0 是基于 Java8
底层框架是:springframework5.0.X 而 springframework 5.0必须基于Java8或以上
1、Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。采用 Spring Boot 可以大大的简化开发模式,所有你想集成的常用框架,它都有对应的组件支持。
2、Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用,大部分的 Spring Boot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
3、Spring Boot 特性
- 使用 Spring 项目引导页面可以在几秒构建一个项目
- 方便对外输出各种形式的服务,如 REST API、WebSocket、Web、Streaming、Tasks
- 非常简洁的安全策略集成
- 支持关系数据库和非关系数据库
- 支持运行期内嵌容器,如 Tomcat、Jetty
- 强大的开发包,支持热启动
- 自动管理依赖
- 支持各种 IED,如 IntelliJ IDEA 、NetBeans
基于Spring Boot 的这些特性、我们可以快速构建独立的微服务。是Java 领域最优秀的微服务架构落地技术。
Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop. ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
Spring MVC是基于Servlet 的一个 MVC 框架主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。
说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。
Spring MVC的功能
Spring MVC提供了一种轻度耦合的方式来开发web应用。
Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring Boot的功能
Spring Boot实现了自动配置,降低了项目搭建的复杂度。
众所周知Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。
对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。
所以,用最简练的语言概括就是:
Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
以上内容来自:https://blog.csdn.net/u014590757/article/details/79602309
二、Spring boot消失的xml配置(@Configuration)
Springboot 中建议放弃通过 XML 定义 Spring 应用程序,推荐在代码类上面通过 @Configuration 实现配置。
如有需要还可以通过 @ImportResource 来导入 xml 配置文件
我们定义好自己的 @Configuration 如何引用呢?
在启动类中,可以通过 @Import 注解来引入我们自定义的 配置类 @Configuration
@Import :引入 @Configuration【Class<?>[] value();】
@ImportResource :引入 xml文件【String[] value() default {};】
@SpringBootApplication @Import({ RedisConfig.class, MysqlConfig.class }) @ImportResource(value = {"classpath:beans3.xml"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
RedisConfig
@Configuration @ComponentScan({"net.core.cache.redis"}) public class RedisConfig { public 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 FastJson2JsonRedisSerializer(Object.class)); return template; } }
MysqlConfig
@Configuration @ImportResource(value = { "classpath:beans1.xml", "classpath:beans2.xml" }) @EnableConfigurationProperties({MysqlProperties.class}) public class MysqlConfig { public MysqlConfig() { } @Bean DataSource dataSource(MysqlProperties mysqlProperties) { DruidDataSource dataSource = new DruidDataSource(); ...... return dataSource; } }
三、Springboot的starter(重要)
starter是一个集成接合器,其包含许多依赖项,这些依赖项是使用项目快速启动和运行所需的依赖项。
例如:通过配置spring-boot-starter-data-redis,可以快捷的使用spring对Redis进行数据访问,
因为这个依赖包里面已经包含了Redis官方常用的多个依赖包,而 spring-boot-starter-data-redis 所做的就是将多个依赖包打包为一个总的依赖包(减少依赖包的引用个数),并且提供了一些简洁的操作接口和封装了一些实用工具类,使我们能快速方便的使用 redis.
主要帮我们干了两件事
- starter 引入相关的jar
- starter 自动完成的bean配置
四、SpringBoot自动装配原理(重点)
1、spring-boot-autoconfigure 依赖
如果要实现自动配置,需要 spring-boot-autoconfigure 这个依赖
在我们引用的 spring-boot-starter 依赖中可以找到,autoconfigure 里面包含了很多常用的配置
2、@SpringBootApplication 注解分析
(1)我们常用的 @SpringBootApplication 注解点开可以看到就是在 spring-boot-autoconfigure 包下
(2)进入 @EnableAutoConfiguration 注解
@EnableAutoConfiguration 简单概括一下就是,借助 @Import 的支持,收集和注册特定场景相关的bean定义。
- @EnableScheduling 是通过 @Import 将Spring调度框架相关的bean定义都加载到IoC容器。
- @EnableMBeanExport 是通过 @Import 将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!
其中,最关键的要属 @Import(AutoConfigurationImportSelector.class),借助 AutoConfigurationImportSelector,@EnableAutoConfiguration 可以帮助SpringBoot应用将所有符合条件的 @Configuration 配置都加载到当前SpringBoot创建并使用的IoC容器。
(3)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容器。
3、自动配置案例
下面我们以 DataSource 为例,来看是如何进行自动配置的
(1)我们找 DataSource 肯定是在 jdbc 里面,看到 DataSourceAutoConfiguration 是一个配置类,里面已经为我们预先配置了很多信息
(2)要找DataSource肯定要先找池,这个池里什么都没有写,但是通过 @Import 引入了5个DataSource
(3)我们可以先看一下Tomcat的DataSource是什么,进入后看到这个类上有一些注解,类里面的方法是bean信息
ConditionalXXX 注解:用来判断加载这个bean信息的条件(当所有and条件全部成立后 IOC 容器中才会有这个 bean)
例如:
//项目中必须存在org.apache.tomcat.jdbc.pool.DataSource.class这个类(有引入Tomcat的DataSource jar包)
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
//在当前容器IOC中不存在DataSource(DataSource这个bean为null)
@ConditionalOnMissingBean(DataSource.class)
//在资源文件中(Property、yml)有包含以下信息
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
下图是注解的介绍 :
个性化加载配置
(4)如果我们没有引入外部任何DataSource jar依赖,那么就会使用 Generic 返回一个默认的 DataSource
我们可以看到这里的 conditional 条件比先前少了一些
4、bean配置需要的参数是如何规定和获取的
例如:配置dataSource需要数据库连接参数,mybatis也有自己的配置参数
找到 mybatis-spring-boot-starter 这个综合依赖包,进入看到有 mybatis-spring-boot-autoconfigure 依赖
(1)依赖包里 MybatisAutoConfiguration 是配置类,上面有很多配置注解
@EnableConfigurationProperties({MybatisProperties.class})可以看出指向了 MybatisProperties 类
(2)MybatisProperties 类中,注解表示在 properties、yml 资源文件中找以 mybatis 为前缀的信息,这样就能找到我们资源文件中对应的配置信息
Configuration 为我们嵌套了mybatis默认的配置信息,我们如果有某个新配置信息,则会覆盖特定默认的
五、Springboot 启动加载bean流程(重要)
问:spring 启动时将所有带 @Configuration 注解的配置类扫描,然后将bean装入容器中?
答:是的,但是springboot只扫描 启动类 路径同级和子级的@Configuration
自动装配bean大概流程(重要):
- Spring boot 启动时(run方法)会先运行,SpringFactoriesLoader.class
- SpringFactoriesLoader 中会加载扫描所有依赖 jar 中的 META-INF/spring.factories 文件
- spring.factories文件会指向 XXXAutoConfiguration
- 根据 XXXAutoConfiguration 信息 ,合理的将bean加载进spring容器