Spring AOP(2008-12-19 20:23:52)
先来看看AOP的概念:
面向方面/切面编程:Aspect Oriented Programming
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),这样会给程序的维护带来不便,AOP就实现了把这些业务需求与系统需求分开来做。这种解决的方式也称代理机制。
AOP分为静态代理,和动态代理:
静态代理
业务接口
实现业务类
代理类,实现业务接口,加入代理方法
测试:
静态代理的优点:
可以保证业务类的可重用性,和简单性。业务类只观注业务本身。
当系统需求发生变动时只需要个改代理类
静态代理缺点:代理类与业务类一对一,一个业务类,对应一个代理类
动态代理
上面业务和业务接口不做变动,重新做一个代理类,集成InvocationHandler
在这里需要引用java.lang.reflect.Proxy;
并且用到Proxy的newProxyInstance方法
测试:
先来了解一些定义:
Aspect(切面)
给业务类中要加入的非业务功能,如日志,事务,安全等,即:要实现的系统需求。
Advice(通知)
在上面示例中,日志功能可能非常通用,如果把日志功能做成一个类,在使用的时候只调用那就非常放便,那么这个类可以称之为对某个Aspect(切面)的具体实现,即通知。
所以切面是一个概念意义上的,而通知才是具体的实现。
Joinpoint(连接点)
在上面示例中有如下代码:
其中system.out部分可以称为Aspect(切面),即系统需求,而method.invoke才是真正的业务完成业务功能,此处Aspect(切面)的应用时机是在业务方法调用的周围。那么还可以在业务方法调用之前,之后,或者说某个条件成立的时候如:产生异常的时候。在spring中切面的应用时机更确切的说通知的应用时机称为Joinpoint(连接点)。在spring中也提供了四种连接时机,方法前,方法后,方法周围,异常产生的时候。
Pointcut(切入点)
比如说:现在选择Joinpoint(连接点)为前置(方法调用前)连接点,选中的Advice(通知)为日志功能,把它应用到某个具体的对像,如Say类中。切入点实际上是一个组织实施的过程,说明什么Aspect(切面)在什么时机(Joinpoint(连接点)),应用到目标对像。
Target(目标对像)
将要被代理的对像(一般为业务接口)。如上面示例中的IProcess接口
Porxy(代理对像)
生成的代理对像
Weave(织入)
把通知应用到目标对象,最后生成代理对象的过程叫织入。
现在我们用在用Spring来做一下,首先业务类和接口仍然不变,重写代理类
需要实现org.aopalliance.intercept.MethodInterceptor接口
然后在sping.xml中配置
测试:
测试成功:
通知分为四种:
BeforeAdvice(前置通知)org.springframework.aop.MethodBeforeAdvice
AfterAdvice(后置通知) org.springframework.aop.AfterReturningAdvice
AroundAdvice(环绕通知) org.aopalliance.intercept.MethodInvocation
ThrowAdvice(异常通知) org.springframework.aop.ThrowsAdvice
可以把多个通知应用到目标对象上
我们现在只是把通知应用到目标对象上面,可是我们如要应用到某个具体的方法怎么办,也就是说,例如事务,在添加,更新,删除有事务,而查询的时候并不需要事务,这时候我们应该怎么办?
下一章,我们就来解决这个问题!~
相关推荐
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
spring aop jar 包
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足
springAOP配置实现动态代理,有利于熟悉动态代理原理,深入了解spring。
Spring源码最难问题:当Spring AOP遇上循环依赖.docx
spring aop的demo spring aop的demo
Spring AOP 入门 作者:廖雪峰
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
Spring AOP简单demo 入门级的 advice
springAOP详解
spring aop 经典例子(原创),无论新手还是老手,可以快速对Spring AOP有个总体的认识。基于JDK1.6,Spring2.0.5,Eclipse IDE。
springaop多数据库读写分离