`
dreamstone
  • 浏览: 288440 次
  • 来自: ...
文章分类
社区版块
存档分类

Spring的Aop的实现方式

阅读更多
最近看了一下Spring的Aop和Java的动态代理,下边利用个小例子,简单的表述一下。
Spring中的Aop实现
一,什么是Aop呢:
AOP是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,
设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
二,Spring中的Aop
spring中的aop运用了java中的动态代理来实现的,下边是我写的个小例子,便于理解,如有问题请提出。
1,需求:
 我们经常遇到这样的情况,在很多不同的操做开始和结尾要做相同的操做。举个例子,比如你要实现一个对象
ByBus(乘坐公共汽车旅游)这个对象有一个seat()函数和一个rob()函数.如果你要正常乘车,在上车seat()之前
须要买票,在下车之前须要查票。如果你要做霸王车rob(),可以不用买票,也不用查票。
这个时候我们可以有以下两种实现方法。

 1方法一。
 2    更改seat()方法,在这个方法的第一句加上
 3    System.out.println("buy ticket ");
 4    最后一句加上
 5    System.out.println("check ticket ");
 6    然後调用
 7    ByBus bb = new ByBus();
 8    bb.seat();
 9    bb.rob();
10方法二。
11    再调用之前加上    
12    ByBus bb = new ByBus();
13    System.out.println("buy ticket ");
14    bb.seat();
15    System.out.println("check ticket ");
16    bb.seat();
17方法三。
18    利用代理模式,定义一个接口IByBus . ByBus实现接口 ,定义一个代理类,实现IByBus接口
19    public class ProxyByBus implements IByBus{
20        private IByBus byBus;
21        public ProxyByBus(IByBus byBus){
22            this.byBus = byBus;
23        }

24        public void seat(){
25            System.out.println("buy ticket ");
26            byBus.seat();
27            System.out.println("check ticket ");
28        }

29        public void rob(){
30            byBus.rob();
31        }

32    }

33

以上三种方法都面临一个问题,如果函数很多,类也很多,以上几种方式的实现都不是很美观。那没有没有更好的
方式呢,这个时候Java的动态代理加入.能较好的解决这个问题,例如我们要加入一种旅游方式ByTrain
定义IByTrain接口,下边是利用动态代理的实现:
定义一个使用动态代理的类

 1package proxy;
 2
 3import java.lang.reflect.InvocationHandler;
 4import java.lang.reflect.Method;
 5import java.lang.reflect.Proxy;
 6
 7public class TxHandler implements InvocationHandler{
 8    private Object originalObject;
 9    public Object bind(Object obj){
10        this.originalObject = obj;
11        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
12                obj.getClass().getInterfaces(),this);
13    }

14    //加入buy ticket ,check ticket
15    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
16        Object result = null;
17        if(method.getName().startsWith("seat")){
18            System.out.println("buy ticket");
19            result = method.invoke(originalObject, args);
20            System.out.println("check ticket");
21        }
else{
22            result = method.invoke(originalObject, args);
23        }

24        return result;
25    }

26}

27定义一个辅助类
28package proxy;
29
30public class Util {
31    public static Object getObject(String name){
32        Object obj= null;
33        try{
34            Class clazz = Class.forName(name);
35            obj = clazz.newInstance();
36            
37            TxHandler th = new TxHandler();
38            obj = th.bind(obj);
39        }
catch(Exception e){
40        }

41        return obj;
42    }

43}

44
45然後测试一下结果:
46package proxy;
47import java.lang.reflect.Method;
48public class Test {
49    public static void main(String[] args) {
50        try{
51            String name1 ="proxy.ByBusImpl";
52            IByBus byBus = (IByBus)Util.getObject(name1);
53            byBus.seat();
54            byBus.rob();
55            //加入一种旅游方式
56            String name2 ="proxy.ByTrainImpl";
57            IByTrain byTrain = (IByTrain)Util.getObject(name2);
58            byTrain.seat();
59            byTrain.rob();
60            
61        }
catch(Exception e){
62            e.printStackTrace();
63        }

64    }

65}

ok我们也实现了同样的效果,看看代码量比前几种的更多,但是试想一下如果我们的旅游方式变的越来越多,
ByAir By...等等是否这中方式更简单了呢。

理解了Java的动态代理,再回到Spring,
Spring的IOC就类似Util类的作用,根据配制文件(本例中的字符串),在运行时自动生成代理类。
Spring的Aop就类似TxHandler类的作用,须要的函数例如seat()之前,之后都加入一写东西,
Spring加入的是

 1    try{
 2        //之前加入(类似buy ticket)
 3        Transation.begin();
 4        
 5        //调用你的函数.
 6        
 7        //之后加入(类似check ticket)
 8        Transation.commit() 
 9    }
catch(Exception e){
10        //加入
11        Transation.rollback();
12    }

13


这样你就能在配制文件中来管理事务了。
 
本文提供实例source下载,见这里:http://www.blogjava.net/Files/dreamstone/proxy.rar
参考文献:夏昕的SpringGuide

分享到:
评论

相关推荐

    理解Spring AOP实现与思想 案例代码

    2. **Spring AOP实现方式** - **代理模式**:Spring AOP使用两种代理方式,JDK动态代理和CGLIB代理。如果目标类实现了接口,Spring会使用JDK动态代理;如果没有实现接口,Spring会使用CGLIB代理生成子类。 - **JDK...

    Spring AOP实现机制

    Spring AOP的实现方式 Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - ...

    spring aop实现原理

    NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927

    SpringAOP.zip

    2. **Spring AOP实现方式**:Spring提供了两种AOP实现,一种是基于代理(Proxy-based AOP),另一种是基于ASM字节码操作的AspectJ。基于代理的方式简单易用,而AspectJ则更为强大,支持更复杂的切面定义。 3. **...

    Spring AOP简单demo

    **Spring AOP实现方式** 1. **注解驱动(Annotation-based)**:使用`@Aspect`注解定义切面,`@Before`, `@After`, `@AfterReturning`, `@AfterThrowing`, `@Around`定义通知,`@Pointcut`定义切入点表达式。 2. *...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    SpringAOP简单项目实现

    二、Spring AOP实现方式 1. 静态代理:通过Java反射或CGLIB动态创建一个代理对象,适用于没有接口的目标对象。 2. 动态代理:基于JDK的动态代理,目标对象需实现至少一个接口;若目标对象无接口,使用CGLIB库生成子...

    spring aop所需jar包

    2. **Spring AOP实现方式**: - **代理模式**:Spring支持两种代理,JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有实现接口的类。 - **注解驱动的AOP**:通过在类或方法上使用特定...

    spring aop jar 包

    这个"spring aop jar 包"包含了实现这一功能所需的类和接口,使得开发者能够轻松地实现面向切面的编程。 在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录...

    spring AOP切面编程

    二、Spring AOP实现方式 1. 动态代理:当目标对象实现了接口时,Spring使用JDK动态代理生成一个代理对象,实现在方法调用前后添加通知功能。 2. CGLIB代理:如果目标对象没有实现接口,Spring会使用CGLIB库动态生成...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...

    Spring AOP 16道面试题及答案.docx

    Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....

    spring aop demo 两种实现方式

    压缩包中的"aop"文件可能包含了一个简单的Spring AOP示例项目,包括了上述两种实现方式的源代码和配置文件。下载后,可以直接运行以观察AOP如何工作。 总结来说,Spring AOP提供了一种强大的方式来实现横切关注点,...

    简单spring aop 例子

    在Spring AOP中,切面主要通过两种方式实现:代理(Proxies)和织入(Weaving)。 1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或...

    Spring Aop的简单实现

    在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...

    使用Spring的注解方式实现AOP的细节

    本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...

    spring aop

    **二、Spring AOP实现方式** 1. **代理模式**:Spring AOP通过两种代理模式实现,即JDK动态代理和CGLIB代理。如果目标类实现了接口,Spring将使用JDK动态代理;否则,使用CGLIB生成目标类的子类。 2. **注解驱动**...

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    **Spring AOP 实现详解** 在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务...

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    springAop默认代理方式.zip

    在Spring AOP中,代理是实现切面的关键机制,它在目标对象与实际调用之间起到了中介作用,让我们来详细探讨Spring AOP的默认代理方式。 1. **静态代理**:Spring AOP 提供了两种代理方式,一种是静态代理,另一种是...

Global site tag (gtag.js) - Google Analytics