1、什么是AOP
面向切面编程。就是这样。
2、AOP术语
(1)连接点(Joinpoint)
程序执行的某个特定位置。比如类在初始化的前后,方法执行的前后。
(2)切点(PointCut)
一个类会有很多个链接点,但是如何定位到某个特定的连接点的逻辑或条件或方法我们称之为切点。就像sql语句的where条件。
(3)增强/通知(Advice)
织入到目标连接点的一段代码程序。
(4)目标对象(Target)
增强织入的目标类。
(5)引介(Introduction)
是一种特殊的增强,为目标类织入属性和方法。这样我们可以为一个原本没有实现某个接口的类,通过Aop变成某个接口的实现类。
(6)织入(Weaving)
是增强添加到连接点的具体过程。有三种方式:编译期织入、类装载期织入、动态代理期织入。spring使用动态代理织入的方式在运行期织入,AspectJ采用编译期和装载期织入的方式。
(7)代理(Proxy)
一个类被织入增强后,就产生一个结果类。这个类是原类和增强逻辑的结合。代理和原类可是有相同接口的类,也可能是原类的子类,所以我们可以用调用原类的方式调用代理类。
(8)切面
切面由切点和增强组成,它既包括了横切逻辑的定义,也包括了连接点。
3、AOP实例
(1)Jdk动态代理。
Jdk动态代理主要涉及到两个类,一个是Proxy另一个是接口InvocationHandler。InvocationHandler主要是织入横切逻辑实现增强,并将切点和增强融合在一起形成切面。
a、业务接口
ForumService
b、对应的业务实现类 ForumServiceImpl
c、切面 PerformanceHandler
d、测试类 JdkTest
---
ForumService
public interface ForumService {
public abstract void removeTopic();
}
--ForumServiceImpl
public class ForumServiceImpl
implements ForumService {
@Override
public void removeTopic() {
System.
out.println(
"
删除。。。。
");
try {
Thread.
sleep(
2000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
--PerformanceHandler
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Created by weiyuan on 2018/7/9/009.
* InvocationHandler
像是一个切面,将目标类和增强编织成一个切面
*/
public class PerformanceHandler
implements InvocationHandler {
private Object
target;
private Log
logger = LogFactory.
getLog(PerformanceHandler.
class);
public PerformanceHandler(Object target){
this.
target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
logger.info(
"
执行的方法
////"+
target.getClass().getName()+
"."+method.getName());
logger.info(
"
开始执行。。。。
");
Object object = method.invoke(
target, args);
logger.info(
"
完成。。。。
");
return object;
}
}
--JdkTest
import com.aop.jdk.handler.PerformanceHandler;
import com.aop.jdk.impl.ForumServiceImpl;
import java.lang.reflect.Proxy;
/**
* Created by weiyuan on 2018/7/9/009.
*/
public class JdkTest {
public static void main(String[] args) {
//
希望被代理的目标类
ForumService target =
new ForumServiceImpl();
//
切面
PerformanceHandler handler =
new PerformanceHandler(target);
//
代理类实例
ForumService forumServiceProxy = (ForumService) Proxy.
newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
forumServiceProxy.removeTopic();
}
}