Spring Boot 最核心的 3 个注解详解

最近面试一些 Java 开发者,他们其中有些在公司实际用过 Spring Boot, 有些是自己兴趣爱好在业余自己学习过。然而,当我问他们 Spring Boot 最核心的 3 个注解是什么,令我失望的是鲜有人能答上来,这样你能说你对 Spring Boot 很了解吗?这可能还会给你减分!

你所需具备的基础

·什么是 Spring Boot?

·Spring Boot 核心配置文件详解

·Spring Boot 开启的 2 种方式

·Spring Boot 自动配置原理、实战

·Spring Boot 2.x 启动全过程源码分析

更多请在Java技术栈微信公众号后台回复关键字:boot。

Spring Boot 核心注解讲解

Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置。

所以Spring Boot 最核心的 3 个注解就是:

1、@Configuration

org.springframework.context.annotation.Configuration

这是Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。

下面几个相关注解也是非常重要的!

@Bean

用来代替 XML 配置文件里面的bean ...配置。

@ImportResource

如果有些通过类的注册方式配置不了的,可以通过这个注解引入额外的 XML 配置文件,有些老的配置文件无法通过@Configuration方式配置的非常管用。

@Import

用来引入额外的一个或者多个@Configuration修饰的配置文件类。

@SpringBootConfiguration

这个注解就是@Configuration注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展,源码如下。

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Configuration

public @interface SpringBootConfiguration {

}

2、@ComponentScan

org.springframework.context.annotation.ComponentScan

这是Spring 3.1 添加的一个注解,用来代替配置文件中的component-scan配置,开启组件扫描,即自动扫描包路径下的@Component注解进行注册 bean 实例到context 中。

另外,@ComponentScans是可重复注解,即可以配置多个,用来配置注册不同的子包。

3、@EnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration

看全路径就知道,这是自 Spring Boot 诞生时添加的注解,用来提供自动配置,上面的两个都是spring-context包下的,不属于 Spring Boot,所以 Spring 3.0 之后的去 XML 配置方式已经为 Spring Boot 埋下了伏笔!

最后的彩蛋

Spring Boot 最核心的 3 个注解介绍完了,大家可能会有疑问,为什么最主要的注解@SpringBootApplication不在其中?

留给大家的彩蛋,其实这个@SpringBootApplication注解就包含了以上 3 个主要注解,平时没有自定义配置的需求,则使用@SpringBootApplication注解完全就可以了!

让我们来看下@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 {

...

}


看完涨姿势了吗?

点赞转发一下吧,以后碾压面试官!


转载于:https://juejin.im/post/5bc5a938f265da0ab873aa3c