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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

initializeBean()方法为容器产生的Bean 实例对象添加BeanPostProcessor 后置处理器

發布時間:2024/4/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 initializeBean()方法为容器产生的Bean 实例对象添加BeanPostProcessor 后置处理器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

同樣在AbstractAutowireCapableBeanFactory 類中,initializeBean()方法實現為容器創建的Bean實例對象添加BeanPostProcessor 后置處理器,源碼如下:

//初始容器創建的Bean實例對象,為其添加BeanPostProcessor后置處理器 protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {//JDK的安全機制驗證權限if (System.getSecurityManager() != null) {//實現PrivilegedAction接口的匿名內部類AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {//為Bean實例對象包裝相關屬性,如名稱,類加載器,所屬容器等信息invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;//對BeanPostProcessor后置處理器的postProcessBeforeInitialization//回調方法的調用,為Bean實例初始化前做一些處理if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}//調用Bean實例對象初始化的方法,這個初始化方法是在Spring Bean定義配置//文件中通過init-method屬性指定的try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}//對BeanPostProcessor后置處理器的postProcessAfterInitialization//回調方法的調用,為Bean實例初始化之后做一些處理if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean; } //調用BeanPostProcessor后置處理器實例對象初始化之前的處理方法 public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;//遍歷容器為所創建的Bean添加的所有BeanPostProcessor后置處理器for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {//調用Bean實例所有的后置處理中的初始化前處理方法,為Bean實例對象在//初始化之前做一些自定義的處理操作Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result; } @Override //調用BeanPostProcessor后置處理器實例對象初始化之后的處理方法 public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;//遍歷容器為所創建的Bean添加的所有BeanPostProcessor后置處理器for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {//調用Bean實例所有的后置處理中的初始化后處理方法,為Bean實例對象在//初始化之后做一些自定義的處理操作Object current = beanProcessor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result; }

BeanPostProcessor 是一個接口,其初始化前的操作方法和初始化后的操作方法均委托其實現子類來實現,在Spring 中,BeanPostProcessor 的實現子類非常的多,分別完成不同的操作,如:AOP 面向切面編程的注冊通知適配器、Bean 對象的數據校驗、Bean 繼承屬性、方法的合并等等,我們以最簡單的AOP 切面織入來簡單了解其主要的功能。下面我們來分析其中一個創建AOP 代理對象的子類AbstractAutoProxyCreator 類。該類重寫了postProcessAfterInitialization()方法。

?

總結

以上是生活随笔為你收集整理的initializeBean()方法为容器产生的Bean 实例对象添加BeanPostProcessor 后置处理器的全部內容,希望文章能夠幫你解決所遇到的問題。

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