Spring AOP
- Advice
- Aspectj
Advice 通知
-
MethodBeforeAdvice 前置通知
-
AfterReturingAdvice 后置通知
-
MethodInterceptor 环绕通知
-
ThrowAdvice 异常抛出通知
-
AfterAdvice 最终通知
MethodBeforeAdvice 前置通知
public interface MethodBeforeAdvice extends BeforeAdvice {
/**
method : 代理的 目标方法
args : 代理的 目标方法需要的参数
target : 目标对象
*/
void before(Method method, Object[] args, @Nullable Object target) throws Throwable ;
}
MethodInterceptor 环绕通知
public interface MethodInterceptor extends Interceptor {
// invoke 返回的结果 代表 目标方法 返回的结果,结果可以被切面修改
Object invoke(MethodInvocation invocation) throws Throwable;
}
MethodInvocation 中常见的方法
-
getMethod : 获取 目标方法
-
getArguments : 获取 目标方法需要的参数列表
-
getThis() : 获取代理的目标对象
-
proceed() : 调用目标对象的方法,返回方法的结果, 在 proceed() 方法前 执行的的代码是 前置通知
在 proceed() 方法后执行的代码 是后置通知,所以 MethodInterceptor 被称为 环绕通知
AfterReturingAdvice
public interface AfterReturningAdvice extends AfterAdvice {
/**
returnValue : 代表 目标方法 返回的 结果
*/
void afterReturning(Object returnValue, Method method, Object[] args,
Object target) throws Throwable;
}
ThrowsAdvice 异常抛出通知
该接口 是一个 空接口,里面没有任何的方法, 但是如果希望在目标方法抛出异常的时候,进行处理,则需要提供对应的处理方法
public void afterThrowing(Exception ex)
public void afterThrowing(RemoteException)
public void afterThrowing(Method method, Object[] args, Object target, Exception ex)
public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)
方法中需要提供一个 返回 void 且 方法名为 afterThrowing的方法
在方法中 至少提供一个Exception类型的参数,但该参数最为方法的最后一个参数
可以在方法中,添加 method, args, target 三个参数
ProxyFactoryBean
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 注入 target 目标对象 -->
<property name="target" ref="userDao" />
<!-- 配置 目标类 需要的 切面类 -->
<property name="interceptorNames">
<array>
<value>timeAdvice</value>
</array>
</property>
</bean>
BeanNameAutoProxyCreator
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 代理bean的名字以 Dao结尾的 bean -->
<property name="beanNames" value="*Dao" />
<property name="interceptorNames">
<list>
<value>logAdvice</value>
<value>timeAdvice</value>
</list>
</property>
</bean>