在Spring配置文件中,所以AOP相关定义必须放在<aop:config>
标签下,
该标签下可以有<aop:pointcut>
、<aop:advisor>
、<aop:aspect>
标签,配置顺序不可变。
<aop:pointcut>
:用来定义切入点,该切入点可以重用;
<aop:advisor>
:用来定义只有一个通知和一个切入点的切面;
<aop:aspect>
:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的通知和切入点定义是无序的;和advisor的区别就在此,advisor只包含一个通知和一个切入点。
下面的例子是转载别人的,我在这里只是方便我自己学习和使用,添加一些说明。
MyAspect.java
package com.demo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
public void before(JoinPoint jp) {
System.out.println("被代理方法名字:"+jp.getSignature().getName());
System.out.println("被代理方法参数:"+jp.getArgs());
System.out.println("被代理对象:"+jp.getTarget());
System.out.println("现在调用的是权限验证");
}
public void log(JoinPoint jp,Object rvt){
System.out.println("被代理方法名字:"+jp.getSignature().getName());
System.out.println("被代理方法参数:"+jp.getArgs());
System.out.println("被代理对象:"+jp.getTarget());
System.out.println("被代理对象的返回值"+rvt);
System.out.println("现在调用的是日志管理");
}
public void around(ProceedingJoinPoint joinpoint){
try{
System.out.println("begin!");
long start = System.currentTimeMillis();
joinpoint.proceed();//Proceed with the next advice or target method invocation
long end = System.currentTimeMillis();
System.out.println("end! performance took "+(end-start)+" milliseconds");
}catch(Throwable e){
System.out.println("eee!We want our money back!");
}
}
public void after(){
System.out.println("资源已经被释放!");
}
}
UserDao.java
@Component
public class UserDao {
public String save(String name){
System.out.println(name+"被保存");
return "success";
}
}
Test.java
public class Test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("application.xml");
UserDao userDao=(UserDao) context.getBean("userDao");
userDao.save("csdnccccccc");
}
}
application.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 切面 -->
<bean id="myAspect" class="com.demo.aop.MyAspect"></bean>
<bean id="userDao" class="com.demo.aop.UserDao"></bean>
<!-- 切入点 -->
<aop:config>
<aop:aspect id="asp1" ref="myAspect">
<aop:before method="authority" pointcut="execution(* com.demo.aop.UserDao.save(..))" />
<aop:after method="release" pointcut="execution(* com.demo.aop.UserDao.save(..))" />
<aop:after-returning method="log"
pointcut="execution(* com.demo.aop.UserDao.save(..))" returning="rvt" />
<aop:around method="watchPerformance" pointcut="execution(* com.demo.aop.UserDao.save(..))" />
</aop:aspect>
</aop:config>
</beans>