国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】

這篇具有很好參考價值的文章主要介紹了注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、注解配置AOP

1. 開啟注解支持

2. 在類和方法加入注解

3. 測試

4.??為一個類下的所有方法統(tǒng)一配置切點

二、原生Spring實現(xiàn)AOP

1. 引入依賴

2. 編寫SpringAOP通知類

3. 編寫配置類bean2.xml

4? 測試

三、SchemaBased實現(xiàn)AOP

1. 配置切面

2. 測試

往期專欄&文章相關(guān)導(dǎo)讀?

1. Maven系列專欄文章

2. Mybatis系列專欄文章

3. Spring系列專欄文章


一、注解配置AOP

Spring可以使用注解代替配置文件配置切面:

1. 開啟注解支持

在xml中開啟AOP注解支持

以下是bean1.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 掃描包 -->
    <context:component-scan base-package="com.example"></context:component-scan>
    <!-- 開啟注解配置Aop -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

2. 在類和方法加入注解

在通知類上方加入注解 @Aspect:配置切面

在通知方法上方加入注解

  • @Before:前置通知
  • @AfterReturning:后置通知
  • @AfterThrowing:異常通知
  • @After:最終通知
  • @Around:環(huán)繞通知

MyAspectAdvice通知類?

package com.example.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspectJAdvice {

    // 后置通知
    @AfterReturning("execution(* com.example.dao.UserDao.*(..))")
    public void myAfterReturning(JoinPoint joinPoint){
        System.out.println("切點方法名:"+joinPoint.getSignature().getName());
        System.out.println("目標(biāo)對象:"+joinPoint.getTarget());
        System.out.println("打印日志···"+joinPoint.getSignature().getName()+"方法被執(zhí)行了!");
    }

    // 前置通知
    @Before("execution(* com.example.dao.UserDao.*(..))")
    public void myBefore(){
        System.out.println("前置通知···");
    }

    // 異常通知
    @AfterThrowing(value = "execution(* com.example.dao.UserDao.*(..))",throwing = "e")
    public void myAfterThrowing(Exception e){
        System.out.println("異常通知···");
        System.out.println(e.getMessage());
    }

    // 最終通知
    @After("execution(* com.example.dao.UserDao.*(..))")
    public void myAfter(){
        System.out.println("最終通知···");
    }

    // 環(huán)繞通知
    @Around("execution(* com.example.dao.UserDao.*(..))")
    public Object myAround(ProceedingJoinPoint point) throws Throwable {
        System.out.println("環(huán)繞前···");
        // 執(zhí)行方法
        Object obj = point.proceed();
        System.out.println("環(huán)繞后···");
        return obj;
    }
}

3. 測試

測試方法

    // 測試注解開發(fā)AOP
    @Test
    public void testAdd2(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean1.xml");
        UserDao userDao = (UserDao) ac.getBean("userDao");
        //userDao.update();
        userDao.delete();
    }

測試結(jié)果(無異常):?

注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】

使用update方法測試結(jié)果(有異常):?

注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】

可以看到環(huán)繞后沒有打印,因為此時碰到異常終止了程序?

4.??為一個類下的所有方法統(tǒng)一配置切點

如何為一個類下的所有方法統(tǒng)一配置切點:

在通知類中添加方法配置切點

    // 添加方法配置切點
    @Pointcut("execution(* com.example.dao.UserDao.*(..))")
    public void pointcut(){

    }

在通知方法上使用定義好的切點,就是把注解括號里面得內(nèi)容替換成?"pointCut()"?即可。

二、原生Spring實現(xiàn)AOP

除了AspectJ,Spring支持原生方式實現(xiàn)AOP。但是要注意的是原生方式實現(xiàn)AOP只有四種通知類型:前置通知、后置通知、環(huán)繞通知,異常通知。少了最終通知。

1. 引入依賴

        <!-- AOP -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.13</version>
        </dependency>

2. 編寫SpringAOP通知類

Spring原生方式實現(xiàn)AOP時,只支持四種通知類型:

通知類型 實現(xiàn)接口
前置通知 MethodBeforeAdvice
后置通知 AfterReturningAdvice
異常通知 ThrowsAdvice
環(huán)繞通知 MethodInterceptor
package com.example.aspect;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

import java.lang.reflect.Method;

public class SpringAop implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice, MethodInterceptor {

    /**
     * 環(huán)繞通知
     * @param invocation 目標(biāo)方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("環(huán)繞前");
        Object proceed = invocation.proceed();
        System.out.println("環(huán)繞后");
        return proceed;
    }

    /**
     * 后置通知
     * @param returnValue 目標(biāo)方法的返回值
     * @param method 目標(biāo)方法
     * @param args 目標(biāo)方法的參數(shù)列表
     * @param target 目標(biāo)對象
     * @throws Throwable
     */
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("后置通知");
    }

    /**
     * 前置通知
     * @param method 目標(biāo)方法
     * @param args 目標(biāo)方法的參數(shù)列表
     * @param target 目標(biāo)對象
     * @throws Throwable
     */
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("前置通知");
    }

    /**
     * 異常通知
     * @param e 異常對象
     */
    public void afterThrowing(Exception e){
        System.out.println("發(fā)生異常了!");
    }
}

3. 編寫配置類bean2.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.example"></context:component-scan>
    <!-- 通知對象 -->
    <bean id="springAop" class="com.example.aspect.SpringAop"/>

    <!-- 配置代理對象 -->
    <bean id="userDaoProxy"class="org.springframework.aop.framework.ProxyFactoryBean">                    
        <!-- 配置目標(biāo)對象 -->
        <property name="target" ref="userDao"/>
        <!-- 配置通知 -->
        <property name="interceptorNames">
            <list>
                <value>springAop</value>
            </list>
        </property>
        <!-- 代理對象的生成方式 true:使用CGLib false:使用原生JDK生成 -->
        <property name="proxyTargetClass" value="true"/>
        <!-- bug -->
        <aop:aspectj-autoproxy proxy-target-class="true"/>
    </bean>
</beans>

4? 測試

測試類UserDaoTest2

import com.example.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class userDaoTest2 {

    // 原生AOP測試
    @Test
    public void testAdd(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean2.xml");
        UserDao userDao = (UserDao) ac.getBean("userDaoProxy");
        userDao.update();
    }
}

測試結(jié)果?

注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】

????????OK,這里有個驚喜,如果敲到這里同學(xué),就知道了?

????????其實標(biāo)簽?zāi)莻€bug,是因為原生方法配置類要加上那個標(biāo)簽才可以識別,否則會報一個錯誤。

三、SchemaBased實現(xiàn)AOP

????????SchemaBased(基礎(chǔ)模式)配置方式是指使用Spring原生方式定義通知,而使用AspectJ框架配置切面。因此這里通知類和上面一樣,看上面的即可。

1. 配置切面

aop3.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.example"></context:component-scan>

    <!-- 通知對象 -->
    <bean id="springAop2" class="com.example.aspect.SpringAop"/>

    <!-- 配置切面 -->
    <aop:config>
        <!-- 配置切點 -->
        <aop:pointcut id="myPointcut" expression="execution(* com.example.dao.UserDao.*(..))"/>
        <!-- 配置切面:advice-ref:通知對象 pointcut-ref:切點 -->
        <aop:advisor advice-ref="springAop2" pointcut-ref="myPointcut"/>
    </aop:config>
</beans>

2. 測試

測試方法

    // 使用AspectJ框架配置切面測試
    @Test
    public void t6(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("aop3.xml");
        UserDao userDao = (UserDao) ac.getBean("userDao");
        userDao.add();
    }

測試結(jié)果

注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】

????????OK,這里的輸出應(yīng)該是我上面定義的不夠完美,有些可能重復(fù)定義了,所以這里就重復(fù)輸出了一些東西?

往期專欄&文章相關(guān)導(dǎo)讀?

?????大家如果對于本期內(nèi)容有什么不了解的話也可以去看看往期的內(nèi)容,下面列出了博主往期精心制作的Maven,Mybatis等專欄系列文章,走過路過不要錯過哎!如果對您有所幫助的話就點點贊,收藏一下啪。其中Spring專欄有些正在更,所以無法查看,但是當(dāng)博主全部更完之后就可以看啦。文章來源地址http://www.zghlxwxcb.cn/news/detail-472868.html

1. Maven系列專欄文章

Maven系列專欄 Maven工程開發(fā)
Maven聚合開發(fā)【實例詳解---5555字】

2. Mybatis系列專欄文章

Mybatis系列專欄 MyBatis入門配置
Mybatis入門案例【超詳細(xì)】
MyBatis配置文件 —— 相關(guān)標(biāo)簽詳解
Mybatis模糊查詢——三種定義參數(shù)方法和聚合查詢、主鍵回填
Mybatis動態(tài)SQL查詢 --(附實戰(zhàn)案例--8888個字--88質(zhì)量分)
Mybatis分頁查詢——四種傳參方式
Mybatis一級緩存和二級緩存(帶測試方法)
Mybatis分解式查詢
Mybatis關(guān)聯(lián)查詢【附實戰(zhàn)案例】
MyBatis注解開發(fā)---實現(xiàn)增刪查改和動態(tài)SQL
MyBatis注解開發(fā)---實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

3. Spring系列專欄文章

Spring系列專欄 Spring IOC 入門簡介【自定義容器實例】
IOC使用Spring實現(xiàn)附實例詳解
Spring IOC之對象的創(chuàng)建方式、策略及銷毀時機和生命周期且獲取方式
Spring DI簡介及依賴注入方式和依賴注入類型
Spring IOC相關(guān)注解運用——上篇
Spring IOC相關(guān)注解運用——下篇
Spring AOP簡介及相關(guān)案例
注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】
Spring事務(wù)簡介及相關(guān)案例
Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API
Spring 事務(wù)的相關(guān)配置、傳播行為、隔離級別及注解配置聲明式事務(wù)

到了這里,關(guān)于注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細(xì)案例】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java注解方式實現(xiàn)aop,切點切面實戰(zhàn)

    Java注解方式實現(xiàn)aop,切點切面實戰(zhàn)

    注解方式實現(xiàn)aop我們主要分為如下幾個步驟(有更好的方法的話,歡迎交流): 1.在切面類(為切點服務(wù)的類)前用@Aspect注釋修飾,聲明為一個切面類。 2.用@Pointcut注釋聲明一個切點,目的是為了告訴切面,誰是它的服務(wù)對象。(此注釋修飾的方法的方法體為空,不需要寫功

    2024年02月12日
    瀏覽(19)
  • javaee spring aop 注解實現(xiàn)

    javaee spring aop 注解實現(xiàn)

    2024年02月09日
    瀏覽(19)
  • Spring5系列學(xué)習(xí)文章分享---第三篇(AOP概念+原理+動態(tài)代理+術(shù)語+Aspect+操作案例(注解與配置方式))

    Spring5系列學(xué)習(xí)文章分享---第三篇(AOP概念+原理+動態(tài)代理+術(shù)語+Aspect+操作案例(注解與配置方式))

    開篇: 歡迎再次來到 Spring 5 學(xué)習(xí)系列!在這個博客中,我們將深入研究 Spring 框架的AOP概念+原理+動態(tài)代理+術(shù)語+Aspect+操作案例(注解與配置方式)。 概念 什么是AOP (1)面向切面編程(方面),利用 AOP 可以對業(yè)務(wù)邏輯的各個部分進行隔離,從而使得 業(yè)務(wù)邏輯各部分之間的

    2024年01月24日
    瀏覽(28)
  • Spring Boot學(xué)習(xí)隨筆- 實現(xiàn)AOP(JoinPoint、ProceedingJoinPoint、自定義注解類實現(xiàn)切面)

    Spring Boot學(xué)習(xí)隨筆- 實現(xiàn)AOP(JoinPoint、ProceedingJoinPoint、自定義注解類實現(xiàn)切面)

    學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程 問題 現(xiàn)有業(yè)務(wù)層開發(fā)存在問題 額外功能代碼存在大量冗余 每個方法都需要書寫一遍額外功能代碼不利于項目維護 Spring中的AOP AOP:Aspect 切面 + Oriented 面向 Programmaing 面向切面編程 Aspect(切面) = Advice(通知) + Pointcut(

    2024年02月04日
    瀏覽(43)
  • 【Spring AOP + 自定義注解 + 動態(tài)數(shù)據(jù)源 實現(xiàn)主從庫切換&讀寫分離】—— 案例實戰(zhàn)

    【Spring AOP + 自定義注解 + 動態(tài)數(shù)據(jù)源 實現(xiàn)主從庫切換&讀寫分離】—— 案例實戰(zhàn)

    ???????????????????????????????????????????? ?? S p r i n g A O P + 主從數(shù)據(jù)源切換 + 讀寫分離 + 自定義注解案例實戰(zhàn)! color{#FF1493}{Spring AOP + 主從數(shù)據(jù)源切換 + 讀寫分離 + 自定義注解 案例實戰(zhàn)!} Sp r in g A OP + 主從數(shù)據(jù)源切換 + 讀寫分離 + 自定義注解案例

    2024年02月15日
    瀏覽(21)
  • 對接第三方接口鑒權(quán)(Spring Boot+Aop+注解實現(xiàn)Api接口簽名驗證)

    對接第三方接口鑒權(quán)(Spring Boot+Aop+注解實現(xiàn)Api接口簽名驗證)

    一個web系統(tǒng),從接口的使用范圍也可以分為對內(nèi)和對外兩種,對內(nèi)的接口主要限于一些我們內(nèi)部系統(tǒng)的調(diào)用,多是通過內(nèi)網(wǎng)進行調(diào)用,往往不用考慮太復(fù)雜的鑒權(quán)操作。但是,對于對外的接口,我們就不得不重視這個問題,外部接口沒有做鑒權(quán)的操作就直接發(fā)布到互聯(lián)網(wǎng),而

    2024年04月29日
    瀏覽(133)
  • spring boot 使用AOP+自定義注解+反射實現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對比數(shù)據(jù),并保存至日志表

    spring boot 使用AOP+自定義注解+反射實現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對比數(shù)據(jù),并保存至日志表

    使用FieldMeta自定義注解,看個人業(yè)務(wù)自行覺得是否需要重新定義實體 實現(xiàn)類 :通過該實現(xiàn)類獲取更新前后的數(shù)據(jù)。 該實現(xiàn)類的實現(xiàn)原理為:獲取入?yún)⒊鋈氲膇d值,獲取sqlSessionFactory,通過sqlSessionFactory獲取selectByPrimaryKey()該方法,執(zhí)行該方法可獲取id對應(yīng)數(shù)據(jù)更新操作前后的數(shù)

    2024年01月23日
    瀏覽(28)
  • Spring的注解開發(fā)-注解方式整合MyBatis代碼實現(xiàn)

    Spring的注解開發(fā)-注解方式整合MyBatis代碼實現(xiàn)

    之前使用xml方式整合了MyBatis,文章導(dǎo)航:Spring整合第三方框架-MyBatis整合Spring實現(xiàn)-CSDN博客 現(xiàn)在使用注解的方式無非是就是將xml標(biāo)簽替換為注解,將xml配置文件替換為配置類而已。 非自定義配置類 ? ? ? ? ? ? ? ? 與數(shù)據(jù)庫建立連接的同時,掃描指定的mapper接口,實現(xiàn)實現(xiàn)

    2024年02月07日
    瀏覽(25)
  • Spring AOP官方文檔學(xué)習(xí)筆記(二)之基于注解的Spring AOP

    1.@Aspect注解 (1) @Aspect注解用于聲明一個切面類,我們可在該類中來自定義切面,早在Spring之前,AspectJ框架中就已經(jīng)存在了這么一個注解,而Spring為了提供統(tǒng)一的注解風(fēng)格,因此采用了和AspectJ框架相同的注解方式,這便是@Aspect注解的由來,換句話說,在Spring想做AOP框架之前,

    2023年04月17日
    瀏覽(25)
  • Spring——基于注解的AOP配置

    Spring——基于注解的AOP配置

    1.1.pom.xml 1.2.dao 1.3.service 1.4.applicationContext.xml 1.5.測試 2.1.applicationContext.xml 2.2.AOP配置 常用注解 @Aspect:把當(dāng)前類聲明為切面類 @Before:前置通知,可以指定切入點表達式 @AfterReturning:后置【try】通知,可以指定切入點表達式 @AfterThrowing:異常【catch】通知,可以指定切入點表達

    2024年01月22日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包