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拦截。
热门文章
优秀文章