什么是面向切面?
面向切面是面向对象的补充,怎么理解呢?在程序的功能中可以分为两类:核心功能(登陆、注册、增删改等)、辅助功能(日志、性能统计、事务管理)。辅助功能就是在面向对象编程思想中就被定义为切面,你可以理解为一个横切面,几乎每个核心功能都会涉及到。
例如:核心功能不依赖于辅助功能就能够运行,但是辅助功能的加入会使得我们的程序更容易维护、管理,所以面向切面是面向对象的补充,使得程序更加的完整、可维护。
切面编程(简单实践)
第一步:编写业务类
public void doSomeService() {
for (long i = 0;; i++) {
if (i == 1000) {
break;
} else {
System.out.println("this is" + i);
continue;
}
}
System.out.println("结束循环");
}
第二步:编写切面类
public class Aspect {
public Object asp(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("方法start:" + joinPoint.getSignature().getName());
long start = System.currentTimeMillis();
Object object = joinPoint.proceed();
long end = System.currentTimeMillis();
System.out.println("方法end:" + joinPoint.getSignature().getName());
System.out.println("执行了多长时间" + (end - start));
return object;
}
}
第三步:添加切面配置
将以下配置代码添加到applicationContext.xml文件中
<!-- 将业务类注入到spring容器 -->
<bean id="s" class="spring.ProductService"></bean>
<!-- 将切面类注入到spring容器 -->
<bean id="aspect" class="spring.Aspect"></bean>
<aop:config>
<!--设置切入点 -->
<aop:pointcut
expression="execution(* spring.ProductService.*(..))" id="Cutpoint" />
<!-- 设置切面 -->
<aop:aspect id="testAspect" ref="aspect">
<aop:around method="asp" pointcut-ref="Cutpoint" />
</aop:aspect>
</aop:config>
第四步:编写测试类
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
ProductService s = (ProductService) applicationContext.getBean("s");
s.doSomeService();
}
测试结果:
为了能看到实际输出的语句,我将循环次数减少到了10次。
方法start:doSomeService
this is0
this is1
this is2
this is3
this is4
this is5
this is6
this is7
this is8
this is9
结束循环
方法end:doSomeService
执行了多长时间1
通过输出语句我们可以看到在调用方法时触发了切入点,然后就会进入到切面类中输出方法start,接着运行方法本身的方法,在方法结束后又回到了切面类中输出方法end。
面向切面编程使得核心功能和辅助功能可以分开独立开发,然后再通过配置来让它们交织在一起。
面向切面编程有什么用?
①性能监测:可以通过切面来记录调用业务方法的时间消耗,以此来作为优化代码的参考标准。
②日志记录:对于重要的方法调用,在适当位置进行切面记录日志使得后期更容易维护和定位错误。
③事务管理:有的方法在执行过程中需要加入到事务管理,也可以通过切面编程来完成。