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来加深理解
spring boot基本认识的更多相关文章
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)
Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...
- 玩转spring boot——开篇
很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...
- 玩转spring boot——结合redis
一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...
- 玩转spring boot——AOP与表单验证
AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 玩转spring boot——结合AngularJs和JDBC
参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...
- 玩转spring boot——结合jQuery和AngularJs
在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 玩转spring boot——MVC应用
如何快速搭建一个MCV程序? 参照spring官方例子:https://spring.io/guides/gs/serving-web-content/ 一.spring mvc结合thymeleaf ...
随机推荐
- C# 快速排序--二分查找法--拉格朗日插值法
1.快速排序 参考自: https://www.cnblogs.com/yundan/p/4022056.html namespace 快速排序算法 { class Program { static ...
- Kali Linux介绍篇
Kali Linux 官网:https://www.kali.org/ Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Linux 发行版,包含很多安全 ...
- cin、cout、cerr、clog------c++ Primer Plus
cin对象与标准输入流相对应. cout对象与标准输出流相对应. cerr对象与标准错误流相对应,常用于程序错误信息,不缓冲,直接被发送给屏幕. clog对象也对应标准错误流(这点儿和cerr是一样的 ...
- eclipse - 链接hadoop
插件: 配置:Map/Reduce Location 问题:An internal error occurred during: "Map/Reduce location status up ...
- Educational Codeforces Round 60 (Rated for Div. 2)D(思维,DP,快速幂)
#include <bits/stdc++.h>using namespace std;const long long mod = 1e9+7;unordered_map<long ...
- 从零开始安装 Ambari (4) -- 通过 Ambari 部署 hadoop 集群
1. 打开 http://192.168.242.181:8080 登陆的用户名/密码是 : admin/admin 2. 点击 “LAUNCH INSTALL WIZARD”,开始创建一个集群 3 ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
- webpack 的使用教程
webpack 的使用教程 今天接触webpack,就着官网上的教程一步一步的玩,把自己的理解总结以便和大家交流 webpack的主要特点 1. 可以把js,css,image,甚至文本当成模块来处理 ...
- socket套接字基本概念
int socket()函数创建的是套接字socket,返回的是socket描述符(套接字描述符),其实就是文件描述符,socket(套接字)其实就是文件 socket()创建了套接字(文件),只是开 ...
- C++基础学习5:强制类型转换
在C++语言中新增了四个关键字static_cast.const_cast.reinterpret_cast和dynamic_cast.这四个关键字都是用于强制类型转换的.我们逐一来介绍这四个关键字. ...