zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    vc++6.0如何调试
    Visual C++单文档混合分割视图
    使用VC6.0实现窗口的任意分割张中庆
    用MFC创建通用窗体分割框架
    vc++6.0编译环境介绍(1、2)
    浅谈SDI单文档多视切换方法
    单文档多视图Formview切换源代码(此网还有许多其它多视图切换的源代码)
    VC单文档实现多视图的方法
    Visual C++(VC++6.0)编译器常用选项设置
    PowerTip of the DayRemoving Empty Things
  • 原文地址:https://www.cnblogs.com/zhendiao/p/14885501.html
Copyright © 2011-2022 走看看