- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要实现的目标:
我正在使用 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/
我是 Struts 框架的新手。因此寻找一些在线教程并尝试开发一个非常基本的应用程序。在使用拦截器之前,我能够访问操作类中的用户名和密码值,但在使用拦截器之后,我在操作类执行方法中将用户名和密码获取为
我想要实现的目标: 我正在使用 Spring MVC。我需要以适当的 AOP 方式拦截具有 RequestMapping 注释的 Controller 方法。基本上,当服务器启动时,Spring 应该
我是一名优秀的程序员,十分优秀!