激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 關于spring中aop的注解實現方法實例詳解

關于spring中aop的注解實現方法實例詳解

2020-12-09 11:50小Cai先森 Java教程

這篇文章主要給大家介紹了關于spring中aop的注解實現方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起看看吧。

前言

在之前的一篇文章中我們講到spring的xml實現,這里我們講講使用注解如何實現aop呢。前面已經講過aop的簡單理解了,這里就不在贅述了。話不多說,來一起看看詳細的介紹:

注解方式實現aop我們主要分為如下幾個步驟:

  1.在切面類(為切點服務的類)前用@Aspect注釋修飾,聲明為一個切面類。

  2.用@Pointcut注釋聲明一個切點,目的是為了告訴切面,誰是它的服務對象。(此注釋修飾的方法的方法體為空,不需要寫功能比如 public void say(){};就可以了,方法名可以被候命的具體服務功能所以引用,它可以被理解為切點對象的一個代理對象方法)

  3.在對應的方法前用對應的通知類型注釋修飾,將對應的方法聲明稱一個切面功能,為了切點而服務

  4.在spring配置文件中開啟aop注釋自動代理。如: <aop:aspectj-autoproxy/>

這樣講可能還是很抽象,那么,廢話不多說,我們代碼說話,代碼如下:

騎士類:(看過上一篇內容的就知道騎士是什么東西了,嘿嘿嘿)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.cjh.aop2;
 
import org.springframework.stereotype.Component;
 
/**
 * @author Caijh
 *
 * 2017年7月11日 下午3:53:19
 */
@Component("knight")
public class BraveKnight {
 public void saying(){
  System.out.println("我是騎士..(切點方法)");
 }
}

切面類:(注釋主要在這里體現)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.cjh.aop2;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
 
/**
 * @author Caijh
 * 2017年7月12日 上午9:31:43
 */
/**
 * 注解方式聲明aop
 * 1.用@Aspect注解將類聲明為切面(如果用@Component("")注解注釋為一個bean對象,那么就要在spring配置文件中開啟注解掃描,<context:component-scan base-package="com.cjh.aop2"/>
 *  否則要在spring配置文件中聲明一個bean對象)
 * 2.在切面需要實現相應方法的前面加上相應的注釋,也就是通知類型。
 * 3.此處有環繞通知,環繞通知方法一定要有ProceedingJoinPoint類型的參數傳入,然后執行對應的proceed()方法,環繞才能實現。
 */
@Component("annotationTest")
@Aspect
public class AnnotationTest {
 //定義切點
 @Pointcut("execution(* *.saying(..))")
 public void sayings(){}
 /**
  * 前置通知(注解中的sayings()方法,其實就是上面定義pointcut切點注解所修飾的方法名,那只是個代理對象,不需要寫具體方法,
  * 相當于xml聲明切面的id名,如下,相當于id="embark",用于供其他通知類型引用)
  * <aop:config>
  <aop:aspect ref="mistrel">
   <!-- 定義切點 -->
   <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
   <!-- 聲明前置通知 (在切點方法被執行前調用) -->
   <aop:before method="beforSay" pointcut-ref="embark"/>
   <!-- 聲明后置通知 (在切點方法被執行后調用) -->
   <aop:after method="afterSay" pointcut-ref="embark"/>
  </aop:aspect>
  </aop:config>
  */
 @Before("sayings()")
 public void sayHello(){
  System.out.println("注解類型前置通知");
 }
 //后置通知
 @After("sayings()")
 public void sayGoodbey(){
  System.out.println("注解類型后置通知");
 }
 //環繞通知。注意要有ProceedingJoinPoint參數傳入。
 @Around("sayings()")
 public void sayAround(ProceedingJoinPoint pjp) throws Throwable{
  System.out.println("注解類型環繞通知..環繞前");
  pjp.proceed();//執行方法
  System.out.println("注解類型環繞通知..環繞后");
 }
}

spring配置文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
 <!-- 開啟注解掃描 -->
 <context:component-scan base-package="com.cjh.aop2"/>
 <!-- 開啟aop注解方式,此步驟s不能少,這樣java類中的aop注解才會生效 -->
 <aop:aspectj-autoproxy/>
</beans>

測試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.cjh.aop2;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
/**
 *
 * @author Caijh
 * 2017年7月11日 下午6:27:06
 */
public class Test {
 public static void main(String[] args) {
  ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");
  BraveKnight br = (BraveKnight) ac.getBean("knight");
  br.saying();
 }
}

運行結果:

注解類型環繞通知..環繞前

注解類型前置通知

我是騎士..(切點方法)

注解類型環繞通知..環繞后

注解類型后置通知

========================分割線===================================

因為使用了注解方式,所以配置文件少了很多內容,只需要一句<context:component-scan base-package="com.cjh.aop2"/>聲明要掃描的包,框架會自動掃描注釋并生成bean對象。有個@Component("knight")這個注釋,和<bean id="knight" class="com.cjh.aop2.BraveKnight"/>這個配置時一樣的意思,框架會自動識別并創建名為knight的BraveKnight對象。所以有了注釋,只需要開啟注釋掃描配置就好了,無需再做相同的bean配置。

如果運行過程中出現Spring aop : error at ::0 can't find referenced pointcut sleepPonit的錯誤,那么很可能是spring的包的版本問題,

我用的是spring4的版本,然后還需要加aspectjrt-1.7.4.jar和aspectjweaver-1.7.4.jar兩個包

下載地址:aspectjrt_aspectjweaver.rar

工程目錄如下:(打碼碼的類不用管,只是為了不為大家造成誤導,所以劃掉了)

關于spring中aop的注解實現方法實例詳解

通知注解類型如下:

關于spring中aop的注解實現方法實例詳解

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持

原文鏈接:http://www.cnblogs.com/caijh/p/7154691.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91在线视频导航 | 国产扩阴视频 | 久久久久久久99 | 黄在线| 99精品视频一区二区三区 | av在线大全 | 黄色毛片一级视频 | 久久亚洲精品11p | 男男羞羞视频网站国产 | 一级毛片a级 | 国产精品成人一区二区三区电影毛片 | 国产伦精品一区二区三区 | 国产成人在线免费观看视频 | av在线影片 | 人人看人人舔 | 亚洲国产精品久久久久久久 | 成人一级免费视频 | 最新久久免费视频 | 日本s级毛片免费观看 | 轻点插视频 | 久久久成人999亚洲区美女 | 一级视频片| 少妇一级淫片免费放4p | 91在线免费观看 | 免费看日产一区二区三区 | 欧美性成人 | 亚洲第一成人在线视频 | 成年性羞羞视频免费观看 | 性生大片免费观看一片黄动漫 | 老司机一级毛片 | 久久精品a一级国产免视看成人 | 一本在线高清码电影 | 国产成人精品一区二区三区电影 | 在线看一区二区三区 | 97久久人人超碰caoprom | 失禁高潮抽搐喷水h | 国产88久久久国产精品免费二区 | 国产二区三区在线播放 | 中文字幕爱爱视频 | av免费不卡国产观看 | 欧美成人黄色 |