欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringAOP术语

程序员文章站 2022-04-16 09:10:27
2019-03-10/21:12:31 参考博客:MiroKlose AOP术语 1.通知: 通知定义了切面要完成的工作内容和何时完成工作,就是什么时候去做辅助功能,功能具体是什么代码 五种类型 Before——在方法调用之前调用通知 After——在方法完成之后调用通知,无论方法执行成功与否 Af ......

2019-03-10/21:12:31

参考博客:miroklose

aop术语

1.通知:

通知定义了切面要完成的工作内容和何时完成工作,就是什么时候去做辅助功能,功能具体是什么代码

五种类型

  1. before——在方法调用之前调用通知

  2. after——在方法完成之后调用通知,无论方法执行成功与否

  3. after-returning——在方法执行成功之后调用通知

  4. after-throwing——在方法抛出异常后进行通知

  5. around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

前四个好理解的,最后一个around 表示切面在被监视的函数运行前后都会执行,下面是切面要执行的函数 log,log函数有一个形参 joinpoint 这个可以理解为断点,中间一句代表的就是被监视的程序运行,在被监视的程序运行时,可以替换他的形参,这个是 around 厉害的地方,如果被监视的程序,运行的时候输入的是一个haha字符串作为实参,但是经过log方法之后,这个参数就被替换为ab了.

1 public object log(proceedingjoinpoint joinpoint) throws throwable {
2         system.out.println("我在被监视程序之前。。。");
3         object object = joinpoint.proceed(new object[]{"ab"});
4         system.out.println("我在被监视程序之后。。。" );
5         return object;
6     }

 

2.连接点:

在执行正常的功能时,能够插入切面的点。可以作为切入点的点。备选点。

连接点可以是调用方法时、抛出异常时、甚至修改字段时,在这些点,就可以去执行切面。

 

3.切面: 

定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。

声明切面:

在spring中,切面就是一个包含通知和切点的对象,是一个bean,bean的字段和方法就是该切面的状态和行为,还要通过配置,来指定切入点和通知实现

在xml中,切面使用<aop:aspect>标签指定,ref属性用来引用切面支持bean。这个bean里面就是用来执行要做的辅助功能的。

 

4.切点:

定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。通常使用明确的类或者方法来指定这些切点。

作用:定义通知被应用的位置(在哪些连接点)

切入点的声明:

切入点在spring也是一个bean。

切点的声明有三种定义方式:

1)在<aop:config>标签下使用<aop:pointcut>声明一个切入点bean,该切入点可以被多个切面使用,对于需要共享使用的切入点最好使用该方式,该切入点使用id属性指定bean名字,在通知定义时使用pointcut-ref属性通过该id引用切入点,expression属性指定切入点表达式

<aop:config>  
   <aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/>  
   <aop:aspect ref="aspectsupportbean">  
      <aop:before pointcut-ref="pointcut" method="before"/>  
   </aop:aspect>  
</aop:config>  

2)在<aop:aspect>标签下使用<aop:pointcut>声明一个切入点bean,该切入点可以被多个切面使用,但一般该切入点只被该切面使用,当然也可以被其他切面使用,但最好不要那样使用,该切入点使用id属性指定bean名字,在通知定义时使用pointcut-ref属性通过该id引用切入点,expression属性指定切入点表达式:

<aop:config>  
 <aop:aspect ref="aspectsupportbean">  
    <aop:pointcut id=" pointcut" expression="execution(* cn.javass..*.*(..))"/>  
    <aop:before pointcut-ref="pointcut" method="before"/>  
 </aop:aspect>  
</aop:config>  

3)匿名切入点bean可以在声明通知时通过pointcut属性指定切入点表达式,该切入点是匿名切入点,只被该通知使用:

<aop:config>  
 <aop:aspect ref="aspectsupportbean">  
     <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterfinallyadvice"/>  
 </aop:aspect>  
</aop:config>  

 

5.引入: 

引入允许我们向现有的类中添加方法或属性 

6.织入: 

织入是将切面应用到目标对象来创建的代理对象过程。

切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入

  1. 编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。aspectj的织入编译器就是以这种方式织入切面。
  2. 类加载期——切面在类加载到
  3. jvm ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。aspectj5 的 ltw 就支持这种织入方式
  4. 运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,aop 容器会为目标对象动态的创建代理对象。spring aop 就是以这种方式织入切面。