當前位置:
首頁 > 知識 > spring 使用Resource 後,修改值(實現思路及spring注意事項)

spring 使用Resource 後,修改值(實現思路及spring注意事項)

Controller類是使用註解@Resource 注入service類,我想通過配置文件,動態的改變注入的service類。

spring 使用Resource 後,修改值(實現思路及spring注意事項)

實現思路:

  1. 載入所有配置文件,讀取屬性和值,保存在單例類中。
  2. 切入點:在spring把這個類實例化之後(實例化完成),並且所有成員變數賦值完成之後(初始化完成),拿到這個實例對象。
  3. 從對象中取出標記了@UpdateValueByConfigByClassInit的屬性。
  4. 使用class的名+屬性名從配置類中取值,有值則為該欄位重新賦值。
  5. 這邊賦值分二種情況:若欄位上沒有@Resource標籤,從配置文件取值後轉String賦值給該欄位;若該欄位有@Resource標籤,從配置文件取值後使用取得的值從spring容器取對象,把取得的對象賦值給該欄位。

===================================================================

使用spring mvc 與 spring整合之後,spring擴展點執行順序與網上說的不太一樣,所以這裡記錄一下。(spring4.3.7)

對如下五個擴展點進行測試,結論:使用這個postProcessBeforeInitialization和postProcessAfterInitialization擴展點可以實現上面思路。

import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;
import java.beans.PropertyDescriptor;
/**
* 對 spring 提供的擴展點進行測試
* Created by Think on 2018/12/2.
*/
@Component
public class FilterBeanPostProcessor implements BeanPostProcessor,InstantiationAwareBeanPostProcessor {
private static final Logger logger = Logger.getLogger(FilterBeanPostProcessor.class);
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
logger.info("====postProcessAfterInitialization====="+o.getClass().getName());
return o;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
logger.info("====postProcessBeforeInitialization====="+bean.getClass().getName());
return bean;
}
@Override
public Object postProcessBeforeInstantiation(Class<?> aClass, String s) throws BeansException {
logger.info("====postProcessBeforeInstantiation====="+aClass.getName());
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object o, String s) throws BeansException {
logger.info("====postProcessAfterInstantiation====="+o.getClass().getName());
return true;
}
@Override
public PropertyValues postProcessPropertyValues(PropertyValues propertyValues, PropertyDescriptor[] propertyDescriptors, Object o, String s) throws BeansException {
logger.info("====postProcessPropertyValues====="+o.getClass().getName());
return propertyValues;
}
}

UserToListPageController第一次出現

spring 使用Resource 後,修改值(實現思路及spring注意事項)

UserToListPageController第二次出現

spring 使用Resource 後,修改值(實現思路及spring注意事項)

spring 使用Resource 後,修改值(實現思路及spring注意事項)

UserToListPageController第三次出現,第一個擴展點出現

spring 使用Resource 後,修改值(實現思路及spring注意事項)

UserToListPageController第四次出現,實例化方法被調用

spring 使用Resource 後,修改值(實現思路及spring注意事項)

UserToListPageController第五次出現,實例化方法調用完成之後,其它擴展點如下順序依次被調用

spring 使用Resource 後,修改值(實現思路及spring注意事項)

作者:tinguo002

原文:http://www.zuidaima.com/blog/4192905400863744.htm

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

使用gradle生成Spring Boot應用的Docker Image
ASP.NET Web Pages-HTML 表單

TAG:程序員小新人學習 |