导语
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等。
一、AOP的基本概念
(1)Aspect(切面)
:通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点)
:程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知)
:AOP在特定的切入点上执行的增强处理,有before
,after
,afterReturning
,afterThrowing
,around
(4)Pointcut(切入点)
:就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP代理
:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
二、Spring AOP
Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。
三、基于注解的AOP配置方式
1. 启用@AsjectJ支持
在applicationContext.xml中配置下面一句:
2.通知类型介绍
(1)Before
:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
(2)AfterReturning
:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
(3)AfterThrowing
:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名
来访问目标方法中所抛出的异常对象
(4)After
:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
(5)Around
:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个 ProceedingJoinPoint
3.通知执行的优先级
进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入After,最后才织入AfterReturning。
4.切入点的定义和表达式
切入点表达式的定义算是整个AOP中的核心,有一套自己的规范
Spring AOP支持的切入点指示符:
(1)execution
:用来匹配执行方法的连接点
@Pointcut("execution(* com.aijava.springcode.service..*.*(..))")
第一个*
表示匹配任意的方法返回值,..
(两个点)表示零个或多个,上面的第一个..
表示service包及其子包,第二个*
表示所有类,第三个*
表示所有方法,第二个..
表示
方法的任意参数个数
(2) @Pointcut("within(com.aijava.springcode.service.*)")
within限定匹配方法的连接点,上面的就是表示匹配service包下的任意连接点
(3) @Pointcut("this(com.aijava.springcode.service.UserService)")
this用来限定AOP代理必须是指定类型的实例,如上,指定了一个特定的实例,就是UserService
(4) @Pointcut("bean(userService)")
bean也是非常常用的,bean可以指定IOC容器中的bean的名称
5、基于注解示例代码
定义切面类
定义业务接口
业务接口实现类
测试类
输出结果
6.基于XML的切面编程
定义日志类
定义Aspect切面类
applicationContext.xml