测试

SpringBoot核心原理:自动配置

2018-02-25 java4all java4all

摘要:本文通过断点追溯源码的方式,来逐步展示SpringBoot的核心功能实现原理:自动化配置;

由于是分析源码,贴出了一些源码,所以文章较长,但关键都是在文字上,可以跳着看;

本文较长,分为两篇,但主要内容如下:

分析@SpringBootApplication源码;

分析@EnableAutoConfiguration源码;

分析AutoConfigurationImportSelector类中的部分方法(这个是关键);

(由于篇幅,我会删除很多无用代码,但不代表此类没有这些代码,如大量的import xxx.xxx.xxx等代码)

  1. 新建一个普通的SpringBoot项目,然后随便加几个注解,后面会提到这几个注解,代码如下:
package com.jd;

@EnableAsync
@RestController
@EnableScheduling
@SpringBootApplication
public class JdmallApplication {

public static void main(String[] args) {
      SpringApplication.run(JdmallApplication.class, args);
   }

@RequestMapping(value = "getHello",method = RequestMethod.GET)
public String getHello(){
return "good";
   }
}

2.我们知道SpringBoot的入口是:@SpringBootApplication,我们进入这个注解,看看源码:

package org.springframework.boot.autoconfigure;

@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 {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class,
        attribute = "excludeName"
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

公众号来源:java4all

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java---通过属性名反射获取get和set方法

    最近有此需求:拿到name,需要执行setName()方法,这里记录一下,可以当做工具类直接使用:

    IT云清
  • HashMap和HashTable的区别和联系

    线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问某个数据时,进行加锁保护,其他线程不能进行访问,直到该线程任务结束,其他线程才可使用。不会出现数据不一...

    IT云清
  • SpringCloud教程(Finchley版本)-01:服务注册与发现(Eureka)

    新建一个SpringBoot项目eureka_server,作为注册中心,后续的其他项目,都注册在这个注册中心上面。

    IT云清
  • 还在纠结 Flux 或 Relay,或许 Redux 更适合你

    时见疏星
  • SASS第十篇 层级结构

    用户7873631
  • 「前端架构」Redux vs.MobX的权威指南

    大型应用程序的前端管理是最难解决的问题之一。虽然有几种方法可以解决状态管理问题,但Redux和MobX是两个最流行的外部库,用于解决前端应用程序中的状态管理问题...

    首席架构师智库
  • C++、Java语法差异对照表

    C++ and Java Syntax Differences Cheat Sheet

    Enjoy233
  • 几种水平垂直居中的方法

    用户3836409
  • 五年之后的回顾--磊科路由器后门利用情况分析

    磊科路由器后门是由趋势科技的安全研究人员[1]在2014年发现的,当时给出的暴露数量在200万台以上。在5年后的今天,我们的威胁捕获系统每天依旧可以捕获到对于该...

    绿盟科技研究通讯
  • 基于xmpp聊天室实现,国外牛人作品

    XMPP的官网:http://xmpp.org/ 测试帐号注册:https://register.jabber.org PC端下载地址注册之后就会看到下载地址 ...

    xiangzhihong

扫码关注云+社区

领取腾讯云代金券