Spring3开发实战 之 第三章:AOP开发(2)(七)

2014-11-24 08:36:49 · 作者: · 浏览: 4

public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("现在调用的是:"+target.getClass().getName()
+",方法是:"+method.getName() +",参数是:"+args[0]);
}
}
配置文件如下:

java代码:
查看复制到剪贴板打印
< xml version="1.0" encoding="UTF-8" >
http://www.springframework.org/dtd/spring-beans.dtd">





cn.javass.Spring3.aop1.Api




beforeAdvisor



class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">





.*




客户端文件如下:

java代码:
查看复制到剪贴板打印
public class Client {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[] {"applicationContext-1.xml"});
Api api = (Api)ctx.getBean("myIn");
String s = api.t(123);
System.out.println("sssss="+s);
}
}
AOP与设计模式
AOP实际是设计模式的一种扩展,设计模式所追求的是降低代码之间的耦合度,增加程序的灵活性和可重用性,AOP实际上就是设计模式所追求的目标的一种实现。
所谓的分离关注就是将某一通用的需求功能从不相关的类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类 ,只要修改这个行为就可以,从而达到更好的可扩展性和复用性。
AOP包括三个清晰的开发步骤:
1: 功能横切:分解需求提取出横切关注点。

2: 实现分离:各自独立的实现这些关注点所需要完成的功能。

3: 功能回贴:在这一步里,方面集成器通过创建一个模块单元——方面来指定重组的规则。重组过程——也叫织入或结合——则使用这些信息来构建最终系统
AOP与OOP开发的不同关键在于它处理横切关注点的方式,在AOP中,每个关注点的实现都不知道其它关注点是否会‘关注’它,如信用卡处理模块并不知道其它的关注点实现正在为它做日志和验证操作。
应该拦截字段吗?
我们在实现AOP的时候,想要修改某个属性。者通常不是一种好的做法,因为属性通常应该在类的内部进行访问,他体现了类的封装性,如果拦截字段并修改它,那么就会破坏这种封装性。
而拦截方法不会破坏封装性,因为这些方法本身就是能够被外界访问的。 如果确实需要拦截字段,通常的做法是对这个字段定义getXXX和setXXX方法,然后拦截方法,进行相应的操作。
太多的方面?
也许你会认为AOP实在是太强大了,可以到处使用,从而设计出太多的方面,以至于当一个方法被调用时,都难以说清楚究竟执行了哪些代码。
这是很可怕的,“过犹不及”,这是典型的过度设计的毛病。通常情况下,很少有一个对象实例需要5个方面以上。况且过多的方面会影响性能。
在设计的时候,通常如下情况会设计成方面:
(1)大部分模块都需要使用的通用功能,包括系统级或模块级的功能
(2)预计目前的实现,在今后进行功能扩展的可能性很大的地方


正交性
如果多个方面互相影响,造成一些无法预测的结果,该怎么办?多个切入点的功能实现叠加起来,甚至造成错误?
对于这种情况,在设计AOP的时候要特别注意,要遵循连接点的正交模型:不同种类的连接点和不同种类的实现应该能够以任何顺序组合使用。
换句话说,请保持你设计的方面的独立性,功能实现的独立性,不依赖于多个方面的执行先后顺序。
对粗粒度对象使用AOP
AOP通常用来对粗粒度的对象进行功能增强,比如对业务逻辑对象,拦截某个业务方法,进行功能增强,从而提高系统的可扩展性。
注意不要在细粒度的对象上使用AOP,比如对某个实体描述对象。在运行时,这种细粒度对象通常实例很多,比如可能有多条数据,这种情况下,使用AOP,会有大量的方法拦截带来的反射处理,严重影响性能。
作者:jinnianshilongnian