spring原生的Aop实现,作为了解就行,不是重点
重点是Aspect(专门面向切面编程的框架)
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
简化:
execution( 方法返回值 方法声明(参数))
第一个before表示 ,在这个包的SomeServiceImpl这个类里面的doSome()方法前面插入myAspect方法,进行日志处理
可以看到同一个切入点织入了多个切面,或者说多个切面切入到了同一个切入点
也就是说某处要加入好几个切面
这个时候发现execution后面的内容其实都一样,那这样重复写三次就非常麻烦,于是我们给execution后面的内容起一个别名,这样就可以用很短的几个单词代替原先execution后面很长的一串了
(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更好理解)
就是不管目标方法是否正常执行,最重的代码都会被执行