大家眼中的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. ConfigParser简介

    一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类似于key-value 的配置 ...

  2. jquery easyui datagrid 多选只能获取一条数据

    DataGrid属性: singleSelect ------如果为true,则只允许选择一行: idField ------- 指明哪一个字段是标识字段: 方法: 一:getSelections-- ...

  3. 读取txt里面的数据进行计算

    双在论坛上找到一个问题,有关读取txt里面的数据进行计算的问题. 尝试解决这个问题,获取每一行的X和Y的浮点数据即可.读取文本文件每一行,判断是否为空行,是否符以分隔符号(,)分隔的两个数值.每个数值 ...

  4. Hadoop单机/伪分布式集群搭建(新手向)

    此文已由作者朱笑笑授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 本文主要参照官网的安装步骤实现了Hadoop伪分布式集群的搭建,希望能够为初识Hadoop的小伙伴带来借鉴意 ...

  5. Oracle复制表

    Oracle复制表分为只复制表结构或者结构和数据均复制两种: 只复制表结构 create table newTableName as select * from oldTableName where ...

  6. 5分钟构建无服务图片鉴黄web应用(基于FunctionGraph)

    函数工作流(FunctionGraph,FGS)是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行.即使在一些复杂的web应用场景中,函数工作流也能发挥出令人 ...

  7. 黑马MySQL数据库学习day01 MySQL8和MySQL5.5暴力破解密码

  8. .net mvc 框架实现后台管理系统

    原文: https://www.cnblogs.com/ymnets/p/3424309.html -->底层实现 https://www.layui.com/ -->UI实现

  9. eclipse字体

  10. import与from...import...的区别

    from ... import ... 的用法和直接import的区别: 1.直接使用import时,如果需要使用到导入模块内的属性和方法,必须使用模块名.属性和模块名.方法的方式进行调用 2.使用f ...