- 浏览: 352074 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
pacoson:
感谢楼主。请受小生一拜。
ANT预编译JSP -
zhuhongming123:
一楼的同学Lucene4.* 以上的 已经改成了Numeric ...
Lucene日期排序及组合查询 -
ywjk520:
RangeQuery在哪个包里?
Lucene日期排序及组合查询 -
willwen:
有个疑问,楼主,为何初始化bits 从txt读取已有的网址是直 ...
布隆过滤器(Bloom Filter)之java实例 -
yu_226528:
还不如没有呢
jFreeChart 在jsp页上实现简单的折线图、柱状图
其实AOP的意思就是面向切面编程.
OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!
还是拿人家经常举的一个例子讲解一下吧:
比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录,
我们写个例子看看我们最简单的解决方案
我们先写一个接口IHello.java代码如下:

2

3



4


5

6

7

8

9

10

里面有个方法,用于输入"Hello" 加传进来的姓名;我们去写个类实现IHello接口














现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:

2

3



4

5

6



7

8

9

10



11


12

13

14

15

16

17

18

其中.Logger类和Level枚举代码如下:
Logger.java

2

3

4

5



6


7

8

9

10

11



12



13

14

15



16

17

18

19

20

21

Level.java

2

3



4

5

6

那我们去写个测试类看看,代码如下:
Test.java

2

3



4



5

6

7

8

9

运行以上代码我们可以得到下面结果:




从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:

2

3



4



5

6

7

8

9

上面代码,可以说是AOP最简单的实现!
但是我们会发现一个问题,如果我们像Hello这样的类很多,那么,我们是不是要去写很多个HelloProxy这样的类呢.没错,是的.其实也是一种很麻烦的事.在jdk1.3以后.jdk跟我们提供了一个API java.lang.reflect.InvocationHandler的类. 这个类可以让我们在JVM调用某个类的方法时动态的为些方法做些什么事.让我们把以上的代码改一下来看看效果.
同样,我们写一个IHello的接口和一个Hello的实现类.在接口中.我们定义两个方法;代码如下 :
IHello.java

2

3



4


5

6

7

8

9


10

11

12

13

14

15

Hello.java

2

3



4

5



6

7

8



9

10

11

12

我们一样的去写一个代理类.只不过.让这个类去实现java.lang.reflect.InvocationHandler接口,代码如下:

2

3

4

5

6

7



8

9


10

11

12

13

14


15

16

17

18

19

20

21



22

23

24

25

26

27


28

29

30

31

32



33

34



35

36


37

38

39

40

41

42



43

44

45

46

47

48

49

50

上面类中出现的Logger类和Level枚举还是和上一上例子的实现是一样的.这里就不贴出代码了.
发表评论
-
在Struts中基于Spring的AOP MethodInterceptor(拦截器)的权限验证
2010-08-13 13:34 1748本程序是关于"某考试系统"中的aop应用. ... -
反射实现 AOP 动态代理模式(2)
2010-08-05 12:40 962上面类中出现的Logger类和Level枚举还是和上一上例子的 ... -
Spring事务配置的五种方式
2010-06-25 16:51 830前段时间对Spring的事务配置做了比较深入的研究,在此之间对 ... -
使用 Spring 2.5 注释驱动的 IoC 功能(2)
2010-06-25 16:37 902使用 JSR-250 的注释 Sprin ... -
使用 Spring 2.5 注释驱动的 IoC 功能(1)
2010-06-25 16:36 759概述 注释配置相对于 XML 配置具有很多的优势: 它可以 ... -
spring事务配置方法(BeanNameAutoProxyCreator)
2010-05-11 15:18 1085采用这种配置策略,完全可以避免增量式配置,所有的事务代理由系统 ... -
spring事务配置方法(TransactionProxyFactoryBean)
2010-05-11 15:10 1101采用这种方式的配置时候,配置文件的增加非常快,每个bean有需 ... -
spring事务配置方法(TransactionProxyFactoryBean继承)
2010-05-11 15:07 1135大部分情况下,每个事务代理的事务属性大同小异,事务代理的实现类 ... -
spring事务配置方法(BeanNameAutoProxyCreator)
2010-05-11 15:05 1173采用这种配置策略,完全可以避免增量式配置,所有的事务代理由系统 ... -
spring声明式事务
2010-05-11 14:26 845Spring中几种常见的事务配置,是Aop和Ioc的充分体现以 ... -
Spring AOP 入门实例
2010-05-01 19:18 867AOP 面向切面,可以让我们在不修改业务代码的前提下,在业务代 ... -
使用动态代理实现简单AOP
2010-05-01 19:02 832Spring默认使用JDK动态代理来实现AOP,如果业务对象没 ... -
Sping acegi 配置文件
2010-05-01 18:23 1010applicationContext-acegi-securi ... -
Spring的BeanFactory
2010-05-01 18:17 794一、Spring装配Bean的过程 1. 实例化; 2. 设置 ... -
使用Spring方法注入协调不同步的bean
2010-05-01 18:00 1269<?xml version="1.0" ... -
几种加载Spring的配置文件的方式
2010-05-01 16:49 1304package com.liu.test; pu ... -
Quartz在Spring中动态设置cronExpression
2009-11-20 15:26 1282什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
使用Spring发邮件
2009-11-07 14:15 1026关于Spring的邮件发送的功能演示: (我把程序中一些敏感 ... -
Spring中的Quartz配置
2009-11-07 10:16 940Quartz是一个强大的企业级任务调度框架,Spring中继承 ... -
Spring ~IOC Annotations
2009-10-29 18:49 10491.1 零配置使用场合 IOC Annotations ...
相关推荐
这种通过代理模式实现的AOP方法,可以很好地将业务逻辑代码与额外的横切关注点分离,使得代码更加清晰,易于维护。如果将来需要去除日志记录功能,只需要替换掉代理类的实例,而不需要修改任何业务逻辑代码。此外,...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
6. **代理模式的其他实现**:除了Java的动态代理,还有其他实现方式,比如CGLIB库,它通过字节码生成技术创建代理对象,即使目标类没有实现接口也能进行代理。 学习AOP动态代理有助于我们理解面向切面编程的核心...
JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring会创建一个代理对象,这个代理对象实现了与目标对象相同的接口,并在调用接口方法时插入额外的切面逻辑。代理对象在运行...
代理模式是实现AOP的关键。代理模式的核心思想是创建一个代理类,它充当原对象的代理,控制对原对象的访问。在Spring AOP中,代理模式使得我们可以在不修改原始业务逻辑的情况下,插入额外的逻辑,比如事务管理、...
例如,`Castle.DynamicProxy`库就是基于动态代理实现AOP的。动态代理在运行时创建代理类,可以针对接口或者抽象类,而不需要重新编译源代码。这使得代码更加灵活,但性能相比静态织入略低。 3. **特性驱动编程**: ...
reflection是一系列的API,用于表示或者处理当前JVM中的类,接口和对象. java.lang.reflect/java.lang.Class 在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
在实际应用中,Spring AOP(面向切面编程)就是利用动态代理技术实现的。它可以让我们编写关注点分离的代码,比如日志、事务等通用功能,而无需侵入业务逻辑。此外,动态代理也被广泛应用于RPC框架,如Dubbo、gRPC,...
在Java中,动态代理有两种主要实现方式:一是使用Java的反射API,即`java.lang.reflect.Proxy`类;二是使用JDK动态代理。另一种常见的方式是使用CGLIB库,它是在字节码级别创建代理对象,适用于无法实现接口的目标类...
在Java中,代理模式主要有两种实现方式:静态代理和动态代理。 1. 静态代理: 在静态代理中,我们需要手动创建一个代理类,这个代理类实现了与目标类相同的接口。代理类中会持有目标对象的引用,并在调用目标对象...
4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置代理。`ProxyFactoryBean`是XML配置方式,而`@EnableAspectJAutoProxy`是基于...
Spring框架广泛使用AOP来实现这些功能,而Java的反射和动态代理机制是实现AOP的基础。 首先,AOP的核心思想是将横切关注点(如日志、事务管理)从核心业务逻辑中分离出来,形成独立的模块,以提高代码的可读性和可...
实现方式通过手动编写代理类,实现代理模式。 特点在编译期就生成了代理类,代理类持有委托类的实例,代为执行具体类实例方法。 应用场景适用于简单的代理需求,代码直观易懂。 2. JDK动态代理 实现方式利用...
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
在J2EE(Java 2 Platform, Enterprise Edition)环境中,AOP的动态代理实现机制是一种常用的技术手段,它利用了Java的反射机制。Java的动态代理可以分为接口型和类型两种。接口型动态代理要求目标对象实现一个接口,...
在实际应用中,动态代理模式常用于AOP(面向切面编程)框架,例如Spring AOP,它可以方便地实现日志、事务控制等功能。而适配器模式则广泛应用于各种集成场景,比如将第三方库的API转换为项目统一的接口,或者在不同...
代理模式通常用于实现AOP(面向切面编程),比如日志记录、性能监控、事务管理等。当需要在调用目标方法前后添加额外操作时,动态代理就显得非常方便。通过实现`InvocationHandler`,我们可以控制代理对象的行为,当...
代理模式是一种设计模式,它在Java中可以通过两种方式实现:静态代理和动态代理。静态代理是通过编写一个代理类来实现接口,代理类在编译时就已经确定。而动态代理则是在运行时动态生成代理类,通常使用`java.lang....
为了更好地理解代理模式的工作原理,我们通过下面的例子来实现一个简单的代理模式。 **定义接口**: ```java public interface SellPerfume { void sellPerfume(double price); } ``` **定义真实对象**: ```java...