1.0 开发环境
同上一篇文章 Spring 入门实战(四) aop
2.0 准备工作
由于本篇还是基于aop的 所以我们还是基于上节的代码 做一些相应改动即可
2.1 主业务模块 Affairs.java 同上一篇文章
2.2 切面功能类 Function.java
package com.ccut.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Function {
private String fmessage;
private String mmessage;
public Function(){}
public String getFmessage() {
return fmessage;
}
public void setFmessage(String fmessage) {
this.fmessage = fmessage;
}
public String getMmessage() {
return mmessage;
}
public void setMmessage(String mmessage) {
this.mmessage = mmessage;
}
@Pointcut("execution(* com.ccut.aop.Affairs.PersonA())")
public void cut2(){};
//before增强
@Before(value="cut2()")
public void f(){
System.out.println(this.getFmessage());
}
//环绕增强
@Around(value="cut2()")
public void around(ProceedingJoinPoint pj){
System.out.println("在目标函数之前执行");
try {
pj.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println("在目标函数之后执行");
}
}
//after增强
@After(value="cut2()")
public void m(){
System.out.println(this.getMmessage());
}
//返回增强
@AfterReturning(pointcut="execution(* com.ccut..*(..))",returning = "msg")
public void mess(String msg){
System.out.println(msg+" 这是返回后的信息");
}
//异常增强
@AfterThrowing(value="cut2()",throwing="ex")
public void err(Throwable ex){
System.out.println("这个错误是:"+ex);
}
}
2.3 测试类Test.java
package com.ccut.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ccut.aop.Affairs;
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("./resources/aop.xml");
Affairs affairs = (Affairs) applicationContext.getBean("affairs");
affairs.PersonA();
affairs.PersonB();
affairs.getMessage1();
affairs.error();
}
}
2.4 配置文件 aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<aop:aspectj-autoproxy/>
<bean id="affairs" class = "com.ccut.aop.Affairs">
<property name="message1" value="我就是 A 啊 这有什么疑问吗?"/>
<property name="message2" value="我就是 B 啊 这有什么疑问吗?"/>
</bean>
<bean id = "function" class="com.ccut.aop.Function">
<property name="fmessage" value="我可能在你前面执行!"></property>
<property name="mmessage" value="我可能在你后面执行呢!"></property>
</bean>
</beans>
3.0 工程目录
4.0 执行结果
几点说明
- @Aspect 代表这个类是切片类
@Pointcut(“execution(* com.ccut.aop.Affairs.PersonA())”)
public void cut2(){}; 定义切入点为 com.ccut.aop.Affairs.下的PersonA() 方法 切入点的名字叫做cut2,相当于xml中的id@Before(value=”cut2()”) value的值指向切入点id
- @AfterReturning(pointcut=”execution(* com.ccut..*(..))”,returning = “msg”) 除了用value外还可以自定义切入点
- 配置文件中 < aop:aspectj-autoproxy/>代表启用aop注释 这样就不需要在xml配置文件中写代码了