1、目的:在Spring啟動的時候加載在數據庫保存的配置信息,一方面杜絕隨意修改,一方面方便管理
2、BeanPostProcessor是Spring提供的一個方法通過implements方式實現
會產生兩個實現類:
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; }
名字和返回類型不一樣可以自己修改
3、解釋:
1)BeanPostProcessor的實現類,是在Spring容器加載所有配置的bean的時候經過(有點類似於攔截器的原理)
2)Object bean:是整個bean加載的時候對應的bean在內存中的地址(可以強轉成對應的類型) String beanName:對應的bean的名字(也就是class前面的id名稱)
3)postProcessBeforeInitialization方法:是在bean加載之前進行的操作。postProcessAfterInitialization方法:是在bean加載之后進行的操作
4、加載數據的方式就是利用DataSource加載完成之后,連接數據庫進行數據加載。(嘗試過sessionfactory的方式,但是針對於所有注入接口報錯,請大神指點)
具體實現代碼僅供參考:
public class PropUtil implements BeanPostProcessor{ public static Map<String, Object> map = new HashMap<String, Object>(); @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if("dataSource".equals(beanName)){ DataSource ds = (DataSource)(bean); Connection conn = null;
PreparedStatement pm = null; try { conn = ds.getConnection(); pm = conn.prepareStatement("select * from model"); ResultSet rs = pm.executeQuery(); while(rs.next()){ System.out.println(rs.getString("modelId")); System.out.print(rs.getString("modelName"));//這里可以針對於不同的數據,保存在對應的map中做靜態數據加載,方便其他方法調用 } } catch (SQLException e) { e.printStackTrace(); }finally { try { conn.close();
pm.close(); } catch (SQLException e) { e.printStackTrace(); } } } return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } }
5、刷新數據
1)因為數據存在變動的情況,固寫入一個刷新機制
2)將對應的操作方式加入到線程里面,這樣只需要啟動一次服務器,就可以實現數據和配置的更新
6、問題:
1)此方式會對所有bean加載進行一次過濾,在初始化啟動的會后會造成相應的效率啟動問題
2)我在利用線程實現5分鍾刷新靜態變量的更新的時候,存在只加載一次,線程沒有再啟動的問題