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