浅析Spring.net中的Aop使用

浅析Spring.net中的Aop使用,第1张

;   一 什么是AOP        AOP为Aspect Oriented Programming的缩写 意为 面向切面编程(也叫面向方面) 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加 功能的一种技术 AOP实际是GoF设计模式的延续 设计模式孜孜不倦追求的是调用者和被调用者之间的解耦 AOP可以说也是这种目标的一种实现         主要的功能是 日志记录 性能统计 安全控制 事务处理 异常处理等等         主要的意图是 将日志记录 性能统计 安全控制 事务处理 异常处理等代码从业务逻辑代码中划分出来 通过对这些行为的分离 我们希望可以将它们独立到非指导业务逻辑的方法中 进而改变这些行为的时候不影响业务逻辑的代码         可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 AOP实际是GoF设计模式的延续 设计模式孜孜不倦追求的是调用者和被调用者之间的解耦 AOP可以说也是这种目标的一种实现         在Spring中提供了面向切面编程的丰富支持 允许通过分离应用的业务逻辑与系统级服务(例 如审计(auditing)和事务(transaction)管理)进行内聚性的开发 应用对象只实现它们应该做的 完成业务逻辑 仅此而已 它们并 不负责(甚至是意识)其它的系统级关注点 例如日志或事务支持    

                                                                               切面(Aspect)        切面是你要实现的交叉功能 它是应用系统模块化的一个切面或领域 切面的最常见(虽然简单)例子是日志记录 日志记录在系统中到处需要用到 利用继承来重用日志模块不适合 然而 你可以创建一个日志记录切面 并且使用AOP在系统中应用         连接点(Joinpoint)        连接点是应用程序执行过程中插入切面的地点 这个地点可以是方法调用 异常抛出 或者甚至是要修改的字段 切面代码在这些地方插入到你的应用流程中 添加新的行为         通知(Advice)        通知切面的实际实现 它通知应用系统新的行为 在日志例子中 日志通知包含了实现实际日志功能的代码 如向日志文件写日志 通知在连接点插入到应用系统中         切入点(Pointcut)        切入点定义了通知应该应用在哪些连接点 通知可以应用到AOP框架支持的任何连接点 当然 你并不希望把所有切面应用到所有可能的连接点上 切入点让你指定通知应用到什么地方 通常通过指定类名和方法名 或者匹配类名和方法名式样的正则表达式来指定切入点 一些AOP框架允许动态创建切入点 在运行时根据条件决定是否应用切面 如方法参数值         引入(Introduction)        引入允许你为已存在类添加新方法和属性 例如 你可以创建一个稽查通知来记录对象的最后修改时间 只要用一个方法setLastMofified(Date)以及一个保存这个状态的变量 可以在不改变已存在类的情况下将这个引入 给他们新的行为和状态         目标对象(Target)        目标对象是被通知对象 它既可以是你编写的类也可以是你要添加制定行为的第三方类 如果没有AOP 这个类就必须要包含它的主要逻辑以及其他交叉业务逻辑 有了AOP 目标对象就可以全身心地关注主要业务 忘记应用其上的通知         代理(Proxy)        代理是将通知应用到目标对象后创建的对象 对于客户对象来说 目标对象(应用AOP之前的对象)和代理对象(应用AOP之后的对象)是一样的 也就是 应用系统的其他部分不用为了支持代理对象而改变         织入 (Weaving)        织入是将切面应用到目标对象从而创建一个新的代理对象的过程 切面在指定接入点被织入到目标对象中         二 几个重要接口        用于找到用于通知的相关的类型和方法        View Code        public interface IPointcut        {        ITypeFilter TypeFilter { get; }        IMethodMatcher MethodMatcher { get; }        }        用于匹配相关类型        View Code        public interface ITypeFilter        {        bool Matches(Type type)         }        public interface IMethodMatcher        {        bool IsRuntime { get; }        bool Matches(MethodInfo method Type targetType)         bool Matches(MethodInfo method Type targetType object[] args)         } Matches(MethodInfo Type)        方法用来测试这个切入点是否匹配目标类的指定方法 这将在AOP代理被创建的时候执行 这样可以避免在每次方法调用的时候都执行 如果两个参数的matches方法对于一个给定的方法返回true 并且IMethodMatcher接口的IsRuntime方法也返回true 那么有三个参数的matches方法将在每个方法调用时被调用 这使得切入点在通知将被执行前可以查看传入到方法的参数         绝大多数的IMethodMatcher接口是static的 这也就意味着它们的IsRuntime属性返回false 在这种情况下 有三个参数的Matches方法将永远不会被调用         三 通知        通知生命周期        通知类型        一 拦截环绕通知(around advice) Spring NET中最基本的通知类型是拦截环绕通知(interception around advice) 即方法拦截器 拦截环绕通知继承IMethodInterceptor接口 注意其中IMethodInvocation Proceed()方法的调用 该方法会依次调用拦截器链上的其它拦截器 大部分拦截器都需要调用这个方法并返回它的返回值 当然 也可以不调用Proceed方法 而返回一个其它值或抛出一个异常 但一般不太会这么做         二 前置通知(before advise) 是在IMethodInterceptor Proceed()方法调用前的通知 继承自IMethodBeforeAdvice接口         三 异常通知(throws advise) 是在IMethodInterceptor Proceed()方法调用时发生异常的通知 继承自IthrowsAdvice接口 IthrowsAdvice接口没有定义任何方法 它是一个标识接口(按 之所以用标识接口 原因有二 在通知方法中 只有最后一个参数是必须的 如果声明为接口的方法 参数列表就被固定了 如果第一个原因可以用重载的接口方法解决 那么这个原因就是使用标识接口的充分原因了 实现此接口的类必须声明一或多个通知方法 接口方法做不到这一点) 用以表明实现它的类声明了一或多个强类型的异常通知方法         四 后置通知(after returning advise) 是在IMethodInterceptor Proceed()方法调用后的通知 继承自IAfterReturningAdvice接口 后置通知对切入点的执行没有影响 如果通知抛出异常 就会沿拦截器链向上抛出 从而中断拦截器链的继续执行         Interception Around Advice(环绕拦截通知 后面的讲解以环绕拦截通知为例子)        方法拦截器接口        View Code        public interface IMethodInterceptor : IInterceptor        {        object Invoke(IMethodInvocation invocation)         }

        模拟环绕拦截通知        View Code        public class DebugInterceptor : IMethodInterceptor        {        public object Invoke(IMethodInvocation invocation)        {        Console WriteLine( Before: invocation=[{ }] invocation)         object rval = invocation Proceed()         Console WriteLine( Invocation returned )         return rval;        }        }        注意 IMethodInvocation 的 Proceed 方法 proceed方法返回方法的返回值         四 切入点 *** 作        静态切入点        ProxyFactoryObject 显式创建AOP代理        AOP 配置文件        <object id= UserValidateTarget type= Stephen SpringNet AOPSample Servcies Impl UserValidate Servcies ></object>        <object id= RoundInterceptor type= Stephen SpringNet AOPSample Servcies Interceptor RoundInterceptor Servcies ></object>        <object id= UserValidateProxy type= Spring Aop Framework ProxyFactoryObject Spring Aop >        <property name= proxyInterfaces value= Stephen SpringNet AOPSample Servcies IValidateService />        <property name= target ref= UserValidateTarget />        <property name= interceptorNames >        <list>        <value>RoundInterceptor</value>        </list>        </property>        </object>        不过由于显式的创建AOP在要创建多个代理的时候需要重复的配置因此Spring提供了自动代理        ObjectNameAutoProxyCreator 对象名称自动切入点        可以用特定的文本值或通配符匹配目标对象的名称 并为满足条件的目标对象创建AOP代理 该类支持模式匹配字符串 如 name name name 和精确文本如 name 我们可以通过下面这个简单的例子了解一下自动代理的功能         AOP 配置文件        <object id= IValidateProxy type= Spring Aop Framework AutoProxy ObjectNameAutoProxyCreator Spring Aop >        <property name= ObjectNames >        <list>        <value>Validate</value>        </list>        </property>        <property name= InterceptorNames value= RoundInterceptor ></property>        </object> 测试方法        [TestMethod]        public  void ObjectNameAutoProxyCreatorMethodTest()        {        var context = ContextRegistry GetContext()         IDictionary validates = context GetObjectsOfType(typeof(IValidateService))         foreach (DictionaryEntry validate in validates)        {        ((IValidateService) validate Value) Validate(null)         }        }        执行结果        ObjectNameAutoProxyCreatorMethodTest : Passed        Method:Validate开始执行        Method:Validate执行完毕        SdkRegularExpressionMethodPointcut 通过正则表达式来匹配需要执行的类或方法        AOP 配置        <object id= ValidatePointCut type= Spring Aop Support SdkRegularExpressionMethodPointcut Spring Aop >        <property name= Pattern value= UserValidate Advance ></property>        </object>        <aop:config>        <aop:advisor advice ref= RoundInterceptor pointcut ref= ValidatePointCut />        </aop:config> pattern 的属性 UserValidate Advance 表示 匹配 UserValidate 类中的以Advance开头的方法        DefaultAdvisorAutoProxyCreator+RegularExpressionMethodPointcutAdvisor 创建正则表达式AOP        AOP 配置        <object id= ProxyCreator type= Spring Aop Framework AutoProxy DefaultAdvisorAutoProxyCreator Spring Aop />        <object id= ValidateRegularExpressionPointCut type= Spring Aop Support RegularExpressionMethodPointcutAdvisor Spring Aop >        <property name= advice ref= RoundInterceptor />        <property name= patterns >        <list>        <value>UserValidate Advance</value>        </list>        </property>        </object>        特性Aop        可以通过Attribute类来实现AOP        [AttributeUsage(AttributeTargets Method)]        public class AopAttribute:Attribute        {        } AOP 配置        <object id= aroundAdvisor type= Spring Aop Support AttributeMatchMethodPointcutAdvisor Spring Aop >        <property name= Advice ref= RoundInterceptor />        <property name= Attribute         value = Stephen SpringNet AOPSample Servcies AopAttribute Servcies />        </object>        <object id= ValidateAttributeProxy type= Spring Aop Framework ProxyFactoryObject Spring Aop >        <property name= proxyInterfaces value= Stephen SpringNet AOPSample Servcies IValidateService />        <property name= target ref= UserValidateTarget />        <property name= interceptorNames >        <list>        <value>aroundAdvisor</value>        </list>        </property>        </object> lishixinzhi/Article/program/Java/ky/201311/28013

AOP切静态方法注解即是使用面向切面编程(AOP)提供的注解,来实现对静态方法进行切面编程。静态方法不同于实例方法,因此需要特定的技术来实现AOP。AOP是一种编程范式,它可以在不修改现有代码的情况下,为程序添加横切关注点,例如:日志记录、性能统计等。在Java中,使用AOP最常见的方式是使用Spring AOP框架。使用AOP切静态方法注解,可以方便的实现对静态方法进行横向切面,提高代码复用性和可维护性。

注意: 下面的测试是spring4版本,spring5的执行顺序有变化, 请看

语法: execution( [权限修饰符] [返回类型] [方法名称] ([参数列表]))

CommonAspect:

结果1: 可以发现没有异常通知

结果2:

可以发现:上面5中通知类型的切入点表达式都是一样的,于是可以将切入点抽取出来。

如果 多个增强类 对同一个方法(或多个方法)增强,设置增强类的优先级:

1、什么是AOP

AOP(Aspect Orient Programming) : 面向切面编程

Aspect :表示切面, 给业务方法增加的功能,叫做切面。 切面一般都是非业务功能, 而且切面功能一般都是可以复用的。 例如 日志功能, 事务功能, 权限检查,参数检查, 统计信息等等。

Orient:面向,对着

Programming:编程。

2、 怎么理解面向切面编程 ? 以切面为核心设计开发你的应用。

1)设计项目时, 找出切面的功能。

2)安排切面的执行时间, 执行的位置。

3、AOP的作用:

1)让切面功能复用

2)让开发人员专注业务逻辑。 提高开发效率

3)实现业务功能和其他非业务功能解耦合。

4)给存在的业务方法, 增加功能,不用修改原来的代码

4、AOP中术语

1)Aspect:切面, 给业务方法增加的功能。

2)JoinPoint:连接点, 连接切面的业务方法。 在这个业务方法执行时,会同时执行切面的功能。

3)Pointcut: 切入点, 是一个或多个连接点集合。 表示这些方法执行时,都能增加切面的功能。

表示切面执行的位置。

4)target: 目标对象, 给那个对象增加切面的功能, 这个对象就是目标对象。

5)Advice:通知(增强),表示切面的执行时间。 在目标方法之前执行切面,还是目标方法之后执行切面。

AOP中重要的三个要素: Aspect, Pointcut , Advice 这个概念的理解是: 在Advice的时间,在Pointcut的位置, 执行Aspect

AOP是一个动态的思想。 在程序运行期间,创建代理(ServcieProxy),使用代理执行方法时,增加切面的功能。这个代理对象是存在内存中的。

5、什么时候你想用AOP

你要给某些方法 增加相同的一些功能。 源代码不能改。 给业务方法增加非业务功能,也可以使用AOP

6、AOP技术思想的实现

使用框架实现AOP。 实现AOP的框架有很多。 有名的两个

1) Spring : Spring框架实现AOP思想中的部分功能。 Spring框架实现AOP的 *** 作比较繁琐,比重。

2) Aspectj : 独立的框架,专门是AOP。 属于Eclipse

7、通知

Aspectj表示切面执行时间,用的通知(Advice)。 这个通知可以使用注解表示。

讲5个注解, 表示切面的5个执行时间, 这些注解叫做通知注解。

@Before : 前置通知

@AfterRetunring: 后置通知

@Around: 环绕通知

@AfterThrowing:异常通知

@After:最终通知

8、Pointcut 位置

Pointcut 用来表示切面执行的位置, 使用Aspectj中切入点表达式。

AOP有三种植入切面的方法:其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

以上就是关于浅析Spring.net中的Aop使用全部的内容,包括:浅析Spring.net中的Aop使用、aop切静态方法注解、Spring中切面详解(AOP)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10158888.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存