美文网首页
十八. 通过spring容器获取类

十八. 通过spring容器获取类

作者: 任未然 | 来源:发表于2020-08-04 16:12 被阅读0次

声明一个ApplicationContextHelper组件,名字随意。它实现了ApplicationContextAware接口。并重写setApplicationContext方法。在该组件里可以通过名字获取某个bean.

一. 通过类名获取Bean

@Component
public class ApplicationContextGetBeanHelper implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     * @param className 类名
     * @return
     */
    public static Object getBean(String className) {
        String beanName = getClassName(className);
        return getApplicationContext() != null ? getApplicationContext().getBean(beanName) : null;
    }

    /**
     * 通过class获取Bean.
     * @param clazz 类
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return null != getApplicationContext()?getApplicationContext().getBean(clazz):null;
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String className, Class<T> clazz) {
        String beanName = getClassName(className);
        return null != getApplicationContext()?getApplicationContext().getBean(beanName, clazz):null;
    }

    /**
     * 获取接口所有的实现类
     * 注意:实现类必须已注入到容器
     * @return 实现类名:对应的类
     */
    public <T> Map<String, T> getMap(Class<T> classT) {
        Map<String, T> map = null;
        if(classT == null) {
            throw new IllegalArgumentException("classT为空");
        }
        //根据接口类型返回相应的所有bean
        map = applicationContext.getBeansOfType(classT);
        return map;
    }

    /**
     * 类名转成首字母小写
     * @param className
     * @return
     */
    private static String getClassName(String className) {
        if(ObjectUtils.isEmpty(className)) {
            throw new IllegalArgumentException("className为空");
        }

        String beanName = null;
        if(className.length() > 1) {
            beanName = className.substring(0, 1).toLowerCase() + className.substring(1);
        } else {
            beanName = className.toLowerCase();
        }

        return beanName;
    }

}

使用

@Slf4j
@RestController
@RequestMapping("/getbean")
public class GetBeanTestController {

    @GetMapping("/retryService")
    public String retryService(@RequestParam int num){

        RetryService retryService = (RetryService) ApplicationContextGetBeanHelper.getBean("RetryService");
        String ss = retryService.print();

        return ss;
    }

}

二. 获取接口所有的实现类

@Component
public class ServiceLocator implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    /**
     * 获取应用上下文并获取相应的接口实现类
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 用于保存接口实现类名及对应的类
     * @return
     */
    public <T> Map<String, T> getMap(Class<T> classT) {
        Map<String, T> map = null;
        if(classT==null) {
            throw new IllegalArgumentException("classT为空");
        }
        //根据接口类型返回相应的所有bean
        map = applicationContext.getBeansOfType(classT);
        return map;
    }
}

测试

    public void testServiceLocator(){
        Map<String, Test> map = serviceLocator.getMap(Test.class);
        map.forEach((s, map1) -> {
            System.out.println(map1.getClass().getTypeName());
        });
    }

相关文章

网友评论

      本文标题:十八. 通过spring容器获取类

      本文链接:https://www.haomeiwen.com/subject/etuwrktx.html