Java_Spring:10. 基于注解的 AOP 配置

news/2024/11/24 11:33:51/

目录

1 环境搭建

1.1 第一步:准备必要的代码和 jar 包

1.2 第二步:在配置文件中导入 context 的名称空间

1.3 第三步:把资源使用注解配置

1.4 第四步:在配置文件中指定 spring 要扫描的包

2 配置步骤

2.1 第一步:把通知类也使用注解配置

2.2 第二步:在通知类上使用@Aspect 注解声明为切面

2.3 第三步:在增强的方法上使用注解配置通知

2.3.1 @Before

2.3.2 @AfterReturning

2.3.3 @AfterThrowing

2.3.4 @After

2.4 第四步:在 spring 配置文件中开启 spring 对注解 AOP 的支持

3 环绕通知注解配置 @Around

4 切入点表达式注解 @Pointcut

5 不使用 XML 的配置方式


  • 1 环境搭建

    • 1.1 第一步:准备必要的代码和 jar 包

      • 拷贝上一小节的工程即可。
    • 1.2 第二步:在配置文件中导入 context 的名称空间

      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置数据库操作对象 --><bean id="dbAssit" class="com.itheima.dbassit.DBAssit"><property name="dataSource" ref="dataSource"></property><!-- 指定 connection 和线程绑定 --><property name="useCurrentConnection" value="true"></property></bean><!-- 配置数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property><property name="user" value="root"></property><property name="password" value="1234"></property></bean>
        </beans>
    • 1.3 第三步:把资源使用注解配置

      • 账户的业务层实现类
      • @Service("accountService")
        public class AccountServiceImpl implements IAccountService {@Autowiredprivate IAccountDao accountDao;
        }

      • 账户的持久层实现类
      • @Repository("accountDao")
        public class AccountDaoImpl implements IAccountDao {@Autowiredprivate DBAssit dbAssit ;
        }
    • 1.4 第四步:在配置文件中指定 spring 要扫描的包

      • <!-- 告知 spring,在创建容器时要扫描的包 -->
        <context:component-scan base-package="com.itheima"></context:component-scan>
  • 2 配置步骤

    • 2.1 第一步:把通知类也使用注解配置

      • 事务控制类
      • @Component("txManager")
        public class TransactionManager {//定义一个 DBAssit@Autowiredprivate DBAssit dbAssit ;
        }
    • 2.2 第二步:在通知类上使用@Aspect 注解声明为切面

      • 作用:
        • 把当前类声明为切面类。
      • 事务控制类
      • @Component("txManager")
        @Aspect//表明当前类是一个切面类
        public class TransactionManager {//定义一个 DBAssit@Autowiredprivate DBAssit dbAssit ;
        }
    • 2.3 第三步:在增强的方法上使用注解配置通知

      • 2.3.1 @Before

        • 作用:
          • 把当前方法看成是前置通知。
        • 属性:
          • value:用于指定切入点表达式,还可以指定切入点表达式的引用。
        • //开启事务
          @Before("execution(* com.itheima.service.impl.*.*(..))")
          public void beginTransaction() {try {dbAssit.getCurrentConnection().setAutoCommit(false);} catch (SQLException e) {e.printStackTrace();}
          }
      • 2.3.2 @AfterReturning

        • 作用:
          • 把当前方法看成是后置通知。
        • 属性:
          • value:用于指定切入点表达式,还可以指定切入点表达式的引用
        • //提交事务
          @AfterReturning("execution(* com.itheima.service.impl.*.*(..))")
          public void commit() {try {dbAssit.getCurrentConnection().commit();} catch (SQLException e) {e.printStackTrace();}
          }
      • 2.3.3 @AfterThrowing

        • 作用:
          • 把当前方法看成是异常通知。
        • 属性:
          • value:用于指定切入点表达式,还可以指定切入点表达式的引用
        • //回滚事务
          @AfterThrowing("execution(* com.itheima.service.impl.*.*(..))")
          public void rollback() {try {dbAssit.getCurrentConnection().rollback();} catch (SQLException e) {e.printStackTrace();}
          }
      • 2.3.4 @After

        • 作用:
          • 把当前方法看成是最终通知。
        • 属性:
          • value:用于指定切入点表达式,还可以指定切入点表达式的引用
        • //释放资源
          @After("execution(* com.itheima.service.impl.*.*(..))")
          public void release() {try {dbAssit.releaseConnection();} catch (Exception e) {e.printStackTrace();}
          }
    • 2.4 第四步:在 spring 配置文件中开启 spring 对注解 AOP 的支持

      • <!-- 开启 spring 对注解 AOP 的支持 -->
        <aop:aspectj-autoproxy/>
  • 3 环绕通知注解配置 @Around

    • 作用:
      • 把当前方法看成是环绕通知。
    • 属性:
      • value:用于指定切入点表达式,还可以指定切入点表达式的引用。
    • /**
      * 环绕通知
      * @param pjp
      * @return
      */
      @Around("execution(* com.itheima.service.impl.*.*(..))")
      public Object transactionAround(ProceedingJoinPoint pjp) {//定义返回值Object rtValue = null;try {//获取方法执行所需的参数Object[] args = pjp.getArgs();//前置通知:开启事务beginTransaction();//执行方法rtValue = pjp.proceed(args);//后置通知:提交事务commit();}catch(Throwable e) {//异常通知:回滚事务rollback();e.printStackTrace();}finally {//最终通知:释放资源release();}return rtValue;
      }
  • 4 切入点表达式注解 @Pointcut

    • 作用:
      • 指定切入点表达式
    • 属性:
      • value:指定表达式的内容
    • @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
      private void pt1() {}/*** 引用方式:* 环绕通知* @param pjp* @return*/@Around("pt1()")//注意:千万别忘了写括号public Object transactionAround(ProceedingJoinPoint pjp) {//定义返回值Object rtValue = null;try {//获取方法执行所需的参数Object[] args = pjp.getArgs();//前置通知:开启事务beginTransaction();//执行方法rtValue = pjp.proceed(args);//后置通知:提交事务commit();}catch(Throwable e) {//异常通知:回滚事务rollback();e.printStackTrace();}finally {//最终通知:释放资源release();}return rtValue;
      }
  • 5 不使用 XML 的配置方式

    • @Configuration
      @ComponentScan(basePackages="com.itheima")
      @EnableAspectJAutoProxy
      public class SpringConfiguration {}

http://www.ppmy.cn/news/37891.html

相关文章

iOS 文本二维码识别

在 WWDC 2022&#xff0c;苹果发布了VisionKit 中的 DataScannerViewController&#xff0c;这是一个可以在本地无网络状态下识别文本以及条形码的视图控制器&#xff0c;它的相应速度以及精度都是比较高的&#xff0c;他可以支持汉语&#xff08;简繁版均支持&#xff09;、英…

城市新型智慧能源体系建设的初步解决方案

为加快推进国家“双碳”战略和新型能源体系建设&#xff0c;努力实现负荷控制和用户精细化管理&#xff0c;按照“政府主导、电网组织、政企协同、用户实施”的指导原则&#xff0c;多地成立市/县级电力负荷管理中心&#xff0c;包括浙江宁波、慈溪、辽宁大连、湖南株洲、娄底、…

JDBC---查询所有学生信息的页面运行后报错:

原代码&#xff1a; <% page import"java.sql.Connection" %> <% page import"java.sql.DriverManager" %> <% page import"java.sql.PreparedStatement" %> <% page import"java.sql.ResultSet" %><%--C…

Python 自动化指南(繁琐工作自动化)第二版:零、前言

关于作者 Al Sweigart 是一名软件开发人员和技术书籍作者。Python 是他最喜欢的编程语言&#xff0c;他是该语言的几个开源模块的开发者。他的其他书籍可以在他的网站上根据知识共享许可免费获得。他的猫现在重 11 磅。 关于技术评审 Philip James 从事 Python 工作已经超过…

【Go基础】一篇文章带你全面了解学习—切片

目录 1、切片注意点 2、声明切片 3、切片初始化 4、切片的内存布局

P5717 【深基3.习8】三角形分类

题目描述 给出三条线段 a,b,ca,b,c 的长度&#xff0c;均是不大于 1000010000 的正整数。打算把这三条线段拼成一个三角形&#xff0c;它可以是什么三角形呢&#xff1f; 如果三条线段不能组成一个三角形&#xff0c;输出Not triangle&#xff1b;如果是直角三角形&#xff0c;…

[Java]SpringBoot配置参数

偶尔忘记怎么获取配置的参数&#xff0c;备忘一下。 Spring Boot会自动识别正确的配置文件&#xff08;.properties或.yml&#xff09;并加载其中的属性。 例如&#xff1a;application.properties与application.yml读取机制为 Environment &#xff0c;它将配置抽象为Propert…

Java摘要算法学习日记

Java摘要算法学习日记摘要的作用MD家族的摘要算法sha(安全散列算法)MAC(含有秘钥的散列函数算法)摘要的作用 摘要的作用主要是验证数据的完整性 举个例子: 我们去apche下载jar包时网页上有个sha512的链接&#xff0c;点击后会看到一串sha512摘要值 b6d517db15aedc424d112b8f3…