什么是AOP
OOP(面向对象编程)提供“从上到下”的关系,而AOP(面向方面编程)提供一种“横切”的方式,也可以说是“从左到右”。
简单来说就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
实例
可能光是说AOP的定义,大家都不太能理解。
举个例子,比如日志功能,实现这个功能的代码可能是很多类所需要的功能之一,但是如果我们在每一个类里都重复添加实现日志功能的代码,将会有很多重复代码。
上代码(代码参考https://blog.csdn.net/JinXYan/article/details/89302126
)
/**
* @description: 业务类
*/
public class Calculator {
public int add(int i, int j) {
System.out.println("加法");
return i + j;
}
public int sub(int i, int j) {
System.out.println("减法");
return i - j;
}
public int mul(int i, int j) {
System.out.println("乘法");
return i * j;
}
public int div(int i, int j) {
System.out.println("除法");
return i / j;
}
}
通过切入点,把业务类Calculator
“横向”切开,这样很好的把业务类和日志类解耦。
/**
* @description: 日志切面类,
*/
@Aspect
public class LogAspects {
//切入点
@Pointcut("execution(public int Calculator.*(..))")
public void pointCut(){};
//代表在目标方法执行前切入, 并指定在哪个方法前切入
@Before("pointCut()")
public void logStart(){
System.out.println("@Before");
}
//代表在目标方法运行结束之后 ,不管有没有异常
@After("pointCut()")
public void logEnd(){
System.out.println("@After");
}
//代表在目标方法正常返回值后运行
@AfterReturning("pointCut()")
public void logReturn(){
System.out.println("@AfterReturning");
}
//代表在目标方法出现异常后运行
@AfterThrowing("pointCut()")
public void logException(){
System.out.println("@AfterThrowing");
}
//动态代理,手动执行joinPoint.procced方法(程序执行过程中明确的点,一般指方法的调用)
//简单的来说就是,在目标方法执行之前是前置通知,在目标方法执行之后是后置通知
@Around("pointCut()")
public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("@Around:执行目标方法之前...");
Object obj = proceedingJoinPoint.proceed();
System.out.println("@Around:执行目标方法之后...");
return obj;
}
}
/**
* @description: 配置类
*/
@Configuration
@EnableAspectJAutoProxy
public class Config {
@Bean
public Calculator calculator(){
return new Calculator();
}
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
测试一下
public class test {
public static void main(String[] args) {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(Config.class);
Calculator c = app.getBean(Calculator.class);
c.add(2, 3);
}
}