/**
* 切面类
*/
@Aspect//告诉spring这是一个切面类
public class LogAOP {
@Pointcut(value = "execution(public * com.it.aop.MyAop.*(..))")
public void point(){}
@Before("point()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(joinPoint.getSignature().getName()+"方法运行了,参数列表是:["+ Arrays.asList(args)+"]");
}
@After("point()")
public void logEnd(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName()+"方法结束");
}
@AfterReturning(value = "point()",returning = "result")
public void logReturn(JoinPoint joinPoint, Object result){
System.out.println(joinPoint.getSignature().getName()+"方法正常返回,返回值["+result+"]");
}
@AfterThrowing(value = "point()", throwing = "exception")
public void logException(JoinPoint joinPoint, Exception exception){
System.out.println(joinPoint.getSignature().getName()+"方法出现异常,异常信息:["+exception.getMessage()+"]");
}
}
@Aspect:告诉spring这是一个切面类
@Pointcut:抽取公共的切入点表达式,如果是其他类使用需要写全方法名,本类使用就写方法名
@Before:在目标方法执行前运行
@After:在目标方法执行结束后运行
@AfterReturning:在目标方法正常返回后执行
@AfterThrowing:在目标方法发生异常后执行
2. 编写一个测试AOP的类
public class MyAop {
public int div(int i, int j){
System.out.println("div方法开始执行");
return i/j;
}
}
这个类用于测试切面类是否能成功切入目标方法
3.将切面类和测试类都注册到IOC容器中,同时开启基于注解的AOP模式
@EnableAspectJAutoProxy//开启基于注解的aop模式
@Configuration
public class MainConfigAOP {
@Bean
public MyAop myAop(){
return new MyAop();
}
@Bean
public LogAOP logAOP(){
return new LogAOP();
}
}
public class AppTest
{
/**
* Rigorous Test :-)
*/
// ApplicationContext ioc = new AnnotationConfigApplicationContext(MainConfigAOP.class);
@Test
public void shouldAnswerWithTrue()
{
// MyAop bean = ioc.getBean(MyAop.class);
MyAop bean = new MyAop();
bean.div(1,1);
}
}