SpringBoot关于在Filter中自动注入(@AutoWired)为null的解决方案

前两天在整合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);
    }
}

评论

  1. 2 年前
    2023-1-08 1:59:12

    最近也是遇到了这个问题,网上内容有点少,看了一晚上才看到了这个文章。

    👍感谢博主,记录真是个好习惯。看博主最近都年更了,哈哈哈哈,还是要加油写博客的呀

    祝工作顺利

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇