第十五章、基于注解的AOP编程

1.基于注解的AOP编程的开发步骤

  1. 原始对象
  2. 额外功能
  3. 切⼊点
  4. 组装切面

/*
    通过切⾯类 定义了 额外功能定义了@Around
    		 定义了 切⼊点 @Around("execution(*login(..))")
@Aspect 切⾯类*/
@Aspect
public class MyAspect {
    @Around("execution(* login(..))")
    /*  @Around("execution(* login(..))")   等价于

    
        

        
    */
    public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("- ---aspect log ------");
        Object ret = joinPoint.proceed();
        return ret;
    }
}
上述9-12行和之前的实现MethodInterceptor接口类似,如下代码所示
    /*
 1. 额外功能
 public class MyArround implements MethodInterceptor{
 	public Object invoke(MethodInvocation invocation){
 	System.out.println("- ---MethodInterceptor log ------");
	Object ret = invocation.proceed();
	return ret;
 }
 }*/
    
   配置文件:
  <bean id="userService" class="com.dy.basic.aspect.UserServiceImpl"/>
    /*
   切⾯:
    1. 额外功能
    2. 切⼊点
    3. 组装切⾯*/
    <bean id="arround" class="com.dy.basic.aspect.MyAspect"/>
   
//告知Spring基于注解进⾏AOP编程
    <aop:aspectj-autoproxy/>

2.细节

1.切入点复用

切⼊点复⽤:在切⾯类中定义⼀个方法,方法上⾯@Pointcut注解 通过这种⽅式,定义切⼊点表达式,后续更加有利于切⼊点复⽤。

@Aspect
//切面类
public class MyAspect {
    @Pointcut("execution(* login(..))")
    public void myPointcut(){}
//    添加切入点复用方法后,将@Around("execution(* login(..))")改为    @Around(value = "myPointcut()")
    @Around(value = "myPointcut()")
    public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("- ---aspect log ------");
        Object ret = joinPoint.proceed();
        return ret;
    }
}

2.动态代理的创建方式

AOP底层实现 2种代理创建⽅式
1. JDK 通过实现接⼝ 做新的实现类⽅式 创建代理对象
2. Cglib通过继承⽗类 做新的⼦类创建代理对象
		默认情况 AOP编程 底层应⽤JDK动态代理创建⽅式
如果切换Cglib呢?	
1. 注解AOP开发
 //告知Spring基于注解进⾏AOP编程<aop:aspectj-autoproxy/>改成
 <aop:aspectj-autoproxy proxy-target-class="true" />
 2. 传统的AOP开发切换Cglib
  		 <aop:config>
        <aop:pointcut id="pc" expression="execution(* *(..))"/>
# 组装
        <aop:advisor advice-ref="arround" pointcut-ref="pc"/>
    </aop:config>
    改成
  在aop:config标签中添加属性proxy-target-class="true" 如下:
    <aop:config proxy-target-class="true">
 	</aop>

本系列文章从Spring5原理开始深入浅出,从工厂特性=>依赖注入–IOC=>AOP编程=>Spring事务=>纯注解开发。本文来自观看B站孙帅Spring教程后做的笔记。持续更新…

你可能感兴趣的:(Spring,spring,java,intellij-idea)