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对象不能满足我们实际需要,在实际项目中我们可以将数据存储到第三方缓存系统中.