基于AspectJ的SpringAOP的HelloWorld


本教程将开始制作一个SpringAOP的HelloWorld,我们先以XML方式配置AOP。

一、导入Spring-AOP支持包

其中:

aopalliance.jar

aspectjrt.jar

aspectjweaver.jar

这三个包不属于Spring自身jar包,他们属于AspectJ技术。下面简单介绍Spring与AspectJ的关系:

Spring AOP 与ApectJ 的目的一致,都是为了统一处理横切业务,但与AspectJ不同的是,Spring AOP 并不尝试提供完整的AOP功能(即使它完全可以实现),Spring AOP 更注重的是与Spring IOC容器的结合,并结合该优势来解决横切业务的问题,因此在AOP的功能完善方面,相对来说AspectJ具有更大的优势,同时,Spring注意到AspectJ在AOP的实现方式上依赖于特殊编译器(ajc编译器),因此Spring很机智回避了这点,转向采用动态代理技术的实现原理来构建Spring AOP的内部机制(动态织入),这是与AspectJ(静态织入)最根本的区别。在AspectJ 1.5后,引入@Aspect形式的注解风格的开发,Spring也非常快地跟进了这种方式,因此Spring 2.0后便使用了与AspectJ一样的注解。请注意,Spring 只是使用了与 AspectJ 5 一样的注解,但仍然没有使用 AspectJ 的编译器,底层依是动态代理技术的实现,因此并不依赖于 AspectJ 的编译器。

二、编写业务类

CustomerService:

package com.yiidian.service;
/**
 * @author http://www.yiidian.com
 *
 */
public interface CustomerService {

	public void save();
	
	public void update();
}

 CustomerServiceImpl(目标类):

package com.yiidian.service.impl;

import com.yiidian.service.CustomerService;
/**
 * 这个类在AOP属于目标对象(Target)
 * @author http://www.yiidian.com
 *
 */
public class CustomerServiceImpl implements CustomerService {

	@Override
	public void save() {
		System.out.println("执行save方法");
	}

	@Override
	public void update() {
		System.out.println("执行update方法");
	}

}

三、编写切面类(重点)

package com.yiidian.aspect;

/**
 * Spring的AOP的切面类
 * @author http://www.yiidian.com
 *
 */
public class MyAspect {

	/**
	 * 通知方法
	 */
	public void writeLog(){
		System.out.println("使用spring的AOP切入日志...");
	}

}

四、配置applicationContext.xml(重点)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">

	<!-- 基于AspectJ的spring的AOP编写之XML方式 -->
	
	<!-- 1.创建目标对象 -->
	<bean id="customerService" class="com.yiidian.service.impl.CustomerServiceImpl"/>
	
	<!-- 2.创建切面类对象 -->
	<bean id="myAspect" class="com.yiidian.aspect.MyAspect"/>
	
	<!-- 3.配置AOP切面 -->
	<aop:config>
		<!-- 切面 = 通知+切入点 -->
		<aop:aspect ref="myAspect">
			<!-- 
				aop:before: 代表前置通知(后面会详细介绍各种不同类型的通知的用法)
				writeLog: 该方法为MyAspect类中的writeLog方法
				pointcut-ref: 代表引用一个切入点
			 -->
			<aop:before method="writeLog" pointcut-ref="pt"/>
			<!-- 
				aop:pointcut:代表切入点配置
				expression:这里配置切入点表达式,用于声明哪些方法需要被拦截
			 -->
			<aop:pointcut expression="execution(public void com.yiidian.service.impl.CustomerServiceImpl.*())" id="pt"/>
		</aop:aspect>
	</aop:config>
	
</beans>

五、运行结果

可以看到save和update方法成功被Spring-AOP拦截。

 

源码下载:http://pan.baidu.com/s/1i4Sbyw1