Spring5源码 - 14 如何在所有Bean创建完后做扩展?

简介: Spring5源码 - 14 如何在所有Bean创建完后做扩展?

20200914143739548.png

葛大爷的问题


Answer


想要回答这个问题,就要对Spring的生命周期有一定的了解,今天我们就来回顾一下IOC的生命周期及Spring提供给开发人员的扩展点,当然了,我们今天只聊Bean加载完成后的事儿 。

老规矩 先应用后源码 ,开搞~



20201101104151148.png

AAA BBB CCC 均是spring管理的bean

@Component
public class AAA {
  public AAA() {
    System.out.println("AAA init");
  }
}



方式一 基于SmartInitializingSingleton接口

Source

生命周期中倒数第二步

// Instantiate all remaining (non-lazy-init) singletons.
 finishBeanFactoryInitialization(beanFactory);


SmartInitializingSingleton接口是在所有的Bean实例化完成以后,Spring回调的方法, 所以这里也是一个扩展点,可以在单例bean全部完成实例化以后做处理。


20201101000431854.png


Code

【配置类】

package com.artisan.beanLoadedExtend.smartinit;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.artisan.beanLoadedExtend")
public class SmartInitConfig {
}

【扩展类 implements SmartInitializingSingleton 】

package com.artisan.beanLoadedExtend.smartinit;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.stereotype.Component;
@Component
public class SmartInitExtend implements SmartInitializingSingleton {
  @Override
  public void afterSingletonsInstantiated() {
    System.out.println("all singleton beans loaded , 自定义扩展here ");
  }
}

【测试】

package com.artisan.beanLoadedExtend.smartinit;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SmartInitConfig.class);
  }
}



方式二 基于Spring事件监听

Source

生命周期的最后一步是finishRefresh();,这里面中有一个方法是publishEvent

20201101000052554.png


所以这里也可以进行扩展,监听ContextRefreshedEvent事件 。


Code

【配置类】

package com.artisan.beanLoadedExtend.listener;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.artisan.beanLoadedExtend")
public class Config {
}


【基于接口的方式】

package com.artisan.beanLoadedExtend.listener;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Component
public class BeanLoadedExtendListener implements ApplicationListener<ContextRefreshedEvent> {
  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    System.out.println("监听到ContextRefreshedEvent, 自定义扩展here ");
  }
}


【基于注解的方式】

package com.artisan.beanLoadedExtend.listener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class BeanLoadedExtendListenerByAnno  {
  @EventListener(ContextRefreshedEvent.class)
  public void extend(){
    System.out.println("基于@EventListener的监听");
  }
}


二选一,推荐基于注解的方式


【测试】

package com.artisan.beanLoadedExtend.listener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
  }
}


验证

20201101105438669.png





相关文章
|
1月前
|
XML 安全 Java
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
114 2
|
2月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
114 5
|
15天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
28天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
28天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
1月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
66 6
|
1月前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
117 3
|
2月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
103 4
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
65 2