重难点分析
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实现.?
多个事务并发执行时可能会出现什么问题?(脏读,不可重复读,幻影读)
了解事务的隔离级别吗?知道具体的应用场景吗?