成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于Spring AOP的兩個高級功能,你用過嗎?

開發 前端
在切面中,通過@DeclareParents注解(Spring AOP的特定功能)來聲明哪些目標對象將被引入什么接口。這個注解實際上是在創建代理對象時,將這些接口的實現動態地“插入”到代理對象中。

環境:SpringBoot3.2.5

1. 引入功能

Spring AOP中有非常特殊的類型增強"Introductions",它允許切面為被代理的對象動態地引入新的接口,從而使得這些對象在運行時具備了這些接口所聲明的方法。

工作原理:

定義接口:首先,聲明一個你需要目標類實現的接口。在目標類創建代理時,代理類會實現該接口

實現接口:這是對上面接口的實現,當我們通過代理類調用上面聲明的接口時內部會調用該實現接口對應的方法。

創建切面:在切面中,通過@DeclareParents注解(Spring AOP的特定功能)來聲明哪些目標對象將被引入什么接口。這個注解實際上是在創建代理對象時,將這些接口的實現動態地“插入”到代理對象中。

有點晦澀,接下來直接上代碼你就明白怎么一回事了。

定義接口

public interface DAO {
  void remove() ;
}

該接口會被代理類實現。

實現上面的接口

public class DefaultDAO implements DAO {
  @Override
  public void remove() {
    System.out.println("默認刪除功能") ;
  }
}

最終生成的代理類實現了DAO接口,而具體方法實現細節是調用這里的DefaultDAO。

創建切面

接下來就是定義切面,你需要增強的類及聲明接口(代理類要實現的接口)。

@Aspect
public class LogAspect {
  @Pointcut("@annotation(log)")
  private void recordLog(Log log) {}
  
  // 通過該注解聲明PersonService類,在生成代理時需要實現DAO接口
  // 并且調用DAO中的方法時是調用的這里DefaultDAO中實現的方法
  @DeclareParents(value = "com.pack.aop.PersonService", defaultImpl = DefaultDAO.class)
  private DAO dao ;
  
  @Around("recordLog()")
  public Object aroundLog(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println("日志執行前...") ;
    Object ret = pjp.proceed() ;
    System.out.println("日志執行后...") ;
    return ret ;
  }
}

聲明PersonService

@Service
public class PersonService {
  public void save() {
    System.out.println("保存Person對象") ;
  }
}

接下來進行測試

@SpringBootTest
public class AppTest {
  private final PersonService ps ;
  public AppTest(PersonService ps) {
    this.ps = ps ;
  }
  @Test
  public void testSave() {
    this.ps.save() ;
    // 判斷是否是DAO類型
    if (ps instanceof DAO dao) {
      dao.remove() ; 
    }
  }
}

輸出結果

日志執行前...
保存Person對象
日志執行后...
默認刪除功能

PersonService生成的代理類,同時也實現了DAO接口,方法調用是DefaultDAO中的實現。

2. 切面實例化模型

看標題又是一個晦澀的東西。在Spring AOP中,切面實例化模型主要關注于切面對象是如何被創建和管理的。Spring提供了幾種不同的方式來實例化切面,每種方式都有其特定的用途和優點。這其中包括:perthis、pertarget 和 pertypewithin 實例化模型。這里我們就介紹perthis和pertarget。

perthis

perthis子句的作用是為每個執行業務服務的唯一服務對象創建一個方面實例(每個與此方面在連接點匹配的綁定到此對象的唯一對象)

pertarget

pertarget 實例化模型的工作方式與 perthis 完全相同,但它會在匹配的連接點上為每個唯一的目標對象創建一個方面實例。

示例:

定義切面

@Component
@Scope("prototype")
@Aspect("perthis(execution(* com.pack.aop.DAO.*(..)))")
public class LogAspect {
  @Before("bean(*Service)")
  public void beforeLog(JoinPoint jp) {
    System.out.println("before 記錄日志 - " + this) ;
  }
}

業務對象

public interface DAO {
  public void save() ;
}
public class PersonService implements DAO {
  public void save() {
    System.out.println("保存Person對象") ;
  }
}
public class StudentService implements DAO {
  public void save() {
    System.out.println("保存Student對象") ;
  }
}

測試

@SpringBootTest
public class AppTest {
  @Resource
  private PersonService ps ;
  @Resource
  private StudentService ss ;
  @Test
  public void testAll() {
    ps.save();
    System.out.println("===============") ;
    ss.save();
  }
}

輸出結果

before 記錄日志 - com.pack.aop.LogAspect@3ed242a4
保存Person對象
====================
before 記錄日志 - com.pack.aop.create.LogAspect@73a2e526
保存Student對象

實例化切面模型除非你需要更細粒度控制切面實例生命周期的場景下使用,一般應該是很少使用的。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2023-09-12 08:19:48

接口Controller線程

2024-09-26 14:48:35

SpringAOP范式

2020-09-21 14:55:15

數據庫SQL技術

2021-05-21 13:36:46

iOSiPhone功能

2023-09-13 09:20:00

日志配置Spring

2022-05-05 07:25:03

Supervisor監控Python

2024-11-04 16:29:19

2024-01-09 08:20:05

2020-10-16 09:40:18

順序Spring AOPHTTP

2020-08-16 10:58:20

Pandaspython開發

2011-09-20 15:19:15

Python

2024-04-30 08:20:54

代理工廠類Spring

2012-02-13 09:38:20

諾基亞SymbianMWC

2023-11-23 08:30:16

2022-12-07 08:47:28

2023-09-09 12:23:24

函數式接口程序

2020-02-27 14:05:26

SQLServer數據庫

2020-10-13 14:54:11

機器學習技術工具

2012-10-19 14:14:51

Ubuntu 12.1

2023-09-15 08:18:49

cookie網關代理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍视频在线观看 | 成人午夜影院 | 中文字幕电影在线观看 | 国产在线网址 | 精品国产乱码久久久久久老虎 | 亚洲一区二区不卡在线观看 | 中文二区| 午夜资源| 99久久久99久久国产片鸭王 | 亚洲欧美中文字幕 | 国产乱码高清区二区三区在线 | 国产精品久久久久久久久免费桃花 | 欧美成人一区二区 | 久久婷婷色 | 欧美国产精品一区二区三区 | 永久av | www.黄色网 | 少妇淫片aaaaa毛片叫床爽 | 丁香五月缴情综合网 | 欧州一区二区三区 | www.日韩 | 男人的天堂中文字幕 | 成人a网 | 国产一区二区三区在线 | 国产精品一区二区在线 | 国产成人免费在线观看 | 操人网站 | 成人免费在线视频 | 91精品国产综合久久久久久 | 伊人二区 | 特黄视频 | 在线观看涩涩视频 | 蜜桃av人人夜夜澡人人爽 | www.4虎影院 国产999精品久久久影片官网 | 精品久久久久久亚洲精品 | 亚洲国产成人精品女人久久久 | 99久久婷婷国产综合精品首页 | 二区亚洲 | 亚洲国产精品激情在线观看 | 中文字幕色站 | 国产精品久久国产精品 |