1.代理模式

代理模式(Proxy Pattern)是GoF23种常用设计模式之一
使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下添加一些额外的功能
包括静态代理、动态代理。

静态代理:

静态代理实现:
代理对象与被代理对象必须实现同一个接口,在代理对象中实现日志等服务
问题:
代理对象的一个接口只服务于一种类型的对象
如果要代理的方法很多,要为每种方法进行代理
静态代理在程序规模稍大时无法胜任

动态代理 :

JDK1.3之后加入了实现动态代理的API
InvocationHandler接口
关键:使用Proxy.newProxyInstance()静态方法建立一个代理对象(建立代理对象必须告知要代理的接口)
操作代理对象时会执行invoke()方法。

2.AOP概述

AOP简介:

AOP( Aspect-Oriented Programming ,面向切面编程)
提供了一种新的组织程序结构的思路
是对OOP的补充,而不是替代,经常和OOP一起使用
OOP的核心单位是类,而AOP则是切面
典型的例子包括日志、验证、事务管理等
优点:
使开发人员集中关注于系统的核心业务逻辑
更利于创建松散的、可复用、可扩展的软件系统

AOP概念:

关注点(concern):
一个关注点可以是一个特定的问题、概念或者程序要达到的一个目标。比如日志记录等都是关注点。如果一个关注点的代码被多个类或方法引用,这个关注点就被称为横切关注点
切面(aspect):
一个切面是对一个横切关注点的模块化
连接点(joinpoint):
程序执行过程中的某个点,如方法调用或者抛出异常等

通知(advice):
在特定的连接点应该执行的动作,在多数AOP框架中,通知都是由拦截器实现的,Spring AOP也是如此(定义何时)
切入点(pointcut):
定义在哪些连接点处使用通知,在应用中一般通过指定类名、方法名或者匹配类名、方法名的正则表达式来指定切入点(何地)
目标对象(target):
被切面所通知的对象
织入(weaving):
将切面应用到目标对象,从而创建新的代理对象

通知类型:

前置通知(Before advice):
在某连接点之前执行的通知
后置通知(After returning advice):
在某连接点正常完成后执行的通知
异常通知(After throwing advice):
在方法抛出异常退出时执行的通知
最终通知(After finally advice):
当某连接点退出的时候执行的通知
环绕通知(Around advice):
包围一个连接点的通知,这是最强大的一种通知类型

3.Spring AOP

Spring AOP介绍:

Spring AOP是由纯Java语言实现
Spring AOP和其他AOP框架不同,目的并不是提供最完整的AOP,目前仅支持方法执行上的连接点;但是他和Spring的IoC集成紧密,可以帮助解决企业应用中的常见问题
当Spring AOP不能满足我们的需求时,可以采用其他AOP框架,比如AspectJ,Spring框架可以很好的集成诸如AspectJ等框架,他们是互补的

Spring AOP实现:

Spring AOP提供了3种实现方式:
实现SpringAPI的传统方式
纯POJO类(Advice不用实现任何接口)
一种基于Schema的XML配置,用<aop>标签
一种基于注解驱动的切面
使用AspectJ切面

实现Spring AOP的传统方式:

经典的基于代理的AOP,适用于所有版本
实现步骤:
编写通知
编写切点
Spring自动创建代理对象

纯粹POJO方式-基于Xml

Spring2.x以后提供了新的aop的命名空间
来定义切面等内容
通知不需要实现特定的接口
切面都集中在xml文件中,更加集中、清晰

纯粹POJO方式-基于Annotation
@AspectJ 是一种使用普通Java类注解
来声明AOP切面的方式
开启@AspectJ支持
开启Java的配置方式:@EnableAspectJAutoProxy
开启Xml的配置方式:<aop:aspectj-autoproxy />

4.AOP的更多相关文章

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  3. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  4. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  5. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  6. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  7. .NET里简易实现AOP

    .NET里简易实现AOP 前言 在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比 ...

  8. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  9. 使用Java原生代理实现AOP

    ### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...

  10. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

随机推荐

  1. 关联映射、关联查询【重点掌握一条SQL语句的那种方法】

    1 什么叫关联映射 通过数据库对象之间的关联关系(一对一.一对多.多对多),反映到实体对象上之间的引用. 举例 用户实体类(User):user_id user_name user_token 笔记本 ...

  2. EZOJ #88

    传送门 分析 自然想到二分 我们二分一个长度,之后考虑如何线性判断是否合法 我们可以维护一个单调队列表示从i开始的长度为d的区间和的最大值 每次用一段区间和减去它包含的长度为d的区间最大值即可 但是我 ...

  3. NETTY4中的BYTEBUF 内存管理

    转 http://iteches.com/archives/65193 Netty4带来一个与众不同的特点是其ByteBuf的重现实现,老实说,java.nio.ByteBuf是我用得很不爽的一个AP ...

  4. 使用Notepad++与Dev_c++编译

    1. 安装Dev.打开DEV安装目录下的 D:\app\DevCpp\Dev-Cpp\MinGW64\bin(因人而异). 2.添加环境变量,测试. 将上述路径D:\app\DevCpp\Dev-Cp ...

  5. 第6章 jQuery与Ajax的应用

    6.1 Ajax的优势和不足 6.1.1 Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高Web程序的性能 Ajax模式只是通过XMLHttpRequest对象向服务器端提交希望提交的 ...

  6. ubuntu如何配置VNC远程工具

    现在Linux是非常火的  很多人喜欢用它,界面简单,操作容易,有很多图形化工具如WinSCP可以与ubuntu进行文件的上传的与下载,Xshell就是如同控制ubuntu的终端一样,简单方便,不过要 ...

  7. C# DLL(程序集)的生成和调用

    日期:2018年11月24日 环境:Window 10,VS2015 一.利用VS2015自带的工具生成DLL 步骤: 1.利用C#准备一个.cs文件: using System; public cl ...

  8. linux通配符与基础正则

    1.特殊符号: ' '     单引号          单引号的内容     写什么就是什么,不会被当成特殊字符.       单引号实例:      [root@oldboyedu-sh01 ~] ...

  9. 源码方式安装rabbitmq

    由于工作环境中属于内网,yum安装方式不可用,所以需要采用源码进行rabbitmq的安装.rabbitmq是基于erlang环境进行运行的,所以需要先按照erlang环境,才能运行rabbitmq-s ...

  10. Python3下的paramiko模块

    paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令.文件传输等功能. 默认Python没有,需要手动安装:pip install paramiko SSH密码认证远 ...