1、获取 applicationContext,通过ApplicationAware自动注入
2、getBeansOfType、getBeanNamesForType
//key位 beanName,value为bean
Map result = applicationContext().getBeansOfType(Interface.class);
//返回 beanName 的String 数组
String[] result = applicationContext().getBeanNamesForType(Interface.class);
注:这种方法除了可以获取实现【接口】的所有Bean,也可以获取所有继承【抽象类/类】的所有Bean,如下
Map result = applicationContext().getBeansOfType(AbstractObject.class);
String[] result1 = SpringContextUtils.getApplicationContext().getBeanNamesForType(Action.class);
Map result2 = SpringContextUtils.getApplicationContext().getBeansOfType(Action.class);
logger.info(Arrays.toString(result1));
logger.info(result2.toString());
2021-01-14 01:01:51.733 INFO [http-nio-8080-exec-1]com.imddysc.study.sqlmonitor.controller.TestController.test01:28 -[emailAction, logAction, msgAction, msxfAction, noAction, wechatAction]
2021-01-14 01:01:51.733 INFO [http-nio-8080-exec-1]com.imddysc.study.sqlmonitor.controller.TestController.test01:29 -{emailAction=com.imddysc.study.sqlmonitor.action.EmailAction@6608db67, logAction=com.imddysc.study.sqlmonitor.action.LogAction@7e7a8006, msgAction=com.imddysc.study.sqlmonitor.action.MsgAction@1e67cafc, msxfAction=com.imddysc.study.sqlmonitor.action.MsxfAction@2fd03079, noAction=com.imddysc.study.sqlmonitor.action.NoAction@fa30507, wechatAction=com.imddysc.study.sqlmonitor.action.WechatAction@2573de45}
根据不同参数,调用不同Service完成不同功能的案例
String str = "msg";
Action action = null;
if("msg".equals(str)) {
action = (Action) SpringContextUtils.getBean("msgAction");
}else if ("wechat".equals(str)) {
action = (Action) SpringContextUtils.getBean("wechatAction");
}else if ("email".equals(str)) {
action = (Action) SpringContextUtils.getBean("emailAction");
}
action.doAction();
return "1";
补充:java通过Class的isAssignableFrom方法
注释:【a.isAssignableFrom(b)】有两个Class类型的类象,一个是调用isAssignableFrom方法的类对象(对象a),以及方法中作为参数的这个类对象(对象b),这两个对象如果满足以下条件则返回true,否则返回false:
a对象所对应类信息是b对象所对应的类信息的父类或者是父接口,简单理解即a是b的父类或接口
a对象所对应类信息与b对象所对应的类信息相同,简单理解即a和b为同一个类或同一个接口