zoukankan      html  css  js  c++  java
  • spring boot基本认识

      大家眼中的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来加深理解

  • 相关阅读:
    如何一键部署项目&&代码自动更新
    Node服务端极速搭建 - nvmhome
    Node服务端极速搭建 -- nvmhome
    自动生成了一本ES6的书
    在linux中给你的应用做压力测试
    .NET 跨平台服务端资料
    CabArc to create or extract a cab file
    (转)什么时候要抛出异常?
    Sprint评审会议不是Sprint演示会议
    Sprint回顾大揭秘——“宝典”来了
  • 原文地址:https://www.cnblogs.com/nevermorewang/p/9053504.html
Copyright © 2011-2022 走看看