Spring: aspectJ

2014-11-24 02:08:54 · 作者: · 浏览: 0

AspectJ配置详解:

  

  

		
     
        
   
    aspectj-autoproxy /> 
   
    


注解切面:
@Aspect
public class MyInterceptor {
	@Pointcut("execution (* cn.itcast.service.impl.PersonServiceBean.*(..))")
	private void anyMethod() {}//声明一个切点,anyMethod无任何意义,只是供注解依附
	
	@Before("anyMethod() && args(name)")
	public void doAccessCheck(String name) {
		System.out.println("前置通知:"+ name);
	}
	@AfterReturning(pointcut="anyMethod()",returning="result")
	public void doAfterReturning(String result) {
		System.out.println("后置通知:"+ result);
	}
	@After("anyMethod()")
	public void doAfter() {
		System.out.println("最终通知");
	}
	@AfterThrowing(pointcut="anyMethod()",throwing="e")
	public void doAfterThrowing(Exception e) {
		System.out.println("例外通知:"+ e);
	}
	
	//环绕通知
	@Around("anyMethod()")
	public Object doBasicProfiling(ProceedingJoinPoint joinpoint) throws Throwable {
		System.out.println("进入方法");
		Object result = joinpoint.proceed();
		System.out.println("退出方法");
		return result;
	}
}


传递参数给所标注的通知
@Aspect
public class Magician implements MindReader{
	private String thoughts;

	//设置切点参数类型String 和参数thoughts
	@Pointcut("execution(* com.springinaction.springidol.Thinker.thinkofsomething(String)) && args(thoughts)")
	public void thinking(String thoughts){
	}

	@Before("Thinking(thoughts)")//拦截切点的参数
	public void interceptThoughts(String thoughts){
		this.thoughts = thoughts;
	}

	public String getThoughts(){
		return thoughts;
	}
}


用注解给切点添加新功能:
@Aspect
public class ContestantIntroducer{
	
	@DeclareParents(
		value="com.springinaction.springidol.Performer+",
		defaultImpl=GraciousContestant.class)
	public static Contestant contestant;
}

Performer是切点,GraciousContestant是新增功能,contestant是接口,GraciousContestant是实现