Spring中如何在非Spring管理的Bean中获取到Spring管理的Bean并操作

Posted 赵镇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring中如何在非Spring管理的Bean中获取到Spring管理的Bean并操作相关的知识,希望对你有一定的参考价值。

最近在开发过程中遇到了一个问题,就是和安卓端需要借助socket进行通信,但是此时的socket并不是spring websocket,且此时socket需要在线程中执行,无法被Spring管理,于是找到了另外一种用法

@Component
public class SpringApplicationContextUtil implements ApplicationContextAware{
    private static ApplicationContext applicationContext;
    public ApplicationContext getApplicationContext() {
        return SpringApplicationContextUtil.applicationContext;
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringApplicationContextUtil.applicationContext = applicationContext;
    }
    /**
     * 通过工厂类获取对应的服务
     * @param actionName 服务类名
     * @return 服务类
     */
    public static Object getBean(String name){
        Object object=null;
        try{
            object = SpringApplicationContextUtil.applicationContext.getBean(name);
        }catch(Exception e){
            e.printStackTrace();
        }
        return object;
    }
    /**
     * 通过工厂类获取对应的服务
     * @param clazz 对应的class
     * @return 服务类
     */
    public static <T> T getBean(Class<T> clazz){
        T object=null;
        try{
            object = SpringApplicationContextUtil.applicationContext.getBean(clazz);
        }catch(Exception e){
        }
        return object;
    }
    /**
     * 获取指定class类型的服务类
     * @param name 名称
     * @param requiredType class对象
     * @return 服务类
     */
    public static <T> T getBean(String name,Class<T> requiredType){
        T object=null;
        try{
            object=SpringApplicationContextUtil.applicationContext.getBean(name,requiredType);
        }catch(NoSuchBeanDefinitionException e){
        }catch(Exception e){
        }
        return object;
    }
    /**
     * 是否存在执行名称的服务类
     * @param name 名称
     * @return true 存在  flase 不存在
     */
    public static boolean containsBean(String name){
        return SpringApplicationContextUtil.applicationContext.containsBean(name);
    }
    
    /**
     * 获取注册class类型
     * @param name
     * @return
     */
    public static String[] getAliases(String name){
        String[] s=null;
        try{
            s=SpringApplicationContextUtil.applicationContext.getAliases(name);
        }catch(NoSuchBeanDefinitionException e){
            
        }catch(Exception e){
        }
        return s;
    }
}

原理即是通过ApplicationContextAware接口,并将实现类交给Spring管理,在类中定义一个applicationContext属性接收接口方法中的容器。即可以在该实现类中通过定义静态方法获取到我们需要的容器内我们自定义的Service或者dao等
使用方式如下

        WdDeviceService wdDeviceService = SpringApplicationContextUtil.getBean(WdDeviceService.class);
欢迎搜索关注本人与朋友共同开发的微信面经小程序【大厂面试助手】和公众号【微瞰技术】

以上是关于Spring中如何在非Spring管理的Bean中获取到Spring管理的Bean并操作的主要内容,如果未能解决你的问题,请参考以下文章

Spring-IOC 在非 web 环境下优雅关闭容器

对Spring的理解

如何在线程中获取spring 管理的bean

Spring注解中@Configuration和@Configurable的区别

如何让Spring管理Bean

编码剖析Spring管理Bean的原理