深入理解Spring源码之bean的生命周期控制器BeanPostProcessor

简介: 深入理解Spring源码之bean的生命周期控制器BeanPostProcessor

spring是借助ioc容器进行bean的初始化的,ioc的概念如下:

 

1、bean的生命周期

  bean创建---初始化----销毁的过程

 容器管理bean的生命周期;

我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法

 

 构造(对象创建)

         单实例:在容器启动的时候创建对象

         多实例:在每次获取的时候创建对象

BeanPostProcessor.postProcessBeforeInitialization

初始化:

        对象创建完成,并赋值好,调用初始化方法。。。

 BeanPostProcessor.postProcessAfterInitialization

销毁:

        单实例:容器关闭的时候

        多实例:容器不会管理这个bean;容器不会调用销毁方法

 

Spring对外提供可使用的bean的初始化方式:

1)、指定初始化和销毁方法;

         通过@Bean指定init-method和destroy-method;

2)、通过让Bean实现InitializingBean(定义初始化逻辑),

                 DisposableBean(定义销毁逻辑);

package com.atguigu.bean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
@Component
public class Cat implements InitializingBean,DisposableBean {
  public Cat(){
    System.out.println("cat constructor...");
  }
  @Override
  public void destroy() throws Exception {
    // TODO Auto-generated method stub
    System.out.println("cat...destroy...");
  }
  @Override
  public void afterPropertiesSet() throws Exception {
    // TODO Auto-generated method stub
    System.out.println("cat...afterPropertiesSet...");
  }
}

3)、可以使用JSR250;

4)、BeanPostProcessor【interface】:bean的后置处理器;

        在bean初始化前后进行一些处理工作;

        postProcessBeforeInitialization:在初始化之前工作

        postProcessAfterInitialization:在初始化之后工作

@ComponentScan("com.atguigu.bean")
@Configuration
public class MainConfigOfLifeCycle {
  //  多实例:容器不会管理这个bean;容器不会调用销毁方法
  @Scope("prototype")
  @Bean(initMethod="init",destroyMethod="detory")
  public Car car(){
    return new Car();
  }
}
package com.atguigu.bean;
import org.springframework.stereotype.Component;
@Component
public class Car {
  public Car(){
    System.out.println("car constructor...");
  }
  public void init(){
    System.out.println("car ... init...");
  }
  public void detory(){
    System.out.println("car ... detory...");
  }
}

 

package com.atguigu.test;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.atguigu.config.MainConfigOfLifeCycle;
public class IOCTest_LifeCycle {
  @Test
  public void test01(){
    //1、创建ioc容器
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
    System.out.println("容器创建完成...");
    //applicationContext.getBean("car");
    //关闭容器
    applicationContext.close();
  }
}

2、BeanPostProcessor 初始化bean的示意图:

3、Spring底层对 BeanPostProcessor 的使用

        bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,

 

BeanPostProcessor的实现类

举个例子:

package com.atguigu.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class Dog implements ApplicationContextAware {
  //@Autowired
  private ApplicationContext applicationContext;
  public Dog(){
    System.out.println("dog constructor...");
  }
  //对象创建并赋值之后调用
  @PostConstruct
  public void init(){
    System.out.println("Dog....@PostConstruct...");
  }
  //容器移除对象之前
  @PreDestroy
  public void detory(){
    System.out.println("Dog....@PreDestroy...");
  }
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    // TODO Auto-generated method stub
    this.applicationContext = applicationContext;
  }
}

 

把断点打在setApplicationContext可以看到底层是执行ApplicationContextAwareProcessor的invokeAwareInterfaces方法进行设置IOC容器的,而ApplicationContextAwareProcessor就是继承自BeanPostProcessor利用postProcessBeforeInitialization进行初始化调用invokeAwareInterfaces方法的


目录
相关文章
|
20天前
|
XML 安全 Java
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
3天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
19 6
|
4天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
32 3
|
18天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
38 2
|
1月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
18天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
64 9
|
23天前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
58 0