有时候在Spring没有管理的Bean调用Spring管理的Bean的时候,不知道该怎么做,有人说让那个Bean让Spring管理一下不就行了,现在注解都很简单用**@Component**注解下就可以了,但是你可想过如果这个Bean没有无参构造呢?你会说写个**@Bean**也很简单啊!如果这个Bean在构造函数中引用了其它Bean,其它Bean有引用的其它Bean等等怎么处理呢?当然按你们的办法也是可以解决的,但是是不是太麻烦了。当然我说的这种事是很少出现的,但是它出现在我身上了,我不得不想办法解决,当然日后也许你也会遇到不如来看一看。 问题我们知道了,就是想解决不用注解获取到Sping中的Bean,当然Spring肯定会考虑到中情况,所以提供了**ApplicationContextAware**这个接口。我们只要实现这个接口获取到**ApplicationContext**问题就迎刃而解。**一起来看代码:**
@Component
public class SpringBeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringBeanUtils.applicationContext == null){
SpringBeanUtils.applicationContext = applicationContext;
}
}
/**
* 获取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
如何调用呢?
WebSocket webSocket = SpringBeanUtils.getBean(WebSocket.class);
当然这个我是我项目中的一个WebSocket的Bean做的测试,你可以用其他的Bean测试,只要是Spring管理的Bean都可以获取到。
是不是很简单,其实有时候不是不会,也不是不理解,而是没有经历过,当我们遇到过才会发现就这,就这难为了一两个小时,不就几句话的事嘛,这就是为什么经验值钱了。