日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

准备依赖注入

發布時間:2024/4/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 准备依赖注入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在前面的分析中我們已經了解到Bean 的依賴注入主要分為兩個步驟,首先調用createBeanInstance()方法生成Bean 所包含的Java 對象實例。然后,調用populateBean()方法,對Bean 屬性的依賴注入進行處理。

上面我們已經分析了容器初始化生成Bean 所包含的Java 實例對象的過程,現在我們繼續分析生成對象后,Spring IOC 容器是如何將Bean 的屬性依賴關系注入Bean 實例對象中并設置好的,回到AbstractAutowireCapableBeanFactory 的populateBean()方法,對屬性依賴注入的代碼如下:

//將Bean屬性設置到生成的實例對象上 protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {if (bw == null) {if (mbd.hasPropertyValues()) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");}else {// Skip property population phase for null instance.return;}}// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the// state of the bean before properties are set. This can be used, for example,// to support styles of field injection.boolean continueWithPropertyPopulation = true;if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {continueWithPropertyPopulation = false;break;}}}}if (!continueWithPropertyPopulation) {return;}//獲取容器在解析Bean定義資源時為BeanDefiniton中設置的屬性值PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);//對依賴注入處理,首先處理autowiring自動裝配的依賴注入if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {MutablePropertyValues newPvs = new MutablePropertyValues(pvs);// Add property values based on autowire by name if applicable.//根據Bean名稱進行autowiring自動裝配處理if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {autowireByName(beanName, mbd, bw, newPvs);}// Add property values based on autowire by type if applicable.//根據Bean類型進行autowiring自動裝配處理if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {autowireByType(beanName, mbd, bw, newPvs);}pvs = newPvs;}//對非autowiring的屬性進行依賴注入處理boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);if (hasInstAwareBpps || needsDepCheck) {if (pvs == null) {pvs = mbd.getPropertyValues();}PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);if (hasInstAwareBpps) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);if (pvs == null) {return;}}}}if (needsDepCheck) {checkDependencies(beanName, mbd, filteredPds, pvs);}}if (pvs != null) {//對屬性進行注入applyPropertyValues(beanName, mbd, bw, pvs);} } //解析并注入依賴屬性的過程 protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {if (pvs.isEmpty()) {return;}//封裝屬性值MutablePropertyValues mpvs = null;List<PropertyValue> original;if (System.getSecurityManager() != null) {if (bw instanceof BeanWrapperImpl) {//設置安全上下文,JDK安全機制((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());}}if (pvs instanceof MutablePropertyValues) {mpvs = (MutablePropertyValues) pvs;//屬性值已經轉換if (mpvs.isConverted()) {// Shortcut: use the pre-converted values as-is.try {//為實例化對象設置屬性值bw.setPropertyValues(mpvs);return;}catch (BeansException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", ex);}}//獲取屬性值對象的原始類型值original = mpvs.getPropertyValueList();}else {original = Arrays.asList(pvs.getPropertyValues());}//獲取用戶自定義的類型轉換TypeConverter converter = getCustomTypeConverter();if (converter == null) {converter = bw;}//創建一個Bean定義屬性值解析器,將Bean定義中的屬性值解析為Bean實例對象的實際值BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);// Create a deep copy, resolving any references for values.//為屬性的解析值創建一個拷貝,將拷貝的數據注入到實例對象中List<PropertyValue> deepCopy = new ArrayList<>(original.size());boolean resolveNecessary = false;for (PropertyValue pv : original) {//屬性值不需要轉換if (pv.isConverted()) {deepCopy.add(pv);}//屬性值需要轉換else {String propertyName = pv.getName();//原始的屬性值,即轉換之前的屬性值Object originalValue = pv.getValue();//轉換屬性值,例如將引用轉換為IOC容器中實例化對象引用Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);//轉換之后的屬性值Object convertedValue = resolvedValue;//屬性值是否可以轉換boolean convertible = bw.isWritableProperty(propertyName) &&!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);if (convertible) {//使用用戶自定義的類型轉換器轉換屬性值convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);}// Possibly store converted value in merged bean definition,// in order to avoid re-conversion for every created bean instance.//存儲轉換后的屬性值,避免每次屬性注入時的轉換工作if (resolvedValue == originalValue) {if (convertible) {//設置屬性轉換之后的值pv.setConvertedValue(convertedValue);}deepCopy.add(pv);}//屬性是可轉換的,且屬性原始值是字符串類型,且屬性的原始類型值不是//動態生成的字符串,且屬性的原始值不是集合或者數組類型else if (convertible && originalValue instanceof TypedStringValue &&!((TypedStringValue) originalValue).isDynamic() &&!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {pv.setConvertedValue(convertedValue);//重新封裝屬性的值deepCopy.add(pv);}else {resolveNecessary = true;deepCopy.add(new PropertyValue(pv, convertedValue));}}}if (mpvs != null && !resolveNecessary) {//標記屬性值已經轉換過mpvs.setConverted();}// Set our (possibly massaged) deep copy.//進行屬性依賴注入try {bw.setPropertyValues(new MutablePropertyValues(deepCopy));}catch (BeansException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", ex);} }

分析上述代碼,我們可以看出,對屬性的注入過程分以下兩種情況:

1)、屬性值類型不需要強制轉換時,不需要解析屬性值,直接準備進行依賴注入。

2)、屬性值需要進行類型強制轉換時,如對其他對象的引用等,首先需要解析屬性值,然后對解析后的屬性值進行依賴注入。

對屬性值的解析是在BeanDefinitionValueResolver 類中的resolveValueIfNecessary()方法中進行的,對屬性值的依賴注入是通過bw.setPropertyValues()方法實現的,在分析屬性值的依賴注入之前,我們先分析一下對屬性值的解析過程。

?

總結

以上是生活随笔為你收集整理的准备依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。