java SPI实现类中注入spring bean对象

在项目中,用到了SPI来扩展一些功能,发现很多实现类中用到了bean对象,并且都是通过getBean的方式每次都去拿,感觉不是很方便,而且速度也没有直接使用对象快。

正好安排的工作就是优化那一块的代码,所以就改造了一下,让SPI实现类中支持注入spring bean依赖,下面的类名有所改变,还有使用到的方法,大家可以按需改造。

  1. 首先,为了不影响之前的逻辑,定义了一个接口BeanResource,需要自动注入bean的类,就实现这个接口;

    java 复制代码
    /**
     * 实现类中,实现了这个接口就会自动注入bean,配合注入注解等使用
     */
    public interface BeanResource {
    }
  2. 通过ApplicationContext类的getAutowireCapableBeanFactory()方法拿到AutowireCapableBeanFactory工厂类;

    可以通过hutool工具包的SpringUtil.getApplicationContext().getAutowireCapableBeanFactory()方式拿到,也可以自己实现一个ApplicationContextAware接口,然后在构造器中获取ApplicationContext对象。

  3. 通过autowireBeanProperties方法注入bean对象
    autowireBeanProperties方法有三个形参,第一个是要注入bean依赖的对象,第二个是注入的方式(根据类型或名称),第三个参数是是否依赖检查,这里我们用true,这样注入bean依赖有问题会报错。

    java 复制代码
    // 首先通过拿到所有的子类
    final ServiceLoader<XXXXX> loader = ServiceLoader.load(XXXXX.class);
    final AutowireCapableBeanFactory beanFactory = SpringUtil.getApplicationContext().getAutowireCapableBeanFactory();
    for (XXXXX xxxxx : loader) {
        // 如果需要注入bean对象
        if (xxxxx instanceof BeanResource) {
            try {
                // 给xxxxx注入bean对象,支持@Resource和@Autowired注入,还有set注入; 按类型注入(其实只要你用平常的注入方式BY NAME也可以,除了构造器注入,因为对象是已经创建好了的);进行依赖检查,如果有问题直接报错
                beanFactory.autowireBeanProperties(xxxxx, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  4. 最后在扩展类中使用,除了构造器注入,其他常用的注入方式都行。

    java 复制代码
    @AutoService(XXXXX.class)
    public class Sub implements XXXXX, BeanResource {
        @Resource
        private A a;
    	@Autowired
    	private B b;
    	@Setter
    	private C c;
    }
相关推荐
Frank_refuel2 分钟前
【C++项目】手撕JRpc框架(单机怎么优化到分布式思想)
开发语言·c++
卓怡学长5 分钟前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
wuminyu15 分钟前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
可乐鸡翅yeah_20 分钟前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
流形填表23 分钟前
多校区题库标准化:Excel模板与校验脚本
开发语言·python
步行cgn32 分钟前
AOP 通知的类型详解
开发语言
weixin_3077791334 分钟前
从“人操作仪器”到“Agent 自主发现”:OPL 金属材料自驱动实验室 MVP 技术论述
开发语言·人工智能·算法·架构
笑鸿的学习笔记1 小时前
C++笔记之SIMD与SSE指令集
开发语言·c++·笔记
anew___1 小时前
《从零手写操作系统 (20):ELF加载器——让OS读懂现代编译器》
java·服务器·前端
code2cat1 小时前
【随笔】MCP资源更新订阅:通知到达以后,Agent怎样刷新旧资料
java·后端·开发工具·ai agent·mcp