Spring中Aop的扩展及剖析
副标题[/!--empirenews.page--]
AOP简介: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。面向对象编程是从【静态角度】考虑程序的结构,而面向切面编程是从【动态角度】考虑程序运行过程。AOP底层,就是采用【动态代理】模式实现的。采用了两种代理:JDK动态代理和CGLIB动态代理。 AOP是一种思想,而非实现AOP是基于OOP,而又远远高于OOP,主要是将主要核心业务和交叉业务分离。 前提:导入jar包 一:通过代理工厂ProxyFactoryBean进行以下配置。 (1)前置后置增强 首先创建一个接口:自定义方法 public interface ISomeService { //开启事务 public void doTran(); //记录日志 public String doLog(); } 进行接口实现,书写业务。 //核心业务 @Override public void doTran() { System.out.println("开启事务"); } @Override public String doLog() { System.out.println("书写日志"); return "hehe"; } 定义前置通知类,实现接口MethodBeforeAdvice。(前置)AfterReturningAdvice(后置) 配置applicationContext.xml。 测试类: 实现效果: (2)环绕通知 MethodInterceptor 环绕增强在目标方法的前后都可以织入增强处理。环绕增强是功能最强大的强大处理。Spring把目标方法的控制权全部交给了他。在环绕增强处理中,可以获取或修改目标方法的参数、返回值、可以对它进行异常处理,甚至可以决定目标方法是否执行。 配置applicationContext.xml。 实现效果: 通过MethodInterceptor接口实现了环绕增强。该接口要求实现invoke()方法,其参数MethodInvocation不但封装目标方法及其参数组,还封装了被代理目标对象。通过proceed()方法可以调用目标对象的相应方法,从而实现对目标方法的完全控制! (3)异常通知:ThrowsAdvice 注意:实现该接口没有重写方法ThrowsAdvice,并且它的父类,再上一类都没有方法,我们要在他的自身约束中进行获取。 实现类书写错误信息: 配置applicationContext.xml。 测试类: 若将异常抛给上级处理,则在控制台通过,单测报错,若将异常手动抛出,则相反 二、顾问Advisor 顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能。PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。 如何实现: 同理:定义接口和实现类,并自定义方法。以及前置增强的类。关键点在Spring配置文件 ①名称匹配方法切入点顾问 ② 正则表达式匹配方法切入点顾问 三、自动代理生成器 注意:默认Advisor自动代理生成器,切面只能是顾问,对所有的对象都增强 两种实现方式: ① 默认Advisor自动代理生成器 DefaultAdvisorAutoProxyCreator ② BeanName自动代理生成器 BeanNameAutoProxyCreator 在这里 无需配置代理工厂bean,测试类getBean()取的id是配置文件的被代理对象 切面只能是顾问的情况下: 实现效果: 两者都兼得的情况下: 实现效果: (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |