日期:2014-05-20  浏览次数:20868 次

springframework【5】

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、一个实现接口的实例

?

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);
	}
}

?

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();
	}
}
}

?

上边就是我们的静态代理类,代理了我们IHello接口的实现类,并加上了自己的日志输出,在IHello的实现类的hello方法每次被调用的时候,都会被在其前后加上日志。

结果如下:

信息: method start at Sun Mar 15 10:57:31 CST 2009
2009-3-15 10:57:32 com.itcast.aop.HelloProxy hello
信息: method end at Sun Mar 15 10:57:32 CST 2009

以上就是静态代理,原理很简单,目的也很简单,就是调用接口实现类的某个方法之前或者之后调用另外的操作。

总结下开发步骤:

?1、创建一个接口

?2、创建一个接口的实现类

?3、创建一个代理类,这个代理类也实现了上边的接口,但是将 要被代理的实现类传入到代理类中,在代理类的接口实现方法中调用,并在调用前后加上一些操作(上边的就是日志操作而已)

?

?

?