Spring AOP (面试必问)

 

Spring aop 概念

 

Spring AOP 切点表达式

 

 

 

 

 

 

    <aop:aspect ref="aopAdvice">
         <!--配置通知的类型:前置操作,并且建立通知的方法和切入点方法的关联的方法和切入点方法的关联 -->
                    <aop:before method="before" pointcut-ref="pt1"></aop:before>
         <!--后置通知: 切入点方法正常执行完毕之后 -->
                    <aop:after-returning method="afterRetruning" pointcut-ref="pt1" returning="rst"></aop:after-returning>
         <!--异常通知: 切入点方法有异常后 -->
                    <!--<aop:after-throwing method="exceptionLog" pointcut="execution(* com.cherry.service.impl.*.*(..))"></aop:after-throwing>-->
         <!--最终通知:都会执行 -->
                    <aop:after method="after" pointcut-ref="pt1" ></aop:after>


    </aop:aspect>

  // 对应的advice 方法
  public void afterRetruning(Object rst){

        System.out.println("方法执行的结果值"+rst);

    }

AOP 注解

 

注解AOP 执行顺序 参考,下面这篇文档 写的很好

https://blog.csdn.net/qq_32331073/article/details/80596084?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

AOP 原理

 

  (1)jdk 的动态代理

  注意事项 1 对象必须要有实现接口 2. 使用jdk java.lang.reflect.Proxy 类的  newProxyInstance 方法

下面是我写的一个小demo

测试类

package com.cherry.test;

import com.cherry.proxy.Invocation.MyInvocation;
import com.cherry.proxy.UserService;
import com.cherry.proxy.impl.UserServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) {
        // 创建目标对象
        UserService us = new UserServiceImpl();

        // jdk 动态代理 ,来实现 代理对象 us,并对他 当中的 add 方法进行增强
         InvocationHandler h = new MyInvocation(us);

        /**
         * newProxyInstance 方法的三个参数是什么意思
         *  1.loader: 类加载器(类的字节码对象获得) 写法是固定的
         *  2 interfaces 得到该对象所以实现接口的字节码对象的数组 ,写法固定
         *  3.需要一个实现了InvocationHandler接口对象, 这步需要自己动手完成,对目标方法功能的增强就是在这个对象中完成的
         * */
        // 返回的是代理对象
         Object newproxyInstance =   Proxy.newProxyInstance(us.getClass().getClassLoader(),us.getClass().getInterfaces(),h);
         //执行代理对象增强后的方法
         UserService  proxyU = (UserService) newproxyInstance;
            proxyU.add();
            proxyU.delete();

    }


}

 

具体的实现类和他的接口

 

package com.cherry.proxy.impl;

import com.cherry.annotation.TestAop;
import com.cherry.proxy.UserService;

public class UserServiceImpl implements UserService {


    @Override
    public void add() {

        System.out.println("添加一个人员");


    }

    @Override
    public void delete() {
        System.out.println("删除一个人员");
    }
}
package com.cherry.proxy;

import com.cherry.annotation.TestAop;

public interface UserService {
    @TestAop
    void add();

    void delete();

 

 需要自己写的增强方法的类

package com.cherry.proxy;

import com.cherry.annotation.TestAop;

public interface UserService {
    @TestAop
    void add();

    void delete();
}

 最后再来个自定义注解,这个也就相当于,切点,不加,代理的类,所以方法,都被增强了,方式有很多,大家自己try

package com.cherry.annotation;


import java.lang.annotation.*;

/**
 * @authore:wjf
 * @data 2020/5/6 10:44
 * @Description:
 ***/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAop {

   String value() default "";
}

(1)cglib 的动态代理 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值