记录一个需求:
需求:升级组件,目前有几个组件需要统一管理升级,后面还可能要扩展,所以使用工厂模式实现,然后再升级中,不确定有多少个升级包,所有需要所有的升级都要处理一遍,有包就执行升级没有就不升级,所有我要实现,在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了
原文地址:https://www.jb51.cc/wenti/3284959.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。