## spring boot

---
#### 附录


* [源码](https://github.com/spring-projects/spring-boot)
* [SpringBoot 组件接入示例](https://github.com/aalansehaiyang/SpringBoot-Learning)
* [java autoConfig配置](springboot-javaConfig.md)
* [热部署](http://blog.csdn.net/l1028386804/article/details/69940574)
* [eclipse中如何跑spring boot的单元测试](springboot-unit.md)

#### 学习资料

* http://www.ityouknow.com/spring-boot
* https://github.com/JeffLi1993/springboot-learning-example
* https://github.com/spring-projects/spring-boot
* http://www.jianshu.com/collection/f0cf6eae1754
* http://zh.lucida.me/blog/java-8-lambdas-insideout-language-features/
* 《SpringBoot揭秘--快速构建微服务体系》* 


---

#### 框架---模块---体系---生态

#### 简介

springboot是基于spring+java+web容器，微服务框架的杰出代表。微服务其实就是将服务粒度做小，使之可以独立承担对外服务的的职责。

##### 特征
* 遵循“约定胜于配置”的原则，使用spring boot只需要很少的配置，大部分时候可以使用默认配置
* 项目快速搭建，可以配置整合第三方框架
* 可完全不使用xml配置，借助java config
* 内嵌Servlet（如 Tomcat）容器，可以jar包运行
* 运行中的应用状态监控

**微服务优势：**

*	独立性。每个微服务都是一个独立的项目。可以独立对外提供服务，可以将研发人力资源很好的分摊，避免人力资源密集带来的沟通、协作成本。（低耦合原则）
*	稳定性。任何一个微服务的失败都将只影响自己或少量其他微服务，不会影响整个服务运行体系。

SpringApplication将一个典型的spring应用启动的流程“模板化”，默认模板化后执行流程就可以满足需求了，如果有特殊需求，SpringApplication在合适的流程节点开放了一系列不同类型的扩展点，我们可以通过这些扩展点对SpringBoot程序的启动和关闭过程进行扩展。

```

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
                                  DataSourceTransactionManagerAutoConfiguration.class })
public class Main extends WebMvcConfigurationSupport {

public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Main.class, "classpath*:/spring/*.xml");
        app.setShowBanner(false);
        app.run(args);
    }
}
```

**执行流程：**

1.如果我们使用的是SpringApplication的静态run方法，首先需要创建一个SpringApplication对象实例。

a）使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitialize

b）使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener

c）设置main方法的定义类

2.开始执行run方法的逻辑，首先遍历执行所有通过SpringFactoriesLoader加载到的SpringApplicationRunListener，调用它们的started()方法，告诉这些SpringApplicationRunListener，SpringBoot应用要开始执行了。

3.创建并配置当前SpringBoot应用将要使用的Environment

4.遍历并调用所有的SpringApplicationRunListener的environmentPrepared()方法，告诉它们，Springboot应用使用的Environment准备好了

5.确定SpringBoot应用创建什么类型的ApplicationContext，并创建完成，然后根据条件决定是否使用自定义的ShutdownHook，是否使用自定义的BeanNameGenerator，是否使用自定义的ResourceLoader，然后将准备好的Environment设置给创建好的ApplicationContext使用

6.ApplicationContext创建完成，SpringApplication调用之前加载的ApplicationContextInitialize的initialize方法对创建好的ApplicationContext进行进一步的处理

7.遍历所有SpringApplicationRunListener的contextPrepared()方法，通知它们，SpringBoot应用使用的ApplicationContext准备好了

8.将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的Ioc容器配置加载到已经你准备完毕的ApplicationContext

9.遍历所有的SpringApplicationRunListener的contextLoader()方法，告知ApplicationContext已装载完毕

10.调用ApplicationContext的refresh()方法，完成Ioc容器可用的最后一道工序

11.查找当前ApplicationContext中是否注册有CommandLineRunner，如果有，则遍历执行它们

12.遍历所有的SpringApplicationRunListener的finished()方法，告知，“初始化完成”

---

**springboot提供了很多“开箱即用”的依赖模块，以"spring-boot-starter-"开头，以解决不同场景问题。**

1.SpringBoot应用将自动使用logback作为应用日志框架，

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
```

2.得到一个直接可执行的web应用，当前项目下直接运行mvn spring-boot:run 就可以直接启动一个嵌入tomcat服务请求的web应用。

默认访问地址：http://localhost:8080

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
```
如果想使用其它容器，可引入spring-boot-starter-jetty

另外可以修改server.port使用自己指定的端口

3.访问数据库依赖此模块。

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
```


4.负责web应用安全，配合spring-boot-starter-web使用


```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
```


5.监控，了解应用的运行状态


```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
```

上面只是介绍一些常用的组件，sping社区还有很多其它优秀的组件，可以根据自己的业务情况研究自取。



