aop技术

粗粒度,细粒度

使用代理

客户端------>代理对象----->目标对象

代理放行了,就调用目标对象的方法

静态代理(很少用),动态代理

为目标对象创建动态代理对象,Proxy类,jdk提供

InvocationHandler其实是回调

public class JDKProxyFactory implements InvocationHandler {
    private Object targetObject;
    public Object createProxyInstance(Object targetObject){
        this.targetObject=targetObject;
        //生成的动态代理实例要实现目标代理的所有接口
        return Proxy.newProxyInstance(
                this.targetObject.getClass().getClassLoader(),
                this.targetObject.getClass().getInterfaces(),this);

    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("begin invoking....");
        PersonServiceBean personService=(PersonServiceBean)this.targetObject;
        Object result=null;
        if(personService.getUser()!=null){
            result=method.invoke(targetObject, args);
        }else{
            System.out.println("你没有权限");
        }
        System.out.println("end invoking....");

        return result;
    }
}

测试代码

@Test
    public void proxyTest(){
        JDKProxyFactory factory=new JDKProxyFactory();
        PersonService service=(PersonService) factory.createProxyInstance(new PersonServiceBean("aaa"));
        service.save("bbb");
    }

输出:

begin invoking....
save
end invoking....

如果目标对象没有实现任何接口

使用cglib-nodep-2.1_3.jar

public class CGlibProxyFactory implements MethodInterceptor{
    private Object targetObject;
    public Object createProxyInstance(Object targetObject){
        this.targetObject=targetObject;
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(this.targetObject.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    @Override
    public Object intercept(Object proxy, Method method, Object[] args,
            MethodProxy methodProxy) throws Throwable {
        // TODO Auto-generated method stub
        PersonServiceBean bean=(PersonServiceBean) this.targetObject;
        Object result=null;
        if(bean.getUser()!=null){
            result=methodProxy.invoke(this.targetObject, args);
        }
        return null;
    }
}
时间: 2024-08-13 12:08:19

aop技术的相关文章

AOP技术应用和研究--AOP简单应用

为了更好的理解AOP实践和体现AOP的优势,我们始终将OOP和AOP的比较贯穿到下文中.并在最终总结出AOP与OOP相比所拥有的优点,AOP的缺点以及AOP一般的使用场景. 1.1 问题空间到解空间的映射 在比较研究OOP和AOP实践之前,先让解决从理论上OOP和AOP解决问题的差别,也就是它们各自从问题空间到解空间的不同映射关系. 1.1.1"问题空间"和"解空间"的定义 在不同的文献中对其定义有着细微的差别,本文对其定义的如下:        问题空间(prob

AOP技术应用和研究--SpringAop实现原理

Spring 的AOP实现遵守了AOP联盟的约定.同时 Spring 又扩展了它,增加了如 Pointcut.Advisor 等一些接口使得更加灵活.在Spring的AOP模块中,包括AOP的基本概念,通知,切入点等,以及最核心的AopProxy代理对象生成和Spring AOP拦截器调用的实现. 1,Spring Aop的基本概念 我们在前面 AOP基本概念对AOP基本概念进行了理论上的定义,现在我们将Spring AOP基本概念作为例子来说明AOP的基本概念,这样可以更好的理解AOP基本概念

Java开发工程师(Web方向) - 04.Spring框架 - 第3章.AOP技术

Spring框架 - AOP概述 笔记https://my.oschina.net/hava/blog/758873Spring框架 - AOP使用 笔记https://my.oschina.net/hava/blog/758881 AOP技术单元测试 返回 本次得分为:7.00/7.00, 本次测试的提交时间为:2017-09-11, 如果你认为本次测试成绩不理想,你可以选择再做一次. 1 单选(2分) 如下关于AOP的描述中错误的是: 得分/总分 A. AOP可以对代码进行解耦: B. A

Spring学习(十三)aop技术理解与使用

一.什么是AOP? aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想.AOP底层也是面向对象:只不过面向的不是普通的Object对象,而是特殊的AOP对象.AOP的关注点是组成系统的非核心通用服务模块(比如登录检查等),相对于普通对象,aop不需要通过继承.方法调用的方式来提供功能,只需要在xml文件中以引用的方式,将非核心服务功能引用给需要改功能的核心业务逻辑对象或方法中.最终实现对象的解耦.spring 中ioc技术实现了核心

AOP技术分析

AOP的概述(http://www.cnblogs.com/lxp503238/p/6837653.html)        1. 什么是AOP的技术?        * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程        * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构        * AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范      

JAVA平台AOP技术研究

3.1 Java平台AOP技术概览 3.1.1 AOP技术在Java平台中的应用 AOP在实验室应用和商业应用上,Java平台始终走在前面.从最初也是目前最成熟的AOP工具——AspectJ,到目前已经融和在企业级容器JBoss中的JBoss AOP,均建立在Java平台上. 前面已经描述到,AOP的目的就是将核心关注点和横切关注点分离,实际上这就是一种分散关注(seperation of concerns)的思路.在Java平台下,如果要开发企业级的应用,非J2EE莫属.一个J2EE应用系统只

AOP技术基础

AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分析.他们研究出了一种新的编程思想,借助这一思想或许可以通过减少代码重复模块从而帮助开发人员提高工作效率.随着研究的逐渐深入,AOP也逐渐发展成一套完整的程序设计思想,各种应用AOP的技术也应运而生. AOP技术在Java平台下是最先得到应用的.就在PARC对于面向方面编程进行研究的同时,美国Northeastern University

AOP技术研究--AOP概述

1 前言 1.1 软件编程技术发展 软件编程技术与程序设计语言是分不开的.过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,再到面向对象语言.每一种新的程序设计语言的出现都带来软件编程方法的飞跃.汇编语言出现后,开发人员避免了直接使用0-l编码,而是利用符号来表示机器指令,从而更方便地编写程序.当程序规模继续增大的时候,出现了以Fortran.C.Pascal等为代表的高级语言,这些高级语言使得编写复杂的程序变得容易,开发人员可以更好地应付日益复杂的代码

AOP技术应用和研究

面向切面编程(Aspect-Oriented Programming,简称AOP)是一种新的软件丌发技术,它是针对面向对象编程(Object.Oriented Programming,简称oop)在处理横跨多个模块的非核心需求时所表现出来的不足而提出的. AOP技术应用和研究系列,首先分析了面向对象编程(OOP)的优点和缺点,从而引出AOP技术.并介绍AOP的基本思想和基本概念.并通过对AOP语言的介绍和实现的研究(特别是Spring AOP框架的实现的分析),进一步深入的分析了AOP的思想.最

C#.NET利用ContextBoundObject和Attribute实现AOP技术--AOP事务实现例子

我前两天看见同事用写了用AOP技术实现缓存的方案,于是好奇看了一下这是怎么实现的.原来是用了.NET中的一个类ContextBoundObject和Attribute相关技术.其实个类在.NET Framework很早就有,至今才认识它,是有点相见恨晚的感觉.网上一搜,已经有了很多使用ContextBoundObject类实现AOP的例子,其中我就看到一篇利用ContextBoundObject和Attribute实现AOP事务实现例子,我想应该和实现AOP缓存是一个道理.下面我就把这篇文章分享