Java类通过继承机制可以纵向抽象出一些共用的代码,减少程序的代码量。AOP(面向切面编程)解决的是横向抽象的问题,把业务逻辑从一些非常“固定”的代码中抽取出来(例如:开启、关闭事务;开启、关闭监控等)。
一个类或者程序具有一些边界性质的特定点(例如类中的方法),叫做连接点(JoinPoint)。AOP通过“切点”(PointCut)来定位特定的连接点。
增强(Advice)是织入目标类连接点上的一段代码,除了描述代码外还包含用于定位连接点的方位信息。目标对象(Target)是增强逻辑织入的目标类。引介(Introduction)是一种特殊增强,为类增加一些属性和方法。
织入(Weaving)是将增强添加到目标类的具体连接点上的过程,包括编译期织入、类装载期织入、动态代理织入。一个类被织入增强后,就产生一个结果类,融合原类和增强逻辑的代理(Proxy)类。
切面(Aspect)由切点和增强(引介)组成。
AOP的工作包括: 如何通过切点和增强定位到连接点上;如何在增强中编写切面的代码。AOP的实现者包括 AspectJ、Spring AOP等。
spring AOP有两种代理机制,一种是基于JDK的动态代理,一种是基于CGLib的动态代理。下面使用一种简单的方式实现,ForumServiceImpl.java
public class ForumServiceImpl implements ForumService {
public void removeTopic(int topicId) {
PerformanceMonitor.begin("com.smart.proxy.ForumServiceImpl.removeTopic");
System.out.println("模拟删除Topic记录:" + topicId);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
PerformanceMonitor.end();
}
public void removeForum(int forumId) {
PerformanceMonitor.begin("com.smart.proxy.ForumServiceImpl.removeForum");
System.out.println("模拟删除论坛" + forumId);
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
PerformanceMonitor.end();
}
}
运行业务代码时,需要添加PerformanceMonitor的begin和end方法,破坏了业务完整性,可以使用代理方法来实现抽取业务逻辑。
网友评论