AOPxml说明
<aop:config> 来声明要对 aop 进行配置
<aop:pointcut> 它是用于声明切点(简单说就是对哪些方法进行拦截)
<aop:advisor> 定义传统的 aop 的切面,传统的 aop 切面它只能包含一个切点与一个增强
<aop:aspect> 定义 aspectj 框架的切面.,它可以包含多个切点与多个通知
如果切面代码是自动注入的bean,那么<aop:aspect>的ref属性直接写bean的注入名字就可以了!
<aop:scoped-proxy/> 范围代理
Spring中默认的Scope分为”singleton”和”prototype”两种。
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> 自动代理
proxy-target-class属性若此值为true强制使用CGLIB代理;
expose-proxy属性是为了目标对象内部的自我调用无法实施切面中增加
AOPXml简单配置
<!-- 1.启动Spring注解 -->
<context:annotation-config/>
<!-- 2.扫描 -->
<context:component-scan base-package="com.shxt"/>
<!-- 3.启动AOP注解 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
切入类 注意必须加@componet否则不能注入bean
@Component
@Aspect
public class LogAnnotationAspect {
/*
execution(* com.boolib.web.*.*(..))
第一个*的位置: 任意的返回值类型
第二个.. 任意层次 com.shxt开头 service结尾 的任意层次
第三个位置 *Service监控 Service结尾的类或者接口
第四个位置 *代表类下的所有的方法
第五个位置 ..任意的形参个数和类型
*/
//定义切入点
@Pointcut("execution(* com.boolib.web.*.*(..))")
private void allMethod() {
}
//针对指定的切入点表达式选择的切入点应用前置通知
@Before("execution(* com.boolib.web.*.*(..))")
public void before() {
System.out.println("【注解-前置通知】:");
}
//访问命名切入点来应用后置通知
@AfterReturning("allMethod()")
public void afterReturn() {
System.out.println("【注解-后置通知】:方法正常结束了");
}
//应用最终通知
@After("allMethod()")
public void after() {
System.out.println("【注解-最终通知】:不管方法有没有正常执行完成,"
+ "一定会返回的");
}
//应用异常抛出后通知
@AfterThrowing("allMethod()")
public void afterThrowing() {
System.out.println("【注解-异常抛出后通知】:方法执行时出异常了");
}
}