Spring Boot监听器类中@Resource失效

问题描述:Spring Boot调试监听器类中@Resource注解失效

  • 问题代码如下:

@WebListener
public class AyUserListener implements ServletContextListener {

    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private AyUserService ayUserService;
    private static final String ALL_USER = "ALL_USER_LIST";


    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //查询数据库所有用户
        List<AyUser> ayUserList = ayUserService.findAll();      //断点到此处发现成员变量值都是null
        //清除缓存中的用户数据
        redisTemplate.delete(ALL_USER);
        //将数据存放到Redis缓存中
        redisTemplate.opsForList().leftPushAll(ALL_USER, ayUserList);
        //真实项目中需要注释掉,查询所有的用户数据
        List<AyUser> queryUserList = redisTemplate.opsForList().range(ALL_USER, 0, -1);
        System.out.println("缓存中目前的用户数有:" + queryUserList.size() + "人");
        System.out.println("ServletContext 上下文初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext 上下文销毁");
    }
}


  • 问题描述:
    在其他类和测试类中 @Resource 是可以正常使用的,似乎是在使用了 @WebListener 注解的类之内 @Resource 就不能正常发挥作用了,redisTemplateayUserService 这两个变量没有如期被初始化,调试显示其值都是 null

使用其他依赖注入的注解是否正常。

监听器是最先初始化的,所以导致获取到的是空值。

感觉应该是你这个类先执行,spring的类加载后面执行

你可以换一种注入方式,比如通过构造器注入试试?