什么是springboot

在学springboot之前,你必须有spring、spring mvc基础,springboot的诞生其实就是用来简化新Spring应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

它集成了大量常用的第三方库配置(例如JDBC, Mongodb, Redis, Mail,rabbitmq等等),所以在Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

也就是说,以前集成ssm框架需要一大堆的xml配置文件,效率底下,而使用了springboot之后,很多时候我们不需要写任何配置了,有时候直接通过@EnableXXX就能开启某个模块的功能。

现在问题来了,你知道@EnableXXX是什么原理吗?

mvc、boot、cloud

这里直接引用网友的总结给大家介绍一下:

Spring 是一个“引擎”;springmvc是框架,web项目中实际运行的代码;spring boot只是一个配置工具,整合工具,辅助工具,是一套快速开发整合包。

Spring Boot :J2EE一站式解决方案 Spring Cloud :分布式整体解决方案

约定大于配置的体现

在于减少软件开发人员所需要做出的决定的数量,从而获得简单的好处,而又不失去其中的灵活性。

1、Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:/static /public /resources /META-INF/resources 优先级:META/resources > resources > static > public

2、spring boot默认的配置文件必须是,也只能是application或application-xxx命名的yml文件或者properties文件,我推荐尽量使用yml文件~

3、application.yml中默认属性:a、数据库连接信息必须是以spring: datasource: 为前缀,如:

b、多环境配置。该属性可以根据运行环境自动读取不同的配置文件。例如将该属性定义为dev的话,Spring Boot会额外从 application-dev.yml 文件中读取该环境的配置。

c、修改端口号、请求路径

4、starter启动器,开箱即用的Starter依赖让springboot可以实现零配置即可自动完成框架的整合。

  • spring-boot-starter-web

    • 嵌入tomcat和web开发需要servlet与jsp支持

  • spring-boot-starter-data-jpa

    • 数据库支持

  • spring-boot-starter-data-redis

    • redis数据库支持

  • spring-boot-starter-data-solr

    • solr支持

  • mybatis-spring-boot-starter

    • 第三方的mybatis集成starter

接下来我们来分析一下springboot注入bean有多少种方式。

手动装配

在学习springboot中,我喜欢把总结springboot的一些特性,以及使用springboot的一些规律,比如:在springboot加载bean的过程我分为了

  • 手动装配

  • 自动装配

两种方式,而手动装配又分为了

  • 模式注解装配

  • @Enable模块装配

  • 条件装配

3种方式,接下来我们来一一探讨每种。

首先来看下手动装配:

1、模式注解装配

其实就是使用@Component注解,或者@Component注解的拓展,比如@Controller、@Service、Repository、@Configruation等,

这也是我们最常用的一种方式,直接通过spring mvc的注解把组件bean注入到spring容器中。

2、@Enable模块装配

  • 基于接口驱动实现

当我们需要开启springboot项目的缓存功能时候,我们直接打开@EnableCaching注解就可以注入Caching 模块,这时候我们就可以开心使用@Cacheable、@CacheEvict等注解,这是怎么做到的?

其实你打开@EnableCaching的源码你就能看到:

上面最重要的一句代码就是@Import({CachingConfigurationSelector.class}),你会发现,其实使用@EnableCaching,就是为了导入CachingConfigurationSelector.class这配置类。

而这个CachingConfigurationSelector,其实实现了ImportSelector接口,ImportSelector接口是spring中导入外部配置的核心接口,只有一个方法selectImports,其实就是根据EnableCaching的元数据属性(proxyTargetClass、mode、order),选择出需要转配的Configuration。

总结其实是这样子,@EnableCaching其实就是根据元数据属性然后选择性条件判断注入需要的配置,比较灵活。

  • 基于注解驱动实现

然后我们来看另一种没有元数据属性的@EnableWebMvc。

可以很直观看到,其实@EnableWebMvc其实就是为了导入DelegatingWebMvcConfiguration配置类,某种程度上,可以认为@EnableWebMvc其实和@Import({DelegatingWebMvcConfiguration.class})是对等的,只是起了一个有意义的名字而已。

所以我们总结一下@EnableXXX模块注入,基于接口驱动实现是实现ImportSelector接口,通过注解参数选择需要导入的配置,而基于注解驱动实现其实就是@Import的派生注解,直接导入某个配置类。

思维导图总结如下:

3、条件装配

所谓条件装配,其实是Bean装配的前置条件,我们先来看一下例子:

  • @ConditionalOnBean

  • 仅仅在当前上下文中存在某个对象时,才会实例化一个Bean

  • @ConditionalOnExpression

  • 当表达式为true的时候,才会实例化一个Bean

  • @ConditionalOnMissingClass

  • 某个class类路径上不存在的时候,才会实例化一个Bean

  • @ConditionalOnNotWebApplication

  • 不是web应用

这就是条件装配,当这些条件注解放在某个bean上面的时候,只有满足了条件才能注入bean,这也是为什么springboot能这么智能,知道哪些模块需要开启,哪些不需要,比如当你导入Freemaker的jar包之后,就自动帮你加载Freemaker的的相关配置,其实你看下代码:

这些springboot的自动配置类上面一般是不是都有@ConditionalOnClass注解,这里是说当发现项目有freemarker.template.Configuration.class, FreeMarkerConfigurationFactory.class这两个Class存在时候,我就加载这个FreeMarkerAutoConfiguration,什么时候才会存在这两个Class?当我们导入jar包时候:

所以,当我们没有导入相关jar包时候,我们不用担心springboot会自动开启某些功能,而是会智能判断哪些需要开启,哪些需要跳过。

我们打开@ConditionalOnClass的源码,发现其实是@Conditional拓展出来的注解。

实现逻辑如下:OnClassCondition.class实现Condition接口,并实现matches()方法,如果matches方法返回true,那么带有@Conditional注解的bean就会装载,false就不会装载。

思维导图总结如下:

自动装配

ok,刚才我们已经说了很多关于手动装配部分的东西,现在我们来看下自动装配,其实很多时候自动装配就是手动装配的综合运用,只不过在转配bean或配置类时候,我们不在需要使用@EnableXXX来导入功能,而是通过自动注入方式。

这时候自动注入的条件判断(@Conditional)就显得非常重要了。

我们再用刚才说的Freemaker作为例子,springboot集成freemaker非常简单,只需要导入starter的jar包就会自动实现注入,这个自动集成就是FreeMarkerAutoConfiguration这里配置的。

这里有个问题,你知道为什么springboot会自动去判断和加载FreeMarkerAutoConfiguration这个配置类吗?我没有写类似的@EnableFreemaker,那项目怎么识别的。

其实如果你看过springboot的源码,你就会发现:

上面的意思是去扫描项目下所有的META-INF/spring.factories文件,然后把EnableAutoConfiguration.class作为key找出对应的值,这个值是个List。那么我们来看下其中一个spring.factories长什么样子的。

  • spring-boot-autoconfigure/2.1.2.RELEASE/spring-boot-autoconfigure-2.1.2.RELEASE.jar!/META-INF/spring.factories

  • 可以看到EnableAutoConfiguration作为key有很多个值,比如RabbitMq的自动配置类等,而你认证点看,就能找到FreeMarkerAutoConfiguration这配置类了。

    所以情况是这个的,当springboot项目启动时候,项目会去加载所有的spring.factories文件,然后在EnableAutoConfiguration后面的所有配置类其实都是可以实现自动装配的配置,至于需不需要装配,就需要条件装配来判定是否满足特定的条件了。

    有了这点基础之后,我们就可以自己去写自动装配了。

    第一步、编写需要自动装载的配置类。

    说明:@Configuration表示是个配置类 @ConditionalOnSystemProperty表示需要满足当前系统是win10系统

  • 第二步、在resources目录下新建META-INF文件夹,编写spring.factories。
  • 启动springboot之后就会自动加载这个配置类,于是,我们就注入了SayHelloWorld这个业务bean,项目中就可以直接注入使用啦~

    有人说,这和直接写个@Configruation有啥区别,区别在于@Configruation的配置必须写在Spring能扫描到的目录下,而自动装配不需要。

    思维导图总结如下:

好了,今天的内容先到这里了哈,后面我们会去用详细分析和代码实现@EnableXXX,还有自动装配,手写starter等。

导图梳理springboot手动、自动装配,让springboot不再难懂的更多相关文章

  1. 深入理解SpringBoot之自动装配

    SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提.其实它并不那么神秘,我在这之前已经写过最基本的实现了,大家可以参考这篇文章.这次主要的议题是,来看看它是怎么样实现的,我们透过源代码 ...

  2. SpringBoot:带你认认真真梳理一遍自动装配原理

    前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...

  3. SpringBoot:认认真真梳理一遍自动装配原理

    前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...

  4. 【springboot】自动装配原理

    摘自:https://mp.weixin.qq.com/s/ZxY_AiJ1m3z1kH6juh2XHw 前言 Spring翻译为中文是"春天",的确,在某段时间内,它给Java开 ...

  5. PMBOK项目管理思维导图梳理

    采用思维导图的形式来展示项目管理的五大过程组.九大知识领域,能更好的展示框架结构,便于理解.分析. 下图为思维导图化制的项目管理要素:灰色为启动过程组.白色为规划过程组.紫色为执行过程组.蓝色为监控过 ...

  6. 基于SpringBoot实现自动装配返回属性

    一:需求背景 在业务开发中经常会有这个一个场景,A(业务表)表中会记录数据的创建人,通常我们会用userId字段记录该数据的创建者,但数据的使用方会要求展示该数据的创建者姓名,故我们会关联用户表拿该用 ...

  7. C/C++ 字符串操作函数 思维导图梳理

    这些常用的字符串操作函数都是包在string.h头文件中. 分享此图,方便大家记忆 <(^-^)> 选中图片点击右键,在新标签页中打开图片会更清晰

  8. maven思维导图梳理

    图片可能稍微有点模糊,附上xmind下载地址: 补上面漏掉的Jetty,可以参照这位博主的博客

  9. SpringBoot学习之自动装配

    在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...

随机推荐

  1. Could not delete D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/platform/WEB-INF/lib

    再把之前的maven工程删掉时,出现了如下错误: Could not delete D:/workspace/.metadata/.plugins/org.eclipse.wst.server.cor ...

  2. Appium+python自动化(三十七)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 下(超详解)

    简介 接着上一篇继续看一下如何并发测试以及并发测试的过程中,可能遇到的问题,在这里宏哥把宏哥遇到的和小伙伴或者童鞋们,一起分享一下. Appium端口检测 问题思考 经过前面学习,我们已经能够使用py ...

  3. Webdriver元素定位的方法

    webdriver提供了8种元素定位方法: 1.id 2.name 3.tag name 4.class name 5.link text 6.partial link text 7.xpath 8. ...

  4. windows任务计划定时备份sqlserver数据库

    使用windows的任务计划新建一个sqlserver数据库的定时备份任务 一.      (我是以sqlserver2008r2数据库版本测试的)在G盘下新建文集夹Database_backup,首 ...

  5. windows下docker与.net core 的简单示例

    一 windows 下安装docker 二 .net core 项目 新建一个空的ASP.NET Core Web 应用程序 在该项目的目录下执行dotnet publish,可以看到在bin\Deb ...

  6. 脱离脚手架来配置、学习 webpack4.x (二)基础搭建loader 配置 css、scss

    序 上一篇已经把基本架子搭起来了,现在来增加css.scss.自动生成html.css 提前等方面的打包.webpack 默认只能处理js模块,所以其他文件类型需要做下转换,而loader 恰恰是做这 ...

  7. 离线环境下进行pip包安装

    内网服务器不能上网,但是需要在上面安装python-package 通过另外一台能上网的主机B 1. 下载需要离线安装的Packages 在B上执行如下命令: 安装单个Package $ pip in ...

  8. MySQL性能优化以及常用命令

    1.将查询操作SELECT中WHERE条件后面和排序字段建立索引 2.按需查询,需要哪个字段就查哪个字段,禁止使用"SELECT * " 3.数据库引擎最好选用InnoDB,少用M ...

  9. 转载:elastic5.x部署常见问题总结

    原博文名称:ElasticSearch 5.0.0 安装部署常见错误或问题 原博文地址为:http://www.dajiangtai.com/community/18136.do?origin=csd ...

  10. Jib构建镜像的问题分析(Could not find or load main class ${start-class})

    问题简述 通过Jib插件将SpringBoot工程制作成Docker镜像成功,但是运行镜像的时候报错(Could not find or load main class ${start-class}) ...