前置通知
前置通知
* 在目标类的方法执行之前执行
。
* 配置文件信息:
<aop:before method="before" pointcut-ref="myPointcut3"/>
一、编写业务类
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 java.util.Arrays;
import org.aspectj.lang.JoinPoint;
/**
* Spring的AOP的切面类
* @author http://www.yiidian.com
*
*/
public class MyAspect {
/**
* 前置通知
* JoinPoint:代表当前拦截的方法对象,使用该对象可以获取拦截方法的信息(例如:类名,方法名,方法参数等)
*/
public void before(JoinPoint jp){
System.out.println("执行了前置通知");
System.out.println("代理对象类型:"+jp.getThis().getClass());
System.out.println("拦截的方法名称:"+jp.getSignature().getName());
System.out.println("拦截方法的参数列表:"+Arrays.asList(jp.getArgs()));
}
}
上面的前置通知方法中用的了JoinPoint
参数,以下对这个参数进行简单说明:
AspectJ中的切入点匹配的执行点称作
1、java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
2、Signature getSignature() :获取连接点的方法签名对象;
3、java.lang.Object getTarget() :获取连接点所在的目标对象;
4、java.lang.Object getThis() :获取代理对象本身;
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:
5、java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
6、java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的参数替换原来的参数。
连接点(Join Point)
,在通知方法中可以声明一个JoinPoint类型的参数。通过JoinPoint可以访问连接点的细节。它的常用方法包括:1、java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
2、Signature getSignature() :获取连接点的方法签名对象;
3、java.lang.Object getTarget() :获取连接点所在的目标对象;
4、java.lang.Object getThis() :获取代理对象本身;
ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:
5、java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
6、java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的参数替换原来的参数。
三、配置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="before" pointcut-ref="pt"/>
<!--
aop:pointcut:代表切入点配置
expression:这里配置切入点表达式,用于声明哪些方法需要被拦截
-->
<aop:pointcut expression="execution(public void 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.save("一点教程网");
customerService.update();
}
}
五、运行结果
热门文章
优秀文章