日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Spring一個強大便捷的代理工廠類,你用過嗎?

來源: 責編: 時間:2024-04-30 08:42:23 265觀看
導讀環境:Spring6.1.21. 簡介在Spring框架中,AOP(面向切面編程)是一種強大的編程范式,它允許開發者在不修改原有代碼的情況下,為程序添加額外的功能,如日志記錄、事務管理、安全控制等。實際開發中常用實現AOP配置方式:基于XML在

環境:Spring6.1.2phz28資訊網——每日最新資訊28at.com

1. 簡介

在Spring框架中,AOP(面向切面編程)是一種強大的編程范式,它允許開發者在不修改原有代碼的情況下,為程序添加額外的功能,如日志記錄、事務管理、安全控制等。phz28資訊網——每日最新資訊28at.com

實際開發中常用實現AOP配置方式:phz28資訊網——每日最新資訊28at.com

  • 基于XML

在早期的Spring版本中,開發者常常使用XML配置文件來定義切面、通知和目標對象之間的關聯。通過配置<aop:config>、<aop:aspect>、<aop:before>等標簽,可以輕松地實現AOP的各種功能。如下示例:phz28資訊網——每日最新資訊28at.com

<aop:config>  <aop:aspect id="myAspect" ref="aBean">    <aop:pointcut id="businessService"      expression="execution(* com.pack.service.*.*(..))"/>    <aop:before pointcut-ref="businessService" method="monitor"/>  </aop:aspect></aop:config>
  • 基于注解

通過在切面類和方法上使用如@Aspect、@Before、@After等注解,可以更加簡潔地定義AOP的相關配置。這種方式不僅減少了XML配置的工作量,還使得代碼更加清晰易讀。如下示例:phz28資訊網——每日最新資訊28at.com

@Component@Aspectpublic class LogAspect {  @Pointcut("execution(* save(..))")  private void logPc() {}  @Around("logPc()")  public Object process(ProceedingJoinPoint pjp) throws Throwable {    Object ret = null ;    System.out.println("before log...") ;    ret = pjp.proceed() ;    System.out.println("after log...") ;    return ret ;  }}

以上是Spring提供的2中方式來聲明AOP配置方式。但如果你需要一種更加靈活和可配置性,那么Spring還提供了一個非常方便強大的ProxyFactoryBean類,該類特別適合那些需要更多自定義和控制的場景,例如當你需要為特定的Bean創建代理,或者需要在不修改原始代碼的情況下為現有類添加額外的功能時。phz28資訊網——每日最新資訊28at.com

2. 實戰案例

ProxyFactoryBean與其他Spring FactoryBean實現一樣,引入了一個間接級別。如果定義了名為pack的ProxyFactoryBean,那么引用pack的對象看不到ProxyFactoryBean實例本身,而是由ProxyFactoryBean#getObject()方法實現創建的對象。此方法創建一個AOP代理,用于包裝目標對象。phz28資訊網——每日最新資訊28at.com

2.1 屬性配置

ProxyFactoryBean提供了很多屬性,讓你可以靈活的配置代理對象。該對象繼承了ProxyConfig,一些關鍵的屬性是由ProxyConfig定義。phz28資訊網——每日最新資訊28at.com

  • proxyTargetClass:如果要代理目標類,而不是目標類的接口,則為true。如果此屬性值設置為true,則會創建CGLIB代理。
  • optimize:控制是否對通過CGLIB創建的代理應用積極的優化。除非完全理解相關AOP代理如何處理優化,否則不應該輕松地使用此設置。目前僅用于CGLIB代理。它對JDK動態代理沒有影響。
  • frozen:如果代理配置被凍結,則不再允許更改該配置。此屬性的默認值為false,因此允許更改(例如添加額外的通知)。
  • exposeProxy:確定是否應在ThreadLocal中公開當前代理,以便目標可以訪問它。如果目標需要獲取代理,并且exposeProxy屬性設置為true,則該目標可以使用AoPontext.currentProxy()方法獲取代理對象。
  • proxyInterface:字符串接口名稱的數組。
  • interceptorNames:要應用的Advisor、攔截器或其他建議名稱的字符串數組。

接下來將從2方面介紹ProxyFactoryBean的使用,代理接口與代理類。2.2 代理接口phz28資訊網——每日最新資訊28at.com

要通過ProxyFactoryBean創建代理,你至少需要涉及到下面幾點(類):phz28資訊網——每日最新資訊28at.com

  • 需要被代理的目標bean類。
  • 一個Advisor或者Advice,增強部分。
  • 指定要代理的接口。

如下示例:phz28資訊網——每日最新資訊28at.com

public interface ICommonDAO {  void save() ;}@Component("commonDAOTarget")public class CommonDAOImpl implements ICommonDAO {  @Override  public void save() {    System.out.println("save operator...") ;  }}@Componentpublic class LogInterceptor implements MethodInterceptor {  @Override  public Object invoke(MethodInvocation invocation) throws Throwable {    System.out.println("before log...") ;    Object ret = invocation.proceed() ;    System.out.println("after  log...") ;    return ret ;  }}@Configurationpublic class AppConfig {  @Bean  // 由于上面已經定義了CommonDAOImpl,而這里的FactoryBean#getObject返回的  // 也是一個實現了ICommonDAO接口的對象,所以需要加上@Primary  @Primary  ProxyFactoryBean commonDAO(@Qualifier("commonDAOTarget") CommonDAOImpl commonDAOTarget) throws Exception {    ProxyFactoryBean proxy = new ProxyFactoryBean() ;    proxy.setProxyInterfaces(new Class<?>[] {ICommonDAO.class}) ;    proxy.setTarget(commonDAOTarget) ;    proxy.setInterceptorNames("logInterceptor") ;    return proxy ;  }}

測試phz28資訊網——每日最新資訊28at.com

ICommonDAO dao = context.getBean(ICommonDAO.class) ;dao.save() ;// 輸出before log...save operator...after  log...

2.3 代理類

如果我們的目標沒有實現接口,那么我們只能通過CGLIB進行代理,通過設置proxyTargetClass屬性為true。CGLIB代理通過在運行時生成目標類的子類來工作。Spring將這個生成的子類配置為將方法調用委托給原始目標。如下示例:phz28資訊網——每日最新資訊28at.com

@Component("commonDAOTarget")public class CommonDAO {  public void save() {    System.out.println("save operator...") ;  }}@Bean@PrimaryProxyFactoryBean commonDAO(@Qualifier("commonDAOTarget") CommonDAO commonDAOTarget) throws Exception {  ProxyFactoryBean proxy = new ProxyFactoryBean() ;  proxy.setTarget(commonDAOTarget) ;  proxy.setInterceptorNames("logInterceptor") ;  // 代理類,可以不設置  proxy.setProxyTargetClass(true) ;  return proxy ;}

查看最終的CommonDAO是否是通過CGLIB代理phz28資訊網——每日最新資訊28at.com

CommonDAO dao = context.getBean(CommonDAO.class) ;System.out.println(dao.getClass()) ;

輸出結果phz28資訊網——每日最新資訊28at.com

class com.pack.aop.create.ProxyFactoryBeanTest2$CommonDAO$$SpringCGLIB$$1

CGLIB代理通過在運行時生成目標類的子類來工作。但需要注意以下事項:phz28資訊網——每日最新資訊28at.com

  • final 類不能被代理,因為它們不能被擴展。
  • final方法無法提供增強,因為它們不能被覆蓋。
  • 不能增強private方法,因為它們不能被重寫。
  • 不可見的方法,通常是來自不同包的父類中的包私有方法,不能被增強,因為它們實際上是私有的。

2.4 模糊匹配攔截器

在上面配置攔截器時,我們都是指定的具體攔截器,其實我們還可以使用通配符,指定攔截器。如下示例:phz28資訊網——每日最新資訊28at.com

@Component("global_log")public class LogInterceptor implements MethodInterceptor {}@Component("global_auth")public class AuthInterceptor implements MethodInterceptor {}// ProxyFactoryBena配置ProxyFactoryBean commonDAO() throws Exception {  ProxyFactoryBean proxy = new ProxyFactoryBean() ;  // 注意:這里的通配符必須是最后,你不能放到其它位置  proxy.setInterceptorNames("global_*") ;  return proxy ;}

以上ProxyFactoryBean在初始化時,會自動查找容器中beanName以global_開頭的所有Bean對象。phz28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-86683-0.htmlSpring一個強大便捷的代理工廠類,你用過嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: HTTP 協議是怎么來的?最開始是什么樣子?又是如何一步步發展 HTTP3

下一篇: 一種避免寫大量CRUD方法的新思路

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業務到 2022 年底還是 0,希望 2023 年出來一個 1。&rdquo;這是2022年底,李彥宏
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 主站蜘蛛池模板: 枣阳市| 桂东县| 凤台县| 钟山县| 沁水县| 赤水市| 集安市| 藁城市| 友谊县| 青浦区| 蚌埠市| 峨边| 吉木乃县| 乌审旗| 浙江省| 区。| 全南县| 林口县| 建水县| 廉江市| 马鞍山市| 大兴区| 安溪县| 大新县| 广平县| 鹿邑县| 丰都县| 河曲县| 珠海市| 黔东| 黄骅市| 涪陵区| 玉田县| 丹江口市| 广河县| 玉溪市| 嵩明县| 米脂县| 聂拉木县| 和顺县| 黔南|