A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2017-12-19 10:00 编辑

【郑州校区】JavaEE三大框架课堂笔记之Spring-day09(下)


经典的基于代理的AOP开发(了解)
基本的jar包
1. bean
2. core
3. context
4. expression
5. aop
6. 需要aop联盟的依赖jar包
第一步:编写目标(target)
第二步增强(advice)
第三步在applicationContext.xml文件中配置
第四 测试
基于aspectJ切点传统开发
第一步:在spring的配置文件中定义目标与通知
第二步:使用<aop:xxx>标签来完成切面与切点声明
注意1:需要在xml配置文件中导入aop声明
注意2:因为我们使用aspectj的切面声明方式 需要在导入aspectj的jar包
传统spring aop开发总结
第一步:编写目标对象(target)
第二步:编写通知(advice)
传统的aop开发中,通知是需要实现指定接口。
第三步 在配置文件中配置切面(切面=切点+通知)
<aop:config>来声明要对aop进行配置
<aop:pointcut>它是用于声明切点(简单说就是对哪些方法进行拦截)
<aop:advisor> 定义传统的aop的切面,传统的aop切面它只能包含一个切点与一个增强
<aop:aspect>定义aspectj框架的切面.,它可以包含多个切点与多个通知
关于切点表达式写法
这个语法源于aspectJ的语法,spring中aop开发,对aspectj不是完全支持,只支持部分语法。
在开发中使用的比较多的是execution语法.
关于execution语法常用:
1. execution(public * *()) 所有的public的方法
2. execution(* cn.itheima.aop.*(..)) 所有的aop包下的所有类的方法(不包含子包)
3. execution(* cn.itheima.aop..*(..)) 所有的aop包及其子包下的所有类的方法
4. execution(* cn.itheima.aop.IOrderService.*(..)) IOrderService接口中定义的所有方法
5. execution(* cn.itheima.aop.IOrderService+.*(..)) 匹配实现特定接口所有类的方法
6. execution(* save*(..)) 区配所有的以save开头的方法
Spring整合aspectj框架实现的aop
在现在的开发中使用这种方案比较多.
在spring2.0以后它支持jdk1.5注解,而整合aspectj后可以使用aspectj语法,可以简化开发。
Aspect:切面 =切点+通知(多个切点与多个通知的组合)
AspectJ 它是一个第三方框架,spring从2.0后可以使用aspectJ框架的部分语法.
AspectJ框架它定义的通知类型有6种
1. 前置通知Before 相当于BeforeAdvice
2. 后置通知AfterReturning 相当于AfterReturningAdvice
3. 环绕通知 Around 相当于MethodInterceptor
4. 抛出通知AfterThrowing 相当于ThrowAdvice
5. 引介通知DeclareParents 相当于IntroductionInterceptor
6. 最终通知After 不管是否异常,该通知都会执行
相比spring 的传统AOP Advice多了一个最终通知
基于xml配置方案第一步:创建目标(target)
第二步:创建通知(增强  advice)
注意:在aspectj中它的增强可以不实现任何接口,只需要定义出增强功能(方法)
第三步:在spring的xml 配置文件中来配置
<aop:config>下的<aop:aspect>是aspectJ框架用来声明切面的。
前置通知
后置通知
环绕通知
异常抛出
注意:目标行为只有抛出了异常后才会执行这个增强方法
最终通知
无论是否有异常,最终通知都会执行.
关于通知上的参数
1. 在前置通知上可以添加JoinPoint参数
通过它可以获取目标相关的信息
使用前置通知可以完成日志记录,权限控制
2. 在后置通知上添加的参数
第二个参数val它可以获取目标方法的返回值
注意:需要在配置文件中配置
3. 环绕通知上的参数
它是我们开发中应用最多的,可以完成日志操作,权限操作,性能监控,事务管理
4. 抛出异常通知上的参数
第二个参数Throwable它是用于接收抛出的异常
注意:需要在配置文件中声明
5. 最终通知上的参数
可以使用最终通知完成资源释放
关于代理方式选择
在spring的aop开发中,它使用的是代理方案,代理实现有两种:
1. jdk的proxy
2. cglib
spring框架默认情况下,会对有接口的类使用proxy代理。没有接口的类使用cglib代理
Proxy-target-class的值默认是false,它代表有接口使用proxy代理
问题:如果现在对目标要使用cglib代理(不考虑是否有接口)?
只需要将proxy-target-class设置为true.

传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

55.png (7.98 KB, 下载次数: 28)

55.png

2 个回复

倒序浏览
回复 使用道具 举报
{:8_507:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马