Spring容器初始化數據(數據庫)BeanPostProcessor的應用


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分鍾刷新靜態變量的更新的時候,存在只加載一次,線程沒有再啟動的問題

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM