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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中的后置处理器BeanPostProcessor讲解

發布時間:2023/12/31 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring中的后置处理器BeanPostProcessor讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring中提供了很多PostProcessor供開發者進行拓展,例如:BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor等一系列后處理器。他們的使用方式大多類似,了解其中一個并掌握他的使用方式,其他的可以觸類旁通。

BeanPostProcessor接口作用:

???? 如果我們想在Spring容器中完成bean實例化、配置以及其他初始化方法前后要添加一些自己邏輯處理。我們需要定義一個或多個BeanPostProcessor接口實現類,然后注冊到Spring IoC容器中。

BeanPostProcessor?API:

public interface BeanPostProcessor { /** * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. */ //實例化、依賴注入完畢,在調用顯示的初始化之前完成一些定制的初始化任務 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; /** * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. */ //實例化、依賴注入、初始化完畢時執行 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }

BeanPostProcessor接口提供了兩個供開發者自定義的方法:postProcessBeforeInitialization、postProcessAfterInitialization。

postProcessBeforeInitialization:該方法主要針對spring在bean初始化時調用初始化方法前進行自定義處理。

postProcessAfterInitialization:該方法主要針對spring在bean初始化時調用初始化方法后進行自定義處理。

?

測試代碼:

com.test.model.Cat:

package com.test.model;/*** 測試bean*/ public class Cat {private String name;private int age;public void say() {System.out.println("name:" + name);System.out.println("age:" + age);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} } View Code

spring容器中配置cat,和cat的beanPostProcessor:

<!--配置bean并初始化--><bean id="cat" class="com.test.model.Cat" ><property name="name" value="HelloKitty" /><property name="age" value="1" /></bean><bean id="catBeanPostProcessor" class="com.test.postprocessor.CatBeanPostProcessor" />

com.test.postprocessor.CatBeanPostProcessor:

package com.test.postprocessor;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import com.test.model.Cat;/*** 自定義后處理器*/ public class CatBeanPostProcessor implements BeanPostProcessor{@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof Cat) {//輸出原始屬性Cat cat = (Cat) bean;cat.say();return bean;}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof Cat) {//修改屬性值,并返回Cat cat = (Cat) bean;cat.setName("hello maomi");cat.setAge(3);return cat;}return bean;}}

IndexController:

package com.cy.controller;import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest;import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.support.WebApplicationContextUtils;import com.test.model.Cat;@Controller public class IndexController {//到index首頁@RequestMapping(value="index")public String index(HttpServletRequest request){/*** 訪問index同時,從容器中獲取已經被初始化之后處理過的cat,打印信息*/ServletContext servletContext = request.getSession().getServletContext();ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(servletContext);Cat c = (Cat) ac.getBean("cat");c.say();return "index";} }

觀察結果:

容器啟動時,輸出:

name:HelloKitty age:1 訪問項目http://localhost:8080/demo/index,index鏈接時,輸出: name:hello maomi age:3 -------------------------------------------------------------------------------------------------------------------------- 可以看到通過后處理器處理過后的bean信息已經改變。最后,看看源碼中如何調用自定義實現的。 在初始化bean方法中:AbstractAutowireCapableBeanFactory.java /*** 初始化bean*/ protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {//省略部分無關代碼Object wrappedBean = bean;//初始化前if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//調用初始化方法初始化bean invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}//初始化后if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean; } //postProcessBeforeInitialization方法調用 @Override public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {//調用自定義postProcessBeforeInitialization方法Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result; } //postProcessAfterInitialization方法調用 @Override public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {//自定義postProcessAfterInitialization方法調用Object current = beanProcessor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result; }

?

轉載于:https://www.cnblogs.com/tenWood/p/8542521.html

總結

以上是生活随笔為你收集整理的Spring中的后置处理器BeanPostProcessor讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 影音先锋亚洲一区 | 日韩国产精品一区二区三区 | 波多野结衣一区二区在线 | 直接看的毛片 | 国产亚洲欧美一区二区 | 日韩精品在线第一页 | 亚洲成人天堂 | 韩国三级hd中文字幕有哪些 | 欧美国产高清 | 成人免费一级 | 青草视屏| 一级绝黄| 九色91视频 | 午夜在线视频免费观看 | 国产91综合 | 九七电影院97理论片 | av激情在线 | 久久久精品999 | 四虎亚洲精品 | 国产一区二区三区影视 | 成人91网站 | 少妇性l交大片7724com | 超碰在线c | 亚洲Av无码成人精品区伊人 | 已满十八岁免费观看全集动漫 | 在线www| 国产区福利| 久久久91精品 | 国内自拍第三页 | 欧美一区二区三区久久综合 | 欧美乱色| 谁有av网址 | 精品熟妇无码av免费久久 | 天堂精品视频 | 久久密av| 日韩欧 | 精品久久一二三区 | 日韩 国产 在线 | 久久露脸国语精品国产 | 一级黄色片免费在线观看 | 精品人妻一区二区三区浪潮在线 | 国内视频一区二区 | 婚后打屁股高h1v1调教 | 久久精品国产露脸对白 | 中文无码精品一区二区三区 | 中文字幕永久在线播放 | 男人av网| 国产欧美三级 | 国产一区二区三区四 | 大波大乳videos巨大 | 香蕉视频99 | 久草热在线 | 日韩极品一区 | 国产成人免费观看视频 | 激情六月| 鲁鲁狠狠狠7777一区二区 | 国产精品女同一区二区 | 亚洲精品国产精华液 | 成人久久视频 | 77久久| 夜色视频在线观看 | 成人在线直播 | 中文字幕久久久久 | 嫩草影院懂你的 | 日日躁夜夜躁白天躁晚上躁91 | 黄色三级免费网站 | 国产成人在线视频网站 | 视频一区在线播放 | 在线观看污污视频 | 欧美性极品| av片免费播放 | 又污又黄的视频 | 天堂影视在线观看 | 伊人情人综合网 | 亚洲一卡二卡在线 | 一级片视频免费 | 亚洲综合在线成人 | 91亚洲精品国偷拍自产在线观看 | 日本黄色免费 | 日本乱子伦xxxx | 国产精品一级视频 | 亚洲欧美国产高清 | 国产农村妇女精品一二区 | 国产porn | 久久久国产精华液999999 | 男女一级黄色 | 国产精品美女 | 国产一区中文 | xxxx在线播放 | 亚欧美色图 | 91重口味 | 中文字幕第六页 | 精品字幕 | 黄色一级片免费在线观看 | 蜜桃综合网 | 91全免费| 亚洲乱码国产乱码精品精98午夜 | 中文字幕25页 | 国产成人精品免费视频 |