第二章 Spring AOP

一.AOP?

AOP:面向切向,采用横向抽取机制,取代传统的纵向继承

AOP是一种面向切面的思想,但是我们平常说的spring使用了AOP,实际上说的是spring实现AOP思想的底层原理,而底层原理就是使用动态代理来增强某个方法。所以平常说AOP技术实际上就是指通过动态代理来对方法进行增强。

    举个例子:如果你想加强一个类中写好的方法,一般来说我们用继承来写,但是随着子类过多,那么重写方法就变得麻烦了,

         所以现在我们用AOP,将要增强的方法提取到一个类中,然后将需要增强的方法通过代理类将其方法增强

                                                                           

传统的纵向继承

 二.动态代理的两个方式

1.JDK动态管理 (接口+实现类)                       2.cglib代理(实现类)

下面是每个方式的实例

1.JDK动态管理

                                                      

2.目标类:

                                                     

3.切面类

                                                       

 4.代理类

package com.zlj;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * jdk代理类
 * @author 邹龄晋
 *
 */
public class JdkProxy implements InvocationHandler{
    //目标接口
    private UserDao userDao;
    //创建代理方法
    public Object createProxy(UserDao userDao){
        this.userDao = userDao;
        //1.类加载器
        ClassLoader classLoader = JdkProxy.class.getClassLoader();
        //2.被代理对象实现所有的接口
        Class [] clazz = userDao.getClass().getInterfaces();
        //3.使用代理类,进行增强,返回的是代理后的对象
        return Proxy.newProxyInstance(classLoader, clazz, this);
    }
    
    /**
     * 所有动态代理类的方法调用都会在invoke方法中进行
     * proxy是代理后的对象
     * method将要被执行的方法信息(反射)
     * args执行方法时需要的参数
     */

    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {        
        //声明切面
        MyAspect myAspect = new MyAspect();
        //前增强
        myAspect.check_Permissions();
        //在目标类上调用方法并且传入参数
        Object obj = method.invoke(userDao, args);
        //后增强
        myAspect.log();
        return obj;
    }
}

 5.测试类

 

猜你喜欢

转载自www.cnblogs.com/zoulingjin/p/9492829.html