最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于spring中aop的注解實現(xiàn)方法實例詳解

 更新時間:2017年08月02日 09:37:32   作者:小Cai先森  
這篇文章主要給大家介紹了關(guān)于spring中aop的注解實現(xiàn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起看看吧。

前言

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

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

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

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

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

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

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

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

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("我是騎士..(切點方法)");
 }
}

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

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
 * email:codecjh@163.com
 * 2017年7月12日 上午9:31:43
 */
/**
 * 注解方式聲明aop
 * 1.用@Aspect注解將類聲明為切面(如果用@Component("")注解注釋為一個bean對象,那么就要在spring配置文件中開啟注解掃描,<context:component-scan base-package="com.cjh.aop2"/>
 *  否則要在spring配置文件中聲明一個bean對象)
 * 2.在切面需要實現(xiàn)相應(yīng)方法的前面加上相應(yīng)的注釋,也就是通知類型。
 * 3.此處有環(huán)繞通知,環(huán)繞通知方法一定要有ProceedingJoinPoint類型的參數(shù)傳入,然后執(zhí)行對應(yīng)的proceed()方法,環(huán)繞才能實現(xiàn)。
 */
@Component("annotationTest")
@Aspect
public class AnnotationTest {
 //定義切點
 @Pointcut("execution(* *.saying(..))")
 public void sayings(){}
 /**
  * 前置通知(注解中的sayings()方法,其實就是上面定義pointcut切點注解所修飾的方法名,那只是個代理對象,不需要寫具體方法,
  * 相當(dāng)于xml聲明切面的id名,如下,相當(dāng)于id="embark",用于供其他通知類型引用)
  * <aop:config>
  <aop:aspect ref="mistrel">
   <!-- 定義切點 -->
   <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
   <!-- 聲明前置通知 (在切點方法被執(zhí)行前調(diào)用) -->
   <aop:before method="beforSay" pointcut-ref="embark"/>
   <!-- 聲明后置通知 (在切點方法被執(zhí)行后調(diào)用) -->
   <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("注解類型后置通知");
 }
 //環(huán)繞通知。注意要有ProceedingJoinPoint參數(shù)傳入。
 @Around("sayings()")
 public void sayAround(ProceedingJoinPoint pjp) throws Throwable{
  System.out.println("注解類型環(huán)繞通知..環(huán)繞前");
  pjp.proceed();//執(zhí)行方法
  System.out.println("注解類型環(huán)繞通知..環(huán)繞后");
 }
}

spring配置文件:

<?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>

測試代碼:

package com.cjh.aop2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 
 * @author Caijh
 * email:codecjh@163.com
 * 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();
 }
}

運行結(jié)果:

注解類型環(huán)繞通知..環(huán)繞前

注解類型前置通知

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

注解類型環(huán)繞通知..環(huán)繞后

注解類型后置通知

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

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

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

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

下載地址:http://xiazai.jb51.net/201708/yuanma/aspectjrt_aspectjweaver(jb51.net).rar

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

通知注解類型如下:


總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持

相關(guān)文章

  • springboot上傳zip包并解壓至服務(wù)器nginx目錄方式

    springboot上傳zip包并解壓至服務(wù)器nginx目錄方式

    這篇文章主要介紹了springboot上傳zip包并解壓至服務(wù)器nginx目錄方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • macOS上使用gperftools定位Java內(nèi)存泄漏問題及解決方案

    macOS上使用gperftools定位Java內(nèi)存泄漏問題及解決方案

    這篇文章主要介紹了macOS上使用gperftools定位Java內(nèi)存泄漏問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 用java實現(xiàn)冒泡排序算法

    用java實現(xiàn)冒泡排序算法

    兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個記錄的次序相反時即進行交換,直到?jīng)]有反序的記錄為止
    2013-01-01
  • springboot 如何設(shè)置端口號和添加項目名

    springboot 如何設(shè)置端口號和添加項目名

    這篇文章主要介紹了springboot設(shè)置端口號和添加項目名的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • mybatisPlus自動填充更新時間的示例代碼

    mybatisPlus自動填充更新時間的示例代碼

    本文主要介紹了mybatisPlus自動填充更新時間,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MyBatis高級映射ResultMap解決屬性問題

    MyBatis高級映射ResultMap解決屬性問題

    對于數(shù)據(jù)庫中對表的增刪改查操作,我們知道增刪改都涉及的是單表,而只有查詢操作既可以設(shè)計到單表操作又可以涉及到多表操作,所以對于輸入映射parameterType而言是沒有所謂的高級映射的,也就是說高級映射只針對于輸出映射
    2023-02-02
  • 解決報java.lang.AssertionError錯誤的問題

    解決報java.lang.AssertionError錯誤的問題

    這篇文章主要介紹了解決報java.lang.AssertionError錯誤的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • IntelliJ IDEA的數(shù)據(jù)庫管理工具實在太方便了(推薦)

    IntelliJ IDEA的數(shù)據(jù)庫管理工具實在太方便了(推薦)

    這篇文章主要介紹了IntelliJ IDEA的數(shù)據(jù)庫管理工具實在太方便了,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java實現(xiàn)多線程大批量同步數(shù)據(jù)(分頁)

    Java實現(xiàn)多線程大批量同步數(shù)據(jù)(分頁)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)多線程大批量同步數(shù)據(jù)(分頁),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java幾個重要的關(guān)鍵字詳析

    Java幾個重要的關(guān)鍵字詳析

    這篇文章主要介紹了Java幾個重要的關(guān)鍵字詳析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-07-07

最新評論

会宁县| 沾益县| 凉山| 温泉县| 深泽县| 翁牛特旗| 丹凤县| 元氏县| 康保县| 石景山区| 依兰县| 本溪市| 青冈县| 新竹市| 青海省| 嘉峪关市| 东方市| 平湖市| 宜兰县| 海丰县| 永清县| 攀枝花市| 德化县| 天峻县| 永嘉县| 麟游县| 阿鲁科尔沁旗| 广宗县| 醴陵市| 石河子市| 崇义县| 静宁县| 浦县| 拉萨市| 阳春市| 白水县| 石门县| 昆明市| 囊谦县| 岳普湖县| 霍林郭勒市|