Как избежать точечного выражения в Spring AOP - PullRequest
2 голосов
/ 20 апреля 2009

Я использую Spring AOP. Я даю свои баллы, как:

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

Можно ли избежать выражения pointcut на месте в Spring AOP?

Ответы [ 4 ]

6 голосов
/ 23 апреля 2009

Это зависит от того, какой стиль АОП вы выбираете с помощью Spring. Если вы придерживаетесь подхода, основанного на аннотациях, вы можете получить немногое, кроме наличия констант для выражений, находящихся в классе экстентов.

Это связано с тем, что стиль AOP на основе аннотаций @Aspect посвящен colocate , где и what . Вы можете каким-то образом получить некоторую настраиваемость, используя абстрактный метод и привязав к нему pointcut.

@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 требуется . Если она забудет разместить ее, она полностью рухнет.

Если вам нужна гибкость, чтобы разделить рекомендации и pointcut, вам лучше придерживаться конфигурации на основе XML (см., Например, Документация Spring ).

Вид человека посередине - это возможность привязать ваш pointcut к пользовательской аннотации и позволить пользователям решать, где разместить его и, следовательно, когда применять ваш совет. Документация Spring (глава 6.2.3.4) дает дополнительную информацию об этом.

С уважением, Олли

2 голосов
/ 07 октября 2016

Вот как вы можете определить настраиваемый совет Spring AOP с помощью Java Config:

@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;
    }
}

pointcut.property может быть определено в вашем application.properties файле

1 голос
/ 09 января 2010

Выражение Pointcut введено в Spring2.X, что позволяет вам эффективно сопоставлять места, в которые вы хотите вставить совет.

Вы также можете использовать старомодный способ Spring1.X, который заключается в создании ProxyFactoryBean (составление 1 целевого объекта и, возможно, нескольких советов) через конфигурацию Spring XML, как показано ниже. Таким образом, вам не нужно связываться с выражением pointcut. Недостатком этого является то, что вы можете объединять советы только в один целевой объект вместо нескольких.

Вот один типичный пример ниже:

<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>
1 голос
/ 20 апреля 2009

это то, что вы хотите? на основе прокси-сервера: http://static.springframework.org/spring/docs/2.5.x/reference/aop-api.html образец

<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>

...