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 对象不能满足咱们理论须要, 在理论我的项目中咱们能够将数据存储到第三方缓存零碎中.