乐趣区

关于aop:aop理解

Aop 了解

什么是 Aop?

Aop 是 spring 框架提供的切面编程, 次要作用与在不批改原有业务的时候扩大新的业务. 升高程序的耦合度, 加强程序的开发效率. 代码失去重用性.

Aop 如何实现

Aop 实现次要有两种形式

配置中如果没有配置那么默认应用的是 cglib
1.jdk 自代的动静代理. 为指标对象创立代理对象
2.cglib 代理机制, 为指标创立代理对象

什么是 OCP 准则(开闭准则)?

ocp 开闭准则是对业务批改敞开, 对业务扩大开发

AOP 相干术语剖析

@Async 进行异步操作 spring 框架会在底层创立一个新的线程池, 被 @Async 润饰的办法会又线程池调配的一个线程来进行调用.
@Order 设置优先级, 设置数字优先级越高优先级也就越高

五大告诉

@Advice 告诉. 在切面的某一个链接点进行告诉操作例如:
1.@befor: 第二程序执行不论失 前置告诉
2.@Around: 优先级最高 盘绕告诉
3.@After: 不论程序执行胜利与否当快要执行完时都会先执行 后置告诉
4.@AfterReturning: 程序执行胜利执行 返回告诉
5.@Afterthwing: 程序执行失败执行 异样告诉

四大连接点

@poincut 切面编程的切入点~~~~
1.bean(间接指定保留在 bean 中的对象)粗略的切入点, 该类下所有的办法都能够进行办法的扩大
2.@annotation(指定注解接口的全限定类名), 细腻的切入点, 只有被该注解润饰的办法才会有办法的扩大
3.within 用于匹配包下的所有类中的所有办法
4.execution 用于指定办法~~~~

Spring AOP 事务处理

@Transaction
默认事务回滚
@Transaction(timeout: 时长到时主动回滚事务)

如何获取注解上的值

//1. 获取用户行为日志信息
        // 获取指标对象 (要执行的那个指标业务对象) 类
        Class<?> getcls = jp.getTarget().getClass();
        MethodSignature sim = (MethodSignature) jp.getSignature();// 强转是为了让他获取更多的办法
        Method methods = getcls.getDeclaredMethod(sim.getName(), sim.getParameterTypes());
        System.out.println(methods);
        // 判断是否是 LoginObject 的注解值 
        LoginObject falg = methods.getAnnotation(LoginObject.class);
        String operation="operation";
        if(falg!=null)
            operation = falg.value();

盘绕告诉最为重要, 重点一下

由 @Around 注解形容的办法为一个盘绕告诉办法,咱们能够在此办法外部
         手动调用指标办法(通过连接点对象 ProceedingJoinPoint 的 proceed 办法进行调用)
          盘绕告诉:此盘绕告诉应用的切入点为 bean(sysUserServiceImpl)
          盘绕告诉特点:1)编写:a)办法的返回值为 Object.
      b)办法参数为 ProceedingJoinPoint 类型.
      c)办法抛出异样为 throwable.
           2)利用:a)指标办法执行之前或之后都能够进行性能拓展
      b)绝对于其它告诉优先级最高。@param jp 为一个连贯对象(封装了正在要执行的指标办法信息)
        @return 指标办法的执行后果
      @throws Throwable 

事务 Transaction 的解决

@Transactional(timeout = 30,    // 执行时长到时主动回滚
 readOnly = false,              // 只读事务,*   为了疏忽那些不须要事务的办法,比方读取数据,能够设置 read-only 为 true。isolation = Isolation.READ\_COMMITTED,// 事务的隔离级别, 默认值采纳 DEFAULT.
 rollbackFor = Throwable.class, // 异样回滚事务
 propagation = Propagation.REQUIRED) //Propagation.new 的话为事务的都在新的线程处理事务
 no-rollback- for  抛出 no-rollback-for 指定的异样类型,不回滚事务。

Spring 中事务流传个性

@Transactional(propagation=Propagation.REQUIRED) 
如果没有事务创立新事务, 如果以后有事务参加以后事务, Spring 默认的事务流传行为是 PROPAGATION\_REQUIRED,它适宜于绝大多数的状况
@Transactional(propagation=Propagation.REQUIRES\_NEW)
必须是新事务, 如果有以后事务, 挂起以后事务并且开启新事务

Spring AOP 异步操作实现

1.  @EnableAsync //spring 容器启动时会创立线程池
  @SpringBootApplication
 public class Application {public static void main(String\[\] args) {SpringApplication.run(Application.class, args);
 }
}
2. @在须要异步执行的业务办法上,应用 @Async 办法进行异步申明。即可
##### 
当咱们须要本人对 spring 框架提供的连接池进行一些繁难配置,spring:
 task:
 execution:
 pool:
 queue-capacity: 128    阻塞队列最大期待线程数
 core-size: 5           外围线程数
 max-size: 128          最大线程数
 keep-alive: 60000      当线程闲暇时 60s 后执行线程销毁回收
 thread-name-prefix: db-service-task-      为线程创立名字

Spring AOP 中 Cache 操作实现

1.  @EnableCaching //spring 容器启动时会主动启动 cache 配置缓存
  @SpringBootApplication
 public class Application {public static void main(String\[\] args) {SpringApplication.run(Application.class, args);
 }
}
2. 在须要缓存的办法上配置 @Cacheable(value = "deptCache"),      cache 配置姓名以便前期清理缓存
3. 在须要清理缓存的办法上配置 @CacheEvict(value="deptCache",allEntries=true)
当执行完结的清理缓存,cache 姓名和清理所以缓存配置

在 Spring 中默认 cache 底层实现是一个 Map 对象, 假如此 map 对象不能满足咱们理论须要, 在理论我的项目中咱们能够将数据存储到第三方缓存零碎中.

退出移动版