【Javaspring 學習筆記】面向切面編程——AOP

1、aop:aspect oriented programming 面向切面編程

2、aop在spring中的作用:

    提供聲明式服務(事務)

    允許用戶實現自定義切面

3、在不改變原有代碼的情況下,增加新的功能.是一種橫向的編程(代理類中橫插進來一些代碼)

4、AOP的好處:

 (1)、使得真實角色處理的業務更加純粹,不再關注一些公共的事情

 (2)、公共的業務由代理來完成,實現業務的分工

 (3)、公共業務發生擴展中,

5、關注點:增加某個業務:如日誌、安全、緩存、事務等

6、切面:aspect 一個關注點的模塊化

7、連接點:一個方法的執行

8、通知:在切面的某個特點的連接點執行的動作

9、使用spring實現aop

第一種實現方式: 


public class Log  implements MethodBeforeAdvice {
    /**
     *
     * @param method 被調用方法對象
     * @param objects 調用方法的參數
     * @param o 被調用方法的目標對象
     * @throws Throwable
     */
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println(o.getClass().getName()+"的"+method.getName()+"被實現");
    }
}
  <bean name="service"  class="service.Serviceimpl"/>
    <bean id="log" class="service.Log"/>
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* service.*.*(..))"/>
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
    </aop:config>

第二種實現方式:註解

首先建一個切面類,聲明切點在哪


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

/**
 * @author 賀文傑
 * 2018/8/1 7:57
 */
@Component
@Aspect //聲明切面
public class UserAspect {


    /**
     *  聲明切點
     */
    @Pointcut(value = "execution(* com.hewenjie.service.*.*(..))")
    public void pointCut(){}

    /**
     * 前置通知
     * @param joinPoint
     */
    @Before(value = "pointCut()")
    public void doBefore(JoinPoint joinPoint){ //連接點 程序執行的點,用於鏈接程序的方法
        //獲取程序的方法名
        String name=joinPoint.getSignature().getName();
        System.out.println(name);
        //獲取程序的方法參數
        Object[] args= joinPoint.getArgs();
        System.out.println(args.toString());
    }

    /**
     * 後置通知
     * @param joinPoint
     */
    @After(value = "pointCut()")
    public  void doAfter(JoinPoint joinPoint){
        //獲取程序的方法名
        String name=joinPoint.getSignature().getName();
        System.out.println(name);
        //獲取程序的方法參數
        Object[] args= joinPoint.getArgs();
        System.out.println(args.toString());
    }

 

在主函數中調用的時候,就會執行前置後置的方法。

  /**
     * 環繞通知
     * @param proceedingJoinPoint
     */
    @Around(value = "pointCut()")
    public void  around(ProceedingJoinPoint proceedingJoinPoint)
    {
        try {
            //攔截切點後,繼續執行
            proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章