大家眼中的spring boot:https://www.zhihu.com/question/39483566
-------------------------------------------------------------------------
  Spring Boot是由spring官方(Pivotal团队)在2013年提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架。
  至于spring boot的好处,我的感受就是少了xml,几乎是零配置,项目搭建非常容易。原来搭建一个项目,要引入spring,然后根据spring版本引入orm框架等,要在xml中配置一些基本的比如扫描包路径,数据连接池,orm相关配置,事务配置等一些内容,有些配置根据使用spring或者jar包版本的不同略有差别。spring boot就不用这么麻烦了,要用啥直接引入相关的starter就行了。说起来,当年我们java bean相互依赖,直接new,然后spring说大家太辛苦了,这事儿我来,大家xml配一下就好;后来jdk出了注解以后,spring觉着也不错,就也来了一下,支持了很多注解,说大家xml是不是很辛苦啊,建议使用注解吆,记得当时还有人争论是xml好还是注解好,现在算是尘埃落定了;然后spring不断挑战自己,虽然xml加注解已经挺好使的了,它对自己还真得挺狠,完全把xml干掉了,全部注解,这就是boot了。哈哈。
  当然,spring boot也不全是优点,个人感觉上,正是因为starter的自动配置啥都替我们做了,有的时候我们并不需要一些内容,starter也帮我们引入做好了,导致的结果就是最后的工程打包后体积比原来大了好多;还有就是,啥都约定好了,这么写就行,给了我们发懒的借口,让人不去考虑底层实现,这点作为开发人员还是要警惕的,清楚底层的实现逻辑是一个码农对自己最基础的要求,切记切记。

-------------------------------------------------------------------------
Spring Boot的核心功能:
1、独立运行spring 项目
  Spring Boot可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行就可以;
2、内嵌servlet容器
  spring boot自带了tomcat,jetty跟undertow,这样我们就无需以war包形式部署项目;
3、提供starter简化maven配置
  提供了一系列的starter pom来简化maven配置,看起来pom文件内容少了很多;
4、自动配置spring
  Spring Boot会根据在类路径中的jar包、类,为jar包里的类自动配置bean,这会极大地减少我们要使用的配置;当然,spring boot只是考虑了大部分场景,实际开发中仍会有需要我们自己配置的bean;
5、准生产的应用监控
  Spring Boot提供基于http、ssh跟telnet对运行时的项目进行监控;
6、无xml配置
  Spring 4.x提供了条件注解,在Spring Boot中可以不用任何xml即可实现spring的所有配置;原理参见@enable注解跟@import注解;

使用介绍:
  Spring Boot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法其实就是一个标准的java应用程序入口方法;在main方法中使用SpringApplication.run() 启动Spring Boot应用项目。
  @SpringBootApplication是Spring Boot的核心注解,它是一个组合注解,部分源码为:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] exclude() default {};
}

  主要集成的注解是@Configuration、@EnableAutoConfiguration跟@ComponentScan,若不使用@SpringBootApplication也可以在入口类使用以上三个注解;其中@EnableAutoConfig让Spring Boot根据类路径中的jar包依赖,为当前项目进行自动配置。
  Spring Boot会自动扫描@SpringBootApplication所在类的同级包以及下级包里的bean,建议入口类放置在groupId+arctifactID组合的包名下;
  关闭特定的自动配置,应使用@SpringBootApplication注解的exclude参数,例如:
  @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
Spring Boot的运行原理:
  Spring Boot关于自动配置的源码都在spring-boot-autoconfigure-1.5.9.x.jar中,主要包含了如下配置:

  有必要的时候,我们可以来这里查看源码。
我们可以通过如下方式查看项目中已启用和未启用的自动配置报告:
  1、运行jar时加--debug参数
    java -jar xx.jar --debug
  2、在application.properties中设置熟悉:
    debug==true
原理原理,还是继续看原理,入口注解是@SpringBootApplication,它的核心功能是由@EnableAutoConfiguration这个注解提供的,源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}

这里的关键功能是@Import注解导入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,而我们的spring-boot-autoconfigure-1.5.9.jar里就有一个spring.factories文件,此文件声明了我们有哪些自动配置:

打开其中任意一个AutoConfiguration文件,一般都有一些如下类似的条件注解,比如@ConditionalOnBean(当容器里有指定的bean的条件下),@ConditionalOnClass(当类路径下有指定的类的条件下),@ConditionalOnJava(基于jvm版本作为判断条件)等等;
这些注解都组合了@Conditional元注解,只是使用了不同的条件,在不同情况下自动注册不同的实例到ioc容器中。
--------------------------------------------------
稍后手写一个starter来加深理解

spring boot基本认识的更多相关文章

  1. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  2. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  3. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  4. 玩转spring boot——结合redis

    一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...

  5. 玩转spring boot——AOP与表单验证

    AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...

  6. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  9. 玩转spring boot——结合jQuery和AngularJs

    在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  10. 玩转spring boot——MVC应用

    如何快速搭建一个MCV程序? 参照spring官方例子:https://spring.io/guides/gs/serving-web-content/ 一.spring mvc结合thymeleaf ...

随机推荐

  1. 2013蓝桥杯JavaA组T10 大臣的旅费(树的直径)

    大臣的旅费   时间限制:1.0s   内存限制:256.0MB 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大 ...

  2. Sqlserver根据某字段分隔符将一条记录拆分为多行记录

    参考地址:http://blog.sina.com.cn/s/blog_b3eabfd30102wldv.html 参考语句: if object_id('[aaa]') is not null dr ...

  3. c# winform使用IrisSkin2换肤弹不出窗口解决方案

    winform使用IrisSkin2换肤弹不出窗口解决方案 这张图能解决超级多博友的问题,知识是共享的,绝不私吞.共同学习,共同进步! 不需要说太多,只需1张图!                    ...

  4. C:简单的学生信息处理程序实现

    描述 在一个学生信息处理程序中,要求实现一个代表学生的类,并且所有成员变量都应该是私有的. (注:评测系统无法自动判断变量是否私有.我们会在结束之后统一对作业进行检查,请同学们严格按照题目要求完成,否 ...

  5. Java项目之项目模板(登录注册)

    链接:http://pan.baidu.com/s/1hskYopm 密码:vffl

  6. django2集成DjangoUeditor富文本编辑器

    富文本编辑器,在web开发中可以说是不可缺少的.django并没有自带富文本编辑器,因此我们需要自己集成,在这里推荐大家使用DjangoUeditor,因为DjangoUeditor封装了我们需要的一 ...

  7. 「NOI.AC」Leaves 线段树合并

    题目描述 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为\(1\dots n\)的一个排列).可以任意交换每个非叶子节点的左右孩子. ...

  8. Problem Arrangement ZOJ - 3777(状压dp + 期望)

    ZOJ - 3777 就是一个入门状压dp期望 dp[i][j] 当前状态为i,分数为j时的情况数然后看代码 有注释 #include <iostream> #include <cs ...

  9. [Node.jS]shelljs

    shelljs : https://www.npmjs.org/package/shelljs 要给可以替代Unix下shell脚本的库. require('shelljs/global'); if ...

  10. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_引用类型和值类型(二)

    [引用类型和值类型的区别] //引用类型(由于使用了‘class’) class SomeRef { public Int32 x; } //值类型(由于使用了‘struct’) struct Som ...