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来加深理解