背景
调用方传入一个json,按json中的api字段值去调用本系统中不同类去完成不同的功能。为了统一和可扩展,通过context中的bean的方式去转发。
实现
1、定义一个接口
public interface Req {
public String process(String request);
}
2、所有实现类都implement该接口
@Component("joinReq")
public class JoinReq implements Req {
@Override
public String process(String request) {
return "ok";
}
}
3、实现ApplicationContextAware类,从context中getBean
@Component
public class SpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; // Spring应用上下文环境
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringBeanUtil.applicationContext = applicationContext;
}
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
}
注意:网上有很多方法去getBean,但是:
1)FileSystemXmlApplicationContext方式一定要指定xml文件,对于注解注入的无效
2)WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();这种方式自测是无效的,wac是null,原因待研究
所以最终还是采用上述方法
4、main类,用第3步生成的SpringBeanUtil来路由所需要的接口
Req req=(Req)springBeanUtil.getBean(api);
System.out.println(req.process(request));
当入参api="join"时,就能执行joinReq这个bean的process了