場景描述:
有時我們需要在應用啓動時,加載某些不常變的數據到緩存中,避免每次請求時查詢數據庫或其它數據源,以提高性能(準備連接,建立連接,關閉連接,減少數據讀取的IO數).如果應用中剛好用到spring框架,正好可以用spring的機制實現這個功能
解決方案:
1:寫一個類,實現BeanPostProcessor接口,這個接口有兩個方法。
(1):postProcessBeforeInitialization方法,在spring中定義的bean初始化前調用這個方法
(2):postProcessAfterInitialization方法,在spring中定義的bean初始化後調用這個方法
例子代碼:
public class CacheBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object obj, String arg1) throws BeansException {
try {
if(obj instanceof ColumnService) {
((ColumnService)obj).getColumnList();//加載欄目數據
}else if(obj instanceof TradeServiceImpl){
((TradeServiceImpl)obj).getTradeList();//加載行業數據
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException {
// TODO Auto-generated method stub
return arg0;
}
}
2:在spring的xml文件中,添加
<!-- 初始緩存數據,初始化spring中定義的bean的前後都會用此實現類 -->
<bean id="cacheBeanPostProcessor" class="com.guagua.cache.CacheBeanPostProcessor"/>
3:在加載數據後,數據存在什麼地方,由你來定,我這個例子是放到了一個“靜態變量中”
@Service("columnService")
public class ColumnServiceImpl implements ColumnService {
public static List<Column> columnList = new ArrayList<Column>();
@Autowired
private ColumnDao columnDao;
public void setColumnDao(ColumnDao columnDao) {
this.columnDao = columnDao;
}
@Override
public List<Column> getColumnList() throws Exception {
columnList = columnDao.getColumnList();
return columnList;
}
}