本帖最后由 我是楠楠 于 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口出 |