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

publicclassHelloimplementsIHello{

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

}

现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:
其中.Logger类和Level枚举代码如下:
Logger.java
Test.java
Tue Mar0420:57:12CST2008sayHello method start
.
Hello Doublej
2008-3-420:57:12sayHello method end!
从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:
上面代码,可以说是AOP最简单的实现!
其实AOP的意思就是面向切面编程.
OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决解决问题的方法中的共同点,是对OO思想的一种补充!
还是拿人家经常举的一个例子讲解一下吧:
比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录,
我们写个例子看看我们最简单的解决方案
我们先写一个接口IHello.java代码如下:
1
packagesinosoft.dj.aop.staticaop;
2
3
publicinterfaceIHello{
4
/**
5
* 假设这是一个业务方法
6
*@paramname
7
*/
8
voidsayHello(String name);
9
}
10
packagesinosoft.dj.aop.staticaop;2

3
publicinterfaceIHello{4
/**5
* 假设这是一个业务方法6
*@paramname7
*/8
voidsayHello(String name);9
}10

里面有个方法,用于输入"Hello" 加传进来的姓名;我们去写个类实现IHello接口
packagesinosoft.dj.aop.staticaop;
publicclassHelloimplementsIHello{
publicvoidsayHello(String name){
System.out.println("Hello"+name);
}
}
现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:
1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassHelloProxyimplementsIHello{
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
packagesinosoft.dj.aop.staticaop;2

3
publicclassHelloProxyimplementsIHello{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
packagesinosoft.dj.aop.staticaop;
2
3
importjava.util.Date;
4
5
publicclassLogger{
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
packagesinosoft.dj.aop.staticaop;2

3
importjava.util.Date;4

5
publicclassLogger{6
/**7
* 根据等级记录日志8
*@paramlevel9
*@paramcontext10
*/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

1
packagesinosoft.dj.aop.staticaop;
2
3
publicenumLevel{
4
INFO,DEBUGE;
5
}
6
那我们去写个测试类看看,代码如下:
packagesinosoft.dj.aop.staticaop;2

3
publicenumLevel{4
INFO,DEBUGE;5
}6

Test.java
1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassTest{
4
publicstaticvoidmain(String[] args){
5
IHello hello=newHelloProxy(newHello());
6
hello.sayHello("Doublej");
7
}
8
}
9
运行以上代码我们可以得到下面结果:
packagesinosoft.dj.aop.staticaop;2

3
publicclassTest{4
publicstaticvoidmain(String[] args){5
IHello hello=newHelloProxy(newHello());6
hello.sayHello("Doublej");7
}8
}9

Tue Mar0420:57:12CST2008sayHello method start
.
Hello Doublej
2008-3-420:57:12sayHello method end!从上面的代码我们可以看出,hello对象是被HelloProxy这个所谓的代理态所创建的.这样,如果我们以后要把日志记录的功能去掉.那我们只要把得到hello对象的代码改成以下:
1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassTest{
4
publicstaticvoidmain(String[] args){
5
IHello hello=newHello();
6
hello.sayHello("Doublej");
7
}
8
}
9
packagesinosoft.dj.aop.staticaop;2

3
publicclassTest{4
publicstaticvoidmain(String[] args){5
IHello hello=newHello();6
hello.sayHello("Doublej");7
}8
}9

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


浙公网安备 33010602011771号