Spring AOP內功修煉

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天來和小夥伴們分享這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Spring AOP","attrs":{}},{"type":"text","text":" 的知識點 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c0/c0bc9d9122fcbd0de0d914a298e6063a.png","alt":"image-20210913072321674","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏先推薦大家去閱讀 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Spring","attrs":{}},{"type":"text","text":" 的官方文檔,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"core","attrs":{}},{"type":"text","text":" 文檔的5,6章節, 和 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"AOP","attrs":{}},{"type":"text","text":" 相關的概念都可以這這裏找到~,還有我們要了解的 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Spring AOP APIs","attrs":{}},{"type":"text","text":" 😄","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f3/f340aae60b5f7645361e63d48f967d27.png","alt":"image-20210910074335232","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"先來介紹下這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"AOP","attrs":{}},{"type":"text","text":" 😄","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"AOP 概念","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是個老生常談的問題呀 哈哈 熟悉的小夥伴們可以略過😄","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"面向切面編程 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Aspect-Oriented Programming","attrs":{}},{"type":"text","text":" ,是對 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"OOP","attrs":{}},{"type":"text","text":" 的一種補充","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"使用場景有 : ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"日誌","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"事務","attrs":{}},{"type":"text","text":" , ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"權限認證","attrs":{}},{"type":"text","text":" , ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"緩存","attrs":{}},{"type":"text","text":" 等","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Spring AOP","attrs":{}},{"type":"text","text":" 呢,會通過這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"代理類","attrs":{}},{"type":"text","text":" 來實現對方法的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"增強","attrs":{}},{"type":"text","text":" 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7a/7a17e2f616bbea75ee238b5eb5913f41.png","alt":"image-20210910073611972","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏有很重要的幾個概念 👇(看圖就好啦)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/dd/dd200a5aed69c7c6329794c81ebedf67.png","alt":"image-20210910074649844","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"概念關係圖","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"PointCut","attrs":{}},{"type":"text","text":" 去匹配符合的 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"JoinPoint","attrs":{}},{"type":"text","text":" ,再對其做 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Weaving","attrs":{}},{"type":"text","text":"·操作,將 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Advice","attrs":{}},{"type":"text","text":" 織入其中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"PointCut","attrs":{}},{"type":"text","text":" 和 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Advice","attrs":{}},{"type":"text","text":" 存放在 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Aspect","attrs":{}},{"type":"text","text":" 中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/bf/bfce18adfbc1ee1a2948018d6632ec22.png","alt":"image-20210910081828619","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"切點表達式圖","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"execution","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"within","attrs":{}},{"type":"text","text":" , ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"this","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"target","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"args","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"bean","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以及","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"匹配註解","attrs":{}},{"type":"text","text":"用的 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@target","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@args","attrs":{}},{"type":"text","text":" ,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@within","attrs":{}},{"type":"text","text":" , ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@annotation","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"execution","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用: 匹配 某些連接點","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"execution(public * *(..)) 作用: 匹配所有公共方法","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"execution(* set*(..)) 作用:匹配所有 set 開頭的方法","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"execution(* com.xyz.service.AccountService.*(..)) 作用:匹配 AccountService 中的所有方法","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"execution(* com.xyz.service.","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":".","attrs":{}},{"type":"text","text":"(..)) 作用:匹配 service 包中的所有方法","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"execution(* com.xyz.service..","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":".","attrs":{}},{"type":"text","text":"(..)) 作用:匹配 service 包和它的子包中 所有的方法","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"within","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 類 中的所有 連接點","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"within(com.xyz.service.*) 作用:匹配 service 包中的所有方法","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"within(com.xyz.service..*) 作用:匹配 service 包和它的子包中 所有的方法","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"this","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 代理類","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"this(com.xyz.service.AccountService) 作用:匹配 實現了 AccountService 接口的 代理類,即 父類是 AccountService","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"target","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 被代理類","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"target(com.xyz.service.AccountService) 作用:匹配 實現了 AccountService 接口的 被代理類,即 父類是 AccountService","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"args","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 方法參數","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"args(java.io.Serializable) 作用:匹配 單個方法參數,且是 Serializable 類型的","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"bean","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 bean 名稱,Spring 擴展 AspectJ 的 PDC 規範, 只能在 Spring AOP 中生效","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"@target","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 有註解的 被代理類","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"@target(org.springframework.transaction.annotation.Transactional) 作用:匹配 @Transactional 註解的 被代理類","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"@args","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 傳入的參數 有某個註解","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"@args(com.xyz.security.Classified) 作用: 匹配有 @Classified 註解的參數","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"@within","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 有某個註解 的 類","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"@within(org.springframework.transaction.annotation.Transactional) 作用: 匹配 有 @Transactional 註解 的 類中的所有 連接點","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"@annotation","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:匹配 該註解","attrs":{}}]}],"attrs":{}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"@annotation(org.springframework.transaction.annotation.Transactional) 作用: 匹配 @Transactional 註解","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"小結圖如下 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b6/b663607874f83ab77d7ac74c07f004af.png","alt":"image-20210910082639157","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Advice 註解圖","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏是常用的五個註解","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"注意:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@After","attrs":{}},{"type":"text","text":" 等於 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"finally","attrs":{}},{"type":"text","text":" 語句塊,必定會執行,還有 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@Around","attrs":{}},{"type":"text","text":" 註解時,方法的第一個參數必須是 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"ProceedingJoinPoint","attrs":{}},{"type":"text","text":" ,它是 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"JoinPoint","attrs":{}},{"type":"text","text":" 的子接口","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e2/e29068a211d4adbb99999ff9aa4a003c.png","alt":"image-20210913074020835","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"horizontalrule","attrs":{}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面的內容是本文的重點~ 😝","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"編程式 AOP","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個呢,是我們寫 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"AOP插件","attrs":{}},{"type":"text","text":" 的基礎","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/93/93de31721da5ed2f78a34406b3080603.png","alt":"image-20210912074920354","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏要理解這幾個概念 👇","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Pointcut","attrs":{}},{"type":"text","text":" : ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"對應 @Pointcut","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Advice","attrs":{}},{"type":"text","text":" :","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"對應 @Before,@After,@Around 等等","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Advisor","attrs":{}},{"type":"text","text":" :","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@Aspect 註解解析後的類,等於 Pointcut + Advice","attrs":{}},{"type":"text","text":" 🐷","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Advised","attrs":{}},{"type":"text","text":" : ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Spring AOP 代理類都可以轉換成該接口!","attrs":{}},{"type":"text","text":" 🐷","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例子我放到 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Github","attrs":{}},{"type":"text","text":" 上啦 ,地址放文末啦👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Pointcut","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"裏面有兩個返回類型式 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"ClassFilter","attrs":{}},{"type":"text","text":" 和 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"MethodMatcher","attrs":{}},{"type":"text","text":" 的方法,他們的作用如下 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/03/038612e23f828a3e73fb730d5e3d5368.png","alt":"image-20210912100228554","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4ye 也是大概瞭解下 哈哈 主要還是用 Spring 提供的實現類,如下面例子中用到的 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"NameMatchMethodPointcut","attrs":{}},{"type":"text","text":" ,看名字就能猜個大概,就是匹配這個方法名的 😄","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"小例子","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼例子比較多,這裏就舉這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Pointcut","attrs":{}},{"type":"text","text":" 看看就好啦~ (其他案例代碼小夥伴們可以自行在我的 Github 倉庫上獲取😄)","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過對 ProxyFactroy 添加 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"切面","attrs":{}},{"type":"text","text":" 來對目標 sayService 做增強,這裏的 Pointcut 只針對 setName 方法","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/83/83a49d9a0e5d2564eee4e6d00372488e.png","alt":"AOP_Pointcut","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"效果","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以看到只增強了 setName 方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/37/376a199239fcff6d9608f98bb00c7bba.png","alt":"image-20210912094544020","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Advice","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以看到這裏 Spring 提供了這 五種類型。除了最後一種 Introduction 類型上面沒提到外,是不是還發現少了一種類型😝","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/65/65bd7701993ad0eced771c49ba52e316.png","alt":"image-20210912161447604","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"沒錯,就是這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@After","attrs":{}},{"type":"text","text":" 註解對應的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最終通知","attrs":{}},{"type":"text","text":" 😱","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這去哪了呀 ( ̄﹏ ̄;)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在源碼中尋找一番後,發現了這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"AspectJAfterAdvice","attrs":{}},{"type":"text","text":" 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/88/888fb167e884d026cee7c2b8b92e851e.png","alt":"image-20210912104757851","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以看到這裏不僅實現了 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"AfterAdvice","attrs":{}},{"type":"text","text":" 接口,還要實現這個 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"MethodInterceptor","attrs":{}},{"type":"text","text":" 接口 ,最後真的是在 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"finally","attrs":{}},{"type":"text","text":" 語句塊中實現了這個","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"增強操作","attrs":{}},{"type":"text","text":",來達到 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最終通知","attrs":{}},{"type":"text","text":" 的效果!","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以我們需要 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最終通知","attrs":{}},{"type":"text","text":" 效果的話,可以直接模仿它去實現就好了~","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而 Introduction Advice 這個還挺特別的🐖","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用:爲代理類實現新的接口","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"等於 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"@DeclareParents","attrs":{}},{"type":"text","text":" 註解","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Advisor","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用 👇","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"@Aspect 註解解析後的類,等於 Pointcut + Advice","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Advised","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作用 👇","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"AOP 代理類都可以轉換成該接口","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"爲啥這些代理對象都能轉換成這個 Advised 接口?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"答案當然不言而喻 哈哈,咱們來源碼中看看 Spring 是怎麼寫的😝","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"JDK","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/87/87b99630fe1583263868f1bf9fafb69c.png","alt":"image-20210911231149301","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Cglib","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7b/7b146f4fd88f99ef6176847ddf20890e.png","alt":"image-20210911233943416","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"結論","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以發現,不管是 JDK 還是 Cglib , 都會去調用同一個方法,爲代理類多實現幾個接口,其中一個就是 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Advised","attrs":{}},{"type":"text","text":" 😋","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"關係圖","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/d0/d09414acdc99817a6effb20277581383.png","alt":"SpringAOP","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"最後","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文就分享到這裏啦🐖","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"重點內容在 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"編程式AOP","attrs":{}},{"type":"text","text":" 這一塊~ 內功+1 😋","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼可以在這裏獲取 👇 可以自己多跑跑代碼,會有更多問題等着你發現的!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://github.com/Java4ye/springboot-demo-4ye/tree/main/springboot-aop","title":null,"type":null},"content":[{"type":"text","text":"https://github.com/Java4ye/springboot-demo-4ye/tree/main/springboot-aop","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"思維導圖 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"http://processon.com/chart_image/6134d6cb7d9c081c753b5d54.png","title":null,"type":null},"content":[{"type":"text","text":"http://processon.com/chart_image/6134d6cb7d9c081c753b5d54.png","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"ps:這次分享的時候居然出現了 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Gateway Timeout","attrs":{}},{"type":"text","text":" 異常 ,如果等不及官方修復的話,可以在網盤獲取","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"鏈接","attrs":{}},{"type":"text","text":":","attrs":{}},{"type":"link","attrs":{"href":"https://pan.baidu.com/s/1KVWw0DaYCKrISIKJgqqyuA","title":null,"type":null},"content":[{"type":"text","text":"https://pan.baidu.com/s/1KVWw0DaYCKrISIKJgqqyuA","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"提取碼","attrs":{}},{"type":"text","text":" 需在公衆號後臺回覆 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"bdwp","attrs":{}}],"attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c4/c4074f57bcfc5f61547982765232c78e.png","alt":"image-20210913074314344","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"插件的部分代碼我也上傳啦,就差這畫畫圖寫寫文啦 哈哈 (這兩天應該就安排上了)😆","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"喜歡的話可以 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"關注","attrs":{}},{"type":"text","text":" 並 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"星標","attrs":{}},{"type":"text","text":" 下公衆號 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Java4ye","attrs":{}},{"type":"text","text":" 支持下 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"4ye","attrs":{}},{"type":"text","text":" 呀😝,這樣就可以第一時間收到更文消息啦🐷","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"我是4ye 咱們下期應該……很快再見!!","attrs":{}},{"type":"text","text":" 😆","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章