XML配置AOP
1、切点表达式
语法:
execution([修饰符]返回值类型 包名.类名.方法名(参数名))
访问修饰符可以省略.
返回值类型、包名、类名、方法名可以使用星号*代表任意.
包名与类名之间一个点:代表当前包下的类,两个点…表示当前包及其子包下的类.
参数列表可以使用两个点…表示任意个数,任意类型的参数列表.
例子:
> execution(public void com.cy.aop.Target.method())
> execution(void com.cy.aop.Target.*(..))
> execution(* com.cy.aop.*.*(..))
> execution(* com.cy.aop..*.*(..))
> execution(* *..*.*(..))
测试![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ecf0e50bbe829cc47806394f30ccbfd1.png)
2、通知类型
语法:
<aop:通知类型 method= “切面类中方法名” pointcut= “切点表达式”></aop:通知类型>
名称 | 标签 | 说明 |
---|---|---|
前置通知 | aop:before | 用于配置前置通知。指定增强的方法在切入点方法之前执行 |
后置通知 | aop:after-returning | 用于配置后的通知。指定增强的方法在切入点方法之后执行 |
环绕通知 | aop:around | 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行 |
异常抛出通知 | aop:throwing | 用于配置异常抛出通知。指定增强的方法在出现异常时执行 |
最终通知 | aop:after | 用于配置最终通知。无论增强方式执行是否有异常都会执行 |
aop配置文件(resource–>xml文件)
anno.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.cy.anno"/>
<!-- aop自动代理 -->
<aop:aspectj-autoproxy/>
</beans>
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- 目标对象 -->
<bean id="target" class="com.cy.aop.Target"></bean>
<!-- 切面对象 -->
<bean id="myAspect" class="com.cy.aop.MyAspect"></bean>
<!-- 配置织入:告诉spring框架 哪些方法(切点)需要进行哪些增强(前置、后置...) -->
<aop:config>
<!-- 声明切面 -->
<aop:aspect ref="myAspect">
<!-- 抽取切点表达式 -->
<aop:pointcut id="myPointcut" expression="execution(* com.cy.aop.*.*())"/>
<!-- 切面:切点+通知 -->
<!-- <aop:before method="before" pointcut="execution(public void com.cy.aop.Target.save())"></aop:before>-->
<!-- <aop:before method="before" pointcut="execution(* com.cy.aop.*.*(..))"/>-->
<!-- <aop:after-returning method="afterReturning" pointcut="execution(* com.cy.aop.*.*(..))"/>-->
<!-- <aop:around method="around" pointcut="execution(* com.cy.aop.*.*(..))"/>-->
<!-- <aop:after-throwing method="afterThrowing" pointcut="execution(* com.cy.aop.*.*(..))"/>-->
<!-- <aop:after method="after" pointcut="execution(* com.cy.aop.*.*(..))"/>-->
<aop:around method="around" pointcut-ref="myPointcut"/>
<aop:after method="after" pointcut-ref="myPointcut"/>
</aop:aspect>
</aop:config>
</beans>