spring day03 AOP 面向切面编程

AOP简介和作用

 

 

 AOP核心概念以及工作流程

 

 

首先先将对应的包导入

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
第一步首先先创建对应的通知类 然后在通知类中加入@component 注解来告知这个类要让spring容器识别
第二步写@aspect注解 来告知这是一个AOP类 这里要配合在spring容器中写@EnableAspectJAutoProxy 一起使用这样就可以让spring容器知道这是一个AOP类
第三步在通知类中先定义一个通知用来对在切入点前后执行的操作,也就是增强的共性功能
第四步在通知类中写一个切入点方法 这里用@pointcut注解
第五步用切面将通知和切入点绑定在一起


 

 

 

 

AOP核心概念 目标对象(Target):被代理的对象,也叫原始对象,该对象中的方法没有任何功能增强。 代理对象(Proxy):代理后生成的对象,由Spring帮我们创建代理对象。   这里我们可以理解为AOP帮助我们代理创建一个对象

AOP切入点表达式

 

 

 

 

 

 注意  通配符*代表单个独立任意符号  ..代表的是多个连续任意符号

通常情况下 我们这样书写 : @Pointcut("execution(* com.itheima.service.*Service.*(..))")

这样理解 任意返回值  com包下itheima包下service包下的任意以service结尾的类或者接口下的任意方法 参数任意

AOP通知类型【重点】

1.前置通知(Before):在目标方法被调用之前调用通知功能;
2.后置通知(After):在目标方法完成之后调用通知,此时不会关心方法是否正确执行;
3.返回通知(After-returning ):需在目标方法成功执行之后调用通知;
4.异常通知(After-throwing):在目标方法抛出异常后调用通知;
5.环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

AOP切入点数据获取

注意  环绕通知获取参数的方法是ProccedJointPoint    before 和after是用JointPoint获取

 

 

 

 

 

 

2.2 获取返回值

环绕通知 一定要获取对原始对象的返回值  否则将会形成数据隔离

 

 


Spring事务简介【重点】

Spring事务作用

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败

  • Spring事务作用:在数据层或==业务层==保障一系列的数据库操作同成功同失败

  • 这里使用到的注解有@Transactional   此外还需要在对应的jdbcConfig文件中编写一个bean  
    1. Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合

    2. 注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务

 

 

 

 

 

 事务传播行为:事务协调员对事务管理员所携带事务的处理态度



 

 

 

 

下面我们在写两个案例来巩固一下今天的知识
案例一测量业务层接口万次执行效率
在这个案例中我们锻炼的是对通知类参数的练习
需要的坐标
<dependency>
导入spring坐标
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
导入数据源坐标
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
导入mybatis坐标
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
导入mysql坐标
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
导入 spring整合jdbc坐标
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
导入mybatis整合到spring坐标
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
导入测试坐标
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
导入spring测试坐标
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
导入aop坐标
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>

 

 

 

 

案例二百度网盘密码数据兼容处理
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>

 

 案例三转账业务追加日志 这里就要涉及到事务的回滚   因为如果直接全部回滚那么日志将不会记录消息这里就要用到事务传播行为 如下图

 

 

 

 

 

 

 




posted @ 2022-10-11 20:33  bcdqiejndbiq  阅读(26)  评论(0)    收藏  举报