本文转载于 http://blog.csdn.net/a352193394/article/details/7345860
做了很小的改动,可以直接运行,
1.引入 相关jar 有 aspectjrt.jar,aspectjweaver.jar 就行。
所有java文件放在同一个文件夹下。
package studio.aop.test;
public interface PersonServer {
public void save(String name);
public void update(String name, Integer id);
public String getPersonName(Integer id);
}
一个接口实现类
package studio.aop.test;
import studio.aop.test.PersonServer;
public class PersonServiceBean implements PersonServer{
@Override
public void save(String name) {
System.out.println("我是save方法");
// throw new RuntimeException();
}
@Override
public void update(String name, Integer id) {
System.out.println("我是update()方法");
}
@Override
public String getPersonName(Integer id) {
System.out.println("我是getPersonName()方法");
return "xxx";
}
}
使用Spring注解方式对这个Bean进行方法拦截
package studio.aop.test;
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;
/**
* 切面
* @author Bird
*
*/
@Aspect
public class MyInterceptor {
@Pointcut("execution(* studio.aop.test.*.*(..))")
private void anyMethod(){}//定义一个切入点
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println(name);
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfter(){
System.out.println("后置通知");
}
@After("anyMethod()")
public void after(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void doAfterThrow(){
System.out.println("例外通知");
}
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("进入环绕通知");
Object object = pjp.proceed();//执行该方法
System.out.println("退出方法");
return object;
}
}
springaop.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:aspectj-autoproxy/>
<bean id="personServiceBean" class="studio.aop.test.PersonServiceBean"/>
<bean id="myInterceptor" class="studio.aop.test.MyInterceptor"/>
</beans>
测试 文件
package studio.aop.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import studio.aop.test.PersonServer;
public class SpringAOPTest {
public static void main(String[] args) {
//启动Spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("springaop.xml");
//获取service组件
PersonServer service = (PersonServer) context.getBean("personServiceBean");
//以普通的方式调用UserService对象的三个方法
service.save("123");
try {
service.update("234",12);
} catch (Exception e) {
System.out.println("出错信息");
}
}
}
运行,得到如下结果:
两个简单的小例子 下载地址 http://download.csdn.net/detail/qw0907/9783119