Spring Boot 启动加载数据 CommandLineRunner

来源:互联网 发布:mac虚拟机玩天龙八部 编辑:程序博客网 时间:2024/06/05 22:49

实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。
为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。

本测试类中实现CommandLineRunner接口,通过程序在启动时,遍历所有被自定义注解CacheExpire注释的方法,获取缓存失效是时间,通过Cacheable注解获取缓存信息,最后通过 redisCacheManager进行设置

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface CacheExpire {    /*    过期时间,以秒为单位     */    @AliasFor("value")    long expireAfter() default 0;    @AliasFor("expireAfter")    long value() default 0;}
@Slf4j@Componentpublic class CacheExpireProcessor implements CommandLineRunner {    static Map<String, Long> expireMap = new HashMap<>();    @Autowired    RedisCacheManager redisCacheManager;    @Override    public void run(String... args) throws Exception {        Reflections reflections = new Reflections("com.longdai", new MethodAnnotationsScanner());        Set<Method> methods = reflections.getMethodsAnnotatedWith(CacheExpire.class);        log.debug("Methods annotated with CacheExpire count is:{}", methods.size());        for (Method method : methods) {            Annotation[] annotations = method.getAnnotations();            String[] cacheNames = {};            long expireAfter = 0;            Optional<Annotation> cachableAnnotation = Arrays.stream(annotations).filter(annotation -> annotation instanceof Cacheable).findFirst();            Optional<Annotation> cacheExpireAnnotation = Arrays.stream(annotations).filter(annotation -> annotation instanceof CacheExpire).findFirst();            if (cachableAnnotation.isPresent() && cacheExpireAnnotation.isPresent()) {                Cacheable cacheable = (Cacheable) cachableAnnotation.get();                CacheExpire cacheExpire = (CacheExpire) cacheExpireAnnotation.get();                cacheNames = cacheable.value();                if (cacheNames.length == 0) {                    cacheNames = cacheable.cacheNames();                }                expireAfter = cacheExpire.value();                if (expireAfter == 0) {                    expireAfter = cacheExpire.expireAfter();                }            }            if (cacheNames.length > 0 && expireAfter > 0) {                log.debug("cacheNames:{}", cacheNames);                log.debug("expireAfter:{}", expireAfter);                long finalExpireAfter = expireAfter;                Stream.of(cacheNames).forEach(cacheName -> expireMap.put(cacheName, finalExpireAfter));            }        }        if (!expireMap.isEmpty()) {            redisCacheManager.setExpires(expireMap);            log.debug("redis expire map has been set!");        }    }}
@Configurationpublic class RedisConfig {    @Value("${redis.host}")    private String redisHost;    @Value("${redis.port}")    private int redisPort;    @Value("${cacheRedis.host}")    private String cacheRedisHost;    @Value("${cacheRedis.port}")    private int cacheRedisPort;    @Bean    @Primary    public RedisConnectionFactory jedisConnectionFactory() {        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig());        jedisConnectionFactory.setHostName(redisHost);        jedisConnectionFactory.setPort(redisPort);        return jedisConnectionFactory;    }    @Bean(name = "cacheConnectionFatory")    public RedisConnectionFactory cacheConnectionFatory() {        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig());        jedisConnectionFactory.setHostName(cacheRedisHost);        jedisConnectionFactory.setPort(cacheRedisPort);        return jedisConnectionFactory;    }    @SuppressWarnings("Duplicates")    @Bean    public JedisPoolConfig jedisPoolConfig() {        JedisPoolConfig poolConfig = new JedisPoolConfig();        poolConfig.setMaxTotal(100); //最大连接数        poolConfig.setMaxIdle(50); //最大空闲数        poolConfig.setMaxWaitMillis(1000); //最大建立链接等待时间        return poolConfig;    }    @Bean    public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig) {        return new JedisPool(jedisPoolConfig, redisHost, redisPort);    }    @Bean    @Primary    public StringRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {        return new StringRedisTemplate(redisConnectionFactory);    }    @Bean(name = "cacheRedis")    public StringRedisTemplate cacheRedisTemplate(@Qualifier("cacheConnectionFatory") RedisConnectionFactory redisConnectionFactory) {        return new StringRedisTemplate(redisConnectionFactory);    }    @Bean(name = "cacheRedisForObject")    public RedisTemplate cacheRedisForObject(@Qualifier("cacheConnectionFatory") RedisConnectionFactory redisConnectionFactory) {        RedisTemplate redisTemplate = new RedisTemplate<String, Object>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        return redisTemplate;    }    public RedisTemplate<String, Object> springBootRedisCache(@Qualifier("cacheConnectionFatory") RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        redisTemplate.setEnableDefaultSerializer(false);        redisTemplate.setKeySerializer(stringRedisSerializer());        redisTemplate.setValueSerializer(genericJackson2JsonRedisJsonSerializer());        redisTemplate.afterPropertiesSet();        return redisTemplate;    }    @Bean    public KeyGenerator keyGenerator() {        return (target, method, params) -> {            StringBuilder sb = new StringBuilder();            sb.append(target.getClass().getName());            sb.append("_");            sb.append(method.getName());            sb.append("_");            for (int i = 0; i < params.length; i++) {                sb.append(params[i].toString());                if (i != params.length - 1) {                    sb.append("_");                }            }            return sb.toString();        };    }    @Bean    public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisJsonSerializer() {        return new GenericJackson2JsonRedisSerializer();    }    @Bean    public StringRedisSerializer stringRedisSerializer() {        return new StringRedisSerializer();    }    @Bean    public RedisCacheManager cacheManager() {        RedisCacheManager redisCacheManager = new RedisCacheManager(springBootRedisCache(cacheConnectionFatory()));        redisCacheManager.setLoadRemoteCachesOnStartup(true);        redisCacheManager.setUsePrefix(true);        redisCacheManager.setCachePrefix(cacheName -> ("LONGDAI_CACHE_" + cacheName + ":").getBytes());        redisCacheManager.setExpires(CacheConstants.getExpirationMap());        return redisCacheManager;    }    @Bean(name = "srvAuthCodeBean")    public RedisTemplate<String, SrvAuthCodeBean> srvAuthCodeBeanRedisTemplate(@Qualifier("cacheConnectionFatory") RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, SrvAuthCodeBean> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        redisTemplate.afterPropertiesSet();        StringRedisSerializer stringSerializer = new StringRedisSerializer();        redisTemplate.setKeySerializer(stringSerializer);        redisTemplate.setHashKeySerializer(stringSerializer);        return redisTemplate;    }}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小杜宾犬价格 纯种杜宾犬图片 德系杜宾犬舍 杜宾犬凶吗 德系杜宾犬图片 小杜宾犬图片 杜宾犬简介 杜宾犬多少钱 小型杜宾犬 杜宾犬适合家养吗 杜宾狗价格 杜宾犬凶猛吗 小杜宾犬 杜宾犬咬人吗 美系杜宾犬 杜宾犬介绍 精致杜宾犬舍 杜宾犬的价格 北京杜宾犬价格 北京杜宾犬舍 纯种杜宾犬价格 杜宾犬如何训练 杜宾犬舍排名 杜宾犬的训练 杜宾犬崽多少价格 怎样训练杜宾犬 杜宾犬怎么训练 杜宾犬基地 出售杜宾犬 杜宾犬剪耳多少钱 博文杜宾犬舍 杜宾犬看家能力 杜宾犬智商 杜宾犬名字大全 一只杜宾犬多少钱 杜宾犬好吗 杜宾犬那里有卖 杜宾犬好训吗 杜宾犬的训练方法 杜宾犬什么颜色好 杜宾犬小鹿犬