SpringBoot里获取实现接口的所有实例

记录一个需求:

需求:升级组件,目前有几个组件需要统一管理升级,后面还可能要扩展,所以使用工厂模式实现,然后再升级中,不确定有多少个升级包,所有需要所有的升级都要处理一遍,有包就执行升级没有就不升级,所有我要实现,在spring下,怎么获取实现接口下的所有实例,然后循环调用

首先要定义一个Context,Spring在初始化IOC时,会调用实现了ApplicationContextAware接口的类,将他的容器对象传给实现方法


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author cf
 * @projectName cssa-toolBox
 * @date 2022/8/24上午 9:33
 */
@Component
public class SystemAppContext implements ApplicationContextAware {
    private static ApplicationContext context = null;

    /**
     * Spring在初始化IOC时,会调用实现了ApplicationContextAware接口的类,将他的容器对象传给实现方法
     *
     * @param context IOC创建的容器
     */
    public void setApplicationContext(ApplicationContext context) {
        SystemAppContext.setContext(context);

    }


    /**
     * 取得存储在静态变量中的ApplicationContext.
     */
    public static ApplicationContext getContext() {

        if (context == null) {

            throw new IllegalStateException("applicaitonContext未注入");
        }
        return context;

    }

    /**
     * 存储静态变量中的ApplicationContext.
     */
    public static void setContext(ApplicationContext context) {
        SystemAppContext.context = context;
    }

    /**
     * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型
     */
    public static <T> T getBean(String name) {
        if (context == null)
            throw new IllegalStateException("applicaitonContext未注入");
        try {
            return (T) context.getBean(name);

        } catch (BeansException e) {
            e.printstacktrace();
        }

        return (T) null;

    }

}

然后使用:

//获取所有实例
  Map<String, ComponentUpgradeInterface> animalMap = SystemAppContext.getContext().getBeansOfType(ComponentUpgradeInterface.class);
        animalMap.forEach((s, componentUpgradeInterface) -> {
            try {
            //循环得到实例,执行实例方法,所有都执行一遍
                componentUpgradeInterface.backComponentUpgradeZip(params);
            } catch (Exception e) {
                e.printstacktrace();
            }
        });

ok了

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...