定义的接口
package com.aspectaop;
public interface IUserDao {
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#save()
*/
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#save(java.lang.String)
*/
public abstract void save(String name);
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#update()
*/
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#update()
*/
public abstract String update();
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#doThrow()
*/
public abstract void doThrow();
}
接口实现类,分别定义了传入的参数,返回有参数以及异常等方法
package com.aspectaop;
public class UserDaoImpl implements IUserDao {
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#save()
*/
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#save(java.lang.String)
*/
public void save(String name)
{
System.out.println("这是保存方法!");
}
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#update()
*/
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#update()
*/
public String update()
{
System.out.println("这是更新方法!");
return "这是更新方法返回的值!";
}
/* (non-Javadoc)
* @see com.aspectaop.IUserDao#doThrow()
*/
public void doThrow()
{
throw new RuntimeException("返回了例外!");
}
}
定义切面方法
package com.aspectaop;
import org.aspectj.lang.ProceedingJoinPoint;
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 AspectBean {
@Pointcut("execution(* com.aspectaop.UserDaoImpl.*(..))" )
public void anyWay()
{}
@Before("anyWay() && args(name)")
//这里采取的是args(name)的方法,表示被代理的方法传入的参数,在doValidate中的name要和这个名字对应,
并且这里定义的是String表示只有方法中传入参数类型是STRING的,才会被拦截
public void doValidate(String name)
{
System.out.println("这是事前方法.."+"获得事前方法的参数:"+name);
}
@AfterReturning(pointcut="anyWay()",returning="result")
//这里用returning表示要返回方法的值,然后作为参数传递到doAfterReturning中,注意doAfterReturning中的result也要和returning="result"中的result对应
public void doAfterReturning(String result)
{
System.out.println("这是最终方法.."+"获得最终方法的参数:"+result);
}
@AfterThrowing(pointcut="anyWay()",throwing="e")
//该部分解释和返回值的一致
public void doAfterThrowing(Exception e)
{
System.out.println("例外通知:"+e);
}
@Around("anyWay()")
//环绕通知必须按照以下方法签名来写,除了doAround的这个方法名可以自己定义和pjp这个名字可以自己定义以外,然后执行pjp.proceed()方法才会被执行
public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("执行前");
Object o = pjp.proceed();
System.out.println("执行后");
return o;
}
}