环境搭建
需要spring-aop,这里没有标明,需要可以看上一篇开发环境搭建里面有spring-aop相关的dependency
基于springframework的环境下,需要额外的jar包
<!-- aop -->
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
在spring配置文件(xml)中添加
<!-- aop,aspectJ的支持 -->
<aop:aspectj-autoproxy />
建立测试代码
新建用于被代理的类和接口
接口
public interface IModel {
/**
* 默认方法
*/
public abstract void doSome();
/**
* 有返回值的方法
*/
public abstract String doSomeReturn();
/**
* 抛出异常的方法
*/
public abstract void doSomeThrow() throws Exception;
/**
* 一个参数的方法
*/
public void doSomeParm(String name);
/**
* 两个参数的方法
*/
public void doSomeParm(String name, int age);
}
实现类
@Repository//交由spring管理
public class AopModel implements IModel {
/*
* (non-Javadoc)
*
* @see springAop.model.IAspect#doSome()
*/
public void doSome() {
System.out.println("do something..");
}
/*
* (non-Javadoc)
*
* @see springAop.model.IAspect#doSomeReturn()
*/
public String doSomeReturn() {
System.out.println("do some and return");
return "test";
}
/*
* (non-Javadoc)
*
* @see springAop.model.IAspect#doSomeThrow()
*/
public void doSomeThrow() throws Exception {
throw new Exception("something is wrong");
}
//
public void doSomeParm(String name) {
System.out.println("name : " + name);
}
//
public void doSomeParm(String name, int age) {
System.out.println("name : " + name + "," + age);
}
}
切面类
@Aspect//表示这个是一个切面类
@Repository//交由spring管理
public class Aspectlogic {
// 切入点(IModel的所有方法)
/*
匹配格式:public * *..IModel.*(..)
public : 定义方法作用域
第一个* : 表示返回值类型
*..IModel.* : 匹配所有包下的IModel接口中的所有方法
(..) : 方法的参数为任意个
@PointCut : 定义一个切点,可以在其他通知中直接使用方法名代表切入点
*/
@Pointcut("execution(public * *..IModel.*(..))")
public void point() {
}
// 在切入点的方法执行前执行
// JoinPoint 用来获取切入方法的名称参数等(可以省略)
//比如: execute(){}
@Before("point()")
public void execute(JoinPoint point) {
Object[] objs = point.getArgs();
System.out.println(objs.length + "before-------");
System.out.println("Before ............" + point);
}
// 筛选方法带参数的
// value中的args的名字需要和argNames相同
@Before(argNames = "name", value = "point() && args(name)")
public void executeOneParm(String test) {
System.out.println("before :" + test + ",");
}
// 筛选方法带参数的
@Before(argNames = "name,age", value = "point() && args(name) && args(age)")
public void executeParm(String name, int age) {
System.out.println("before :" + name + "," + age);
}
// 返回后执行
@AfterReturning(pointcut = "point()", returning = "result")
public void executeReturn(String result) {
System.out.println("after return " + result);
}
// 抛出异常后
@AfterThrowing(pointcut = "point()", throwing = "e")
public void executeThrow(Exception e) {
System.out.println("after throws");
System.out.println(e.getMessage());
}
// 声明环绕通知
@Around("point()")
public Object doAround(ProceedingJoinPoint pjp) {
System.out.println("环绕方法执行");
// 显示调用,确保被代理的方法被调用
Object o = null;
try {
o = pjp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果不try,那么抛出异常后,后面的方法将不会继续执行
System.out.println("环绕方法执行完毕");
return o;
}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "file:src/test/java/springAop/spring-root.xml")
public class SpringAopTest {
private IModel aopModel;
public IModel getAopModel() {
return aopModel;
}
@Autowired
@Qualifier("aopModel")
public void setAopModel(IModel aopModel) {
this.aopModel = aopModel;
}
@Test
public void testDoSome() throws Exception {
aopModel.doSomeParm("test");
}
}
测试结果