目录导航
前言
前面的章节我们讲了源码分析专题,分布式专题,工程专题。从本节开始,进入微服务专题的讲解,共计16小节,分别是:
- 微服务专题01-Spring Application
- 微服务专题02-Spring Web MVC 视图技术
- 微服务专题03-REST
- 微服务专题04-Spring WebFlux 原理
- 微服务专题05-Spring WebFlux 运用
- 微服务专题06-云原生应用(Cloud Native Applications)
- 微服务专题07-Spring Cloud 配置管理
- 微服务专题08-Spring Cloud 服务发现
- 微服务专题09-Spring Cloud 负载均衡
- 微服务专题10-Spring Cloud 服务熔断
- 微服务专题11-Spring Cloud 服务调用
- 微服务专题12-Spring Cloud Gateway
- 微服务专题13-Spring Cloud Stream (上)
- 微服务专题14-Spring Cloud Bus
- 微服务专题15-Spring Cloud Stream 实现
- 微服务专题16-Spring Cloud 整体回顾
本节内容重点为:
- 自定义 SpringApplication:介绍
SpringApplication
与SpringApplicationBuilder
的API调整 - 配置 Spring Boot 源:理解 Spring Boot 配置源
- SpringAppliation 类型推断:Web 应用类型、Main Class 推断
- Spring Boot 事件:介绍 Spring Boot 事件与 Spring Framework 事件之间的差异和联系
自定义 SpringApplication
如图所示,在官网上快速搭建一个 SpringBoot 项目,通常把它称为 SpringBoot 的脚手架。
最简单的SpringBoot项目也会包括SpringApplication启动类,所以通常我们将SpringApplication作为一切的起点,首先看看这个类是如何定义的
SpringApplication
的详细讲解
展开刚才我们通过脚手架创建的代码,直接查看启动类:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这就是最简化版本的 SpringBoot 启动类,这里有两个地方值得我们注意:
一个是类 SpringApplication
,另外一个是注解 @SpringBootApplication
。
Q: 什么是 SpringApplication
?
A: SpringApplication
是 Spring Boot 驱动 Spring 应用上下文的引导类。
Q:怎么理解注解 @SpringBootApplication
?
A:直接查看此注解的源码,源码如下:
/**
* @since 1.2.0
*/
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
这里有三个注解值得注意:
@ComponentScan
是用于定义扫描的路径,从中找出标识了需要装配的类自动装配到 Spring 的 Bean 容器中。@EnableAutoConfiguration
是激活自动装配,用于自动载入应用程序所需的所有 Bean。@SpringBootConfiguration
用于标注当前类是配置类,并会将当前类内声明的一个或多个以@bean
注解标记的方法的实例纳入到 Spring 容器中,它与@Configuration
,在功能上是一致的。
Q: 如何理解 @Component
的“派生性”?
A:@Component
是用来把普通 pojo 实例化到 Spring 容器中,相当于配置文件中的<bean id="" class=""/>
,通常我们将 @Component
称之为元注解,所谓的派生性指的是以元注解为基准,其他注解再次调用元注解而产生的派生。
Spring 注解编程模型
推荐一篇关于 Spring 注解编程模型的 Wiki。
这里再看一下在 SpringBoot 常见的注解,诸如 @Service
、@Repository
、@Controller
、@Configuration
。在 Spring 源码里,其实都是引入了 @component
,作为这些注解的元注解。
@component
:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
-
@Service
:用于标注业务层组件。@Component public @interface Service { ... }
-
@Repository
:用于标注数据访问组件,即 DAO 组件。@Component public @interface Repository { ... }
-
@Controller
:用于标注控制层组件。@Component public @interface Controller { ... }
-
@Configuration
:允许通过调用同一类中的其他@Bean
方法来定义 Bean 之间的依赖关系。@Component public @interface Configuration { ... }
Spring 模式注解:Stereotype Annotations
所谓的模式注解:@component
逻辑上与@Service
、@Repository
、@Controller
、@Configuration
都是一样,只是物理层面上不同,但都是为了找到BeanDefinition。
Spring 注解驱动示例
区别于ClassPathXmlApplicationContext
以xml配置文件驱动,注解驱动的上下文是 AnnotationConf