为什么应用 AOP?
问题 1: 将缓存的代码间接写到业务中, 只对某个业务无效, 如果其余业务也须要缓存, 则须要反复编辑…
问题 2: 如果将缓存代码间接写死在业务层, 如果前期代码须要更新时, 代码的耦合性高. 不便于扩大…
解决方案: 应用 AOP 形式实现…
名称: 面向切面编程.
核心作用: 在不扭转原有代码的条件下 对办法进行性能扩大.
AOP 结构因素 = 切入点表达式 + 告诉办法.
spring 中的两大外围机制:
1:管制反转(IOC)+ 依赖注入(DI)
管制反转:将对象创立的势力交给容器,由容器管制对象的生命周期
注入形式一:通过 bean 的 id 进行注入。bean:被 spring 容器治理的对象称之为 bean。bean 的 id 为类名首小字母小写。(@Autowired+@Qualifier(“itemCatServiceImpl”))应用注解 @Qualifier
注入形式二:通过类型注入。spring 规定个别的接口都是单实现
2:AOP
常见切入点表达式
名称解释: 被 Spring 容器治理的对象称之为 bean.
1). bean(“bean 的 Id”) 个别类名首字母小写 依照某个类匹配
2). within(“包名. 类名”) 依照指定的类目录(多个类) 上述 2 个操作粒度较粗 按类匹配
3). execution(返回值类型 包名. 类名. 办法名(参数列表…)) 管制办法参数级别 粒度较细
4). annotation(“包名. 注解名”) 依照特定的注解进行拦挡. 支流语法
告诉办法
1)before 指标办法执行前执行
2)afterReturnoing 指标办法执行之后执行
3)afterThrowing 指标办法抛出异样时执行
4)after 程序最初执行
上述四大告诉类型 个别用来记录程序的执行的状态, 为监控零碎提供数据的反对的 . 只能监控不能解决.
5)around 指标办法执行前后都要执行
盘绕告诉是 5 大告诉中性能最为弱小的. 能够控制目标办法是否执行.(管制业务是否操作).
@Component // 交给 Spring 容器治理
@Aspect // 标识 AOP 切面类
public class RedisAOP {
//1. 定义切入点表达式 粗粒度(类)细粒度(办法)@Pointcut("bean(itemCatServiceImpl)")
public void pointCut(){}
//joinPoint 连接点
@Before("pointCut()")
public void before(JoinPoint joinPoint){Class targetClass = joinPoint.getTarget().getClass();
Object[] args = joinPoint.getArgs();
String methodName = joinPoint.getSignature().getName();
String ClassName = joinPoint.getSignature().getDeclaringTypeName();
System.out.println("获取指标对象的类型:"+targetClass);
System.out.println("获取指标参数:"+ Arrays.toString(args));
System.out.println("获取指标办法名称:"+ methodName);
System.out.println("获取指标类的门路:"+ ClassName);
System.out.println("我是前置告诉!!!");
}
}