AOP

来源:互联网 发布:什么网络分析软件 编辑:程序博客网 时间:2024/06/05 08:48
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

静态的代理:
    代码:
     public class Client
{
    public  static  void main(String[] lzp)
    {
        RealSubject realSubject = new RealSubject( );   //真实的角色
        ProxySubject proxySubject = new ProxySubject();   //代理的角色
        proxySubject.setRealSubject(realSubject);   //代理的角色开始代理真实角色
        proxySubject.dosomething();
    }
}

动态的代理:
ProxyHandler代理处理类;采用JDK动态代理必须实现InvocationHandler接口:

newProxyInstance
public static Object newProxyInstance(ClassLoader loader,                                      Class<?>[] interfaces,                                      InvocationHandler h)                               throws IllegalArgumentException


<!——第三个参数-->
public class ProxyHandler implements InvocationHandler {
    //目标对象,真实角色
    private Object targetObject;

    public void setTarget(Object o) {
        this.targetObject = o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //执行真实角色的方法
        System.out.println("before");
        Object result = method.invoke(targetObject, args);
        System.out.println("after");
        return result;
    }
}
<!——开始代理-->
public class Client {
    public static void main(String[] args) {
        // 被代理类的实例 AbstractSubject是一个接口
        AbstractSubject realSubject = new RealSubject();

        // 获得被代理类的类加载器,使得JVM能够加载并找到被代理类的内部结构,以及已实现的
       // 第一个参数
interface
        ClassLoader loader = realSubject.getClass().getClassLoader();

        // 获得被代理类已实现的所有接口interface,使得动态代理类的实例
        //第二个参数
        Class[] interfaces = realSubject.getClass().getInterfaces();

        //创建处理器对象
        ProxyHandler handler = new ProxyHandler();
        //传入真实角色
        handler.setTarget(realSubject);

        //通过Proxy的静态方法newProxyInstance创建代理对象
        AbstractSubject proxy = (AbstractSubject) Proxy.newProxyInstance(
                loader, interfaces, handler);

        proxy.request();

    }
}

待续。。。。。。。。。。