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();
}
}