gpt4 book ai didi

spring - 不调用 MyPointcutAdvisor(扩展 AbstractBeanFactoryPointcutAdvisor)和 MyInterceptor(实现 MethodInterceptor)

转载 作者:行者123 更新时间:2023-12-04 12:52:35 24 4
gpt4 key购买 nike

我想要实现的目标:
我正在使用 Spring MVC。我需要以适当的 AOP 方式拦截具有 RequestMapping 注释的 Controller 方法。基本上,当服务器启动时,Spring 应该注册我的顾问 bean 和我的拦截器 bean 并建立 AOP 连接。


限制:
被允许根本使用AspectJ(或者我不会发布这个问题)。

我目前拥有的:

MyPointcutAdvisor 类:

@SuppressWarnings("serial")
public class MyPointcutAdvisor extends AbstractBeanFactoryPointcutAdvisor {

@Override
public Pointcut getPointcut() {
return new Pointcut() {
public MethodMatcher getMethodMatcher() {
return new MethodMatcher() {
public boolean matches(Method method, Class<?> targetClass, Object[] args) {
return matches(method, targetClass);
}
public boolean matches(Method method, Class<?> targetClass) {
return (method.getAnnotation(RequestMapping.class) != null) ? true : false;
}
public boolean isRuntime() {
return true;
}
};
}
public ClassFilter getClassFilter() {
return new ClassFilter() {
public boolean matches(Class<?> clazz) {
return (clazz.getAnnotation(Controller.class) != null) ? true : false;
}
};
}
};
}

我的拦截器类:

public class MyInterceptor implements MethodInterceptor {

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Method intercepted!);
return invocation.proceed();
}

在 dispatcher-servlet.xml 中:

<bean class="package.MyPointcutAdvisor">
<property name="adviceBeanName" value="package.MyInterceptor"/>
</bean>
<bean class="package.MyInterceptor"/>

到目前为止的结果:

服务器启动无任何异常,但建议/拦截器不工作(没有打印出任何内容)。

通过设置断点,我可以看到 MyInterceptor 是由 spring 通过 AbstractBeanFactoryPointcutAdvisor 类中的 setAdviceBeanName(String adviceBeanName) 注入(inject)的,但是,该建议永远不会执行。

在我看来,Spring 根本不知道这些建议。也永远不会检索切入点(IDE 不会在 getPointcut() 方法上中断)。

我们将不胜感激。

最佳答案

您可能需要确保已将自动代理创建者注册到上下文中。您可以通过使用 BeanDefinitionRegistryPostProcessor 以编程方式注册您的 bean 来完成此操作.

public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

private static final String MY_ADVISOR_BEAN_NAME = "package.MyAdvisor";

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// Do nothing.
}

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// Ensure an auto-proxy creator is registered.
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);

RootBeanDefinition beanDefinition = new RootBeanDefinition(MyPointcutAdvisor.class);
// Bean will only be auto-proxied if it has infrastructure role.
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(MY_ADVISOR_BEAN_NAME, beanDefinition);
}
}

本质上,这就是 Spring Transaction 库注册其通知以拦截 @Transactional 的方式。通过 <tx:annotation-driven/> 启用时的类和方法.

使用这个方法,如果你愿意,你可以简单地使用 PointcutAdvisor 而不是 AbstractBeanFactoryPointcutAdvisor .

关于spring - 不调用 MyPointcutAdvisor(扩展 AbstractBeanFactoryPointcutAdvisor)和 MyInterceptor(实现 MethodInterceptor),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22235157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com