日期:2014-05-20 浏览次数:20930 次
spring的AOP是基于代理的。java的事务控制是基于代理的。这两句话熟悉吧,一些老鸟就喜欢用这些词汇让我们犯晕,让我们感到他们很专业。这里我们将打破这个神话,本篇先介绍基于代理的AOP。这里我们先展示下什么叫做代理,先从静态代理开始。
一个静态代理的例子。
1、定义一个接口
AOP之静态代理
?
package com.itcast.aop; //要实现的接口 public interface IHello { public void hello(String name) throws Exception; public void helloAaa(String name); public void helloBbb(String name); }
?
?
2、一个实现接口的实例
?
? 3、调用的静态代理类 ?package com.itcast.aop;
//实现方法1
public class HelloSpeaker implements IHello{
// private Logger logger = Logger.getLogger(this.getClass().getName());
public void hello(String name) throws Exception{
System.out.println("Hello "+ name);
}
public void helloAaa(String name) {
System.out.println("Hello in aaa "+ name);
}
public void helloBbb(String name) {
System.out.println("Hello in bbb "+ name);
}
}
? 上边就是我们的静态代理类,代理了我们IHello接口的实现类,并加上了自己的日志输出,在IHello的实现类的hello方法每次被调用的时候,都会被在其前后加上日志。
结果如下: 信息: method start at Sun Mar 15 10:57:31 CST 2009 以上就是静态代理,原理很简单,目的也很简单,就是调用接口实现类的某个方法之前或者之后调用另外的操作。 总结下开发步骤: ?1、创建一个接口 ?2、创建一个接口的实现类 ?3、创建一个代理类,这个代理类也实现了上边的接口,但是将 要被代理的实现类传入到代理类中,在代理类的接口实现方法中调用,并在调用前后加上一些操作(上边的就是日志操作而已) ? ? ?package com.itcast.aop;
import java.util.Date;
import java.util.logging.Logger;
//静态代理类
public class HelloProxy implements IHello {
private Logger logger = Logger.getLogger(this.getClass().getName());
private IHello helloObj;
public HelloProxy(IHello helloObj){
this.helloObj=helloObj;
}
public void hello(String name) {
logger.info("method start at "+new Date());
try {
helloObj.hello(name);
} catch (Exception e) {
e.printStackTrace();
}
logger.info("method end at "+new Date());
}
public void helloAaa(String name) {
System.out.println("Hello in aaa"+ name);
}
public void helloBbb(String name) {
System.out.println("Hello in bbb"+ name);
}
//静态代理类的测试方法
public static void main(String[] args){
IHello proxy = new HelloProxy(new HelloSpeaker());
try {
proxy.hello("tester");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2009-3-15 10:57:32 com.itcast.aop.HelloProxy hello
信息: method end at Sun Mar 15 10:57:32 CST 2009