Spring Bean InitializingBean和DisposableBean详解

对于bean实现了InitalizingBean接口,重写了afterPropertiesSet(),此方法运行在所有的bean被实例化之后。

DisaposableBean接口,重写destroy方法,此方法是执行在bean释放之后,也就是spring容器销毁之后。

 这里介绍的是一个redis缓存的示例,比如在spring容器启动后,需要把省市区数据加载到缓存,并且定期对数据进行更新,这个时候我们就可以结合InitalizingBean和DisaposableBean,还有定时器ScheduledThreadPoolExecutor、多线程一起来实现。

首先,spring容器启动后,加载实例化所有bean对象后,就会执行afterPropertiesSet(),创建线程,线程中取得数据,缓存到redis,设置ScheduledThreadPoolExecutor,并设置好定时器的时间间隔。然后在afterPropertiesSet启动线程run方法,执行定时器即可。

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import com.ycst.craft4j.system.util.DateUtil;

import net.sf.ehcache.util.NamedThreadFactory;

@Component
public class BasicDataCacheLoader implements InitializingBean,DisposableBean{

    private ScheduledThreadPoolExecutor executor = null;
    
    protected static final int CORE_SIZE = Runtime.getRuntime().availableProcessors() * 2;
    
    @Autowired
    private StringRedisTemplate redisTemplate;
    
    @Override
    public void destroy() throws Exception {

        executor.shutdown();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        
         executor = new ScheduledThreadPoolExecutor(CORE_SIZE, new NamedThreadFactory("static-info-loader"));
         RefreshCache refreshCache = new RefreshCache();
         refreshCache.run();
         executor.scheduleWithFixedDelay(refreshCache, 10, 10, TimeUnit.SECONDS);
    }
    
    private class RefreshCache implements Runnable{

        @Override
        public void run() {
            //获取省市区数据,这里随意写一些无关逻辑
            redisTemplate.opsForValue().set("time", DateUtil.getDateTime());
        }
    }
    
    public String getCache(){
        return redisTemplate.opsForValue().get("time");
    }
    
}
 

你可能感兴趣的:(缓存)