Spring 容器也叫 IoC 容器。
Spring 容器可以看作是 ApplicationContext 接口实例,有不同的实现类,容器初始化时会一次性创建所有的 Bean;BeanFactory 作为它的父接口,初始化时不会创建所有的 Bean,获取时按需创建 Bean。
Bean 相当于一个组件,其作用是实现某个特定的功能。
组件的生命周期管理、配置、之间的依赖交由容器管理,开发者只需关心组件的使用
Ioc 是一种设计思想,为的是设计出低耦合的程序。有了 IoC 容器后,创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
通过 @Scope 指定 Bean 的生命周期,容器默认创建的 Bean 是 singleton,指定 prototype 表示每次都获取一个新的 Bean,request 表示 Bean 的生命周期和在一次请求同步,session 表示 Bean 的生命周期和一次会话同步。
略
创建 Java 配置类来创建第三方的 Bean。
@Configuration (类上)加 @Bean (方法上),用到时可以和普通 Bean 一样注入。
提前配置 @ComponentScan(类上),容器会自动扫描带有 @Component,@Controller,@Service,@Repository 这四个注解的类。
容器将组件间的依赖关系注入组件之中。
下面的注入方式全部基于 Java 代码及注解。
@Autowired 为 Spring 自带的注解,默认按照类型进行注入,只能有一个类型匹配的 Bean;如果有多个类型符合的 Bean,则需要配合 @Qualifier 指定 Bean 的名称来表明注入的是哪个 Bean,此时 @Autowired 按照名称进行注入;或者在其中一个 Bean 上使用 @Primary 来优先使用这个 Bean。
@Resource 为 JDK 自带的注解,默认按照类型进行注入,出现多个类型匹配的 Bean 时,需要指定 Bean 的名称来表明注入的是哪个 Bean。
public class Foo {
private Bar bar;
// @Autowired 可省略
public void setBar(Bar bar) {
this.bar = bar;
}
...
}public class Foo {
private Bar bar;
// @Autowired 可省略
public Foo(Bar bar) {
this.bar = bar;
}
}public class Foo {
@Autowired
private Bar bar;
}AOP 的原理是动态代理,通过代理类将切面织入(Weaving)到业务类中,将常用方法从业务方法中剥离出来;具体来说,对接口类型使用 JDK 动态代理,对普通类使用 CGLIB 创建子类;使用注解来对方法、类装配切面,可以防止切面被装配到不必要的地方;访问注入的 Bean 时,总是调用方法而非访问字段,因为注入 Bean 的实际类型是代理类,CGLIB 创建的代理类不会初始化继承的成员变量,只会代理非 final 修饰的方法
Spring 不依赖 AOP 框架,Spring 集成了 AspectJ 来实现对 AOP 的支持。
@EnableAspectJAutoProxy 修饰配置类。
@Aspect 修饰切面类。
@Before、@Around、@After 指定切入点表达式来织入指定业务方法:根据类、方法名、参数列表、注解修饰。
Spring Boot 是一个基于 Spring 的套件,它帮我们预组装了 Spring 的一系列组件,以便以尽可能少的代码和配置来开发基于 Spring 的 Java 应用程序;Spring 只提供了一系列组件,不成架构体系,而 Spring Boot 提供了开箱即用的应用程序架构,基于 Spring Boot 的预置结构继续开发,省时省力。
基于自动配置和起步依赖,使用尽可能少的配置来快速构建应用。
提供了自动配置和注解扫描的功能
将指定类纳入容器管理
starter 是面向功能的,解决了对一个功能需要的依赖管理繁琐的问题,提供了一个功能需要的最小依赖
命名方式:xxx-spring-boot-starter
加载 META-INF/spring.factories 中 EnableAutoConfiguration 注解对应的配置类。
-
引入
spring-boot-autoconfigure -
结合条件注解
@ConditionalOnXxx、自动配置加载顺序注解@AutoConfigureBefore等编写配置类 -
在
META-INF/spring.factories中声明配置类全路径
微服务是将一个应用按功能/业务进行拆分成一些相对内聚的服务。
分布式可以是将不同的微服务部署在一台/多台服务器上,也可以是将一个应用部署在多台服务器上,通过负载均衡服务来分担访问压力。
依赖 [Spring Boot](#Spring Boot),提供了一系列开箱即用的组件来构建分布式系统中的通用模式:服务注册与发现、服务熔断与降级、服务配置、服务网关、服务链路追踪。
消息队列,生产者发送消息给 MQ,消费者从 MQ 获取消息。主要解决三个方面的问题:
- 解耦
当前应用的接口调用了多个系统的接口,又不需要知道其他接口的返回结果时;当前应用只需要生产消息,其他系统从 MQ 中消费,从而与其他系统解耦
- 异步
同步高延时请求场景:将原本同步调用多系统互不相关的操作改为向多个 MQ 发消息,其他系统从各自 MQ 中消费,达到异步效果
- 削峰
将高峰期的 QPS(Query Per Second)先发到 MQ,系统再根据自身性能处理,避免直接崩溃,高峰期一过,再处理积压的消息
不过,MQ 的加入也会导致一些问题,比如当前应用调用多系统接口,当前应用返回成功了,但不清楚其他系统的调用结果,可能导致数据不一致