摘要:Spring AOP ,从代理机制看AOP,静态代理的范例。
在一个服务的流程中插入与业务逻辑无关的系统服务逻辑(比如 Logging、Security),这样的逻辑称为Cross-cutting concerns,将Cross-cutting concerns独立出来设计为一个对象,这样的特殊对象称之为Aspect,Aspect-oriented programming着重在Aspect的设计及与应用程序的织入(Weave)。
●
静态代理
在静态代理的实现中,代理对象与被代理对象都必须实现同一个接口,在代理对象中可以实现日志记录等相关服务,并在需要的时候再呼叫被代理的对象,如此代理对象当中就可以仅保留业务相关职责。
●
IHello.java
package com.kela.spring.aop;
public interface IHello {
public void hello(String name);
}
●
HelloSpeaker.java
package com.kela.spring.aop;
public class HelloSpeaker implements IHello {
public void hello(String name) {
System.out.println("
你好," + name);
}
}
●
HelloProxy.java
package com.kela.spring.aop;
import org.apache.log4j.Logger;
public class HelloProxy implements IHello {
private Logger log = Logger.getLogger(this.getClass().getName());
private IHello helloObject;
public HelloProxy(IHello helloObject) {
this.helloObject = helloObject;
}
public void hello(String name) {
//
日志记录
log.info("hello
方法开始执行... ...");
//
执行业务逻辑
helloObject.hello(name);
//
日志记录
log.info("hello
方法执行完毕");
}
}
●
ProxyDemo.java
package com.kela.spring.aop;
public class ProxyDemo {
public static void main(String[] args) {
HelloProxy proxy = new HelloProxy(new HelloSpeaker());
proxy.hello("KELA");
}
}
●
运行结果
HelloProxy - hello
方法开始执行
... ...
你好,
KELA
HelloProxy - hello
方法执行完毕
●
学习小结
静态代理中,代理对象的一个接口只服务于一种类型的对象,而且如果要代理的方法很多,势必要为每个方法进行代理,静态代理在程序规模稍大时就无法胜任。