【Spring Boot&&Spring Cloud系列】Spring Boot初识
项目代码地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/Spring-boot-helloworld
一、Spring Boot优点
- 为Spring开发提供更加简单的使用和快速开发的技巧
- 具有开箱即用的默认配置功能,能根据项目依赖自动配置
- 具有功能更加强大的服务体系,包括嵌入式服务、安全、性能指标、健康检查等
- 绝对没有代码生成,可以不再需要XML配置,即可让应用更加轻巧和灵活
- 对于第三方技术的使用,提供了非常完美的整合
二、项目创建方式
- 使用Maven新建项目
- 使用Spring Initializr新建项目(参见之前的文章)
三、基本依赖配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
四、简单的实例
package com.slp; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
@MapperScan("com.slp.mapper")
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注解@SpringBootApplication标注这是一个Spring Boot应用
main方法使他成为一个主程序,将在应用启动时首先被执行
五、Spring Boot配置
在工程resource文件夹中创建一个application.properties或application.yum文件,该文件会被自动发布到classpath中,并且被Spring Boot自动读取。
不同文件的配置方式有差异,但是是实现的同样的参数项:
application.yml:
server:
port: 80
tomcat:
uri-encoding: UTF-8
application.properties:
server.port = 80
server.tomcat.uri-encoding = UTF-8
六、SpringApplication执行流程
1、如果我们使用的是SpringApplication的静态run方法,那么这个方法里面首先需要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例run方法。在SpringApplication实例化初始化的时候,它会提前做几件事情
- 根据classpath里面是否存在某个特征类(org.springframework.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型,还是应该创建一个标准Standalone应用使用的ApplicationContext类型
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer.
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener
- 推断并设置main方法的定义类
2、SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener,调用他们的started()方法,告诉SpringApplicationRunListener,SpringBoot应用要开始执行了
3、创建并配置当前SpringBoot应用将要使用的Environment(包括配置要使用的PropertySource以及profile)
4、遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法
5、告诉SpringApplication的showBanner属性被设置为true,则打印banner
6、根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然最重要的是将之前准备好的Environment设置给创建好的ApplicationContext使用
7、ApplicationContext创建好之后,SpringApplication会再次借助SpringFactoriesLoader,查找并加载classpath中所有可用的ApplicationContextInitializer然后遍历这些ApplicationContextInitializer的initialize方法来对已经创建好的ApplicationContext进行进一步的处理
8、遍历调用的SpringApplicationRunListener的contextPrepared()方法,通知他们“SpringBoot”应用使用的ApplicationContext准备好了
9、将之前通过@EnableAutoConfiguration获取的所有配置已经其他形式的IoC容器配饰加载到已经准备完毕的ApplicationContext
10、遍历调用所有的SpringApplicationRunListener的contextLoaded()方法,告知所有SpringApplicationRunListener,ApplicationContext装填完毕
11、调用ApplicationContext中是否注册有CommandLineRunner如果有则遍历他们
12、正常情况下,遍历执行SpringApplicationRunListener的finished()方法,并告知“搞定”。
七、自动配置
如前面所说@EnableAutoConfiguration可以借助SpringFactoriesLoader的特性将标注了@Configuration的Javaonfig类加载汇总到最终的ApplicationContext,这只是简化的说明,实际上,基于@EnableAutoConfiguration的自动配置功能拥有更加强大的调控能力。
1、基于条件的自动配置
在Spring框架中,我们可以使用@Conditional这个Annotation配合@Configuration或者@Bean扥来干预一个配置或者bean定义是否能够生效,其最终实现的效果或者语义类似于
if(符合@Conditional规定的条件){
加载当前配置(enable current Configuration)或者注册当前bean定义;
}
比如
@Conditional({Test.class,User.class})
最主要的是@Conditional可以作为一个Meta Annotation用了标注其他Annotation实现类,从而构建各色的符合Annotation,比如SpringBoot的autoconfigure模块就是基于这一优良传统实现了一批这样的Annotation(@ConditionalOnClass @ConditionalOnBean @ConditionalOnMissingClass @ConditionalOnMissingBean @ConditionalOnProperty)
2、调整自动配置的顺序
我们可以使用AutoConfigureBefore和AutoConfigureAfter让当前配置或者组件在某个组件之前或者之后进行
【Spring Boot&&Spring Cloud系列】Spring Boot初识的更多相关文章
- spring boot 2.x 系列 —— spring boot 实现分布式 session
文章目录 一.项目结构 二.分布式session的配置 2.1 引入依赖 2.2 Redis配置 2.3 启动类上添加@EnableRedisHttpSession 注解开启 spring-sessi ...
- spring boot 2.x 系列 —— spring boot 整合 redis
文章目录 一.说明 1.1 项目结构 1.2 项目主要依赖 二.整合 Redis 2.1 在application.yml 中配置redis数据源 2.2 封装redis基本操作 2.3 redisT ...
- spring boot 2.x 系列 —— spring boot 整合 dubbo
文章目录 一. 项目结构说明 二.关键依赖 三.公共模块(boot-dubbo-common) 四. 服务提供者(boot-dubbo-provider) 4.1 提供方配置 4.2 使用注解@Ser ...
- spring boot 2.x 系列 —— spring boot 整合 druid+mybatis
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构 项目查询用的表对应的建表语句放置在resour ...
- spring boot 2.x 系列 —— spring boot 整合 servlet 3.0
文章目录 一.说明 1.1 项目结构说明 1.2 项目依赖 二.采用spring 注册方式整合 servlet 2.1 新建过滤器.监听器和servlet 2.2 注册过滤器.监听器和servlet ...
- spring boot 2.x 系列 —— spring boot 整合 RabbitMQ
文章目录 一. 项目结构说明 二.关键依赖 三.公共模块(rabbitmq-common) 四.服务消费者(rabbitmq-consumer) 4.1 消息消费者配置 4.2 使用注解@Rabbit ...
- spring boot 2.x 系列 —— spring boot 整合 kafka
文章目录 一.kafka的相关概念: 1.主题和分区 2.分区复制 3. 生产者 4. 消费者 5.broker和集群 二.项目说明 1.1 项目结构说明 1.2 主要依赖 二. 整合 kafka 2 ...
- 【Spring Boot && Spring Cloud系列】Spring Boot的启动器Starter
Spring Boot的内置Servlet Container: Name Servlet Version Java Version Tomcat8 3.1 Java 7+ Tomcat7 3.0 J ...
- 【Spring Boot&&Spring Cloud系列】Spring Boot配置文件
很多的参数可以配置在application.properties或application.yml文件中 一.BANNER banner.charset=UTF-8 # Banner file enco ...
随机推荐
- unity3d-----Collider 组件参考
Collider 组件参考 点击 属性检查器 下面的 添加组件 按钮,然后从 添加碰撞组件 中选择需要的 Collider 组件,即可添加 Collider组件到节点上. Collider 组件属性 ...
- Xianfeng轻量级Java中间件平台:流水号管理、组织机构管理
流水号管理:现实中,经常都会和流水号打交道,至于什么是流水号,简而言之,就是按照特定格式要求产生的一个号码,并且总是按照递增的规则生成的,对于要求比较高的业务,需要流水号是连续的,比如移动营业厅排号小 ...
- JQuery $.each遍历JSON字符串报Uncaught TypeError:Cannot use 'in' operator to search for
查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. [js] view plaincopy var json = [ {"id":"1" ...
- Hibernate与MyBatis的对比
Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现 ...
- 原来找字也可以这样用ElseIf FindStr 手机按键精灵 跟大漠的区别
原来找字也可以这样用ElseIf FindStr(646, 1109, 776, 1261, "公告小叉", "FFFFFF-333333", 0.9, in ...
- php脚本超时 结束执行代码
函数:stream_context_create ,file_get_content 创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设 ...
- 【machine translate】deep learning seq2seq
https://www.tensorflow.org/tutorials/seq2seq https://medium.com/@devnag/seq2seq-the-clown-car-of-dee ...
- Android学习之——GridView
背景知识 GridView在Android开发中和ListView一样经常被使用.如我们经常使用的快图浏览,里面就有将图片的布局改为网格(即GridView)的选项.还有约X神器——陌陌的搜索界也是用 ...
- 深入解析Java AtomicInteger原子类型
深入解析Java AtomicInteger原子类型 在并发编程中,需要确保当多个线程同时访问时,程序能够获得正确的结果,即实现线程安全.线程安全性定义如下: 当多个线程访问一个类时,无论如何调度运行 ...
- 【2018年12月10日】A股最便宜的股票
新钢股份(SH600782) - 当前便宜指数:196.21 - 滚动扣非市盈率PE:2.86 - 动态市净率PB:0.95 - 动态年化股息收益率:1.78% - 新钢股份(SH600782)的历史 ...