前两天在整合Shiro框架,因为要拦截所有请求并自定义验证方式,所以需要自定义Filter来过滤请求。但是我试图在Filter中通过@Value
的方式获取自定义配置文件的值时,却发现总是为null,说明Spring并没有为我们注入这个属性。后来又尝试了@AutoWired
发现也是为null。
原因是因为过滤器的启动顺序在servlet之前,在filter初始化时,Spring Bean还未初始化完毕,所以总是为null
。
经过一番查找,最终发现了一个个人感觉比较可靠的解决方案:即写一个工具类实现ApplicationContextAware
接口,通过该工具类的静态方法getBean
手动获取对应的Spring Bean。
项目中有使用hutool工具库的话,可以使用里面的SpringUtil方法,原理是一样的。
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz){
return applicationContext.getBean(clazz);
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<?> getType(String name) {
return applicationContext.getType(name);
}
}
最近也是遇到了这个问题,网上内容有点少,看了一晚上才看到了这个文章。
👍感谢博主,记录真是个好习惯。看博主最近都年更了,哈哈哈哈,还是要加油写博客的呀
祝工作顺利