你知道面试必问的 AOP 吗?通过 Spring 又如何实现呢?
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
配置 Aop 代理
编写 aop 实现类
/**
声明切面组件
*/
@Component
@Aspect
public class LogCut {
/**
定义切入点 匹配方法规则定义
匹配规则表达式含义 拦截 com.xxx.service 包下 以及子包下 所有类的所有方法
*/
@Pointcut("execution (* com.xxx.service...(..))")
public void cut(){}
/**
声明前置通知 并将通知应用到定义的切入点上
目标类方法执行前 执行该通知
*/
@Before(value="cut()")
public void before(){
System.out.println("前置通知.....");
}
/**
声明返回通知 并将通知应用到切入点上
目标类方法执行完毕执行该通知
*/
@AfterReturning(value="cut()")
public void afterReturning(){
System.out.println("返回通知....");
}
/**
声明最终通知 并将通知应用到切入点上
目标类方法执行过程中是否发生异常 均会执行该通知 相当于异常中的 finally
*/
@After(value="cut()")
public void after(){
System.out.println("最终通知....");
}
/**
声明异常通知 并将通知应用到切入点上
目标类方法执行时发生异常 执行该通知
*/
@AfterThrowing(value="cut()",throwing="e")
public void afterThrowing(Exception e){
System.out.println("异常通知....方法执行异常时执行:"+e);
}
/**
声明环绕通知 并将通知应用到切入点上
方法执行前后 通过环绕通知定义相应处理
*/
@Around(value="cut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("环绕前置...");
System.out.println("环绕通知");
System.out.println(pjp.getTarget()+"--"+pjp.getSignature());
Object result=pjp.proceed();//执行目标对象方法
System.out.println("环绕后置...");
return result;
}
}
Aop 匹配方法规则表达式语言(简要了解)
Aop 切入点表达式简介
执行任意公共方法:
execution(public *(..))
执行任意的 set 方法
execution(* set*(..))
执行 com.xxx.service 包下任意类的任意方法
execution(* com.xxx.service..(..))
执行 com.xxx.service 包 以及子包下任意类的任意方法
execution(* com.xxx.service...(..))
xml 方式
配置切面、切入点、通知
<aop:aspect ref="logCut">
<aop:pointcut expression="execution (* com.xxx.service...(..))"
id="cut"/>
<!-- 配置前置通知 指定前置通知方法名 并引用切
入点定义 -->
<aop:before method="before" pointcut-ref="cut"/>
<aop:after-returning method="afterReturning" pointcut-ref="cut"/>
<aop:after-throwing method="afterThrowing" throwing="e" pointcut-ref="cut"/>
<aop:after method="after" pointcut-ref="cut"/>
<aop:around method="around" pointcut-ref="cut"/>
</aop:aspect>
</aop:config>
定义 bean
/**
声明切面组件
*/
@Component
public class LogCut {
public void before(){
System.out.println("前置通知.....");
}
评论