Spring学习笔记-04.Spring AOP的使用

AOP的使用


所谓AOP的思想是现在程序设计中常用的一种设计思想,主要是为了能够更好的监控程序的运行的情况。 在Spring中AOP的思想展现的淋漓尽致。

实现一个简单的AOP。

1
2
3
4
5
6
7
8
@Component
public class OrderBiz {

public void doSomething(int x, int y) {
System.out.println(x + y);
}
}

增加一个AOP的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Aspect
public class LogAspector {

//此处是一个入口,定义为OrderBiz的所有方法
@Pointcut("execution(public void learnJava.spring.sprz05.OrderBiz.*(..))")
public void pointCut(){}

@Before("pointCut()")
public void logStart(JoinPoint joinPoint) {
System.out.println(joinPoint);
RzLogger.info("方法开始执行....");
}

@After("pointCut()")
public void logEnd() {
RzLogger.info("方法执行完成....");
}

@AfterReturning("pointCut()")
public void logReturn() {
RzLogger.info("方法执行结束返回数据....");
}
@AfterThrowing(value = "pointCut()",throwing = "ex")
public void logException(Exception ex) {
RzLogger.info("方法执行异常....");
RzLogger.error(JsonUtils.serializeObject(ex));
}

@Around("pointCut()")
public Object process(ProceedingJoinPoint joinPoint) throws Throwable {
RzLogger.info("Around开始");
Object proceed = joinPoint.proceed();
RzLogger.info("Around结束");
return proceed;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
@EnableAspectJAutoProxy //不可缺少
public class ConfigMain {

@Bean
public OrderBiz getOrderBiz(){
return new OrderBiz();
}

@Bean
public LogAspector getLogAspector(){
return new LogAspector();
}
}


主方法的调用

1
2
3
4
5
6
7
public static void main(String[] args) {

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConfigMain.class);
OrderBiz bean = applicationContext.getBean(OrderBiz.class);
bean.doSomething(1, 3);

}

代码执行结果:

1
2
3
4
5
6
7
8
20:12:44,753  INFO [main] (RzLogger.java:12) - Around开始
execution(void learnJava.spring.sprz05.OrderBiz.doSomething(int,int))
20:12:44,758 INFO [main] (RzLogger.java:12) - 方法开始执行....
4
20:12:44,773 INFO [main] (RzLogger.java:12) - Around结束
20:12:44,773 INFO [main] (RzLogger.java:12) - 方法执行完成....
20:12:44,773 INFO [main] (RzLogger.java:12) - 方法执行结束返回数据....