AOP 思维
- AOP 是对 OOP 的一种补充
- 面对对象(OOP)引入了继承、多态、封装、将零碎的业务性能依照模块划分,每个模块用一个或多个类来示意。
- 而对于一些零碎性能,无奈应用 OOP 的思维来实现它们。这些零碎性能往往穿插在业务性能的各处,和业务代码耦合在一起;而且零碎性能往往会被重复使用,这就导致了模块不利于复用,这就是应用 OOP 实现零碎性能的弊病。
- AOP 即为面向切面编程,它把零碎需要依照性能分门归类,把她们封装在一个个切面中,而后再指定这些零碎性能往业务性能中织入的规定。最初由第三方机构依据你指定的织入规定,将零碎性能正和到业务性能中。
AOP 的基本概念
- 切面(Aspect): 相似于 OOP 中的 Class,以恶搞 Aspect 寄存一个零碎性能的所有逻辑;在 ApplicationContext 中由 aop:aspect 来配置;
- 连接点(Joinpoint): 程序执行过程中的某一事件,如办法被调用、抛出异样时;
- 切入点(Pointcut):它是一个表达式,用于确定哪些类的哪些函数须要插入横切逻辑;它只准确到函数,到底要在函数执行的哪个阶段横切逻辑,这就由告诉的类型决定;
-
告诉(Advice): 具体的横切逻辑,Spring 中有四种 Advice
- 前置告诉(Before Advice)
- 后置告诉(After Advice)
- 返回告诉(After Return Advice)
- 盘绕告诉(Around Advice)
- 抛出异样后告诉(After Throwing Advice)
动静代理
Spring 有两种实现 AOP 的形式:Java 动静代理和 Cglib。默认应用动静代理,当指标对象没有实现接口时,就会应用后者。
代理模式中存在指标对象和代理对象,它们必须实现雷同的接口。用户间接应用代理对象,而代理对象会将用户的申请交给指标对象解决。代理对象能够对用户的申请减少额定的解决。
jdk 动静代理简略例子
1. 创立指标对象
// 指标对象接口
public interface Subject
{public void doSomething();
}
// 指标对象实现
public class RealSubject implements Subject
{public void doSomething()
{System.out.println( "call doSomething()" );
}
}
2. 创立代理对象逻辑解决类
public class ProxyHandler implements InvocationHandler
{
private Object proxied;
public ProxyHandler(Object proxied)
{this.proxied = proxied;}
public Object invoke(Object proxy, Method method, Object[] args ) throws Throwable
{
// 在转调具体指标对象之前,能够执行一些性能解决
// 转调具体指标对象的办法
return method.invoke(proxied, args);
// 在转调具体指标对象之后,能够执行一些性能解决
}
}
3. 简略调用,创立代理对象
RealSubject real = new RealSubject();
Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),
new Class[]{Subject.class},
new ProxyHandler(real));
proxySubject.doSomething();