AOP 面向切面编程,也称为横截面编程,其实类似于Filter和拦截器。Filter和拦截器也是横截面编程,即类似切了一刀,然后搞完一端再搞另一端。
而Filter 和 拦截器 是用于处理Web请求的“横截面拦截”编程,在云笔记和项目中有登录,html,*.do,业务层和持久层。Filter和拦截器用于拦截html和*.do的切面。AOP用于业务层的编程。
AOP的优点:
在不改变原有业务情况下,为软件灵活扩展功能。即在保留目前功能的情况下再加其他功能,不改变原有代码。在多个业务层控制器中,难免有公用的功能。而AOP提供了动态调用业务方法。在控制器和业务层放入切入点,当切入点触发事件时,调用容器中的切面bean。
导入jar包:
org.aspectj aspectjweaver 1.8.0 org.aspectj aspectjtools 1.8.0 org.aspectj aspectjrt 1.8.0配置:
通知(切入点表达式):
@Aspect 标注在类之上 声明切面
@Before("bean(xxxxx)") 标注在方法之上 声明通知和切入点 “bean(xxx)“为切入点,即为在xxx的全部方法之前执行方法
@AfterReturing 在切入点正常执行完成后执行,如果切入点抛出异常,则不执行
@AfterThrowing 在切入点抛出异常后执行
@After 类似final 不管是否有抛出异常都在最后执行
@Around 类似Servelt Filter 既可以在方法前又可以在方法后 使用该通知需要传入参数"ProceedingJoinPoint",类似chain.do,ProceedingJoinPint(jp)也有一核心方法proceed(),即调用目标的业务方法(利用反射实现invoke()),适用于性能测试(时间),配合jp.signature()来获取方法名。不写try catch,返回.proceed()的返回值
切入点表达式: 1.类级别 - within(包名) 2.对象级别 - bean(userService) - bean(userService) || bean(noteService) - bean(*Service) 3.方法级别 - execution(* cn.tedu.note.service.UserService.login(..)) 参数用".."表示 Sun公司建议将包名,方法名和类名定制的有规律,便于使用切入点。 AOP的工作原理: 1.注解如何解析:利用反射解析注解 2.Spring AOP是利用AspectJ实现 3.AOP底层利用了动态代理技术 - 如果被代理的位置有接口,则使用JDK动态代理 - 如果被代理的位置没有借口,则使用CGLIB动态代理 **建议AOP切入到有接口的位置,自动调用JDK动态代理 4.JDK动态代理是反射API的一部分 - java.lang.reflect.Proxy5.代理模式: 不改变原有类功能,为类的方法扩展功能
