簡體   English   中英

避免Spring AOP中的就地切入點表達式

[英]Avoiding in-place pointcut expression in Spring AOP

我正在使用Spring AOP。 我正在給我的切入點:

@Pointcut("execution(* com.demo.Serviceable+.*(..))")
public void serviceMethodCalls() {
}

是否有可能避免Spring AOP中的就地切入點表達式?

這取決於你選擇Spring的AOP風格。 當您堅持使用基於注釋的方法時,除了具有位於外部類中的表達式的常量之外,您可以獲得的內容並不多。

這是由於基於@Aspect注釋的AOP風格致力於共存地點內容 您可以通過使用抽象方法並將切入點綁定到它來以某種方式獲得一些可配置性。

@Aspect
public abstract class MyAspect {

  protected abstract pointcut();


  @Before("pointcut()")
  public void myAdviceMethod() {
    // Advice code goes here
  }
}


public class ConcreteAspect extends MyAspect {

  @Pointcut("execution(* com.acme.*.*(..))")
  protected pointcut() {
  )
}

這是可能的,但對我來說似乎很尷尬,因為實現者必須知道該方法需要 @Pointcut 如果她忘記放置它,它將完全崩潰。

如果您需要靈活地將建議和切入點分開,則最好堅持使用基於XML的配置(例如,請參閱Spring文檔 )。

中間的一種人可以將切入點與自定義注釋聯系起來,讓用戶決定將其放置在何處,從而何時應用您的建議。 Spring文檔(第6.2.3.4章)提供了更多信息。

此致,奧利

以下是如何使用Java Config定義可配置的Spring AOP建議:

@Configuration
public class ConfigurableAdvisorConfig {

    @Value("${pointcut.property}")
    private String pointcut;

    @Bean
    public AspectJExpressionPointcutAdvisor configurabledvisor() {
        AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
        advisor.setExpression(pointcut);
        advisor.setAdvice(new MyAdvice());
        return advisor;
    }
}

class MyAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("Before method");
        Object result = invocation.proceed();
        System.out.println("After method");
        return result;
    }
}

然后可以在application.properties文件中定義pointcut.property

Pointcut表達式是在Spring2.X中引入的,它有效地允許您匹配您希望將建議編入的位置。

你也可以使用Spring1.X舊的方式,即通過spring配置xml創建一個ProxyFactoryBean(由1個目標對象和潛在的多個建議組成),如下所示。 通過這種方式,您不需要亂用切入點表達式。 這樣做的缺點是你只能將建議編織成一個目標對象而不是多個目標對象。

以下是一個典型示例:

<bean id="personTarget" class="com.mycompany.PersonImpl">
    <property name="name"><value>Tony</value></property>
    <property name="age"><value>51</value></property>
</bean>

<bean id="myAdvisor" class="com.mycompany.MyAdvisor">
    <property name="someProperty"><value>Custom string property value</value></property>
</bean>

<bean id="person" 
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces"><value>com.mycompany.Person</value></property>

    <property name="target"><ref local="personTarget"/></property>
    <property name="interceptorNames">
        <list>
            <value>myAdvisor</value>
        </list>
    </property>
</bean>

這是你想要的嗎? 基於代理的aop: http//static.springframework.org/spring/docs/2.5.x/reference/aop-api.html sample

<bean id="settersAndAbsquatulateAdvisor" 
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
    <ref local="beanNameOfAopAllianceInterceptor"/>
</property>
<property name="patterns">
    <list>
        <value>.*set.*</value>
        <value>.*absquatulate</value>
    </list>
</property>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM