Spring之AOP在XML中的配置方法

AOP 即 Aspect Oriental Program 面向切面编程

先来一个栗子:

 <aop:config>
        <aop:pointcut id="loggerCutpoint"
            expression=
            "execution(* com.how2java.service.ProductService.*(..)) "/>

        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:after pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
  </aop:config>     

这个配置过程是什么含义呢?

<aop:pointcut id="loggerCutpoint" expression="execution(* com.how2java.service.ProductService.*(..)) "/>

这一句是声明切入点,切入点的 id 叫 loggerCutPoint ,用来标记这个切入点,

这个expression表示:满足expression中的方法调用之后,就会去进行切面操作,类似于触发了切面:

第一个 * 代表返回任意类型
com.how2java.service.ProductService.*     表示包名以 com.how2java.service.ProductService 开头的类的任意方法(第二个*表示任意方法,通配符肯定知道吧)
(..) 表示方法的参数是任意数量和类型

简单说就是,只要com.how2java.service这个包中的ProductService类的任意一个函数被调用,不管你的返回值是什么,都会触发开关,我就会去执行切面,也就是辅助功能,但是辅助功能是什么呢,就是下面两句:

<aop:aspect id="logAspect" ref="loggerAspect">

  <aop:after pointcut-ref="loggerCutpoint" method="log"/>

</aop:aspect>

这两句是定义了一个切面,上面说只要触发开关,就会去执行切面,就是指的这里的切面,所谓切面,就是一个类中的方法而已,搞的这个高大上。。。

id代表这个切面的名字,ref就是指的方法所在的类,method代表的就是方法的名字,

pointcut-ref="loggerCutpoint" 这个就是表示我这个切面是和上面的切点关联起来的(一个切点是可以关联多个切面的,一个切面只能关联一个方法),只要上面的切点被触发,我就会到这里来执行一些辅助功能,搞得和单片机的中断一样,

after表示在切入点触发之后来执行我这个中断,当然也有before,一共有五个before,after,After-returning ,After-throwing,Around。

在 method 参数后面,还可以加上参数列表。

正文开始

网站的功能分为核心功能和辅助功能,辅助功能叫做切面

AOP的过程分为两步:1,在业务类中插入切入点,2,将切入点和切面类关联起来

业务类就是核心类,就是网站的主要功能,切面就是辅助功能,日志,统计之类的

通过配置,可以实现,在某个方法调用的时候,触发别的方法执行,就好像在监视目标方法,你被执行,就触发我执行。

AOP术语

1,通知:

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

五种类型

  1. Before——在方法调用之前调用通知
  2. After——在方法完成之后调用通知,无论方法执行成功与否
  3. After-returning——在方法执行成功之后调用通知
  4. After-throwing——在方法抛出异常后进行通知
  5. Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

前四个好理解的,最后一个

around 表示切面在被监视的函数运行前后都会执行,

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

public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("我在被监视程序之前。。。");
        Object object = joinPoint.proceed(new Object[]{"abc"});
        System.out.println("我在被监视程序之后。。。" );
        return object;
    }

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 就是以这种方式织入切面。
时间: 2024-10-26 03:47:24

Spring之AOP在XML中的配置方法的相关文章

spring mvc在web.xml中的配置

spring mvc将所有的请求都经过一个servlet控制器-DispatcherServlet,这个servlet的工作就是将一个客户端的request请求分发给不同的springmvc控制器,既然是一个控制器Servlet就需要在web.xml中配置. <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.Dispa

Servlet在web.xml中的配置

import javax.servlet.*; import java.io.IOException; import java.io.PipedWriter; import java.io.PrintWriter; /** * Created with IntelliJ IDEA. * User: wbb * Date: 14-6-17 * Time: 上午11:56 * To change this template use File | Settings | File Templates.

Maven使用私服setting.xml中的配置

Maven使用私服setting.xml中的配置 setting.xml中的配置 使用maven,每次都是从中央仓库下载依赖包,网络很渣,只有使用Nexus搭建个私服. 下面是setting.xml中的配置文件 <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi=&quo

springmvc在web.xml中的配置详解

                          <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-

NHibernate支持的数据库 NHibernate连接配置 hibernate.cfg.xml中的配置

使用下列数据库时hibernate.cfg.xml中的配置 Microsoft SQL Server 2005/2000 配置如下: <?xml version="1.0" ?>  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >      <session-factory>          <property name="co

Spring AOP 在XML中声明切面

转载地址:http://www.jianshu.com/p/43a0bc21805f 在XML中将一个Java类配置成一个切面: AOP元素 用途 <aop:advisor> 定义AOP通知器 <aop:after> 定义一个后置通知(不管目标方法是否执行成功) <aop:after-returning> 定义AOP返回通知 <aop:after-throwing> 定义AOP异常通知 <aop:around> 定义环绕通知 <aop:as

Spring web.xml中的配置

转载博客:http://blog.163.com/zhangke_616/blog/static/191980492007994948206/ 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制,自动加载的容器中去,在web项目中,配置文件加载到web容器中进行解析,目前,spring提供了两种加载器,以供web容器的加载:一种是ContextLoaderListener,另一种是ContextLoaderServlet.这两种在功能上

spring在web.xml中的配置

在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制,自动加载的容器中去,在web项目中,配置文件加载到web容器中进行解析,目前,spring提供了两种加载器,以供web容器的加载:一种是ContextLoaderListener,另一种是ContextLoaderServlet.这两种在功能上完全相同,只是一种是基于Servlet2.3版本中新引入的Listener接口实现,而另一种是基于Servlet接口实现,以下是这两种加载器在w

struts2 开发中,一些功能需要在struts.xml中的配置

1.普通package <!-- package元素: * name:为当前包起名 作用,用于继承 * namespace:命名空间,相当于一个房间号:我们需要对号入座 * extends:当使用action的时候,必须继承struts-default,如果不继承,struts2定义的所有方法将失效--> <package name="primer" namespace="/primer" extends="struts-default&