1. 程式人生 > 其它 >spring -7 aop編碼補充註解實現

spring -7 aop編碼補充註解實現

技術標籤:筆記javaaopspring

目錄

XML形式的編碼回顧

註解方式的使用


XML形式的編碼回顧

package aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyAspect implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        Object ret = null;
        System.out.println("執行在原始方法之前");
        ret = methodInvocation.proceed();
        System.out.println("執行在原始方法之後");
        return ret;
    }
}

XML中配置

<!--    原始物件-->
    <bean id="userDao" class="core.UserDaoImpl"></bean>
<!--    額外功能-->
    <bean id="around" class="aop.MyAspect"></bean>

<!--Proxy -target-class 預設false,執行JDK,true,執行cglib-->
    <aop:config proxy-target-class="true">
<!--        定義切入點-->
        <aop:pointcut id="pc" expression="within(core..*)"/>
<!--        組裝-->
        <aop:advisor advice-ref="around" pointcut-ref="pc"></aop:advisor>
    </aop:config>

註解方式的使用

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
/**
 * aop額外功能 類註解
 * 表示切面類
 */
@Aspect
public class MyAspect1 {
    /**
     * 這個方法必須是空實現,返回值是void
     */
    @Pointcut("within(core..*)")
    public void pointcut(){};
    /**
     * 這是自定義aop實現類額外功能方法,必須加上@Around註解
     * @param joinPoint 這個引數的作用同MethodInterceptor【spring】中MethodInvocation methodInvocation
     * @return 原始方法執行結果的返回值
     */

//    該註解表示額外功能類,裡面的value值是切入點表示式
//    @Around("within(core..*)")
//    為了其他的額外功能重用切入點,避免重複的書寫切入點
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object ret = null;
        System.out.println("原始方法執行之前");
        ret = joinPoint.proceed();
        System.out.println("原始方法執行之後");
        return ret;
    }
}

配置檔案中:

<!--    原始物件-->
    <bean id="userDao" class="core.UserDaoImpl"></bean>
<!--額外功能 包括了切入點。-->
    <bean id="around" class="aop.MyAspect1"></bean>
<!--自動組裝,proxy-target-class指定代理型別 cglib true JDK false-->
    <aop:aspectj-autoproxy proxy-target-class="false"/>

執行結果: