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源码分析

一、思考代理对象什么时候、在哪里、怎么生成?
在这里插入图片描述
我们在main方法里,debug就能进入代理对象的invoke方法。JdkDynamicAopProxy就是userService的代理对象,此时的代理对象已经被增强。

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值