spring 复习

1# Spring复习

1.了解Spirng

spirng->spring mvc ->spring boot ->spring cloud

![48b2da9ced4cd0074a9fdd4f7c0a4318](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\48b2da9ced4cd0074a9fdd4f7c0a4318.png)

层层递进--

![3a684778fcbcadf529eaad2b4e9ca34d](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\3a684778fcbcadf529eaad2b4e9ca34d.png)

2.IOC -Di 了解

由分层解耦引出的依赖注入 以及依赖反转

![ab5ce66c757c262b95bdbeb4ec1862ad](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\ab5ce66c757c262b95bdbeb4ec1862ad.png)

如图 ->当我们想更改对象name->时 改动过大->

Ioc->控制反转
使用对象--由主动new-改为外部提供对象->对象控制器转移到外部

spring提供容器->ioc容器 ->提供了对象存储

依赖注入

![1f0310fa78da12366d47e8d7844a002a](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\1f0310fa78da12366d47e8d7844a002a.png)

IOC->容器管理Bean

DI->将具有依赖关系的Bean进行关系绑定

3.加入IOC 容器![ed3173cdd0c9bc6ba6d44953a8c38e0a](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\ed3173cdd0c9bc6ba6d44953a8c38e0a.png)

1.配置Bean

![19c1fd155ec41e2182592cffc5262d96](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\19c1fd155ec41e2182592cffc5262d96.png)

2.获取Bean

![506c12b2db4dd7aca712594fa5e279fa](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\506c12b2db4dd7aca712594fa5e279fa.png)

当我们配置bean的时候--容器内就保存了我们的对象地址->单例->谁需要就给予

2.依赖注入

![838a65e2572d2c5fafc8c03d3a3ffd44](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\838a65e2572d2c5fafc8c03d3a3ffd44.png)

![dace05b9aa02d6ab02fd488a060b202e](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\dace05b9aa02d6ab02fd488a060b202e.png)

![eed54b5a29e21c9568ee7b195168d180](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\eed54b5a29e21c9568ee7b195168d180.png)

set容器执行->最后还是容器将Bean给予了

spring->编译 --自动找set 依赖方法注入

4.Bean配置

![2a1a6f9cec7eca02be1d7807228f64ae](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\2a1a6f9cec7eca02be1d7807228f64ae.png)

![316948bfd792a80f844396040f862c94](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\316948bfd792a80f844396040f862c94.png)

![8f41e07fcd21e2e60e49873e445f8656](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\8f41e07fcd21e2e60e49873e445f8656.png)

spring->默认的Bean是单例的

如果需要多例 就需要修改配置

![20bd78b82f85ef5660348295b0f97bf6](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\20bd78b82f85ef5660348295b0f97bf6.png)

为什么bean要单例--
开对象->耗费内存

由于是单例->需要改变的数据就不能加入spring管理->除非开多例

5.Bean实例化

1.无参构造

![2509eb7c62e476183b724c53e7881f29](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\2509eb7c62e476183b724c53e7881f29.png)

给接口内->一个构造->通过xml解析出 需要构造的对象->通过反射 ->创建出对象返回->默认单例

通过类名动态加载类的方法

在使用 Class.forName() 方法时,情况会根据加载的类是否已存在而有所不同:

  1. 类已存在
    • 如果使用 Class.forName() 加载的类在类路径中已经存在,则会返回对应的 Class 对象,而不会创建新的对象。这意味着它只是获取已加载类的引用,不会触发类的初始化和实例化。
  2. 类不存在
    • 如果要加载的类在类路径中不存在,则会抛出 ClassNotFoundException 异常,而不会创建新的类对象。在这种情况下,不会创建新的类对象,因为类根本就没有被加载到内存中
2.工厂模式

工厂模式 ->由一个类中的静态方法->返回对象的引用

![b39cbdcfb32cefef12c5dc795734b37a](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\b39cbdcfb32cefef12c5dc795734b37a.png)

![6e30ea94078f8a8c486fbce0d8641f84](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\6e30ea94078f8a8c486fbce0d8641f84.png)

![9cbd0159352e46e3bde7a755d81d982c](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\9cbd0159352e46e3bde7a755d81d982c.png)

3.实例工厂-

1.实例工厂-需要指定Bean![685ed5127a7397e3d796dafbac96c3e4](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\685ed5127a7397e3d796dafbac96c3e4.jpeg)

2.FactoryBean

![dd082cfbea4d7e4b13aa31843b6f35c3](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\dd082cfbea4d7e4b13aa31843b6f35c3.jpeg)

指定类-扫描

6.Bean生命周期

1.生命周期配置

1.配置法

![3f411aabb27ce975d2121258bbe3d082](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\3f411aabb27ce975d2121258bbe3d082.jpeg)

2.接口法

![a1a7897db2e6c6a81a71ae18c1629103](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\a1a7897db2e6c6a81a71ae18c1629103.jpg)

![0b42710ae7bb291a8a7f65ac715b86bc](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\0b42710ae7bb291a8a7f65ac715b86bc.png)

2.bean销毁时间

为了体现生命周期->我们提前销毁bean

![87ed0bfac3a4d77291ac594173873a77](G:\360MoveData\Users\nixg\Documents\Tencent Files\2583181473\nt_qq\nt_data\Pic\2024-03\Ori\87ed0bfac3a4d77291ac594173873a77.jpeg)

7.依赖注入

1.了解依赖注入

有Bean关系的类进行自动注入 ---向类传递数据方式-set 传递 --构造传参


参数--引用类型和简单类型

2.引用注入 setter注入

引用注入

![9d6739467f9eff7922717646b9f7dfc8](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\9d6739467f9eff7922717646b9f7dfc8.jpeg)

3.构造器注入

![2ac8de3631e734a2817de72f0e21076e](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\2ac8de3631e734a2817de72f0e21076e.jpeg)

![906d5345ed81c62f2ca79c2c87182043](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\906d5345ed81c62f2ca79c2c87182043.jpeg)

![37aa8dfa1862573eb20ad4710135f7a0](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\37aa8dfa1862573eb20ad4710135f7a0.jpeg)

4.依赖注入方式选择

![d7f4076b8a85df6389a465186386ba9f](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\d7f4076b8a85df6389a465186386ba9f.jpeg)

5.依赖自动装配

IOC容器根据bean所依赖的资源在容器中自动查找并注入到bena的过程称为自动装配

1.按类型

2.按名称

3.按构造方法

4.不启用自动装配

![d604dff0d944968b0f83ef5e0ed9148f](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\d604dff0d944968b0f83ef5e0ed9148f.png)

更改自动装配为按照类型

比如bookServcice依赖BookDao--我们不需要描述其关系 程序会自动根据名字找到对应类的bean

8.集合注入

1.数组

![6956e79faab9804acbd6a47b860b0245](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\6956e79faab9804acbd6a47b860b0245.png)

2.list

![43ed876a380305fa263d981c7a984c74](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\43ed876a380305fa263d981c7a984c74.png)

3.Set
<p>
<set>

</set>
</p>
4.Map

![ca7bbcd65d882884d7297dd75609d006](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\ca7bbcd65d882884d7297dd75609d006.png)

5.Properties

![2fac8b9f2d57b4c92547d6a8235169a4](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\2fac8b9f2d57b4c92547d6a8235169a4.png)

9.案例分析-bean注入

我们要拿到druid的连接

1.配置bean -注入参数

![00252469c47ede33f309cf222de6d27a](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\00252469c47ede33f309cf222de6d27a.png)

我们就可以进行拿取

Set注入--进行注入传普通参数

10.加载properties文件

![3259185201691e092710f1c19ad74f73](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\3259185201691e092710f1c19ad74f73.png)

加载模式

![e482c7cd8837d44f0b1684ae235838c7](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\e482c7cd8837d44f0b1684ae235838c7.png)

11.容器

1.容器的创建

![88afb0e3109da0ceb049ce45b2ea81dd](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\88afb0e3109da0ceb049ce45b2ea81dd.png)

2.bean获取

![6441e65ec06a343800d7d118ec915bf7](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\6441e65ec06a343800d7d118ec915bf7.png)

3.容器接口分析

![8d310da378a35e1bc86067389adf5c3b](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\8d310da378a35e1bc86067389adf5c3b.png)

4.BeanFactory初始化

![ccb6cf9576f42e82a4190ea129f29b18](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\ccb6cf9576f42e82a4190ea129f29b18.png)

IOC DI Bean总结

![aec185bb8dc978e09e302c6e168d677e](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\aec185bb8dc978e09e302c6e168d677e.jpeg)

![18abb534418dab1c205c287cd041975f](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\18abb534418dab1c205c287cd041975f.jpeg)

------------------------------------------------------------------------------------

12.注解

1.@声明为Bean

将一个类声明为Bean

![86b345941eab120771d71166dbf2beb3](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\86b345941eab120771d71166dbf2beb3.png)

为了适配MVC->故此还有 @Controller @Service @Repository

2.纯注解配置

![547c0427ec597688cc1c0ec42b75f8a2](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\547c0427ec597688cc1c0ec42b75f8a2.png)

![8e5159d69c7dd85c33f019d20ac3be99](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\8e5159d69c7dd85c33f019d20ac3be99.png)

3.依赖注入

![ede5cccd6b754d10bd7e5d2dfb4db131](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\ede5cccd6b754d10bd7e5d2dfb4db131.png)

![f4d394d6384f8e1211f0b8775862a884](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\f4d394d6384f8e1211f0b8775862a884.png)

简单类型注入

![2cde566b050a6d34fbe85be5502e6c50](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\2cde566b050a6d34fbe85be5502e6c50.png)

4.加载properties文件

![73301e328b26e40279005a10ac179d9b](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\73301e328b26e40279005a10ac179d9b.png)

![22a1fbb70d0306860f7d4ce5107158b5](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\22a1fbb70d0306860f7d4ce5107158b5.png)

5.第三方bean管理例子

1.注册为bean

![b515a9216fdb4b0cf13229af949a5107](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\b515a9216fdb4b0cf13229af949a5107.png)

2.加入管理-导入式

![26e0669596d4e65ef8badc876869a654](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\26e0669596d4e65ef8badc876869a654.png)

扫描式

![f1c3b59e56b859a8a04b94fa9cc65876](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\f1c3b59e56b859a8a04b94fa9cc65876.png)

简单依赖注入

image-20240330164305805

---连接池配置

![2f09511581cde24e3c7dfcb783c3dc4c](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\2f09511581cde24e3c7dfcb783c3dc4c.png)

XML与注解 配置区别

![b4f6fbbd9134d7813d17dec19a77cd8c](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\b4f6fbbd9134d7813d17dec19a77cd8c.jpeg)

13.aop

1.Aop基础
1.原理

AOP的原理主要是通过使用代理对象来实现,在Spring中,AOP通过代理对象包装目标对象(被代理的对象),在代理对象中插入切面(aspect),实现对目标对象方法的增强。Spring AOP主要采用动态代理技术来实现AOP,其中包括JDK动态代理和CGLIB动态代理两种方式。


再框架中添加了个拦截器->依据正则过滤

2.场景
  1. 日志记录:记录方法的调用、参数、返回值等信息。
  2. 事务管理:管理事务的开始、提交、回滚等操作。
  3. 安全性:实现权限控制、加密解密等安全相关功能。
  4. 性能监控:统计方法的执行时间、次数等性能指标。
3.连接点 切面 切入点 通知

切面 @Aspect

定义一个类为切面类 -通知和切入点

@Aspect注解标识一个类为切面类,Spring会在扫描到这个注解的类时,自动创建代理对象,并将切面逻辑织入到目标方法中。

通知

@Before和@After

切入点

execution(* Calculator.divide(..))

-谁会被AOP管理


连接点

连接点是代码执行过程中的具体位置,可以被切面(Aspect)拦截并注入相应的增强逻辑。


@Before("execution(* Calculator.add(..))")

通知+切入点

代表了 Calculator类的add方法上执行增强操作

在Spring AOP中,切入点用于定义在哪些连接点上应用通知,连接点则代表实际的程序执行点。通常情况下,切入点通过切入点表达式来指定,而连接点表示实际执行的方法调用或事件发生的地方。

接点是由execution表达式指定的,它表示了切入点的具体位置,允许切面在这些位置执行通知。而切入点则是通过execution表达式来定义的,以确定在哪些连接点上应用通知。

案例代码

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int divide(int a, int b) {
        return a / b;
    }
}
@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* Calculator.add(..))")
    public void logBeforeAdd(JoinPoint joinPoint) {
        System.out.println("Logging before the add method is called");
    }

    @After("execution(* Calculator.divide(..))")
    public void logAfterDivide(JoinPoint joinPoint) {
        System.out.println("Logging after the divide method is called");
    }
}
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.example"/>
2.Aop进阶
1.通知类型
  1. 前置通知(Before Advice):在目标方法执行之前调用通知方法。

    对应注解:@Before

  2. 后置通知(After Returning Advice):在目标方法成功执行之后调用通知方法。

    对应注解:@AfterReturning

  3. 后置异常通知(After Throwing Advice):在目标方法抛出异常后调用通知方法。

     @AfterThrowing
    
  4. 后置通知(After (finally) Advice):无论目标方法是否成功执行,都会调用通知方法。

    @After
    
  5. 环绕通知(Around Advice):在目标方法之前和之后执行通知方法,可以控制目标方法的执行过程。

    对应注解:@Around

  6. 引入通知(Introduction Advice):向现有的对象添加新的方法或属性。

  7. 织入通知(AspectJ Advice):在AOP中指定切点和通知的组合。


案例

  1. 前置通知(Before Advice):在用户进行结账操作时,检查用户的权限,确保用户具有足够的权限进行结账操作。

  2. 后置通知(After Returning Advice):在用户提交订单成功后,记录订单信息到日志中,或者发送确认邮件给用户。

  3. 后置异常通知(After Throwing Advice):如果订单处理过程中出现异常,比如库存不足,就发送通知给相关人员进行处理。

  4. 后置最终通知(After (finally) Advice):无论订单处理成功与否,都需要关闭数据库连接或释放其他资源。

  5. 环绕通知(Around Advice):在处理订单之前和之后记录订单处理时间,以及性能监控等功能。

  6. 引入通知(Introduction Advice):向订单类引入一个新的接口,比如可追踪变更历史的接口。

  7. 织入通知(AspectJ Advice):定义一个切面,将上述的各种通知类型织入到订单处理的流程中。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class LoggingAspect {

@Before("execution(* com.example.service.OrderService.processOrder(..))")
public void beforeProcessOrder() {
    System.out.println("Before processing order...");
}

@AfterReturning(pointcut = "execution(* com.example.service.OrderService.processOrder(..))", returning = "result")
public void afterProcessOrder(Object result) {
    System.out.println("After processing order. Result: " + result);
}

@AfterThrowing(pointcut = "execution(* com.example.service.OrderService.processOrder(..))", throwing = "exception")
public void afterThrowingProcessOrder(Exception exception) {
    System.out.println("Exception thrown during order processing: " + exception.getMessage());
}

@After("execution(* com.example.service.OrderService.processOrder(..))")
public void afterProcessOrderCompletion() {
    System.out.println("After processing order completion...");
}

@Around("execution(* com.example.service.OrderService.processOrder(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    long startTime = System.currentTimeMillis();
    Object result = joinPoint.proceed();
    long endTime = System.currentTimeMillis();
    System.out.println("Order processing time: " + (endTime - startTime) + " milliseconds");
    return result;
}
2.通知顺序

当多个切面匹配到同一个类时,可以按照切入点所在类的字母顺序来决定通知方法的执行顺序

1.类字母

按照匹配到的切入点的类字母决定先后顺讯

1.前置-字母排名靠前的先执行

2.后置-字母排名靠前的后执行

2.@Order

可以使用@Order注解来控制多个通知方法的执行顺序。通过@Order注解可以指定通知方法的执行顺序,数值越小的通知方法优先执行。

具体步骤如下:

  1. 在定义通知方法的类上添加@Component或其他相关注解,使其成为Spring容器中的Bean。
  2. 在通知方法上添加@Order注解,并指定执行顺序的数值,数值越小优先级越高。
@Component
public class MyAspect {

    @Before("execution(* com.example.service.MyService.*(..))")
    @Order(1)
    public void beforeAdvice() {
        // 前置通知的实现
    }

    @AfterReturning("execution(* com.example.service.MyService.*(..))")
    @Order(2)
    public void afterReturningAdvice() {
        // 后置通知的实现
    }
}

目标前-数字小的先执行

目标后-数字小的后执行

3.切入点

1.execution

![b0484d9f1bbe10d4207d84882472bf29](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\b0484d9f1bbe10d4207d84882472bf29.png)

![e0a84ff1d8ccee34eb3876e12a63ef97](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\e0a84ff1d8ccee34eb3876e12a63ef97.png)

![3ce5a2480e7eaf7f880d1624f4013487](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\3ce5a2480e7eaf7f880d1624f4013487.png)

2.@annotation

代码案例

首先,定义一个自定义注解CustomAnnotation

@Target(ElementType.METHOD)
//@Target(ElementType.METHOD):表示该注解可以用于方法上。这意味着CustomAnnotation只能用于方法的声明中,而不能用于其他地方,比如类、字段等。
@Retention(RetentionPolicy.RUNTIME)
///@Retention(RetentionPolicy.RUNTIME):表示该注解在运行时可以被反射读取。这意味着在运行时,我们可以通过Java的反射机制来获取并处理带有CustomAnnotation注解的方法。
public @interface CustomAnnotation {
    String value();
}
这两个元数据的设定确保了CustomAnnotation注解的使用方式和其在程序运行期间的可见性,使其可以被AOP或其他机制所识别并进行相应的处理。

接着,在一个服务类中使用CustomAnnotation注解:

@Service
public class MyService {

    @CustomAnnotation("Custom Annotation Example")
    public void myMethod() {
        // 方法实现
    }
}

@CustomAnnotation("Custom Annotation Example")这个注解中,双引号里面的参数是注解的属性值。在定义自定义注解时,可以为注解定义属性,并在使用注解时为这些属性赋值。

在这个示例中,自定义注解CustomAnnotation定义了一个名为value的属性,因此在使用这个注解时,需要为value属性赋值。双引号中的内容 "Custom Annotation Example" 就是为value属性赋的具体数值。

当在切面类中通过反射获取带有CustomAnnotation注解的方法时,可以通过访问注解的属性值来获取这里传入的参数值,从而实现根据不同的属性值执行不同的逻辑处理。


然后,在切面类中使用@annotation注解匹配带有CustomAnnotation注解的方法:

@Aspect
public class MyAspect {

    @Pointcut("@annotation(customAnnotation)")
    public void annotatedMethod(CustomAnnotation customAnnotation) {}

    @Before("annotatedMethod(customAnnotation)")
    public void beforeAnnotatedMethod(CustomAnnotation customAnnotation) {
        System.out.println("Before advice for method with custom annotation: " + customAnnotation.value());
    }
}

,切面类MyAspect中的beforeAnnotatedMethod方法使用@annotation注解来匹配带有CustomAnnotation注解的方法,并在匹配到的方法执行前执行相应的通知逻辑。

4.连接点

![c9a1881e71612ce58b920331bae4d304](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\c9a1881e71612ce58b920331bae4d304.png)

![6ecb0785b0a6a59af4c08f919aeb6b9e](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\6ecb0785b0a6a59af4c08f919aeb6b9e.png)

14.事务

1.事务入门 -例子

![f397271d03daf69fca019dd3d214f58b](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\f397271d03daf69fca019dd3d214f58b.png)

![e0e85694e0b4dc2dfdf91aae5b7a6319](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\e0e85694e0b4dc2dfdf91aae5b7a6319.png)

1.接口上加入事务--事务会自动加入-

![8e55c6e2a0336160b16f4412dae91b16](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\8e55c6e2a0336160b16f4412dae91b16.png)

--管理事务

![668dd42a6b5cd30221c5282f2cf4c31c](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\668dd42a6b5cd30221c5282f2cf4c31c.png)

![62f4d37d9b29664bf6f653e2a66ce655](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\62f4d37d9b29664bf6f653e2a66ce655.png)

解决方法

![2eba5d537af1486cc6c8d6fbba4bb4fd](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\2eba5d537af1486cc6c8d6fbba4bb4fd.png)

2.事务管理员 事务协调员

例子事务

![342dd9a76057ac1992637973417a63c8](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\342dd9a76057ac1992637973417a63c8.png)

![9b888313da273ab68bfb514f19274a0b](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\9b888313da273ab68bfb514f19274a0b.png)

3.事务配置

![b6f65b886518d3736b235a310f1a6754](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\b6f65b886518d3736b235a310f1a6754.png)

![59d7f8499d23c0a2bcfdb780f1e00ea3](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\59d7f8499d23c0a2bcfdb780f1e00ea3.png)

4.事务加入-规则

![03f05df2aa222c9fb3abd3efb44ef699](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\03f05df2aa222c9fb3abd3efb44ef699.png)

例子

![5dde408db43ac7d09f859c76ed257c91](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\5dde408db43ac7d09f859c76ed257c91.png)

![fba20ae7cf0e8f32ff7aa3de0fb42e42](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\fba20ae7cf0e8f32ff7aa3de0fb42e42.png)

如图-都加入同一事务-一旦有异常-日志也会回滚

![9972f6f167883d144abc515733c62536](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\9972f6f167883d144abc515733c62536.png)

![5f99a409d1ff453639c1d9cc7aa2fcf2](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\5f99a409d1ff453639c1d9cc7aa2fcf2.png)

解决

![cf8e05d7e9f071a8464d78b45eab2ae5](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\cf8e05d7e9f071a8464d78b45eab2ae5.png)

事务传播行为

![fa818038f3cf6f80cf14608cec80c598](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\fa818038f3cf6f80cf14608cec80c598.png)

0.1 Spring 整合mybatis

![11abe4ba3472982e3b1b217edb94c96e](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\11abe4ba3472982e3b1b217edb94c96e.png)

->将该注册为Bean

![e038210f851e6d054f2de5a40605d29c](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\e038210f851e6d054f2de5a40605d29c.png)

![eb16bf7c1655375464b67dcd0194534b](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\eb16bf7c1655375464b67dcd0194534b.png)

如图--以上配置全部进行修改

![241a0676f37e4b12a5eef8cdc8e7fe35](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\241a0676f37e4b12a5eef8cdc8e7fe35.png)

![79a9256b4115e3f74adcb4dfc1db5f30](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\79a9256b4115e3f74adcb4dfc1db5f30.png)

![3ba320445dccb955e30224a3bbee6193](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\3ba320445dccb955e30224a3bbee6193.png)

收纳

![7ff11a9112a3615d298943a68b54e9d6](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\7ff11a9112a3615d298943a68b54e9d6.png)

![55cab2a9fb9c8def31581e7f33474ad0](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\55cab2a9fb9c8def31581e7f33474ad0.png)

0.2 Spring整合测试

设定类运行器

整合spring运行器

![6981732edb98c9b849ff758c5c4053c1](G:\360MoveData\Users\nixg\Documents\Tencent Files\819429207\nt_qq\nt_data\Pic\2024-03\Ori\6981732edb98c9b849ff758c5c4053c1.png)

posted @   逆向狗  阅读(7)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示