基于XML的Spring AOP配置

pom.xml 坐标引入

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <dependencies>
    <!-- 这里使用测试工具 版本要在4.12+   低版本不够集合spring测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!-- 使用Dbutils工具  对jdbc进行了一些封装  如 queryRunner -->
    <dependency>
      <groupId>commons-dbutils</groupId>
      <artifactId>commons-dbutils</artifactId>
      <version>1.7</version>
    </dependency>
    <!-- mysql 驱动  ,没有这个 mysql数据库旧跑不起来 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <!-- 使用阿里巴巴得druild  德鲁伊  连接池工具 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.14</version>
    </dependency>
    <!-- spring 核心坐标  核心框架 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <!-- 基于子类得动态代理 CGlib -->
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.2.2</version>
    </dependency>
    <dependency>
      <!-- spring 面向切面  面向切面编程 AOP 得核心jar包 坐标  AOP是基于IOC得  IOC控制反转 -->
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.14</version>
    </dependency>
     <!-- spring 测试依赖  替换掉 junit 可以获得spring 容器得测试工具 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.2.RELEASE</version>
      <scope>test</scope>
    </dependency>
       <!--  可以不用每次都获取spring容器 了 
		      @RunWith(SpringJUnit4ClassRunner.class) //替换运行器,能够初始化spring容器
		      @ContextConfiguration("classpath:applicationContext.xml") //加载spring容器
		      public class demoTest {
		          @Autowired  //自动注入实例
		          private UserService userService ;
		          @Test
		          public void test01(){
		              userService.Login();
		          }
		      }
    -->
  </dependencies>

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: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/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--配置spring 得通知  公共代码-->
    <!-- 核心代码 目标   准备开始AOP 面向切面编程 -->
    <bean id="target" class="com.itheima.springgao.demo01.UserServiceImpl"/>
    <!--  Advice  通知类 公共代码   -->
    <bean id="logger" class="com.itheima.springgao.demo01.Logger" />
    <!-- spring  得 Aop 面向切面编程得配置   -->
    <!-- 首先引入 新得命名空间  aop:config  此处编译器 会自动帮我们引入 aop:config 得命名空间 -->
    <aop:config >
        <!--我们得aop 得配置需要写在这里面   -->
        <!-- 一,配置切入点(切入点为连接点中得一个 方法称之为连接点)  切入点表达式 spring厉害得地方
        配置中 id  为自己起名    expression  中为表达式   可以使用通配符
        expression =" execution( 返回值  路径.方法名())"-->
        <aop:pointcut id="loginPt" expression="execution(void com.itheima.springgao.demo01.UserServiceImpl.Login())" />
        <!--  配置通知 (切面)  使用通知类得哪个方法  在切点得什么位置执行
            id 为自己起名  ref指定advice  公用对象 (用得谁 ,来自哪里 使用id 获取)
        -->
        <aop:aspect id="loggerAdvice" ref="logger">
            <!--在切入点 之前执行 before在目标类方法执行前切入  method 切入得方法名
            poincur-ref 切入点是哪个   配置哪个对象为切入点 -->
            <aop:before method="LoggerPrint" pointcut-ref="loginPt"/>

        </aop:aspect>
    </aop:config>
    <!--
        *  任意个 多个字符
        .  一级包
        .. 多级包  本级和子级包

        任意返回值类型  com.itheima.springgao.demo01 包下得所有类 得所有方法  不记参数个数
       <aop:pointcut id="loginPt" expression="execution(* com.itheima.springgao.demo01.*.*(..))" />

        通知得4总类型
        1.前置通知  方法前   before          放在切入点方法执行前 执行
             <aop:before method="LoggerPrint" pointcut-ref="loginPt"/>
        2.后置通知  方法后   afterRetuning   放在切入点方法执行后 执行
            <aop:after-returning method="LoggerPrint" pointcut-ref="loginPt"/>
        3.异常通知  类似catch中    afterThrowing   放在抓取异常代码中,异常产生了才会执行 与afterRetuning 互斥  (二者只能存在其一)
             <aop:after-throwing method="LoggerPrint" pointcut-ref="loginPt"/>
        4.最终通知  类似finally    after           终会执行
            <aop:after method="LoggerPrint" pointcut-ref="loginPt"/>
        另类
        环绕通知  :  around  spring 提供得一种自用控制通知代码得出现得编程方式
            <aop:around method="around" pointcut-ref="loginPt"/>
					
    -->
</beans>

环绕通知


//在切点类中书写
//ProceedingJoinPoint 当前正在执行得切入点对象 ,封装了目标对象得对应方法
    public void around(ProceedingJoinPoint point) {
        try{
            System.out.println("前面");
            point.proceed();//调用目标对象的原始方法
            System.out.println("返回前");
        }catch (Throwable e){  //这里 异常比较大  请使用Throwable
            System.out.println("出错了");
        }finally {
            System.out.println("最终");
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扶摇的星河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值