为什么应用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("我是前置告诉!!!"); }}