JDK动态代理(上)

JDK动态代理(上)
好长时间没有用过Spring了. 突然拿起书.我都发现自己对AOP都不熟悉了.
其实AOP的意思就是面向切面编程.
OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!
还是拿人家经常举的一个例子讲解一下吧:
比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录,
我们写个例子看看我们最简单的解决方案
我们先写一个接口IHello.java代码如下:
1 package sinosoft.dj.aop.staticaop;
2
3 public interface IHello {
4  /**
5      * 假设这是一个业务方法
6      *@paramname
7     */

8    voidsayHello(String name);
9}

10

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

public class Hello implements IHello {

    
publicvoidsayHello(String name){
         System.out.println(
"Hello"+name);
     }


}


现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:
1 package sinosoft.dj.aop.staticaop;
2
3 public class HelloProxy implements IHello {
4    privateIHello hello;
5
6    publicHelloProxy(IHello hello){
7        this.hello=hello;
8     }

9
10    publicvoidsayHello(String name){
11         Logger.logging(Level.DEBUGE,"sayHello method start.");
12         hello.sayHello(name);
13         Logger.logging(Level.INFO,"sayHello method end!");
14
15     }

16
17}

18

其中.Logger类和Level枚举代码如下:
Logger.java
1 package sinosoft.dj.aop.staticaop;
2
3 import java.util.Date;
4
5 public class Logger {
6  /**
7      * 根据等级记录日志
8      *@paramlevel
9      *@paramcontext
10     */

11    publicstaticvoidlogging(Level level, String context){
12        if(level.equals(Level.INFO)){
13             System.out.println(newDate().toLocaleString()+""+context);
14         }

15        if(level.equals(Level.DEBUGE)){
16             System.err.println(newDate()+""+context);
17         }

18     }

19
20}

21
Level.java

1 package sinosoft.dj.aop.staticaop;
2
3 public enum Level {
4     INFO,DEBUGE;
5}

6
那我们去写个测试类看看,代码如下:
Test.java
1 package sinosoft.dj.aop.staticaop;
2
3 public class Test {
4    publicstaticvoidmain(String[] args){
5         IHello hello=newHelloProxy(newHello());
6         hello.sayHello("Doublej");
7     }

8}

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

Tue Mar 04 20 : 57 : 12 CST 2008 sayHello method start.
Hello Doublej
2008 - 3 - 4 20 : 57 : 12 sayHello method end!

从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:
1 package sinosoft.dj.aop.staticaop;
2
3 public class Test {
4    publicstaticvoidmain(String[] args){
5         IHello hello=newHello();
6         hello.sayHello("Doublej");
7     }

8}

9

上面代码,可以说是AOP最简单的实现!

你可能感兴趣的:(JDK动态代理(上))