Spring Boot启动时添加业务代码逻辑

原创
2020/03/10 12:48
阅读数 876

问题背景:

    项目中用到了Redis缓存,但是只做了数据缓存,没有提供清理缓存机制。所以现在需要每次启动项目的时候清除上一次的缓存数据。

1.实现CommandLineRunner接口

springboot提供 CommanLineRunner 接口,提供了run() 回调方法,spirng上下文初始化完成后应用启动后将会调用。如果有多个CommanLineRunner 实现类,可以实现 Ordered 接口或者@Order注解指定执行顺序。

@Component
public class CacheCleanRunner implements CommandLineRunner {
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void run(String... strings) throws Exception {
        String pattern = "cachePrefix*";
        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        Set<byte[]> caches = connection.keys(pattern.getBytes());
        //判断缓存是否存在
        if (!caches.isEmpty()) {
            connection.del(caches.toArray(new byte[][]{}));
        }
    }
}

2.实现ApplicationRunner接口

CommandLineRunner非常相似,ApplicationRunner 接口也体用了run()方法,当应用启动时会调用。但是参数不同,它的参数是ApplicationArguments 。

@Component
public class CacheCleanRunner implements ApplicationRunner {
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void run(ApplicationArguments strings) throws Exception {
        String pattern = "cachePrefix*";
        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        Set<byte[]> caches = connection.keys(pattern.getBytes());
        //判断缓存是否存在
        if (!caches.isEmpty()) {
            connection.del(caches.toArray(new byte[][]{}));
        }
    }
}

3.@PostConstruct 注解

可以用在方法上,该方法将在bean初始化完成后立马调用。


@Component
public class ClearRedisCacheBean {

    /**
     * redisTemplate
     */
    @Autowired
    private RedisTemplate redisTemplate;

    @PostConstruct
    public void clear() {
        String pattern = "cachePrefix*";
        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        Set<byte[]> caches = connection.keys(pattern.getBytes());
        if (!caches.isEmpty()) {
            connection.del(caches.toArray(new byte[][]{}));
        }
    }
}

4.实现InitializingBean接口

该接口的功能和上面的注解非常类似。需要实现InitializingBean接口并重写afterPropertiesSet() 函数。

@Component
public class ClearRedisCacheBean implements InitializingBean {
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Override
    public void afterPropertiesSet() throws Exception {
        //缓存清空逻辑
    }
}

参考

https://blog.csdn.net/w605283073/article/details/89220692

https://blog.csdn.net/sinat_38195169/article/details/83787211

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部