环绕通知
环绕通知
* 方法的执行前后执行。
* 配置文件信息:
<aop:around method="around" pointcut-ref="myPointcut2"/>
需求:利用环绕通知来模拟业务层方法做事务管理。
一、编写业务类
CustomerService:
package com.yiidian.service;
/**
* @author http://www.yiidian.com
*
*/
public interface CustomerService {
public void save(String name);
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(String name) {
System.out.println("执行save方法,name为:"+name);
}
@Override
public void update() {
System.out.println("执行update方法");
}
}
二、编写切面类,添加环绕通知方法
package com.yiidian.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* Spring的AOP的切面类
* @author http://www.yiidian.com
*
*/
public class MyAspect {
/**
* 环绕通知
* ProceedingJoinPoint:
*/
public void afterThrowing(ProceedingJoinPoint pjp){
System.out.println("开启事务");
//调用目标对象方法
try {
pjp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("提交事务");
}
}
Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要,这个是aop代理类方法被执行的方法。暴露出这个方法,就能支持 aop:around 这种切面(而其他的几种切面只需要用到JoinPoint,这跟切面类型有关), 能决定是否走代理类的方法还是走自己拦截的其他逻辑。
三、配置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:around:这个是环绕通知配置
-->
<aop:around method="afterThrowing" pointcut-ref="pt"></aop:around>
<aop:pointcut expression="execution(public * com.yiidian.service.impl.CustomerServiceImpl.*(..))" id="pt"/>
</aop:aspect>
</aop:config>
</beans>
四、编写测试类
package com.yiidian.test;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.yiidian.service.CustomerService;
/**
* @author http://www.yiidian.com
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
@Resource
private CustomerService customerService;
@Test
public void test1(){
customerService.update();
}
}
五、运行结果
热门文章
优秀文章