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

无法截获Spring AOP中的通知方法

梁丘缪文
2023-03-14

我正在使用Spring AOP实现自定义注释处理。我有下面的代码。

public class CacheDemo  {

    private static ApplicationContext applicationContext;

    public static void main(String args[])
    {
         applicationContext =
               new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
    }
  }

//应用程序配置

@Configuration
@ComponentScan("Demo")
@Component
public class ApplicationConfiguration implements ApplicationContextAware {

    @Autowired
    TestCacheDemo testCacheDemo;
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {

        applicationContext = ctx;
    }
   
    @Bean
    public void testCacheDemoIntialize()
    {
        testCacheDemo.setApplicationContext(applicationContext);
        testCacheDemo.test();
    }
}
@Aspect
@Component
public class CustomAnnotationAspect {

    @Autowired
    private AbstractCacheService cacheService;

    @Around("@annotation(Demo.CustomCacheable)")
    public Object customCacheable(ProceedingJoinPoint joinPoint) throws Throwable { // This method is not called at all

       joinPoint.proceed();

      // Some other code to follow

}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CustomCacheable {

}
 @Component
public class CacheProvider
{
    @Autowired
    AbstractCacheService abstractCacheService;
    CacheManager<String,String> cacheManager;


    @PostConstruct
    void init()
    {
        cacheManager = CreateCache.create(s -> {return s.toUpperCase();});
        abstractCacheService.setCacheManager(cacheManager);

    }

    @CustomCacheable
    String getCacheValue(String s)
    {
        String str=s.toUpperCase();
        return str;
    }

}

出于测试目的,我创建了下面的bean

@Component
public class TestCacheDemo extends TimerTask
{
    private  ApplicationContext applicationContext;
    private Timer timer;
    @Autowired
    CacheProvider cacheProvider;
    void test()
    {
        System.out.println("Called test");
        for (String beanName : applicationContext.getBeanDefinitionNames()) {
            System.out.println(beanName);
        }

        //CacheProvider cacheProvider = applicationContext.getBean(CacheProvider.class);
        //cacheProvider.getCacheValue("Hello");

        timer = new Timer();
        timer.schedule(this,1000,3000);
    }
    void setApplicationContext(ApplicationContext ctx)
    {
        applicationContext=ctx;
    }


    @Override
    public void run() {
        cacheProvider.getCacheValue("Hi");
    }
}

无论何时启动应用程序,它都将调用TestCacheDemo类的test方法,并将定时器设置为在3秒后触发,这样我就可以从timer任务的run方法内部调用带注释的方法getCacheValue。但是当调用带注释的方法时,不会调用注释处理器。因此,我无法进行注释处理。请让我知道问题出在哪里?

共有1个答案

陶健
2023-03-14

要在spring boot中使用AspectJ,必须启用它。您应该向应用程序主类(CacheDemo)或应用程序配置类添加以下注释。

@EnableAspectJAutoProxy
 类似资料:
  • 在使用Spring/Java和面向方面编程编写代码时,我面临着一个问题。在服务类中,我有使用@retryable的重试方法和使用@recovery的恢复方法。 这两个方法中的每一个都附加到方面。TestProcessService中的可重试方法“TriggerJob”附加到TestAspect类中的这些方法--BeforeTestTriggerJobsAdvision、AfterTestTrigg

  • 问题内容: 我正在尝试打印“你好,AOP!” 当Guice / AOP联盟拦截标有特定(自定义)注释的方法时,将显示一条消息。我按照官方的文档(可以找到一个PDF 这里 - 。AOP方法拦截的东西在第11页 ),它不能去工作,只编译。 首先,我的注释: 然后,我的实现: 接下来,我的方法拦截器: 最后,尝试利用所有这些AOP内容的驱动程序: 当我运行这个小小的测试驱动程序时,我得到的唯一控制台输出

  • 问题内容: 对于Swift3 / iOS10,请参见以下链接: ios10,Swift3和Firebase推送通知(FCM) 我正在尝试使用Firebase进行通知,并且完全按照文档中的说明进行了集成。但是我不明白为什么它不起作用。在构建项目时,我看到以下行: 这是我的AppDelegate: 问题答案: 1.在 didFinishLaunchingWithOptions 方法中设置Notific

  • 在这个问题中,我遇到了与Struts 2相反的问题:仅从defaultStack截取器中排除验证方法 上面的问题涉及到所有的方法都被排除在外,我的问题是没有任何方法被排除在外! 我正在尝试让authenticationInterceptor忽略LoginAction的showLogin方法: 但是,每次我转发到loginInitial时,拦截器都会抓取它,即使我的showLogin方法被排除在外。

  • 我正在处理react native Expo的推送通知。我刚刚开始,无法获得世博推送通知令牌。我添加了以下代码: 并收到错误“[未处理的承诺拒绝:错误:Expo push notification service仅支持Expo项目。请确保您已登录到正在加载项目的计算机上的Expo developer帐户。]”。 我正在Expo应用程序中运行该项目,我已经在Expo上创建了一个帐户,但仍然没有得到令