AOP
Spring的灵魂是什么?AOP和IOC!
AOP全称(Aspect-Oriented Programming),面向切面编程,是一种新的方法论, 是对传统OOP(Object-Oriented Programming, 面向对象编程) 的补充。
面向对象通俗来说就是面对类吧,那么为什么AOP面向的是什么?什么是切面?
如上图所示,以整个核心业务逻辑的地方横切过去一分为二
这样一来我们就可以把验证和日志封装到一起,只关注于最核心的加减乘除的业务逻辑。
是不是很抽象?上例子
简单示例
接口Operation
//纳入IOC容器管理
@Component
public interface Operation {
public double oper(double num1,double num2);
}
加法实现类
//纳入IOC容器管理
@Component
public class Add implements Operation{
public double oper(double num1, double num2) {
double res = num1+num2;
System.out.println("正在计算...");
return res;
}
}
切面类
@Component
//表示这个一个切面类
@Aspect
public class OperationAspect {
//@Befor表示在执行核心逻辑之前的方法,记得切入点表达式
@Before("execution(* Add.oper(..))")
public void before(){
System.out.println("记得检查是否是数字哦");
}
//@AfterReturning表示在返回结果后执行的方法
@AfterReturning("execution(* Add.oper(..))")
public void after(){
System.out.println("计算结束");
}
}
这个切面类就可以理解成将刚刚的验证参数、前置日志、后置日志封装在一起,提高了代码的复用性,不用每次执行加减时都需要验证或者日志。
测试:
public class TestAdd {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Operation add = (Operation) ctx.getBean("add");
System.out.println(add.oper(2,5));
}
}
为什么7.0在最后而不是“计算结束”在最后?
因为其实打印7.0这个语句是在所有方法之后了,看之前写在Add实现类中的打印“正在计算中”就知道,“计算结束”这个方法确实是在执行加法并返回结果之后执行了。
如果还是有点懵,建议去看下设计模式中的代理模式
不嫌弃的话可以看看本人的拙作-----羊村往事与代理模式