zoukankan      html  css  js  c++  java
  • 一步步学习SpringBoot(二) @EnableAutoConfiguration

    适应读者

    • 前端工程师(java系的公司)
    • 前端架构师(java系的公司)
    • java工程师
    • 测试工程师(java系的公司)
    • 全栈工程师

    回顾

      上篇文章我们熟悉了SpringBoot的开发环境并且通过几行代码发布了一个web服务,相信大家已经对SpringBoot有了一个基本的了解,很多同学看了上篇文章私信我,大部分是惊讶SpringBoot简洁高效的同时又担心如果在公司使用它会有怎样的成本与风险,SpringBoot是 spring.io这几年推广的重点,而且现在流行的SpringCloud解决的是以SpringBoot单个服务应用为基础的多个微服务治理与整合的问题,SpringBoot在复用SpringMVC诸多特性的同时解决了SpringMVC配置繁琐的问题,所以熟悉SpringMVC的同学能快速地过渡到SpringBoot,而不熟悉SpringMVC的同学也可以直接跳过SpringMVC直接学习SpringBoot,本篇我们会给大家介绍SpringBoot的默认配置是怎么玩的。

    先看看Main Class的注解@SpringBootApplication

      细心的同学应该能记得main class的注解是@SpringBootApplication ,可以查下它的源代码

      

     在这里我们可以看到

    @SpringBootApplication 里面几个重要的注解  @EnableAutoConfiguration @ComponentScan

    @EnableAutoConfiguration:

    这个注解可以自动载入应用程序所需要的所有Bean,我们继续查看源代码

    看到最重要的一个是@Import(EnableAutoConfigurationImportSelector.class),该类继承了AutoConfigurationImportSelector,仔细读了下AutoConfigurationImportSelector的源代码,

     读到重点,我们会通过SpringFactoriesLoader去查询META-INF/spring.factories文件,spring应该通过spring.factories来初始化里面对应类,继续好奇,在github上很方便可以查到。https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories,部分截图如下:

    在这里可以很清楚的看到@EnableAutoConfiguration其实是引入了spring.factories里面的所有配置,这些配置就是SpringBoot实现最亮点的地方:规约大于配置:这些配置的实现类大都定义了默认值,从而让开发同学只用去关心自己想配置的部分,这里我们再继续好奇下去选列表中的一个自动配置类RedisAutoConfiguration看下,从命名来看应该是redis的配置。

     

    这里@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集,这个POJO就是RedisProperties.class,我们继续看下这个类做了什么事情,看看部分代码截图,

    看到这里我们就懂了,这里面@ConfigurationProperties是将pojo的属性关联到前缀“spring.redis”, 这是比较好的开发方式,后续如果自定义的配置我们也可以效仿这种做法,整体将这个类映射到application.properties就会类似:

         spring.redis.database =0,

                  spring.redis.port = 6379,

    以上这些都是SpringBoot的默认配置, 如果我们想改成实际的配置,我们只用在resource/application.properties里面设置spring.redis.port =【新的端口】即可。

    总结

    我们通过了一系列的源码分析终于知道了@EnableAutoConfiguration是怎么运作的了,其实是这个注解去查询META-INF/spring.factories,这里面列出了所有的SpringBoot的默认配置,包含了server,dao,data,aop等等所有web应用需要用到的特性,并且将这些特性对应的pojo自动映射到application.properties上,在这次源码分析中我们不断了解了SpringBoot的自动配置运作原理,还从这些源代码学习到了很多的开发技巧,也许有些同学觉得源代码有些枯燥,但这是我向推荐大家的一种新技术学习方法,先学会怎么使用,再通过源代码来深入了解它的运作机制,这样既可以加深你对它的了解更能驾驭它,你也能在牛人的源代码里面学到很多开发技巧,也许有一天你也能开发一个框架贡献给千万开发者使用。

    如想了解更多技术,请关注我的微信公众号。

     

          

       

  • 相关阅读:
    JDK9对集合添加的优化
    IO异常的处理
    动态创建分页 LINQ+EF
    TypeError at /admin/booktest/book_infor/add/ __str__ returned non-string (type bytes)
    TypeError at /admin/booktest/bookinfo/ expected string or buffer
    linux下的 pycharm 2016.3d的注册码
    解决ubantu下的pycharm输入中文的问题
    .pip的时候出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))…………
    Day06
    Day05
  • 原文地址:https://www.cnblogs.com/fang9159/p/6622007.html
Copyright © 2011-2022 走看看