SpringAop重难点分析

重难点分析

AOP 是什么,解决了什么问题,应用场景?

是什么?

AOP:面向切面编程,能够在不改变原有代码的情况下对代码的功能进行增强。

解决了什么问题?

AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。
能够解决代码的臃肿问题,提高代码的可维护性

应用场景?

主要应用于:日志记录,事务控制,性能统计,安全控制,异常处理等。

AOP 编程基本步骤及实现过程(以基于AspectJ框架实现为例)。

1.添加依赖


       org.springframework.boot
       spring-boot-starter-aop

2.创建日志切面类对象(以日志为例)

package com.cy.pj.common.aspect;
@Aspect//表示此类对象为一个切面
@Slf4j
@Component//将此类交给spring管理
public class SysLogAspect {
         @Pointcut("bean(sysUserServiceImpl)")//切入点
         public void logPointCut() {}
         @Around("logPointCut()")//环绕通知,表示此方法在核心业务执行之前和之后执行
         public Object around(ProceedingJoinPoint jp)
         throws Throwable{
                 try {
                   log.info("start:{}"+System.currentTimeMillis());
                   Object result=jp.proceed();//最终会调用目标方法
                   log.info("after:{}"+System.currentTimeMillis());
                   return result;
                 }catch(Throwable e) {
                   log.error("after:{}",e.getMessage());
                   throw e;
                 }
         }
}

3.测试

@SpringBootTest
public class AopTests {
         @Autowired
         private SysUserService userService;
         @Test
         public void testSysUserService() {   PageObjectpo=userService.findPageObjects("admin",1);
          System.out.println("rowCount:"+po.getRowCount());
         }
}

AOP 编程中的核心对象及应用关系。

Aspect:切面,由一系列切点、增强和引入组成的模块对象,可定义优先级,从而影响增强和引入的执行顺序。事务管理(Transaction management)在java企业应用中就是一个很好的切面样例。

Join point:接入点,程序执行期的一个点,例如方法执行、类初始化、异常处理。 在Spring AOP中,接入点始终表示方法执行。

Advice:增强,切面在特定接入点的执行动作,包括 “around,” “before” and "after"等多种类型。包含Spring在内的许多AOP框架,通常会使用拦截器来实现增强,围绕着接入点维护着一个拦截器链。

Pointcut:切点,用来匹配特定接入点的谓词(表达式),增强将会与切点表达式产生关联,并运行在任何切点匹配到的接入点上。通过切点表达式匹配接入点是AOP的核心,Spring默认使用AspectJ的切点表达式。

Introduction:引入,为某个type声明额外的方法和字段。Spring AOP允许你引入任何接口以及它的默认实现到被增强对象上。
Target object:目标对象,被一个或多个切面增强的对象。也叫作被增强对象。既然Spring AOP使用运行时代理(runtime proxies),那么目标对象就总是代理对象。

AOP proxy:AOP代理,为了实现切面功能一个对象会被AOP框架创建出来。在Spring框架中AOP代理的默认方式是:有接口,就使用基于接口的JDK动态代理,否则使用基于类的CGLIB动态代理。但是我们可以通过设置proxy-target-class="true",完全使用CGLIB动态代理。

Weaving:织入,将一个或多个切面与类或对象链接在一起创建一个被增强对象。织入能发生在编译时 (compile time )(使用AspectJ编译器),加载时(load time),或运行时(runtime) 。Spring AOP默认就是运行时织入,可以通过枚举AdviceMode来设置。

AOP 思想在Spring中的实现原理分析。
AOP 编程中基于注解方式的配置实现。(@Aspect,@PointCut,@Around,...)
AOP 编程中基于注解方式的事务控制。(@Transactional)
AOP 编程中异步操作的实现?(@EnableAsync,@Async)
AOP 编程中的缓存应用?(@EnableCaching,@Cacheable,@CacheEvict)

FAQ分析

什么是OCP原则(开闭原则)?
什么是DIP原则 (依赖倒置)?
什么是单一职责原则(SRP)?
Spring 中AOP的有哪些配置方式?(XML,注解)
Spring 中AOP 的通知有哪些基本类型?(5种)
Spring 中AOP是如何为Bean对象创建代理对象的?(JDK,CGLIB)
Spring 中AOP切面的执行顺序如何指定?(@Order)
Spring 单体架构项目中事务的控制要通过Connection对象实现,?
Spring 如何保证一个线程一个Connection对象?借助ThreadLocal实现.?
多个事务并发执行时可能会出现什么问题?(脏读,不可重复读,幻影读)
了解事务的隔离级别吗?知道具体的应用场景吗?

你可能感兴趣的