1、什么是AOP
AOP(Aspect-Oriented Programming),面向切面编程,是OOP的补充,主要用于将与业务逻辑无关的代码剥离,例如:性能监控、日志记录、权限控制等。
2、实现方案
静态代理
JDK动态代理
CGLIB动态代理
3、现有AOP框架:Spring AOP
前置增强、后置增强、环绕增强
(编程式)
接口:
public interface Greeting {
public void say();
}
实现类:
public class GreetingImpl implements Greeting{
public void say(){
System.out.println("Hello");
}
}
前置增强类:
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable{
System.out.println("Before");
}
}
后置增强类:
public class GreetingAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object result, Method method, Object[] args, Object target) throws Throwable{
System.out.println("After");
}
}
测试:
public class Test {
public static void main(String[] args){
ProxyFactory proxyFactory = new ProxyFactory(); //创建代理工厂
proxyFactory.setTarget(new GreetingImpl()); //目标对象
proxyFactory.addAdvice(new GreetingBeforeAdvice()); //前置增强
proxyFactory.addAdvice(new GreetingAfterAdvice()); //后置增强
Greeting greeting = (Greeting) proxyFactory.getProxy(); //从代理工厂中获取代理
greeting.say(); //调用代理方法
}
}
当然我们也可以只定义一个增强类,同时实现前置增强和后置增强:
public class GreetingBeforeAndAfterAdvice implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable{
System.out.println("Before");
}
@Override
public void afterReturning(Object result, Method method, Object[] args, Object target) throws Throwable{
System.out.println("After");
}
}
这样,我们在使用时就可以这样写:
public class Test {
public static void main(String[] args){
ProxyFactory proxyFactory = new ProxyFactory(); //创建代理工厂
proxyFactory.setTarget(new GreetingImpl()); //目标对象
proxyFactory.addAdvice(new GreetingBeforeAndAfterAdvice()); //前置增强 和 后置增强