面试:解释一下什么是AOP
在java面试过程中SSM是必修课(Spring,SpringMVC,MyBatis),而Spring中AOP就是一个面试高频考点,他是Spring特性之一即为面向切面编程。很多人当看到AOP叫面向切面编程,脑子中第一反应这是什么玩应,这么抽象,下面我就举一个小例子为大家解释一下。
打个比方我们正在做一个银行之类的项目,比如存钱、取钱加上手续费就是这个项目的核心代码
而存钱取钱还有手续费的扣除这些业务功能可以说是同步的,在这里我们可以加上一些事务,取钱不成功的话
就让事务回滚,以至于不能出现钱取出来而余额没有扣除。所以每个核心代码都要加上事务功能,这就造成了代码重复问题
所以这里我们就可以用上aop,提高开发效率。
而aop就会涉及到一些概念:
1、切面(Aspect):就是共有功能的实现,比如加上日志切面,事务切面,就是一个java的类
@Aspect //在类的上面加上这个注解在有Spring容器管理代表他就是切面类
public class Log {
2、通知(Advice):就是切面的具体表现,可以放在不同的位置,通俗点说就是把通知(也就是事务)加入你想的业务代码上
//前置通知
@Before(value = "execution(* com.ma.mapper.*.*(..))")
public static void Before() {
System.out.println("前置方法。。。");
}
//后置通知(最终通知)
@After(value = "execution(* com.ma.mapper.*.*(..))")
public static void After() {
System.out.println("后置方法");
}
//返回通知 returning:指定返回参数
@AfterReturning(returning = "res",value = "execution(* com.ma.mapper.*.*(..))")
public static void afterReturning(Object res) {
System.out.println("有返回值的方法..."+"返回值是="+res);
}
//异常通知:有异常是执行
@AfterThrowing(value = "execution(* com.ma.mapper.*.*(..))")
public static void afterThrowing() {
System.out.println("异常的方法...");
}
//环绕通知:根据切入点的具体方法是否有返回值来确定环绕通知是否有返回值
@Around(value = "execution(* com.ma.mapper.*.*(..))")
public static Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕通知前...");
//执行目标方法
Object proceed = proceedingJoinPoint.proceed();
System.out.println("环绕通知后...");
return proceed;
}
3、连接点(Joinpoint):是程序在运行过程中能够插入切面的地点
4、切入点(Pointcut):用于定义通知应该切入到那些连接点上,不同的通知能切入到不同的点,通俗点说就是把通知(也就是事务)加入你想的业务代码上
//切入点表达式的语法结构是: execution( 方法访问权限 方法返回值 包名+类名+方法名(参数类型列表) )
@Around(value = "execution(* com.ma.mapper.*.*(..))")
5、目标对象:被加入通知的对象,这些对象中只有干干净净的核心代码了
6、代理对象:通知加入对象之后动态创建的对象
7、织入:就是把切面类加入到目标对象所创建新代理对象的过程就是织入
而上述的代码是解释aop的术语,当然面试的时候把aop概念用一些举例来表达出来,融汇贯通这样更好。我们的aop中用到了动态代理在面试当中点出来这样更好,两种动态代理在我上一篇博客中,有需要的可以看一看。

1万+

被折叠的 条评论
为什么被折叠?



