面向切面编程
散布于应用中多处的功能被称为横切关注点
常用于安全、事务、日志、缓存
优点:切面方法集中在一起,方便管理
开发人员更多的关注业务代码
spring目前仅支持方法级别的连接点
关键字解释:
1、通知:切面执行的东西,有前置、后置、环绕、返回、异常通知
2、切点:缩小切面所通知的连接点的范围(例如只对service层做事务处理)
3、连接点:应用中数以千计的时机应用通知(例如;一个方法)
4、切面:切面是通知和切点的结合
5、织入:把切面应用到目标对象,并创建代理的过程
编译时织入:AspectJ
类加载时织入:LTW
运行时织入:spring AOP
通过切点来选择连接点
AspectJ指示器
execution(常用)、within、arg、this()、target
举例:execution(public * com.bigData.farm.service.UserService.login(…))
userService类中的login方法任意参数,任意返回值
复合运用:execution(public * com.bigData.farm.service.UserService.login(…))
&& within(com.bigData.farm.*)
标示仅仅织入farm包下的东西
常用连接符:&& 、||、! 在java xml 配置文件中用and,or,not标示
__________________________________________________________________________________
- @Aspect 创建切面
- @Before切入之前执行
- @AfterReturning
- @PointCut 切入点,可以随意加载自定义方法上,空方法也可以,仅仅是个标志
- @After 后置通知
- @AfterThrowabling 异常通知
- @Around 环绕通知
1、如何将@Aspect 注解的类视为切面,在javaconfig中增加注解@EnableAspectAutoProxy启动代理功能
2、Around方法接收参数例子
public void watch(ProceedingJoinPoint jp){
“先执行的部分”;
jp.proceed();
"后执行的部分";
}
注意:不执行proceed()方法,执行切入点时会被阻塞,即不会执行目标方法。
处理通知中的参数
1、eg:记录录音播放的次数
2、带参数的切入点
3、@PointCut(“execution( * * soundSystem.CompactDisc.playTrack(int) )” + “&& args(trackNumber)”)
args 给通知方法的参数
playTrack(int) 通知方法和参数类型
trackNumber 定义参数 的名称
Map<trackNumber,count>
xml的配置
aop:config
<aop:aspect ref=“ddd”>
<aop:before pointcut="" method="">
环绕通知:入记录表演用时多久,
xml声明环绕通知,切面方法要有参数,(proceedingJoinPoint ip)
注入aspectj的切面,aspectj有更强大的功能,不仅仅局限于方法。相比spring aop