AOP术语
AspectJ(切面)
切面通常指封装的用于横向插入系统功能的类

Joinpoint(连接点)
在程序执行过程中的某个阶段点,它实际上指是对象的一个操作,例如方法的调用或者异常的抛出。
Pointcut(切入点)
是指切面与程序流程的交叉点,即那些需要处理的连接点。在程序中,切入点通常是指类或者方法名,如某个通知要应用到所有以add开头的方法中,那么所有满足这一规则的方法都是切入点。

Advice(通知/增强处理)
AOP框架在特定的切入点执行的增强处理,即在定义好的切入点处所要执行的程序代码。可以将其理解为切面类中的方法,它是切面的具体实现
Target Object(目标对象)
是指所有被通知的对象,也称为被增强对象,如果AOP框架采用的是动态的AOP实现,那么该对象就是一个被代理对象
Proxy(代理)
将通知应用到目标对象之后,被动态创建的对象。
Weaving(织入)
将切面代码插入到目标对象上,从而生成代理对象的过程。
AOP实现一:JDK-Proxy java动态代理
Java动态代理
在java中java.lang.reflect.Proxy提供了动态代理
在java中通过
Proxy.newProxyInstance()
创建代理对象
InvocationHandler 接口是动态代理的核心
通过Proxy.newProxyInstance() 创建对象的对象在运行过程中产生的所有方法都会调用InvocationHandler的invoke方法
public class JdkProxy implements InvocationHandler {
private UserDaoJDK userDaoJDK;
public Object createProxy(UserDaoJDK userDaoJDK) {
this.userDaoJDK=userDaoJDK;
ClassLoader classLoader = JdkProxy.class.getClassLoader();
Class<?>[] interfaces = userDaoJDK.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader, interfaces, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect myAspect = new MyAspect();
myAspect.check_Permissions();
Object object = method.invoke(userDaoJDK, args);
myAspect.log();
return object;
}
}
public class MyAspect {
public void check_Permissions() {
System.out.println("模拟检测权限");
}
public void log() {
System.out.println("模拟记录日志");
}
}
UserDaoJDKImp
public class UserDaoJDKImpl implements UserDaoJDK {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
Main
public class JDKTest {
public static void main(String[] args) {
JdkProxy jdkProxy = new JdkProxy();
UserDaoJDK userDaoJDK= new UserDaoJDKImpl();
UserDaoJDK userDaoJDKProxy = (UserDaoJDK)jdkProxy.createProxy(userDaoJDK);
userDaoJDKProxy.addUser();
userDaoJDKProxy.deleteUser();
}
}

AOP实现二:CGLIB-Code Generation Library
CGLIB
通过核心类Enhancer
调用setSuperclass();
确定目标对象。
调用setCallback添加监听函数
intercept 会在程序执行目标对象方法时调用,intercept 会执行切面中的增强方法
public class CglbProxy implements MethodInterceptor{
public Object creatProxy(Object obj) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
MyAspect myAspect = new MyAspect();
myAspect.check_Permissions();
Object object = arg3.invokeSuper(arg0, args);
myAspect.log();
return object;
}
}
网友评论