启动类相关注解
项目中的启动类
@SpringBootApplication 背后到底是什么?
@SpringBootApplication注解实际上是SpringBoot提供的一个复合注解,看源码:
很清楚,其是一个合成体,但其中最重要的三个注解分别是:
-
@SpringBootConfiguration
-
@EnableAutoConfiguration
-
@ComponentScan
如果不怕麻烦,在 SpringBoot 应用的启动类上用这个三个注解代替@SpringBootApplication 注解发现也是没问题的:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class TestSpringBootApplication {
...
}
@SpringBootConfiguration
这说明 @SpringBootConfiguration 也是来源于 @Configuration,二者功能都是将当前类标注为配置类,并将当前类里以 @Bean 注解标记的方法的实例注入到srping容器中,实例名即为方法名。
至于@Configuration,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置类所使用。
@EnableAutoConfiguration
@EnableAutoConfiguration 注解启用自动配置,其可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 IoC 容器之中,可以简要用图形示意如下:
从宏观一点的角度 概括总结 上述这一过程那就是:
从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories 文件中的 EnableAutoConfiguration 对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC容器配置类,然后注入IoC容器。
@ComponentScan
@ComponentScan 对应于XML配置形式中的 <context:component-scan>,用于将一些标注了特定注解的bean定义批量采集注册到Spring的IoC容器之中,这些特定的注解大致包括:
- @Controller
- @Entity
- @Component
- @Service
- @Repository
等等
对于该注解,还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:
@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})
此部分参考此文章https://www.jianshu.com/p/9dc7a385d19e --@SpringBootApplication注解背后的三体结构探秘
此部分参考文章:
一个面试题引起的SpringBoot启动解析 - 掘金-----很不错
Spring容器启动流程(源码解读) - 掘金---果然很源码,看着很懵
SpringBoot 应用程序启动过程探秘 - 掘金---细致总结
SpringBoot 中启动 Tomcat 流程 - 掘金---Tomcat相关
从Spring启动过程来理解IoC、AOP和bean的生命周期 - 掘金----宏观学习
@Configuration
由于上面的@SpringBootConfiguration注解底层主要使用的是@Configuration,那么,再来深入理解下@Configuration。
JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。
@Configuration的主要目的是搭配@Bean注解替代XML配置文件来向Spring容器注入Bean
任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
可以看到@Configuration的底层是@Component,但是两者又有不同
@Configuration和@Component的区别是什么?
这两个注解都是配置类注解,作用于类上,申明该类为组件。不同之处在于:
1、@Component是一个元注解,可以注解其他类注解。@Configuration注解里面也是被@Component注解修饰的。
2、bean设置的类属性不同。
- 如果是 @Configuration 并且属性 proxyBeanMethods 为 true(默认的),则为 full
- 如果是 @Component @ComponentScan @Import @ImportSource 则为 lite
3、返回bean实例不同。
- @Configuration 注解修饰的类,并且该注解中的 proxyBeanMethods 属性的值为 true(默认的),则会使用cglib动态代理,为这个 bean 创建一个代理类,该代理类会拦截所有被 @Bean 修饰的方法,在拦截的方法逻辑中,会从容器中返回所需要的单例对象。
- @Component 注解修饰的类,则不会为这个 bean 创建一个代理类。 那么我们就会直接执行用户的方法,所以每次都会返回一个新的对象。
Spring注解中@Configuration、@Component、@Bean的用法区别 - 掘金
此部分参考的好文
一个面试题引起的SpringBoot启动解析 - 掘金-----有一部分参考
原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration - 掘金----这篇最棒
Spring注解中@Configuration、@Component、@Bean的用法区别 - 掘金
Spring中@Component和@Configuration的区别 - 掘金
SpringApplication.run做了哪些事?
SpringApplication.run
一共做了两件事,分别是
-
创建
SpringApplication
对象 -
利用创建好的
SpringApplication
对象,调用run
方法
1.创建SpringApplication
对象
这个类中封装了程序的入口
2.调用run
方法
【肥朝】面试官问我,SpringApplication.run做了哪些事? - 掘金-----简单理解版
SpringBoot 应用程序启动过程探秘 - 掘金----深入理解版
总结:
SpringApplication.run一共做了两件事,一件是创建SpringApplication对象,在该对象初始化时,找到配置的事件监听器,并保存起来.第二件事就是运行run方法,此时会将刚才保存的事件监听器根据当前时机触发不同的事件,比如容器初始化,容器创建完成等.同时也会刷新IoC容器,进行组件的扫描、创建、加载等工作.
42. 你如何理解 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
43. Spring Boot Starter 的工作原理是什么?
Spring Boot 在启动的时候会干这几件事情:
- Spring Boot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
- 根据 spring.factories 配置加载 AutoConfigure 类
- 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context
总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可
Spring总体
Spring Bean生命周期,好像人的一生。。 - 掘金
Spring IOC详解及Bean生命周期详细过程,看完直接吊打面试官! - 掘金
@EnableRedisHttpSession
@Bean
异常处理相关注解
@ControllerAdvice
Spring进阶之@ControllerAdvice与统一异常处理 - 掘金
@ControllerAdvice到底是怎么一回事? - 掘金
@ExceptionHandler
SpringBoot源码解析-ExceptionHandler处理异常的原理 - 掘金
@ResponseBody
RequestBody和ResponseBody踩坑 - 掘金
@RequestParam
常见的接口请求类型和@RequestBody、@RequestParam的使用 - 掘金
@Controller
Spring注解之@Component、@Controller、@Service、@Repository - 掘金
@RequestMapping
超详细 Spring @RequestMapping 注解使用技巧 - 掘金
@CrossOrigin
springMVC跨域请求@CrossOrigin - 掘金
@Autowired
Spring为啥不推荐使用@Autowired注解? - 掘金
你还在用@Autowired和@Resource? - 掘金
@PostConstruct
深入理解Spring IOC之扩展篇(三)、InitializingBean、@PostConstruct、SmartInitializingSingleton - 掘金
@Service
@Autowired、@Resource、和@Service注解详解 - 掘金
@Transactional