了解Spring AOP

AOPjava

什么是AOP?spring

Aspect Oriented Programming 面向切面编程。sql

AOP常见的地方:最多见的就是咱们不少框架当中用到的拦截器。编程

AOP的用途: 事务管理,安全检查,日志记录,缓存,对象池管理等。缓存


AOP的基本概念安全

AOP从程序的运行角度考虑程序的流程,提取业务处理过程的切面,AOP面向的是程序运行过程当中的各个步骤,但愿以更好的方式来组合程序运行过程的各个步骤。框架

AOP框架并不与特定的业务代码耦合,AOP框架可以处理程序执行中的特定切入点(PointCut),而不与具体类耦合。代理

AOP框架的特色:日志

#1,各步骤之间良好的隔离性。code

#2,源代码无关性。


下面是AOP中的经常使用术语:

#1, 切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点可能横切多个对象,因此尝尝也

称为横切关注点。

#2,链接点(Joinpoint):程序执行过程当中明确的点,如方法的调用,或者异常的抛出。Spring AOP中,链接点老是方法的调用。

#3,加强处理(Advice): AOP框架在特定的切入点执行的加强处理。处理有"around","before","after"等.

#4,   切入点(Pointcut): 能够插入增长处理的链接点。简而言之,当某个链接点知足指定要求时,该链接点将被添加加强处理,该链接点也就变成了切入点。

#5,引入:将方法或者字段添加到被处理的类中。Spring容许引入新的接口到任何被处理的对象。

#6,目标对象: 被AOP框架进行加强处理的对象,也被称为被加强的对象。若是AOP框架是经过运行时代理来实现的,那么这个对象将是一个被代理的对象。

#7, AOP代理:AOP框架建立的对象,简单的说,代理就是对目标对象的增强。Spring中的AOP代理能够是JDK的动态代理,也能够是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。

#8, 织入(Weaving):将加强处理添加到目标对象中,并建立一个被加强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时加强和运行时加强。Spring和其余纯Java AOP框架同样,在运行时完成织入。


Spring的AOP支持

Spring中的AOP代理由Spring的IOC容器负责生成,管理,其依赖关系也由IOC容器负责管理。所以,AOP代理能够直接使用容器中的其余Bean实例做为目标,这种关系可由IOC容器的依赖注入提供。Spring默认使用Java动态代理来建立AOP代理,这样就能够为任何接口实例建立代理了。

Spring也可使用CGLIB代理,在须要代理类而不是代理接口的时候,Spring自动会切换为使用CGLIB代理。但Spring推荐使用面向接口变成,所以业务对象一般都会实现一个或多个接口,此时默认将使用JDK动态代理,但也能够强制使用CGLIB。


package com.wangbiao.aspect;

import java.sql.Date;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;


@Aspect
@Order(value=2)
public class LoginAspect {

    @Before("execution(* com.wangbiao.target.imp.*.*(..))")
    public void authority()
    {
        System.out.println("模拟执行权限检查");
    }
    
//    
//    @AfterReturning(returning ="rvt",pointcut="execution(* com.wangbiao.target.imp.*.*(..))")
//    public void log(String rvt)
//    {
//        System.out.println("记录log  " + rvt);
//    }
    
    @AfterReturning(pointcut="execution(* com.wangbiao.target.imp.*.*(..)) && args(name)")
    public void log2(String name)
    {
        System.out.println("记录log  " + name);
    }
    
    @AfterReturning(pointcut="execution(* com.wangbiao.target.imp.*.*(..)) && args(name,birthday)")
    public void log3(String name,Date birthday)
    {
        System.out.println("记录log  ");
    }
//    
//    @AfterThrowing(throwing ="exp",pointcut="execution(* com.wangbiao.target.imp.*.*(..))")
//    public void handleException(Throwable exp)
//    {
//        System.out.println("处理异常  " + exp.getCause()+"--"+exp.getMessage());
//    }
//    
////    @AfterThrowing(throwing ="exp",pointcut="execution(* com.wangbiao.target.imp.*.*(..))")
////    public void handleException(NullPointerException exp)
////    {
////        System.out.println("处理异常  " + exp.getCause()+"--"+exp.getMessage());
////    }
//    
//    @After("execution(* com.wangbiao.target.imp.*.*(..))")
//    public void handleExceptionII()
//    {
//        System.out.println("处理异常  ");
//    }
//    
//    @Around("execution(* com.wangbiao.target.imp.*.*(..))")
//    public void remark(ProceedingJoinPoint pj) throws Throwable
//    {
//        System.out.println("XXXXXXXXXXXX---before");
//        System.out.println(pj.getTarget()+"--"+pj.getSignature().getName()+"--"+pj.getArgs());
//        pj.proceed();
//        //pj.proceed(new Object[]{"hee"});
//        System.out.println("XXXXXXXXXXXX---after");
//    }
}
相关文章
相关标签/搜索