Spring AOP
AOP
在一个服务的流程中插入与业务逻辑无关的系统服务逻辑(例如 Logging 、 Security ) , 这样的逻辑称为Cross-cutting concerns,将Crossing-cutting concerns独立出来设计为一个对象,这样的特殊对象称之为Aspect,Aspect-oriented programming着重在Aspect的设计及与应用程序的织入(Weave),以上各式各样与AOP相关的名词,在这个章节中都将获得解释。
AOP跟OOP(Object-oriented programming)并不相互抵触,它们是可以相辅相成的两个设计模型,Spring AOP是实现AOP的一种技术,而spring AOP也是Spring中一些子框架或子功能所依赖的核心.
从代理机制初探 AOP
从代理机制初探 AOP
记录的这几行程序代码横切入(Cross-cutting ) HelloSpeaker类中,对于HelloSpeaker来说记录的这几个动作并不属于HelloSpeaker业务逻辑(显示”Hello “等文字),这使得HelloSpeaker增加了额外的职责。
如果需要的服务(Service)不只有记录动作,有一些非对象本身职责的相关动作也混入了对象之中(例如权限检查、事务管理等等),会使得对象的负担进一步加重,甚至混淆了对象本身该负有的职责,对象本身的职责所占的程序代码,或许还小于这些与对象职责不相关的动作或服务的程序代码。另一方面,使用以上的写法,若有一日不再需要日志记录(或权限检查、事务管理等)的服务,那么将需要修改所有留下记录动作的程序代码,您无法简单地将这些相关服务从既有的程序中移去。
静态代理
public interface IHello {
public void hello(String name);
}
public class HelloSpeaker implements IHello {
public void hello(String name) {
("Hello, " + name);
}
}
静态代理
public class HelloProxy implements IHello {
private Logger logger = (().getName());
private IHello helloObject;
public HelloProxy(IHello helloObject) {
= helloObject;
}
public void hello(String name) {
// 记录服务
log("hello method starts....");
// 执行业务逻辑
(name);
// 记录服务
log("hello method ends....");
}
private void log(String msg) {
(, msg);
}
}
静态代理
package ;
public class ProxyDemo {
public static void main(String[] args) {
HelloProxy proxy =
new HelloProxy(new HelloSpeaker());
("Justin");
}
}
静态代理
这是静态代理的基本范例,然而如您所看到的,代理对象的一个接口只服务于一种类型的对象,而且如果要代理的方法很多,势必要为每个方法进行代理,静态代理在程序规模稍大时就无法胜任,在这边介绍静态代理的目的,是在让您了解代理的基本原理。
动态代理
public class LogHandler implements InvocationHandler {
private Logger logger = (().getName());
private Object delegate;
public Object bind(Object delegate) {
= delegate;
return ( deleg
Spring AOP 来自淘豆网m.daumloan.com转载请标明出处.