我们之前都是如何创建代理对象的
1.实现InvocationHandler对象重新invoke方法
2.使用Proxy.newProxyInstance创建代理对象。
Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
3.使用代理对象进行调用方法。
以上就是动态代理的大致模型。
在学习完spring后
ProxyFactory出现了。当然底层也是对上面逻辑的一个封装
proxyFactory.addAdvice就是添加advice通知,也就是增强方法。
自定义一个类实现MethodInterceptor 后这个类就是一个Advice类
然后通过ProxyFactory 来获取代理的对象来进行方法的调用。
代码如下:
public class TestMethodInterceptor {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new TestMethodInterceptor());
proxyFactory.addAdvice(new Befor());
proxyFactory.addAdvice(new After());
Object proxy = proxyFactory.getProxy();
TestMethodInterceptor methodInterceptor = (TestMethodInterceptor) proxy;
methodInterceptor.add("通过代理对象调用方法");
}
public static class Befor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object result = null;
try {
System.out.println("方法执行之前");
result = methodInvocation.proceed();
return result;
} catch (Exception e) {
return result;
}
}
}
public static class After implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object result = null;
try {
result = methodInvocation.proceed();
System.out.println("方法执行之后");
return result;
} catch (Exception e) {
return result;
}
}
}
public String add(String str) {
System.out.println("===");
return "执行方法";
}
}
大致的知道以上流程之后,我们在学习aop就会相对好理解些了
Aop流程
加载的时候会先找@Aspect注解
找到下面的@Before或@After等注解
下图是创建bean的其中一个流程
Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
让BeanPostProcessors有机会返回一个代理而不是目标bean实例
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
- 获取到所有的beanName进行遍历
- 判断类上是加了@Aspect注解
- 获取这个类中所有的增强的方法,只要加了@Before …等注解的方法
创建代理对象
创建代理对象的过程(与最上面的demo很类似)
protected Object createProxy(Class<?> beanClass, @Nullable String beanName,
@Nullable Object[] specificInterceptors, TargetSource targetSource) {
if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);
}
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.copyFrom(this);
if (!proxyFactory.isProxyTargetClass()) {
if (shouldProxyTargetClass(beanClass, beanName)) {
proxyFactory.setProxyTargetClass(true);
}
else {
evaluateProxyInterfaces(beanClass, proxyFactory);
}
}
Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
proxyFactory.addAdvisors(advisors);
proxyFactory.setTargetSource(targetSource);
customizeProxyFactory(proxyFactory);
proxyFactory.setFrozen(this.freezeProxy);
if (advisorsPreFiltered()) {
proxyFactory.setPreFiltered(true);
}
return proxyFactory.getProxy(getProxyClassLoader());
}
以上代理对象就已经创建成功了。
然后我们看下是如何调用的。
从advised中查询是否有增强的方法。
开始调用
retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
以上就是我们动态代理以及aop的一些理解。