一、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事务,是同一个原理,使用了责任链设计模式。