public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:config" + "/spring/applicationContext-core2.xml");
MyService as = (MyService) context.getBean("annotationServiceImpl");
as.doSomething("Jack"); //aop起作用,com.zhuguang.jack.annotation.AnnotationServiceImpl@1c55f277,里面的h = org.springframework.aop.framework.JdkDynamicAopProxy@50c6911c,h里面的advised = ProxyFactory = 1 interfaces [MyService]; 4 advisors [ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void afterrr(JoinPoint)]; InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void arounddd(ProceedingJoinPoint) ]; InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void beforeee(JoinPoint)]; ]; targetSource [AnnotationServiceImpl@1c55f277]];
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
TargetSource targetSource = this.advised.targetSource; //AnnotationServiceImpl,被代理的类,
Class<?> targetClass = null;
Object target = null;
try {
if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) { //调用的方法是equals方法,就直接调用了,不用代理了。
return equals(args[0]);
}
if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) { //调用的方法是hashCode方法,就直接调用了,不用代理了。
return hashCode();
}
if (!this.advised.opaque && method.getDeclaringClass().isInterface() &&
method.getDeclaringClass().isAssignableFrom(Advised.class)) {//调用的方法是,,就直接调用了,不用代理了。
return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args);
}
Object retVal;
target = targetSource.getTarget();
if (target != null) {
targetClass = target.getClass();//class com.zhuguang.jack.annotation.AnnotationServiceImpl
}
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); //advised = ProxyFactory代理工厂,
[public void arounddd(ProceedingJoinPoint) , public void beforeee(JoinPoint), public void afterrr(JoinPoint), public void pc1()]这些切面已经加到工厂里面去了, [ExposeInvocationInterceptor@65aa6596,
AspectJAfterAdvice: advice method [public void afterrr()]; aspect name 'aspectAnnotation',
AspectJAroundAdvice: advice method [public void arounddd() ]; aspect name 'aspectAnnotation',
MethodBeforeAdviceInterceptor@1ce61929]
else {
invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
retVal = invocation.proceed(); //调用,invocation = ReflectiveMethodInvocation,
}
Class<?> returnType = method.getReturnType(); //返回值
return retVal;
}
}
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, Class<?> targetClass) {
MethodCacheKey cacheKey = new MethodCacheKey(method); //doSomething方法,
List<Object> cached = this.methodCache.get(cacheKey);
if (cached == null) {
cached = this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(this, method, targetClass);
this.methodCache.put(cacheKey, cached);
}
return cached;
}
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
Advised config, Method method, Class<?> targetClass) { //config = ProxyFactory,method = doSomething(),targetClass = AnnotationServiceImpl List<Object> interceptorList = new ArrayList<Object>(config.getAdvisors().length);
boolean hasIntroductions = hasMatchingIntroductions(config, targetClass);
AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
for (Advisor advisor : config.getAdvisors()) {//[ExposeInvocationInterceptor.ADVISOR,
InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void afterrr()];
InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void arounddd() ];
InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void beforeee()]]
if (advisor instanceof PointcutAdvisor) {
PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor; //AspectAnnotation.afterrr,AspectAnnotation.arounddd,AspectAnnotation.beforeee,
if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) { //在不在Pointcut的表达式里面,匹配的是类。
MethodInterceptor[] interceptors = registry.getInterceptors(advisor); //AspectAnnotation.afterrr,
MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher(); //AspectJExpressionPointcut: () pc1(),
if (MethodMatchers.matches(mm, method, targetClass, hasIntroductions)) { //前面匹配的是类,这里匹配的是方法。
else {
interceptorList.addAll(Arrays.asList(interceptors));
}
}
}
}
}
return interceptorList;
}
public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException {
List<MethodInterceptor> interceptors = new ArrayList<MethodInterceptor>(3);
Advice advice = advisor.getAdvice();
if (advice instanceof MethodInterceptor) {
interceptors.add((MethodInterceptor) advice);
}
for (AdvisorAdapter adapter : this.adapters) {
if (adapter.supportsAdvice(advice)) {
interceptors.add(adapter.getInterceptor(advisor));
}
}
return interceptors.toArray(new MethodInterceptor[interceptors.size()]);
}
public Object proceed() throws Throwable {
if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) { //索引是最后一个就调用被代理类的方法,interceptorsAndDynamicMethodMatchers = [ExposeInvocationInterceptor.ADVISOR,
InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void afterrr()];
InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void arounddd() ];
InstantiationModelAwarePointcutAdvisor: expression [pc1()]; advice method [public void beforeee()]]
return invokeJoinpoint(); //被代理类的方法
} Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex); //根据索引拿到第一个,第二个,。。 else {
return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); //链是调用,this = invocation = ReflectiveMethodInvocation,
}
}
ExposeInvocationInterceptor类的invoke()方法
public Object invoke(MethodInvocation mi) throws Throwable {
MethodInvocation oldInvocation = invocation.get();
invocation.set(mi);
try {
return mi.proceed(); //mi = invocation = ReflectiveMethodInvocation,又调会去了,拿到第二个。
}
finally {
invocation.set(oldInvocation);
}
}
AspectAnnotation.afterrr(org.aspectj.lang.JoinPoint) 类:
public Object invoke(MethodInvocation mi) throws Throwable {
try {
return mi.proceed(); //mi = invocation = ReflectiveMethodInvocation,又调会去了,拿到第三个。after所以现在不会执行。
}
finally {
invokeAdviceMethod(getJoinPointMatch(), null, null);
}
}
AspectAnnotation.arounddd(org.aspectj.lang.ProceedingJoinPoint)类
public Object invoke(MethodInvocation mi) throws Throwable {
ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;//mi = invocation = ReflectiveMethodInvocation,
ProceedingJoinPoint pjp = lazyGetProceedingJoinPoint(pmi);
JoinPointMatch jpm = getJoinPointMatch(pmi);
return invokeAdviceMethod(pjp, jpm, null, null);
}
protected Object invokeAdviceMethod(JoinPoint jp, JoinPointMatch jpMatch, Object returnValue, Throwable t)
throws Throwable {
return invokeAdviceMethodWithGivenArgs(argBinding(jp, jpMatch, returnValue, t));
} protected Object invokeAdviceMethodWithGivenArgs(Object[] args) throws Throwable {
try {
ReflectionUtils.makeAccessible(this.aspectJAdviceMethod);
return this.aspectJAdviceMethod.invoke(this.aspectInstanceFactory.getAspectInstance(), actualArgs);
}
public Object invoke(Object obj, Object... args)
{
MethodAccessor ma = methodAccessor; // read volatile
if (ma == null) {
ma = acquireMethodAccessor();
}
return ma.invoke(obj, args);
}
调到了
public void arounddd(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("==============arounddd 前置通知=========");
joinPoint.proceed(); //MethodBeforeAdviceInterceptor去执行,
System.out.println("==============arounddd 后置通知=========");
}
public Object invoke(MethodInvocation mi) throws Throwable {
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );//beforeee()方法执行,
return mi.proceed(); // 被代理类的方法执行,
}
public void beforeee(JoinPoint joinPoint) {
System.out.println("==============beforeee 前置通知=========");
}
public String doSomething(String param) {
System.out.println("==========AnnotationServiceImpl.doSomething=========");
return "==========AnnotationServiceImpl.doSomething";
}
最后执行after:
invokeAdviceMethod(getJoinPointMatch(), null, null);
protected Object invokeAdviceMethodWithGivenArgs(Object[] args) throws Throwable {
try {
ReflectionUtils.makeAccessible(this.aspectJAdviceMethod);
return this.aspectJAdviceMethod.invoke(this.aspectInstanceFactory.getAspectInstance(), actualArgs);
}
} public Object invoke(Object obj, Object... args)
{
MethodAccessor ma = methodAccessor; // read volatile
if (ma == null) {
ma = acquireMethodAccessor();
}
return ma.invoke(obj, args);
} public void afterrr(JoinPoint joinPoint) {
System.out.println("==============afterrr 后置通知=========");
}
==============arounddd  前置通知=========
==============beforeee 前置通知=========
==========AnnotationServiceImpl.doSomething=========
==============arounddd 后置通知=========
==============afterrr 后置通知=========
cglib的代理
return proxyFactory.getProxy(this.proxyClassLoader);
public Object getProxy(ClassLoader classLoader) {
try {
Class<?> rootClass = this.advised.getTargetClass(); //advised = ProxyFactory Class<?> proxySuperClass = rootClass; //AnnotationServiceImpl Callback[] callbacks = getCallbacks(rootClass);//[CglibAopProxy$DynamicAdvisedInterceptor@2ce86164,
CglibAopProxy$StaticUnadvisedInterceptor@5e8f9e2d,
CglibAopProxy$SerializableNoOp@51df223b,
CglibAopProxy$StaticDispatcher@fd46303,
CglibAopProxy$AdvisedDispatcher@60d8c0dc,
CglibAopProxy$EqualsInterceptor@4204541c,
CglibAopProxy$HashCodeInterceptor@6a62689d]

Class<?>[] types = new Class<?>[callbacks.length];
for (int x = 0; x < types.length; x++) {
types[x] = callbacks[x].getClass();
}
enhancer.setCallbackFilter(new ProxyCallbackFilter(
this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
enhancer.setCallbackTypes(types);
return createProxyClassAndInstance(enhancer, callbacks);
}
}
调用方法时候:
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
try {
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); //
[ExposeInvocationInterceptor@65aa6596,
AspectJAfterAdvice: advice method [public void afterrr()]; aspect name 'aspectAnnotation',
AspectJAroundAdvice: advice method [public void arounddd() ]; aspect name 'aspectAnnotation'
,
MethodBeforeAdviceInterceptor@1ce61929]

Object retVal;
if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {
retVal = methodProxy.invoke(target, args);
}
else {
// We need to create a method invocation...
retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
}
retVal = processReturnType(proxy, target, method, retVal);
return retVal;
}
}
public Object proceed() throws Throwable {
if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
return invokeJoinpoint();
} Object interceptorOrInterceptionAdvice =
this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
else {
return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
}
}

spring 注解aop调用invoke()的更多相关文章

  1. Spring注解 - AOP 面向切面编程

    基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...

  2. 重新学习Spring注解——AOP

    面向切面编程——思想:在一个地方定义通用功能,但是可以通过声明的方式定义这个功能要以何种方式在何处运用,而无须修改受影响的类. 切面:横切关注点可以被模块化为特殊的类. 优点: 1.每个关注点都集中在 ...

  3. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  4. Spring注解AOP及单元测试junit(6)

    2019-03-10/20:19:56 演示:将xml配置方式改为注解方式 静态以及动态代理推荐博客:https://blog.csdn.net/javazejian/article/details/ ...

  5. spring 注解AOP

     aspectAnnotation的切面信息,加到了AnnotationAwareAspectJAutoProxyCreator的advisorsCache属性里面去了. 解析annotationSe ...

  6. spring注解 aop

    @Resource(name="as")  为空按类型装配 @autowired 按类型 @quafiler (name="xx") 按名称 spring继承关 ...

  7. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  8. Spring同一个类中的注解方法调用AOP失效问题总结

    public interface XxxService { // a -> b void a(); void b(); } @Slf4j public class XxxServiceImpl ...

  9. spring注解、aop(二)

    使用注解配置spring 1.导入 spring-aop-5.0.6.RELEASE.jar包 2.为主配置文件引入新的命名空间 xmlns:context="http://www.spri ...

随机推荐

  1. 6 种微服务 RPC 框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  2. IT兄弟连 Java语法教程 数据类型2

    整型 Java定义了4种整数类型:byte.short.int和long.所有这些类型都是有符号的.正或负的整数.Java不支持无符号的.只是正值的整数.许多其它计算机语言同时支持有符号和无符号整数. ...

  3. Long类型数据前端精度丢失

    问题描述 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440 相 ...

  4. Docker学习——Dockerfile

    上一篇我们讲了docker的基本使用,掌握了前一篇,docker使用基本不成问题,但是要是你学习了Dockerfile,你会发现它使用起来有多方便了.项目最终部署时,我们希望docker容器打开时项目 ...

  5. MySQL for OPS 09:MHA + Atlas 实现读写分离高可用

    写在前面的话 前面做了 MHA 高可用,但是存在这样一个问题,我们花了 4 台机器,但是最终被利用起来的也就一台,主库.这样硬件利用率才 25%,这意味着除非发生故障,不然其他几台机器都是摆设.明显的 ...

  6. Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application-笔记

    参考 Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application http://www.vnfan.com/helinbin/d/745b1e040c9b4f6 ...

  7. PlayJava Day001

    今日所学: /* 2019.08.19开始学习,此为补档. */ 三目(元)运算符 格式:(表达式)? 表达式为true返回值A : 表达式为false返回值B 例: String s=2>3 ...

  8. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  9. 如何将HTML页面中的文本设置首行缩进

    text-indent属性介绍 属性值单位 描述 em 比如:1em 就代表缩进1个字,2em缩进2个字...... 由于简单我就不过多的介绍了直接上代码了哦,注意:text-indent属性的值支持 ...

  10. 从0系统学Android-1.4日志工具的使用

    更多精品文章分类 1.4 日志工具 简单介绍一下日志工具,对以后的开发非常有用 1.4.1 使用日志工具 Log Log 日志工具类提供了 5 个方法来供我们打印信息(级别逐渐提高) Log.v(): ...