Spring使用增强类定义横切逻辑,由于只支持方法级别的连接点,增强类中还包含了部分连接点的方位信息。
增强类既包含了横切逻辑,又包含了连接点的方位信息(方法前,后),所以增强类可以用来代表一个切面,只不过它表示的连接点是目标类中所有方法,如果需要定位到特定的方法,则需要切点进一步描述。
增强类型:
前置增强:BeforeAdvice,又由于Spring只支持方法级别的增强,所以前置增强中只有MethodBeforeAdvice可以用 ,在目标方法调用之前执行。
后置增强:AfterReturningAdvice,在目标方法调用之后执行。
环绕增强:MethodInterceptor,在目标方法执行前后执行 增强。
异常抛出增强:ThrowAdvice,用于在目标方法抛出异常后实施增强。
引介增强:IntroductionInterceptor,用于在目标类中添加一些新的方法与属性。
通过实现这些接口中定义的方法,在接口方法中定义横切逻辑,就可以在目标方法中实施。
前置增强:
如:
Public class advice implements MethodBeforeAdvice{
//接口方法
Public void before(Method method,Object[]args,Object obj)throws Throwable{
Method 为目标类方法
Args 目标类方法的入参
obj 目标类实例
}
}
在一般使用中,顺序为:获取代理工厂,添加目标类,添加增强,获取代理类实例,调用目标类的方法。
在Springxml文件中的配置为:
默认采用JDK动态代理
<bean id="advice" class="advice"/>//配置增强
<bean id="target" classs="target"/>//配置目标类
<bean id=""class="org.springframework.aop.framework.ProxyFactoryBean"
P:proxyInterfaces="代理类接口(与目标类的接口相同)"
P:interceptorName="advice(增强类)"
P:target-ref="target(目标类)"/>
后置增强:
Public class advice implements AfterReturningAdvice{
//接口方法
Public void afterReturning(Object returnObj,Methodmethod,Object[] args,Object obj)throws Throwable{
returnObj目标实例方法返回的结果
Method 为目标类方法
Args 目标类方法的入参
obj 目标类实例
}
}
在Spring中的配置如上。
环绕增强:
允许在目标类方法调用前后织入横切逻辑,综合实现了前置与后置增强。
Public class advice implements MethodInterceptor{
//接口方法,用于截获目标类方法的执行,并在其前后添加横切逻辑
Public void invoke(MethodInvocation invocation)throws Throwable{
MethodInvocation不但封装了目标方法及其方法参数组,还封装了目标方法所在的实例对象
Invocation.proceed()方法通过反射调用目标实例相应的方法
}
}
在Spring中的配置如上。
异常抛出增强:
引介增强: