您现在的位置是:首页 > 正文

Spring扩展点

2024-04-01 00:37:34阅读 12

如何在所有Bean创建完后做扩展?

方式一

Spring在容器刷新完成后会注册ContextRefreshedEvent。
在这里插入图片描述
所以可以自定义事件监听器监听该事件进行扩展。

监听器实现:

@Component
public class ContextRefreshedEventListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("容器初始化完成,开始进行扩展!");
    }
}

方式二

Spring在所有bean注册完成后,会检查bean是否实现了SmartInitializingSingleton接口,如果实现了,会回调改类的afterSingletonsInstantiated()方法,我们可以在方法里实现扩展。
在这里插入图片描述
实现SmartInitializingSingleton接口:

/**
 * @author zhw
 * @description
 * @date 2021-09-29 15:28
 */
@Component
public class SmartInitializingSingletonTest implements SmartInitializingSingleton {
    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("所有单例bean注册完成,开始扩展!");
    }
}

Spring通过initPropertySources扩展方法设置环境配置

Spring的prepareRefresh()方法中有initPropertySources()方法,但是默认容器是未实现这个方法的。我们可以实现该方法进行扩展。
在这里插入图片描述
实现自定义扩展容器:

/**
 * @author zhw
 * @description
 * @date 2021-09-29 16:05
 */
public class ExtensionContext extends AnnotationConfigApplicationContext {
    public ExtensionContext(Class<MainConfig> mainConfigClass) {
        super(mainConfigClass);
    }

    @Override
    protected void initPropertySources() {
        //设置一些必须的环境变量
        getEnvironment().setRequiredProperties("appName");
    }
}

设置环境变量:
在这里插入图片描述

测试类:

public class MyContextTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new ExtensionContext(MainConfig.class);
    }
}

结果:
在这里插入图片描述

@Import进行扩展

方式一:实现ImportBeanDefinitionRegistrar接口

例如开启AOP注解,使用AspectJAutoProxyRegistrar.class
在这里插入图片描述
AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,进行BeadDefinition的注册:
在这里插入图片描述

方式二:实现ImportSelector接口

在这里插入图片描述
ImportSelector接口的selectImports方法返回的是要注入类的全类名数组。spring会根据全类名注册bean。
例如:开启事务管理功能就是使用实现ImportSelector接口进行扩展。
在这里插入图片描述
看下TransactionManagementConfigurationSelector.class:
在这里插入图片描述

网站文章

  • cannot import name ‘SGD‘ from ‘keras.optimizers‘ 报错

    将from keras.optimizers import SGD修改为 from tensorflow.keras.optimizers import SGD

    2024-04-01 00:37:28
  • HTTPS如何防止中间人攻击

    https如何防止中间人攻击

    2024-04-01 00:37:04
  • Linux系统下运行很慢如何解决

    Linux系统下运行很慢如何解决

    解决Linux系统下cpu占用率过高导致程序运行缓慢的问题

    2024-04-01 00:36:58
  • 微型前端简介

    微型前端简介

    重点(Top highlight)The first time I heard the term micro frontend, my eyes rolled into the back of my ...

    2024-04-01 00:36:30
  • eclipse转idea找不到项目某些配置文件

    eclipse转idea找不到项目某些配置文件

    &lt;!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。--&gt;&lt;resources&gt;   &lt;resource&gt;      &lt;!--   描述存放资源的目录,该路径相对POM路径--&gt;      &lt;directory&gt;src&lt;/directory&gt;      &lt...

    2024-04-01 00:36:23
  • chatgpt赋能python:Python计算器代码实现——简单又实用

    def calculator(expression) : # 主体逻辑代码 return result其中,参数expression:\.\d+)?&#39;) # 匹配数字 operator = r...

    2024-04-01 00:36:17
  • android 移除子view,android-从父视图中移除视图与隐藏视图

    在android中,如果我从其父视图中移除视图,而在父视图中隐藏子视图(GONE不可见).我知道隐藏的视图仍将保留在内存中,但说到父视图的物理外观会有所不同吗?如果答案没有不同,那是否意味着当我隐藏子...

    2024-04-01 00:36:08
  • MySQL数据库总结

    MySQL数据库总结

    文章目录DDL操作数据库、表操作数据库查看数据库查询创建数据库mysql的字符集创建数据库修改数据库删除数据库使用数据库操作表查询表(use、show)数据类型创建表(create)复制表(like)...

    2024-04-01 00:35:44
  • linux关闭无响应文件夹,4种强制关闭Ubuntu中无响应应用程序的方法

    linux关闭无响应文件夹,4种强制关闭Ubuntu中无响应应用程序的方法

    4种强制关闭Ubuntu中无响应应用程序的方法在使用Ubuntu时,我们的一个或多个进程和应用程序可能会经常挂起。重新启动我们的系统并不总是最佳解决方案,我们发现自己在寻找能够快速、轻松和安全地摆脱无...

    2024-04-01 00:35:36
  • 一文讲清Mybatis架构

    一文讲清Mybatis架构

    MyBatis功能架构设计 功能架构讲解: 我们把Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数...

    2024-04-01 00:35:28