当前位置: 首页 > 知识库问答 >
问题:

Spring AOP不拦截Spring容器中的方法

仲君昊
2023-03-14
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
@ComponentScan({"sk.lkrnac"})
@Aspect
@Component
public class TestAspect {
    @Before("execution(* *(..))")
    public void logJoinPoint(JoinPoint joinPoint){
        ....
    }

}

春令:

package sk.lkrnac.testaop;

@Component
public class TestComponent{
    @PostConstruct
    public void init(){
        testMethod();
    }

    public void testMethod() {
        return;
    }
}

如何拦截Spring框架本身调用的所有公共方法?(例如,在Spring创建TestComponent实例期间使用TestComponent.init())当前,我只能通过调用TestComponent.testMethod()来拦截:

TestComponent testComponent = springContext.getBean(TestComponent.class);
testComponent.testMethod();

共有1个答案

卓致远
2023-03-14

这是使用Spring AOP时遇到的一个常见问题。Spring通过代理建议类来实现AOP。在您的例子中,您的TestComponent实例将包装在运行时代理类中,该类为要应用的任何方面建议提供“钩子”。当从类外部调用方法时,这种方法非常有效,但正如您所发现的,它不适用于内部调用。原因是内部调用不会通过代理屏障,因此不会触发方面。

主要有两种方法来解决这个问题。一个是从上下文中获取(代理的)bean的实例。这是你已经成功尝试过的。

另一种方法是使用称为加载时编织的东西。当使用它时,自定义类加载器通过向类定义中注入字节码将AOP建议添加到类中(“编织”到其中)。Spring文档对此有更多介绍。

 类似资料:
  • 现在,当我到达spring-boot应用程序的endpoint时,它工作得很好 基本上,它根本不调用preandle。我错过了什么????

  • 主要内容:定义拦截器,配置拦截器,拦截器的执行流程,多个拦截器的执行流程。拦截器(Interceptor)是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。 在 Spring MVC 中,拦截器的作用与 Servlet 中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是

  • 主要内容:定义拦截器,注册拦截器,指定拦截规则,实现登陆功能,验证登陆及登陆拦截功能我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。Spring Boot 同样提供了拦截器功能。  在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步: 定义拦截器; 注册拦截器; 指定拦截规则(如果是拦截所有,静态资源也会被拦

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 在我的应用程序中,消息从一个队列移动到另一个队列,我想在日志中添加消息ID。我试图找出是否可以在实际处理之前拦截消息,并在MDC字段中设置消息ID,以便可以跨所有队列跟踪此消息。到目前为止,我还没有取得成功。是否存在任何现有解决方案?

  • 我正在使用SpringDataJPA,我想拦截hibernate操作,如保存、删除或更新。 我创建了MyInterceptor,它扩展了EmptyInterceptor。这个类可以说是在实体被保存(删除、编辑)到数据库后记录消息。花费大量时间,无法添加到spring数据jpa 所以我的问题是,我应该在哪里将MyInterceptor添加到Spring data jpa中,以便拦截所有实体。 Lin