获取spring context中bean,实现按需调用接口

背景

调用方传入一个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了

上一篇:spring5-一个简单的spring案例


下一篇:Spring系列之FactoryBean