Spring中AOP注解使XML更简洁,在使用注解之前我们需要在XML中配置<aop:aspectj-autoproxy></aop:aspectj-autoproxy>,表示启用注解。
具体看一个实例:
package aop;
public class People {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public void greet(People p)
{
System.out.println(name+".............");
}
}
package aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect//表示注解的类为一个切面
public class Advice {
@Before("execution(* aop.People.greet(..))")
//前置通知并且说明该通知的切点
public void doSomething()
{
System.out.println("hello .......");
}
@After(value="execution(* aop.People.greet(..)) and args(p)",argNames="p")
//后置通知,说明该通知的切点并且给该通知传递参数
public void doSomething2(People p)
{
System.out.println("bye----------------"+p.getName());
}
}
测试:ApplicationContext ac=new ClassPathXmlApplicationContext("aop/bean.xml");
People p=ac.getBean("people", People.class);
p.greet(p);
结果:hello .......
zhangsan.............
bybe----------------zhangsan
通过@PointCut声明切点
package aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect//表示注解的类为一个切面
public class Advice {
@Before("greet2()")//前置通知并且说明该通知的切点
public void doSomething()
{
System.out.println("hello .......");
}
@After(value="greet2()")
//后置通知,说明该通知的切点
public void doSomething2()
{
System.out.println("bybe----------------");
}
@Pointcut(value="execution(* aop.People.greet(People))")
//声明一个切点,该切点就是value的值,greet2()方法相当于切点的ID,用于标示该切点
public void greet2(){}
}