Spring之AOP(面向切面编程)

一.  概念:

            即面向切面编程,采取横向抽取机制,将分散在各个地方中的重复代码提出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方

 

二.  实现方法:

                      1.  动态代理。

                           条件:  必须要有接口才能创建对象那个,否则,将无法创建。

                           例子:

                                1.  创建UserDao接口:

                                 

                                2.  实现UserDao类:

                                 

                                3.创建切面类:

                                                               

                                4.创建MyProxy代理类并且实现InvocationHandler接口,并覆盖invoke()方法。

                                    注:代理:newProxyInstance(ClassLoader  loader,class<?> clazz,InvocationHandler h)

                                            其中:

                                                     第一个参数:指定生成代理对象的类的加载器,通过getClassLoader()方式获取

                                                     第二个参数:获得被代理对象实现的接口,先获取被代理对象的字节码,再通过getInterfaces()获取

                                                     第三个参数:一般为new InvocationHandler()

public class MyProxy implements InvocationHandler {
    //声明目标类接口
    private  UserDao userDao;

    //创建代理方法
    public UserDao creatProxy(UserDao userDao){
        this.userDao = userDao;
        //生成动态代理
        //首先生成类加载器
        ClassLoader loader = MyProxy.class.getClassLoader();
        //指定被代理的对象
        Class [] classes = userDao.getClass().getInterfaces();
        return (UserDao) Proxy.newProxyInstance(loader,classes,this);
    }

    @Override
    /*
     *  实现InvocationHandler接口,则要实现invoke方法
     *  其中第一个参数: 指的是代理类
     *  第二个参数:     指的是被代理对象的方法
     *  第三个参数:     指的是第二个参数的参数数组
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        MyAspect myAspect = new MyAspect();
        myAspect.beforeAdvice();
        Object object = method.invoke(userDao,args);
        myAspect.afterAdvice();
        return object;
    }


}

                                            invoke()方法的详细介绍:

                                            

                                5.  测试:

                                     

三.  AOP的名词解释:

                    1.  Aspect(切面):  即封装用于横向插入的系统功能,如上述例子中的MyAspect类

         2.  Jointcut(切入点):  即所有可以增强的方法,如上述例子中UserDao接口中的方法即为切入点

         3.  Advice(通知):   即切面中的具体方法(系统功能) 

         4. Target Object(目标对象):  即所有被代理的对象或被增强的对象,如上例指的是UserDao接口     

         5.  Proxy(代理):  形成代理对象,如上例指的是MyProxy proxy = new MyProxy();

         6.  Weaving(织入):  把通知应用到切入点的过程,如上例中的UserDao userDao2 = (UserDao)proxy.creatProxy(userDao1);

四.CGLIB代理:

                     参考网址:      https://www.cnblogs.com/best/p/5679656.html                                                                 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值