基于schema的风格
先看一下配置文件(aop_config_schema.xml):
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:aop=”http://www.springframework.org/schema/aop”
xsi:schemaLocation=”
[url]http://www.springframework.org/schema/beans[/url]
[url]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]
[url]http://www.springframework.org/schema/aop[/url]
[url]http://www.springframework.org/schema/aop/spring-aop-2.0.xsd[/url]“>
<!–
有了schema的支持,切面就和常规的Java对象一样被定义成application context中的一个bean。
对象的字段和方法提供了状态和行为信息,XML文件则提供了切入点和通知信息。
正如下面这个bean指向一个没有使用 @Aspect 注解的bean类,
但是这个类会在下面被配置为一个切面的backing bean(支持bean)。
–>
<bean id=”aBean” class=”com.xyz.myapp.AspectExample2″>
…
</bean>
<!–
配置文件中:
所有的AOP配置是在<aop:config>标签中设置的,所有的切面和通知器都必须定义在 <aop:config> 元素内部。
一个application context可以包含多个 <aop:config>。
一个 <aop:config> 可以包含pointcut,advisor和aspect元素(注意它们必须按照这样的顺序进行声明)。
如果想强制使用CGLIB代理,需要将 <aop:config> 的 proxy-target-class 属性设为true
–>
<aop:config>
<!–顶级(<aop:config>)切入点:
直接在<aop:config>下定义,这样就可以使多个切面和通知器共享该切入点。–>
<aop:pointcut id=”businessService”
expression=”execution(* com.xyz.myapp.service.*.*(..))”/>
<!–这里使用命名式切入点,只在JDK1.5及以上版本中支持。–>
<aop:pointcut id=”businessService”
expression=”com.xyz.myapp.SystemArchitecture.businessService()”/>
<!–切面使用<aop:aspect>来声明,backing bean(支持bean)通过 ref 属性来引用–>
<aop:aspect id=”myAspect” ref=”aBean”>
<!–在切面里面声明一个切入点:这种情况下切入点只在切面内部可见。–>
<aop:pointcut id=”businessService”
expression=”execution(* com.xyz.myapp.service.*.*(..))”/>
<!–Before通知–>
<aop:before
pointcut-ref=”dataAccessOperation”
method=”doAccessCheck”/>
<!–使用内置切入点:将 pointcut-ref 属性替换为 pointcut 属性–>
<aop:before
pointcut=”execution(* com.xyz.myapp.dao.*.*(..))”
method=”doAccessCheck”/>
<!–返回后通知–>
<aop:after-returning
pointcut-ref=”dataAccessOperation”
method=”doAccessCheck”/>
<!–和@AspectJ风格一样,通知主体可以接收返回值。使用returning属性来指定接收返回值的参数名–>
<aop:after-returning
pointcut-ref=”dataAccessOperation”
returning=”retVal”
method=”doAccessCheck”/>
<!–抛出异常后通知–>
<aop:after-throwing
pointcut-ref=”dataAccessOperation”
method=”doRecoveryActions”/>
<!–和@AspectJ风格一样,可以从通知体中获取抛出的异常。
使用throwing属性来指定异常的名称,用这个名称来获取异常–>
<aop:after-throwing
pointcut-ref=”dataAccessOperation”
thowing=”dataAccessEx”
method=”doRecoveryActions”/>
<!–后通知–>
<aop:after
pointcut-ref=”dataAccessOperation”
method=”doReleaseLock”/>
<!–Around通知:通知方法的第一个参数的类型必须是 ProceedingJoinPoint 类型–>
<aop:around
pointcut-ref=”businessService”
method=”doBasicProfiling”/>
</aop:aspect>
</aop:config>
</beans>