简化“基础结构”需求的实现
当你越来越习惯于AspectJ和所配套的工具组时,你就可以用AspectJ来实现影响你应用程序所有部分的需求,包括领域模型。作为一个简单的实例,我将向你介绍如何剖析jpetstore范例的应用程序。让我们首先看一下Profiler方面,然后填入一些外围的细节:
public aspect Profiler { private ProfilingStrategy profiler = new NoProfilingStrategy(); public void setProfilingStrategy(ProfilingStrategy p) { this.profiler = p; } pointcut profiledOperation() : Pointcuts.anyPublicOperation() && SystemArchitecture.inPetStore() && !within(ProfilingStrategy+); Object around() : profiledOperation() { Object token = this.profiler.start(thisJoinPointStaticPart); Object ret = proceed(); this.profiler.stop(token,thisJoinPointStaticPart); return ret; } }
|
我们已经将profiledOperation()定义为[the]PetStore()中的anyPublicOperation()了。该方面表现得就像委托给ProfilingStrategy的控制器,我们将利用依赖注入通过Spring对它进行配置。
class="org.springframework.samples.jpetstore.profiling.Profiler" factory-method="aspectOf">
class="org.springframework.samples.jpetstore.profiling.JamonProfilingStrategy" init-method="reset" destroy-method="report">
|
注意给方面bean使用了“factory-method”属性,这是配置单例(singleton)AspectJ方面和配置一般的Spring bean之间的唯一区别。我正在用JAMon进行剖析,它提供了一个非常简单的API。
public class JamonProfilingStrategy implements ProfilingStrategy { public Object start(StaticPart jpStaticPart) { return MonitorFactory.start(jpStaticPart.toShortString()); } public void stop(Object token, StaticPart jpStaticPart) { if (token instanceof Monitor) { Monitor mon = (Monitor) token; mon.stop(); } } }
|
这就是我们激活适用于整个pet store的剖析所必须做的全部工作。通过将JAMon提供的jsp增加到pet store应用程序,我们就可以在Web浏览器中观看到剖析的输出。以下是我在应用程序周围点击一会之后的屏幕快照: