我正在使用 Spring AOP。我给出的切入点如下:
@Pointcut("execution(* com.demo.Serviceable+.*(..))")
public void serviceMethodCalls() {
}
是否可以避免 Spring AOP 中的就地切入点表达式?
这取决于您使用 Spring 选择的 AOP 样式。当您坚持使用基于注释的方法时,除了具有位于外部类中的表达式的常量之外,您能得到的东西不多。
这是由于基于 @Aspect 注释的 AOP 样式专用于 colocate where和what。您可以通过使用抽象方法并将切入点绑定到它来以某种方式获得一些可配置性。
@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 Advice 的方法:
@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
文件中定义
这是你想要的吗?基于代理的 aop: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>
在 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>