Spring使用AspectJ风格切面配置,使得Spring的切面配置大大简化,但是AspectJ是另外一个开源项目

切入点表达式的一般形式:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

modifiers-pattern:指访问修饰符,public,private等 ?表示0或1

ret-type-pattern:返回值类型

declaring-type-pattern:指包名和类名

name-pattern:指方法名

param-pattern:参数

throws-pattern:抛出异常


<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="cn.itcast.g_execution"></context:component-scan>

    <!-- dao实例加入容器 -->
    <bean id="userDao" class="com.matrix42.g_execution.UserDao"></bean>

    <!-- 实例化切面类 -->
    <bean id="aop" class="com.matrix42.g_execution.TransactionAop"></bean>

    <!-- Aop相关配置 -->
    <aop:config>
        <!-- 切入点表达式定义 -->

        <!-- 1. 拦截指定的方法(通用)  -->
        <!--<aop:pointcut expression="execution(* cn.itcast.g_execution.UserDao.save(..))" id="pt"/>-->

        <!-- 2. 拦截指定的类下所有的方法 -->
        <!--<aop:pointcut expression="execution(* cn.itcast.g_execution.UserDao.*(..))" id="pt"/>-->

        <!-- 3. 拦截指定包下所有的类的所有方法 -->
        <!--<aop:pointcut expression="execution(* cn.itcast.g_execution.*.*(..))" id="pt"/>-->

        <!-- 3. 拦截指定包,以及其子包下所有类的所有方法 -->
        <!--<aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/>-->

        <!-- 5. 拦截所有的public方法 -->
        <!--<aop:pointcut expression="execution(public * *(..))" id="pt"/>-->

        <!-- 6. 拦截所有的包含save方法 -->
        <!--<aop:pointcut expression="execution(* *save*(..))" id="pt"/>-->

        <!-- 7. 拦截UserDao.save()方法与OrderDao.save() -->
        <!--<aop:pointcut expression="execution(* cn..UserDao.save(..)) || execution(* cn..OrderDao.save(..))" id="pt"/>-->
        <!--<aop:pointcut expression="execution(* cn..UserDao.save(..)) or execution(* cn..OrderDao.save(..))" id="pt"/>-->

        <!-- 8. 不拦截UserDao.save()方法 -->
        <!--<aop:pointcut expression="!execution(* cn..UserDao.save(..))" id="pt"/>-->
        <!--<aop:pointcut expression=" not execution(* cn..UserDao.save(..))" id="pt"/>-->

        <!-- 9. 拦截UserDao.save()同时拦截OrderDao.save() -->
        <!-- 注意: 这种很少用,一般都是或者的关系即: || 、 or  -->
        <!--<aop:pointcut expression="execution(* cn..UserDao.save(..)) and execution(* cn..OrderDao.save(..))" id="pt"/>-->
        <aop:pointcut expression="execution(* cn..UserDao.save(..)) &amp;&amp; execution(* cn..OrderDao.save(..))" id="pt"/>

        <!-- 切面配置 -->
        <aop:aspect ref="aop">
            <aop:around method="arroud" pointcut-ref="pt"/>
        </aop:aspect>
    </aop:config>

</beans>