`
dr.han
  • 浏览: 46295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring AOP 定义切入点

阅读更多
首先我们编写了通知advice,但是我们还不能表达在应用系统的什么地方应用这些通知,切入点决定了一个特定类的特定方法是否满足特定规则,如果满足则通知就应用到该方法上,Spring的切入点可以让我们灵活的定义在什么地方应用通知。

Spring的切入点框架的核心接口PointCut

public interface PointCut {
  ClassFilter getClassFilter();
  MethodMatcher getMethodMatcher();
}


PointCut 是根据方法和类决定在什么地方织入通知的。

ClassFilter决定了一个类是否符合通知的要求
public interface ClassFilter{
   boolean matches(Class clazz);//根据类名判断
}

实现了这个接口的类决定了以参数传进来的类是否应该被通知,它相当于一个类的过滤器,一般根据类名过滤,另外这个接口总是包含一个简单的ClassFilter的实现ClassFilter.TRUE,它是规范任何类的ClasFilter实例,它适用于只创建只根据方法来决定是否是应用通知的切入点。

MethodMether决定了一个类的一个方法是否符合通知的要求
public interface MethodMether{
   //决定一个类的一个方法是否被通知,AOP代理被创建的时候,调用一次这个方法,这个方法的结果决定了是否应用通知
   boolean mathces(Method m,Class target);
  //决定MethodMether是静态还是动态,静态:false,通知总是被执行,动态true:根据运行时方法的参数值决定通知是否被执行。
   public boolean isRuntime();
   //如果是静态切入点,此方法不会被调用
   //如果是动态切入点,目标对象方法每次被调用的时候,此方法被调用。
   public boolean matches(Method m,Class target,Object arg[]);
}


Advisor

   大多数的切面由通知和切入点组成,因此Spring把advice和pointcut组合为一个对象,PointcutAdvisor
public interface PointcutAdvisor{
   PointCut getPointCut();
   Advice getAdvice();
}
//大多数的Spring自带的切入点都有一个对应的PointcutAdvisor.


静态/动态切入点比较

静态切入点只在代理被创建的时候执行一次,而不是在运行期间每次方法调用都执行,因此性能比动态切入点好,因此静态切入点是我们的首选,Spring为创建静态切入点提供了父类StaticMethodMatcherPointcut,继承它并实现isMatch方法就可以了

Spring提供的静态切入点

(1)NameMatchMethodPointcut
这个类有2个主要方法:
   public void setMappedName(String name)
   public void setMappedNames(String[] names)

事例:
有一个接口类 MyInterfaceA ,包含3个方法,set1,set2,get3 ,有一个实现类MyClassAImpl;我们想配置set方法的切入点,如下实现:
 <beans>
    //目标对象
    <bean id="MyClassATarget" class="MyClassAImpl"></bean>
    //通知
    <bean id="myAdvice" class="..."></bean>
    //定义切面
    <bean id="myAdvisor" class="....NameMatchMethodPointcut">
          //方法过滤,注入切入点
          <property name="mappedName">
               <value>set*</value>
          </property>
          //注入通知
          <property name="advice">
               <ref bean="myAdvice"/>
          <property>
    </bean>
   //配置代理
    <bean id="MyClassAProxy" class=".....ProxyFactoryBean">
       //代理的接口
       <property name="proxyInterfaces">
           <value>MyInterfaceA</value>
       <property>
       //配置切面
       <property name="interceptorNames">
           <list>
               <value>myAdvisor</value>
           </list>
       <property>
       //配置目标对象
       <property name="target">
           <ref bean="MyClassATarget"/>
       <property>
    </bean>
 </beans>

//整个过程可以如下几步:
1  编写接口:myinterface
2  编写接口的实现myImpl并配置为bean:myImplTarget   
3  编写通知myAdvice并配置为bean:myAdvice
4  配置切面myAdvisor,切面中注入切入点(set*)和通知myAdvice
5  配置代理myImplProxy,注入接口类myinterface,注入切面myAdvisor,注入目标对 象myImplTarget


   
(2)RegexpMethodPointcut正则表达式切入点
整个过程同上,但在配置切面时有所不同,见蓝色部分代码
   //定义切面
    <bean id="myAdvisor" class="....RegexpMethodPointcut">
          //方法过滤,注入切入点
          [color=blue]<property name="pattern">
               <value>.*get.+By.+</value>
          </property>[/color]          //注入通知
          <property name="advice">
               <ref bean="myAdvice"/>
          <property>
    </bean>

正则表达式:
.:匹配任何单个字符 例如:setF. 匹配setFi,但不匹配setF 和 setFii
+:匹配前一个字符一次或者多次,例如setF.+ 匹配setFBar和setFB,不匹配setF
*:匹配前一个字符0次或者多次,例如setF.* ,同上并匹配setF
\:匹配任何正则表达式符号,例如\.setF ,匹配bar.setF ,不匹配setF
分享到:
评论

相关推荐

    springaop中切入点表达式完整示例代码

    在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...

    Spring AOP 所有切入点指示符详解.docx

    Spring AOP通过使用切入点(Pointcut)和通知(Advice)来实现这一目标。切入点是定义关注点何时触发的表达式,而通知则是实际执行的动作。 Spring AOP目前只支持方法执行这个连接点,下面我们将详细解析Spring AOP...

    Spring AOP 16道面试题及答案.docx

    而切入点(Point Cut)是匹配连接点的规则,它定义了一组连接点的集合,可以是一个断言或表达式。Advice与切入点关联,当切入点匹配到的连接点被执行时,Advice就会运行。 例如,切入点表达式`execution(* Employee...

    简单spring aop 例子

    通知定义了要执行的逻辑,切入点定义了何时执行。例如,我们可以创建一个名为`LoggingAspect`的类,包含一个`@Before`通知来记录方法调用前的信息: ```java import org.aspectj.lang.annotation.Aspect; import ...

    Spring AOP实现机制

    - 在`&lt;aop:config&gt;`标签内定义切面,`&lt;aop:pointcut&gt;`定义切入点,`&lt;aop:advisor&gt;`定义通知。 - `&lt;aop:aspect&gt;`标签用于定义完整的切面,包括切入点和通知。 - **注解配置**: - 使用`@Aspect`注解定义切面类,`...

    Spring AOP面向方面编程原理:AOP概念

    Spring AOP支持多种方式来定义切入点,包括但不限于方法名、类名、注解等。 5. **引入(Introduction)**:允许向被通知对象添加新的接口实现或者新的方法。例如,可以使用引入让任何对象实现`IsModified`接口,...

    Spring AOP简单demo

    在Spring AOP中,通过表达式或注解来定义切入点。 3. **通知(Advice)**:通知是在特定切入点上执行的行为,比如记录日志、开始/结束事务等。有五种不同类型的通知:前置通知(Before)、后置通知(After)、返回...

    springAop的配置实现

    - `&lt;aop:pointcut&gt;`:定义切入点表达式,例如`execution(* com.example.service.*.*(..))`表示匹配com.example.service包下的所有方法。 - `&lt;aop:advisor&gt;`:定义通知和切入点的关联,指定何时何地执行通知。 - `...

    spring aop 五个依赖jar

    使用Spring AOP,开发者可以定义切面,声明切入点(即关注点的定位),编写通知(即实际的增强代码),并通过配置将它们应用到目标对象上。这样,我们可以保持业务逻辑的清晰,同时实现系统级的服务,如事务管理、...

    springaop.zip

    Spring使用表达式语言(如XPath)来定义切入点。 4. **连接点(Join Point)**:程序执行中的一个点,如方法的调用或字段的赋值。切入点表达式匹配连接点,决定通知何时执行。 5. **代理(Proxy)**:Spring AOP...

    spring AOP入门教程

    2. **注解驱动**:使用`@Aspect`注解声明切面类,`@Before`、`@After`、`@Around`、`@AfterReturning`、`@AfterThrowing`定义不同类型的通知,`@Pointcut`定义切入点表达式。 ### 五、示例 以下是一个简单的切面...

    JavaEE Spring AOP使用

    例如,我们可以使用`@Aspect`定义一个切面,`@Before`、`@After`、`@Around`等注解定义通知,`@Pointcut`定义切入点。 2. **XML配置的AOP**:在传统的Spring配置中,我们需要在`&lt;aop:config&gt;`元素内定义切面、切入...

    spring aop的demo

    在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...

    spring AOP实例代码(带详细的讲解)

    在Spring中,我们可以使用`@Pointcut`注解定义切入点,并在通知中引用它。 4. **织入(Weaving)**:织入是将切面应用到目标对象并创建代理的过程。Spring可以在运行时动态地完成织入,也可以在类加载时静态地完成...

    spring aop注解方式、xml方式示例

    // 空方法体,仅用于定义切入点 } @AfterReturning("serviceMethods()") public void logAfterServiceCall() { // ... } ``` #### 4. 配置切面 在Spring配置中启用AOP并注册切面类: ```xml &lt;aop:aspectj-...

    spring-aop-jar

    - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在哪些连接点上应用。 - 通知(Advice):通知是在特定连接点执行的代码,比如在方法调用前后执行的代码。 - 代理(Proxy):Spring AOP通过代理来实现切...

    spring aop demo 两种实现方式

    在XML配置文件中,我们需要声明一个`&lt;aop:config&gt;`元素,并在其内部定义切面和切入点: ```xml &lt;aop:config&gt; &lt;aop:aspect id="loggingAspect" ref="loggingAspectBean"&gt; &lt;aop:before method="logBefore" pointcut...

    spring AOP的运用

    1. 当Spring容器启动时,会扫描所有带有`@Aspect`注解的类,并将其转换为对应的`AspectJExpressionPointcut`对象,这是Spring AOP的核心类,用于匹配切入点表达式。 2. 当遇到一个切入点匹配的连接点时,Spring会...

    spring aop所需jar包

    - XML配置:在Spring配置文件中定义切面、通知和切入点。 - 注解配置:使用`@EnableAspectJAutoProxy`开启基于注解的AOP支持,并在类上使用`@Aspect`定义切面。 - 自动代理:Spring会根据配置自动生成代理对象,...

    spring-aop实例

    4. **切入点表达式(Pointcut Expression)**:这是定义切点的语法,使用了AspectJ的表达式语言,可以精确地定位到需要应用通知的代码位置。 5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理...

Global site tag (gtag.js) - Google Analytics