Controller類是使用註解@Resource 注入service類,我想通過配置文件,動態的改變注入的service類。
實現思路:
- 載入所有配置文件,讀取屬性和值,保存在單例類中。
- 切入點:在spring把這個類實例化之後(實例化完成),並且所有成員變數賦值完成之後(初始化完成),拿到這個實例對象。
- 從對象中取出標記了@UpdateValueByConfigByClassInit的屬性。
- 使用class的名+屬性名從配置類中取值,有值則為該欄位重新賦值。
- 這邊賦值分二種情況:若欄位上沒有@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第一次出現
UserToListPageController第二次出現
UserToListPageController第三次出現,第一個擴展點出現
UserToListPageController第四次出現,實例化方法被調用
UserToListPageController第五次出現,實例化方法調用完成之後,其它擴展點如下順序依次被調用
作者:tinguo002
原文:http://www.zuidaima.com/blog/4192905400863744.htm
※使用gradle生成Spring Boot應用的Docker Image
※ASP.NET Web Pages-HTML 表單
TAG:程序員小新人學習 |