Advice具体的实现就是表示需要在切入点需要具体做什么,spring定义了三个通知实现点。分别是: BeforAdvice:某个方法执行之前 AfterAdvice:某个方法执行之后 ThrowsAdvice:某个方法抛出异常 此上三个接口,就是围绕切入点,编织自己的实现逻辑。类图如下:
切入点所做的具体工作就是,匹配用户定义的表达式,去断定哪些类,哪些方法是需要进行增强的。在Pointcut接口中,有一个MethodMatcher的方法,所表达的意思就是将匹配的工作委托了给MethodMatcher 实现。 MethodMatcher接口: Pointcut接口: 以下通过JdkRegexpMethodPointcut类图分析下继承关系,JdkRegexpMethodPointcut类是通过正则表达式来解析并且匹配切入点。
这个Advisor这个接口继承关系所表达出来的功能就是将Advice和Pointcut结合起来,即就是匹配到了某个方法就是可以执行增强的逻辑。类图如下:
实现AOP功能,就是创建了一个代理对象。而这个代理对象的创建就是关键。在Spring中提供了两种创建方法,一种是通过JDK动态代理,一种通过CGLIB字节码增强技术。 ProxyCreatorSupport是对创建代理对象的支持,创建代理的对象,该类委托给了DefaultAopProxyFactory进行创建代理对象。 在DefaultAopProxyFactory可以看到有两种创建代理方式,分别是JdkDynamicAopProxy和CglibProxyFactory如果没有特殊的设定默认是采用JdkDynamicAopProxy方式来创建代理对象。 JdkDynamicAopProxy类实现了InvocationHandler接口,这就意味着该类中一定有一个invoke()方法来,用来编织对目标对象的增强逻辑。 在JdkDynamicAopProxy invoke()其主要工作就是获取(Advisor)通知器,并且执行所有匹配的通知器,就完成了AOP的功能。
在获取所有通知器之后,会对所有的(Advisor)通知器做一个转换,会将所有的通知器转换成MethodInterceptor,然后执行MethodInterceptor即完成了AOP的具体实现。 AdvisorAdapterRegistry 该类提供将(Advisor)通知器转换成MethodInterceptor功能。 AfterReturningAdviceInterceptor 在方法执行执行之后,执行了后置通知器。
MethodBeforeAdviceInterceptor
在执行方法之前,执行了前置通知器。 ThrowsAdviceInterceptor 异常时执行了,异常通知器。
在解析定义标签里面,AOP项目添加了对 aspectj-autoproxy标签的解析,其就是想容器注入了一个实现了BeanPostProcessor 的AnnotationAwareAspectJAutoProxyCreator类,该类具体实现了InstantiationAwareBeanPostProcessor接口,就可以做到在实例化Bean之前后之后都可以对需要AOP的Bean进行代理。 AbstractAutoProxyCreator 该类中的postProcessBeforeInstantiation()和postProcessAfterInitialization()都将需要进行代理的AOP对象,进行代理创建。就是主要分为两个步骤:1.获取通知器 2.创建代理对象。其中获取通知器就包含了对注解的通知器进行解析。