spring原生的Aop实现,作为了解就行,不是重点
重点是Aspect(专门面向切面编程的框架)
1.Aspect切入点表达式(极其重要)
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
简化:
execution( 方法返回值 方法声明(参数))
第一个before表示 ,在这个包的SomeServiceImpl这个类里面的doSome()方法前面插入myAspect方法,进行日志处理
为同一个方法绑定多个通知:
2.给切入点表达式起别名:使用@Pointcut注解
可以看到同一个切入点织入了多个切面,或者说多个切面切入到了同一个切入点
也就是说某处要加入好几个切面
这个时候发现execution后面的内容其实都一样,那这样重复写三次就非常麻烦,于是我们给execution后面的内容起一个别名,这样就可以用很短的几个单词代替原先execution后面很长的一串了
3.通知的类型:
(1)前置通知
@Aspect//表明这是一个切面类(AspectJ框架能识别出这是一个切面类),这个类里面是切面方法
public class test
{
@Before("execution(public String com.bjpowernode.SomeServiceImpl.doSome(String,int))")
public void Before()
{
System.out.println("前置通知:........");
}
}
如果想在SomeServiceImpl类的所有方法前面都加一个前置通知:
@Before("execution(public * com.bjpowernode.SomeServiceImpl.*(..))")
返回值类型任意 方法名任意 传入方法的参数的类型也是任意
(2)后置通知:
@AfterReturning
@Aspect//表明这是一个切面类(AspectJ框架能识别出这是一个切面类),这个类里面是切面方法
public class test
{
@AfterReturning("execution(public String com.bjpowernode.SomeServiceImpl.doSome(String,int))",returning ="obj")
public void AfterReturning(Object obj)
{
System.out.println("后置通知:........");
}
}
(3)环绕通知:@Around
在目标方法前后通知
(4)@After 最终通知(其实这个关键字换成finally更好理解)
就是不管目标方法是否正常执行,最重的代码都会被执行