Spring源码之Aop原理

一、Spring Aop 代码展示

接口:

public interface UserService {
	String getById(Integer id);
}

实现类:

@Service
@Primary
@EnableAspectJAutoProxy(exposeProxy = true)
public class UserServiceImpl implements UserService {

	@Override
	public String getById(Integer id) {
    System.out.println("userServiceImpl");
		return "userService";
	}

}

config 类

@ComponentScan({"com.lingtig"})
@Configuration
public class Appconfig {

}

Aop类:

@Aspect
@Component
public class AopTest {

	@Around("execution(* com.luban.service.UserService.getById(..))")
	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("AOP  before");
		Object proceed = joinPoint.proceed();
		System.out.println("AOP  after");
		return  proceed;
	}

}

main:

public static void main(String[] args) {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
		applicationContext.register(Appconfig.class);
		applicationContext.refresh();
		UserService userServiceImpl = (UserService) applicationContext.getBean("userServiceImpl");

		String ID = userServiceImpl.getById(12);
		applicationContext.close();

	}

最后的执行结果:

AOP  before
userServiceImpl
AOP  after

Spring aop源码分析

一、思考代理对象什么时候、在哪里、怎么生成?
Spring源码之Aop原理_第1张图片
我们在main方法里,debug就能进入代理对象的invoke方法。JdkDynamicAopProxy就是userService的代理对象,此时的代理对象已经被增强。

Spring源码之Aop原理_第2张图片
我们找到JdkDynamicAopProxy的构造函数执行的代码,进入到DefaultAopProxyFactory的createAopProxy方法。在这里,我们打一个断点。重新执行main方法。
Spring源码之Aop原理_第3张图片
执行的时序图在这里插入图片描述
Spring源码之Aop原理_第4张图片
在bean初始化之后,abstractAutoProxyCreator类去执行postProcessAfterInitialization方法,abstractAutoProxyCreator是重写了beanPostProcessor的后置处理器的postProcessAfterInitialization方法,在这个方面里 ,创建了代理对象,实现了目标对象的增强。

到此已经说明了代理对象什么时候创建、在哪里创建、以及怎么创建。

二、代理对象执行目标对象的方法的时候,怎么对目标方法进行增强的呢?
在这里插入图片描述
在图中,我们能看到此处获取一系列拦截器chain,然后调用ReflectiveMethodInvocation的对象的proceed方法。
Spring源码之Aop原理_第5张图片

在这里,依次遍历拦截器,执行invoke方法,此处和我上一篇博客的Spring事务,是同一个原理,使用了责任链设计模式。

你可能感兴趣的:(Spring)