什么是面向切面?

面向切面是面向对象的补充,怎么理解呢?在程序的功能中可以分为两类:核心功能(登陆、注册、增删改等)、辅助功能(日志、性能统计、事务管理)。辅助功能就是在面向对象编程思想中就被定义为切面,你可以理解为一个横切面,几乎每个核心功能都会涉及到。

例如:核心功能不依赖于辅助功能就能够运行,但是辅助功能的加入会使得我们的程序更容易维护、管理,所以面向切面是面向对象的补充,使得程序更加的完整、可维护。

切面编程(简单实践)

第一步:编写业务类

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。

面向切面编程使得核心功能和辅助功能可以分开独立开发,然后再通过配置来让它们交织在一起。

面向切面编程有什么用?

①性能监测:可以通过切面来记录调用业务方法的时间消耗,以此来作为优化代码的参考标准。

②日志记录:对于重要的方法调用,在适当位置进行切面记录日志使得后期更容易维护和定位错误。

③事务管理:有的方法在执行过程中需要加入到事务管理,也可以通过切面编程来完成。