二三事

“みんなみんな大好き!”

0%

Spring、SpringMVC与Spring Boot

文前提示:如果移动端访问时未显示侧栏,可点击左侧按钮以查看侧栏目录。

这篇文档仅仅是我自己的笔记。比如,我会整理 Spring 的常见注解,但并不会对注解本身做进一步解释,只起目录与导航的作用——因为这些内容的详情在官方文档中可以很轻松地查到。但譬如 Bean 的生命周期,我则会重点分析并记录。

Spring

IoC与DI

常用注解、接口

  • @Configuration

  • @ComponentScan@Import

  • @Bean

  • @Component

    • @Controller@RestController),@Service@Repository
  • @Scope

  • @Lazy

  • 接口 FactoryBean

  • @Conditional、接口 Conditional 及一系列派生注解

    • @Profile

    Spring Boot 如此强大,最主要的原因就是其在底层广泛而灵活地使用了 @Conditional。如果说最初基于 XML 配置的 Spring 设计哲学是配置优于代码,那么后来基于注解的 Spring 为我们大幅减少甚至几乎完全消灭了冗长繁琐的 XML 配置,而 Spring Boot 在这基础上更进一步,通过让约定优于配置,让一个刚入门的开发者也能够轻松上手。

  • @Autowired@Resource

    在源码中,@Autowired 实际上是由 AutowiredAnnotationBeanPostProcessor 实现的,这是一个专门用于处理 @Autowired 的一种特殊的 BeanPostProcessor,在每个 Bean 或组件被创建后调用其特殊的 postProcessProperties 方法或 postProcessBeforeInitialization 方法,通过反射分析目标 Bean 的全部注解、字段、方法、构造器等等,然后对具有 @Autowired 注解修饰的对象尝试在容器中进行匹配,如果匹配成功则注入依赖。

  • @Qualifier@Primary

  • 接口 ...Aware

  • @Value

  • @PropertySource

  • 接口 InitializingBeanDisposableBean

  • @PreConstruct@PreDestory

  • 接口 BeanPostProcessor

生命周期

Bean 生命周期:

  1. 初始化容器自身,加载配置类、解析元数据,随后初始化、创建 Bean;
  2. 创建阶段,在创建的过程中容器调用被初始化 Bean 的构造器,在这一阶段中待被依赖对象进入运行阶段后,被 @Autowired@Resource 修饰的对象由容器为其进行依赖注入(这里可能触发递归初始化);
  3. 初始化阶段及其前置、后置拦截处理,优先初始化 BeanPostProcessor,接着是其他 Bean 与组件:
    • 一个配置类中若显式注册了被 @Bean 修饰、返回类型为 BeanPostProcessor 的方法,且该方法应返回一个重写了 postProcessBeforeInitialization 方法的 BeanPostProcessor 类的一个实例(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用 postProcessBeforeInitialization 方法,而且 BeanPostProcessor 方法自身虽然被 @Bean 修饰但会被容器特殊对待,不会被其他 BeanPostProcessor 处理;
    • 初始化阶段,流程为:
      1. 若返回类具有被 @PostConstruct 修饰的方法,则调用该方法;
      2. 若返回类实现了接口 InitializingBeanafterPropertiesSet 方法,则调用该方法;
      3. 调用 @Bean 注解的属性 initMethod 所指定的方法,该方法可以在其他类中;
    • 一个配置类中若显式注册了被 @Bean 修饰、返回类型为 BeanPostProcessor 的方法,且该方法应返回一个实现了 postProcessAfterInitialization 方法的 BeanPostProcessor 类的一个实例(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用 postProcessAfterInitialization 方法,而且 BeanPostProcessor 方法自身虽然被 @Bean 修饰但会被容器特殊对待,不会被其他 BeanPostProcessor 处理。
  4. 运行阶段;
  5. 销毁阶段:
    • 若返回类具有被 @PreDestory 修饰的方法,则调用该方法;
    • 若返回类实现了接口 DisposableBeandestroy 方法,则调用该方法;
    • 调用 @Bean 注解的属性 destroyMethod 所指定的方法,该方法可以在其他类中;
    • 销毁容器自身。

Component 生命周期:

  1. 初始化容器自身,加载配置类、解析元数据,随后初始化、创建组件;
  2. 创建阶段,在创建的过程中容器调用被初始化组件的构造器,在这一阶段中待被依赖对象进入运行阶段后,被 @Autowired@Resource 修饰的对象由容器为其进行依赖注入(这里可能触发递归初始化);
  3. 初始化阶段及其前置、后置拦截处理,优先初始化 BeanPostProcessor,接着是其他 Bean 与组件:
    • 一个组件若实现了接口 BeanPostProcessor 的方法 postProcessBeforeInitialization(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用 postProcessBeforeInitialization 方法;
    • 初始化阶段,流程为:
      1. 调用组件中被 @PostConstruct 修饰的方法;
      2. 调用被组件实现的接口 InitializingBeanafterPropertiesSet 方法;
    • 一个组件若实现了接口 BeanPostProcessor 的方法 postProcessAfterInitialization(注册至容器),则后续创建的所有 Bean 与组件均会在这一步调用 postProcessAfterInitialization 方法。
  4. 运行阶段;
  5. 销毁阶段:
    • 调用组件中被 @PreDestory 修饰的方法;
    • 调用被组件实现的接口 DisposableBeandestroy 方法;
    • 销毁容器自身。

AOP

SpringMVC

Spring Boot