SpringBoot实现原理

SpringBoot源码刨析

Map接口的基于哈希表的实现。

主要优势

  • 不依赖传统的tomcat外部启动容器,不像一起通过打成war进行部署。可以单独以jar启动内置tomcat,jetty容器。
  • 利用pom文件配置三方依赖,便于管理及引用。
  • 利用注解直接引用方法配置

SpringBoot核心注解

@SpringBootApplication

@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)
Class<?>[] exclude() default {};

/**
* 排除特定的自动配置类名称,以便它们永远不会被应用。
* 返回:
* 要排除的类名
* 自从:
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};

/**
* 用于扫描带注释组件的基本包。 使用scanBasePackageClasses作为基于字符串的包名称的类型安全替代方案。
* 注意:这个设置只是@ComponentScan的别名。 它对@Entity扫描或 Spring Data Repository扫描没有影响。 对于那些你应该添加@EntityScan@Enable...Repositories注释的人。
* 返回:
* 要扫描的基本包
* 自从:
* 1.3.0
*/
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};

/**
* scanBasePackages类型安全替代方案,用于指定要扫描带注释组件的包。 将扫描指定的每个类的包。
* 考虑在每个包中创建一个特殊的无操作标记类或接口,除了被此属性引用外,没有其他用途。
* 注意:这个设置只是@ComponentScan的别名。 它对@Entity扫描或 Spring Data Repository扫描没有影响。 对于那些你应该添加@EntityScan@Enable...Repositories注释的人。
* 返回:
* 要扫描的基本包
* 自从:
* 1.3.0
*/
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}

其中比较重要的注解有@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解非常重要

@SpringBootConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

@Configuration注解是用来读取spring.factories文件
@EnableAutoConfiguration注解具有配置的功能,两则有什么区别?

@EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

}

@EnableAutoConfiguration注解使用的是自动配置机制,是自动导入。
例如:在pom引入maven包,class自动import。

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.5</version>
</dependency>

class中自动import.

import cn.hutool.json.JSONUtil;

@ComponentScan
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {

}

@ComponentScan的作用是告诉spring那个包下面的类用这个@Component注解,则会被spring自动扫描并且注入到bean容器。

文章作者: 陈 武
文章链接: http://www.updatecg.xin/2020/12/15/SpringBoot/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的学习记录
打赏
  • 微信
  • 支付寶

评论