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

你可能感兴趣的:(aop)