一、spring aop简介与应用
JDK 动态代理
/**
@Classname JdkDynamicProxy
@Date 2021/8/4 10:55 上午
@Created by jinhanping
*/
@Slf4j
public class JdkDynamicProxy implements InvocationHandler {
private InterfaceBean target;
public JdkDynamicProxy(InterfaceBean target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("sayHello".equals(method.getName())) {
log.info("JDK动态代理");
}
return method.invoke(target, args);
}
}
测试
public static void main(String[] args) {
InterfaceBean bean = (InterfaceBean) Proxy.newProxyInstance(
InterfaceBean.class.getClassLoader(),
new Class<?>[] {InterfaceBean.class},
new JdkDynamicProxy(new InterfaceBeanImpl())
);
bean.sayHello("java six six six");
}
cglib动态代理
CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的,诸如private的方法也是不可以作为切面的。
// 目标类
public class ClassBean {
public String print(String something) {
return something;
}
}
// cglib代理
public class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Logger logger = LoggerFactory.getLogger(CglibProxy.class);
logger.info("cglib proxy is applyed");
return proxy.invokeSuper(obj, args);
}
}
// 测试类
public class ProxyTest {
@Test
public void testCglibProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ClassBean.class);
enhancer.setCallback(new CglibProxy());
ClassBean bean = (ClassBean)enhancer.create();
bean.print("double six six six");
}
}
上述代码中,我们通过CGLIB的Enhancer来指定要代理的目标对象、实际处理代理逻辑的对象,最终通过调用create()方法得到代理对象,对这个对象所有非final方法的调用都会转发给MethodInterceptor.intercept()方法,在intercept()方法里我们可以加入任何逻辑,比如修改方法参数,加入日志功能、安全检查功能等;通过调用MethodProxy.invokeSuper()方法,我们将调用转发给原始对象。
原文:https://www.cnblogs.com/jphjava/p/15098199.html