`
zhjb2000
  • 浏览: 58324 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

AOP示例(三续)

阅读更多

使用JDK创建代理有一个限制,即它只能为接口创建代理,这一点我们从Proxy的接口方法newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)就看得很清楚,第三个入参interfaces就是为代理实例指定的实现接口。虽然,面向接口的编程被很多很有影响力人(包括Rod Johnson)的推崇,但在实际开发中,开发者也遇到了很多困惑:难道对一个简单业务表的操作真的需要创建5个类(领域对象类、Dao接口,Dao实现类,Service接口和Service实现类)吗?对于这一问题,我们还是留待大家进一步讨论。现在的问题是:对于没有通过接口定义业务方法的类,如何动态创建代理实例呢?JDK的代理技术显然已经黔驴技穷,CGLib作为一个替代者,填补了这个空缺

下面得演示还是居于上面一直在使用得例子

1.新建CglibProxy代理类

2.修改MethodAdvice类的invoke方法,添加private MethodProxy porxy;这样一个属性,及其set方法

3.修改Test类,改成使用CglibProxy代理

  1. /**
  2. *
  3. */
  4. packagecom.advice;
  5. importjava.lang.reflect.Method;
  6. importnet.sf.cglib.proxy.Enhancer;
  7. importnet.sf.cglib.proxy.MethodInterceptor;
  8. importnet.sf.cglib.proxy.MethodProxy;
  9. /**
  10. *@authorzjb
  11. *
  12. */
  13. publicclassCglibProxyimplementsMethodInterceptor{
  14. privateMethodAdvicemethodAdvice;
  15. privateEnhancerenhancer=newEnhancer();
  16. publicObjectgetBean(StringclassName){
  17. try{
  18. enhancer.setSuperclass(Class.forName(className));
  19. enhancer.setCallback(this);
  20. returnenhancer.create();
  21. }catch(Exceptione){
  22. e.printStackTrace();
  23. }
  24. returnnull;
  25. }
  26. publicMethodAdvicegetMethodAdvice(){
  27. returnmethodAdvice;
  28. }
  29. publicvoidsetMethodAdvice(MethodAdvicemethodAdvice){
  30. this.methodAdvice=methodAdvice;
  31. }
  32. @Override
  33. publicObjectintercept(Objectobject,Methodmethod,Object[]args,
  34. MethodProxyporxy)throwsThrowable{
  35. methodAdvice.setArgs(args);
  36. methodAdvice.setMethod(method);
  37. methodAdvice.setPos(-1);
  38. methodAdvice.setDone(false);
  39. methodAdvice.setTarget(object);
  40. methodAdvice.setPorxy(porxy);
  41. returnmethodAdvice.proceed();
  42. }
  43. }
修改以后的MethodAdvice类的invoke方法

  1. privateObjectinvoke(){
  2. done=true;
  3. try{
  4. if(porxy!=null){
  5. returnporxy.invokeSuper(target,args);
  6. }else{
  7. returnmethod.invoke(target,args);
  8. }
  9. }catch(Exceptione){
  10. e.printStackTrace();
  11. }catch(Throwablee){
  12. e.printStackTrace();
  13. }
  14. returnnull;
  15. }

  1. packagecom.myadvice.test;
  2. importcom.advice.CglibProxy;
  3. importcom.advice.DynaProxy;
  4. importcom.advice.MethodAdvice;
  5. importcom.test.BookBiz;
  6. importcom.test.BookBizImpl;
  7. publicclassTest{
  8. /**
  9. *@paramargs
  10. */
  11. publicstaticvoidmain(String[]args){
  12. //DynaProxyproxy=newDynaProxy();
  13. CglibProxyproxy=newCglibProxy();
  14. MethodAdvicemethodAdvice=newMethodAdvice();
  15. methodAdvice.AddAdvice(newObject[]{newMyAdvice()});
  16. proxy.setMethodAdvice(methodAdvice);
  17. //BookBizbookBiz=(BookBiz)proxy.getBean(BookBizImpl.class.getName());
  18. BookBizImplbookBiz=(BookBizImpl)proxy.getBean(BookBizImpl.class.getName());
  19. bookBiz.buy("张三","Spring深入潜出",50);
  20. bookBiz.comment("李四","《恐怖世界》一点都不恐怖,很好看!");
  21. bookBiz.comment("张三","《Spring深入潜出》还是写得不错的!");
  22. }
  23. }

下面是运行结果:

[环绕通知]
前通知,调用的方法:buy,参数:[张三, Spring深入潜出, 50.0]
业务方法buy开始执行
·张三购买图书:Spring深入潜出
·张三增加积分:5
·向物流系统下发货单
业务方法buy结束
后通知,调用的方法:buy,参数:[张三, Spring深入潜出, 50.0]
[环绕通知]
屏蔽李四所有的评论
[环绕通知]
前通知,调用的方法:comment,参数:[张三, 《Spring深入潜出》还是写得不错的!]
业务方法comment开始执行
·张三发表书评《Spring深入潜出》还是写得不错的!
业务方法comment结束
后通知,调用的方法:comment,参数:[张三, 《Spring深入潜出》还是写得不错的!]

通过学习AOP,俺们现在回去想想Spring的数据库事务自动管理是怎么实现的,就比较清晰了,应该使用了环绕通知,在proceed之前开始一个事务,然后在提交事务,就这么简单而已。(^_^,大功告成,关于aop打完收工)

分享到:
评论

相关推荐

    SpringAOP示例讲解

    **Spring AOP 示例讲解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这种技术允许开发者将关注点从...

    Spring AOP 1.0示例

    在这个“Spring AOP 1.0示例”中,我们重点关注如何在实际项目中应用这一特性。 首先,我们需要了解AOP的基本概念。AOP的核心思想是将那些影响多个类的公共行为(如日志记录)抽取出来,形成独立的模块,称为切面...

    基于realproxy的aop使用示例

    在"基于realproxy的aop使用示例"中,我们可能看到以下步骤: 1. **创建代理类**:首先,我们需要创建一个继承自RealProxy的子类,这个子类负责拦截目标对象的方法调用。在这个子类中,我们可以重写`Invoke`方法,该...

    spring aop简单应用示例

    本示例将深入探讨Spring AOP的基础知识,以及如何在实际应用中使用它。 首先,我们来看"LogProfilter.java",这很可能是实现一个日志拦截器的类。在Spring AOP中,这样的类通常被称为切面(Aspect)。切面是封装了...

    Spring AOP代码示例

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、性能监控、安全性、事务管理等。通过AOP,...

    Emit实现AOP示例

    纯手工打造Emit实现AOP private static void OverrideMethods(TypeBuilder tb, MethodInfo method) { if (!method.IsPublic|| !method.IsVirtual || IsObjectMethod(method)) return; Type[] paramTypes = ...

    Spring AOP示例

    这个“Spring AOP示例”包含了一个具体的实践案例,帮助我们更好地理解和应用Spring AOP。 在Spring AOP中,核心概念有以下几个: 1. **切面(Aspect)**:切面是关注点的模块化,比如事务管理就是一个切面。在...

    Sping aop简单示例

    在这个"Spring AOP简单示例"中,我们将深入探讨这五个关键元素,并通过XML配置来实现它们。 首先,**切面(Aspect)**是关注点的模块化,这些关注点定义了跨越多个对象的行为或责任。在Spring AOP中,切面可以是...

    Spring的AOP示例DEMO HELLOWORLD

    本示例DEMO "Spring的AOP示例DEMO HELLOWORLD" 将引导我们深入理解Spring AOP的核心概念,并通过一个简单的 HelloWorld 示例来展示其实现过程。 首先,面向切面编程(AOP)是一种编程范式,旨在提高代码的可维护性...

    spring aop API示例

    在这个"spring aop API示例"中,我们将深入探讨如何利用Spring AOP的四种通知类型:Before、After、AfterThrowing和Around,以及它们在实际开发中的应用。 1. **Before通知**: 在方法执行前触发,可以用来执行...

    spring famework 基于xml配置aop示例

    本示例将详细阐述如何通过XML配置来实现Spring AOP。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了横切关注点,也就是那些跨越多个对象的业务逻辑。这些关注点通常包括日志、安全检查和...

    SpringAOP:Spring AOP示例

    SpringAOP Spring AOP(面向方面​​的编程)用于模块化“横截面”服务。 用一种简单的方式,我们可以说它是一个旨在拦截某些进程的组件,例如,在执行某个方法时,Spring AOP可以... 以下示例将向您展示其工作原理

    Spring使用AOP的三个jar包

    要使用Spring的AOP功能,我们需要引入特定的库,这正是标题中提到的"Spring使用AOP的三个jar包"。 首先,我们来看`aspectjrt.jar`。这个库是AspectJ运行时环境的一部分,包含了运行时织入(runtime weaving)所需的...

    spring2.5.6 aop简单示例

    在本示例中,我们将深入探讨Spring框架2.5.6版本中的面向切面编程(AOP)概念。Spring AOP是Spring框架的核心组件之一,它允许开发者在不修改源代码的情况下,对程序进行横切关注点(如日志、事务管理、性能监控等)...

    aop示例spring 的aop思想解决项目中多次出现的同一个问题

    在Struts、Hibernate、Spring这三个技术栈中,Spring的AOP功能可以很好地与它们集成。Struts作为MVC框架处理请求,Hibernate作为ORM框架负责数据持久化,而Spring AOP则提供跨层的通用功能支持,如事务管理和安全...

    Spring IOC AOP学习示例

    Spring IOC AOP学习示例代码,包含Spring常用操作示例和所有所需jar文件。参考博客:http://blog.csdn.net/daijin888888/article/details/51735291

    spring aop示例

    这主要涉及到三个方面:AOP的基本概念、注解的使用以及Spring的自动注入。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。在本示例中,切...

    Spring AOP完整例子

    在本教程的示例中,你可能发现了一些配置文件,如`applicationContext.xml`,它们用于装配切面。在Spring XML配置中,我们可以使用`<aop:config>`元素来定义切点表达式,然后使用`<aop:aspect>`元素来声明切面,并将...

    Spring Aop 示例

    以下是一个简单的Spring AOP示例,展示如何使用注解定义切面和通知: ```java // 定义切面 @Aspect @Component public class LoggingAspect { // 定义切入点,匹配所有以'execute'开头的方法 @Pointcut(...

    SSH学习记录(4)-AOP测试

    标题中的"SSH学习记录(4)-AOP测试"指的是在软件开发中对Spring、Struts和Hibernate这三大框架(简称SSH)的第四部分学习,主要关注的是AOP(面向切面编程)的测试方面。AOP是编程的一种设计模式,它允许程序员定义...

Global site tag (gtag.js) - Google Analytics