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);