AOP与代理

来源:互联网 发布:php开发微信步骤 编辑:程序博客网 时间:2024/06/16 13:39

AOP静态代理:面向切面编程。将日志,参数合法性,用户权限等重复的操作(这些事情不得不做,但做了会影响逻辑代码)提取,专注于业务逻辑。

AOP的思想就是代理模式。AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低。

面向切面就是在正常的流程上切一刀,在切的这一面做事。

静态代理是设计模式,动态代理是一种技术,通过反射机制实现。

 

JDK动态代理使用java.lang.Proxy创建,是所有动态代理类的超类。通过java.lang.reflect.InvocationHandler动态生成一个代理类,

代理类是由java.lang.reflect.Proxy生成的。被代理的类必须派生于interface,因为动态代理类的创建需接口。

未派生于与interface的类只能通过CGLIB

JDK中具体的动态代理类是怎么产生的呢?

 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,绑定实际类与动态代理类,是Proxy的参数。

 

1.产生代理类$Proxy0类  执行了Proxy.newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h)

将产生$Proxy0类,它继承Proxy对象,并根据第二个参数,实现了被代理类的所有接口。

2. 将代理类$Proxy0类加载到JVM中,这时候是根据Proxy.newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h)它的第一个参数----就是被代理类的类加载器,把当前的代理类加载到JVM中

3. 创建代理类$Proxy0类的对象  调用的$Proxy0类的$Proxy0(InvocationHandler)构造函数,生成$Proxy0类的对象。

 

通过Anntotion生成切面:

实现AOP时需定义好切面类,该类会插入到代码流程中。

想通过Spring提供的@AspectJ切面支持,需在Spring的配置文件applicationContect.xml中引入<aop:aspectj-autoproxy/>

 

切面类(Aspect)通过@Aspect注解。

整个注解AOP的关键字就只有@Aspect(定以切面),@Before,@After...(定义切入点)

 

切面类中的方法就是advice,需通过@Before,@After等注解。

切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。

通知(Advice):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种(通知描述)。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。

 

Advice的注解中通过“execution”注解切入点。

连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。(被插的地点)

切入点(Pointcut):为advice提供的连接点的描述。即加了通知描述的连接点。

目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象的类必须派生于具体的interface(因JDK动态代理限制)。

 

定义一个切面:

 import org.aspectj.lang.annotation.Aspect;

 @Aspect 

public class AspectBean { 

      @Before("execution (*com.koubei.mgr.StudentMgr.update*(..))") 

   public void validateUser(JoinPoint pjp) throws Throwable { 

       System.out.println("执行用户验证"); 

   } 

   @After("execution (*com.koubei.mgr.StudentMgr.update*(..))") 

   public void writeLogInfo() { 

         System.out.println("记录日志信息"); 

     } 

 

AOP也可以通过XML定义:<aop-config>

http://www.blogjava.net/supercrsky/articles/174368.html