文章目录
  1. 1. 实际需求
  2. 2. BeanPostProcessor接口介绍

最近在做底层接口的封装,其中有一个数据存在数据库中,本身数据量很小,就几条记录的样子,本来设计是每次需要的时候读取数据库获取详细信息的,但是老大说可以考虑直接在程序启动时读取到缓存中。网上查找了一下资料,发现Spring中主要通过实现BeanPostProcessor接口来实现该需求。

实际需求

主要是数据库中会存有几个APP的相关信息,我们需要在程序启动时将所有对app加载到缓存中,本地缓存直接食用map来实现,其中key是app的Id,value就是app这个对象。

BeanPostProcessor接口介绍

该接口主要实现两个方法:

  1. postProcessBeforeInitialization方法,在spring中定义的bean初始化前调用这个方法
  2. postProcessAfterInitialization方法,在spring中定义的bean初始化后调用这个方法

我们此处只需要在第一个方法中加载数据即可,程序具体实现如下:

  1. 定义StartOnLoadService类

    @Service("startOnLoadService")
    public class StartOnLoadService {
        private static final Logger logger = LoggerFactory.getLogger(StartOnLoadService.class);
    
        public static Map<Long, App> appMap = new ConcurrentHashMap<>();
    
        @Autowired
        private AppDao appDao;
    
        public void loadData() {
            logger.info("load data when program starts.");
            List<App> appList = appDao.getAllApps();
    
            for (App app : appList) {
                appMap.put(app.get_id(), app);
            }
        }
    
        public static void addNewApp(App app) {
            logger.info("add a new app to AppCache");
    
            if (app == null)
                return;
    
            appMap.put(app.get_id(), app);
        }
    }
    
  2. 定义CacheBeanPostProcessor

    public class CacheBeanPostProcessor implements BeanPostProcessor {
        private static final Logger logger = LoggerFactory.getLogger(CacheBeanPostProcessor.class);
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            logger.info("call postProcessBeforeInitialization");
            if (bean instanceof StartOnLoadService) {
                ((StartOnLoadService) bean).loadData();
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            logger.info("call postProcessAfterInitialization");
            return bean;
        }
    }    
    
  3. 配置xml文件

    <!-- config the part of cache -->
    <bean id="cacheBeanPostProcessor" class="com.ttpod.push.cache.local.CacheBeanPostProcessor"/>
    
文章目录
  1. 1. 实际需求
  2. 2. BeanPostProcessor接口介绍