在我们做项目的时候,经常能遇到不被spring管理的类中要使用相关spring bean,比如自定义过滤器,静态工具类等,相应的也有几种办法,一种是想办法使不被spring容器管理的类让他被spring管理。第二种就是通过应用上下文获取通过clazz或者相关bean的name获取。第一种一般是添加相关注解即可,所以本文着重介绍一下第二种办法,并提供一个工具类。
方案
-
编写一个ApplicationContextHelper类并实现ApplicationContextAware接口
-
将应用上下文赋值给声明的静态ApplicationContext对象上,此时就可以拿到应用上下文,也就可以取出你需要的bean
-
编写静态方法,按照你的需求获取相应的bean
@Component
public class ApplicationContextHelper implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
applicationContext = context;
}
/**
* 根据类获取bean
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T popBean(Class<T> clazz) {
if (applicationContext == null) {
return null;
}
return applicationContext.getBean(clazz);
}
/**
* 根据类和bean的名字获取bean
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T popBean(String name, Class<T> clazz) {
if (applicationContext == null) {
return null;
}
return applicationContext.getBean(name, clazz);
}
}
在需要的地方使用ApplicationContextHelper.popBean(clazz.class)即可
注:
- 上述测试在ubuntu16.04 lts jdk1.8 spring boot 1.5.6.RELEASE中成功
- 上述文字皆为个人看法,如有错误或建议请及时联系我
网友评论