尝试在Spring应用程序中同时使用AspectJ和@Configurable

  • 如果我在类上加载带有@Component批注的Spring,AspectJ包装器将工作并包装所有目标方法,并且@Autowired批注会导致依赖项被注入(inject)。但是,无法在运行时使用new关键字实例化该类,并且已注入(inject)依赖项。
  • 如果我在没有AspectJ bean的情况下加载了@Configurable类,则所有依赖项都正确地注入(inject)了new上,但是没有一种方法可以通过AspectJ进行代理。

  • 我该怎么做?

    这是我的代码。配置:
    @Configuration
    @ComponentScan(basePackages="com.example")
    @EnableSpringConfigured
    @EnableAspectJAutoProxy
    @EnableLoadTimeWeaving
    public class TestCoreConfig {
    
        @Bean
        public SecurityAspect generateSecurityAspect(){
            return new SecurityAspect();
        }
    
    
        @Bean
        public SampleSecuredClass createSampleClass(){
            return new SampleSecuredClass();
        }
    }
    

    方面:
    @Aspect
    public class SecurityAspect {
    
        @Pointcut("execution(public * *(..))")
        public void publicMethod() {}
    
    
        @Around("publicMethod()")
        public boolean test (ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("Here!");
            joinPoint.proceed();
            return true;
        }
    
    }
    

    SampleClass:
    //@Configurable
    @Component
    public class SampleSecuredClass {
    
        @Autowired
        public SecurityService securityService;
    
        public boolean hasSecurityService(){
            return securityService != null;
        }
    
        public boolean returnFalse(){
            return false;
        }
    }
    

    和单元测试:
    @ContextConfiguration(classes={TestCoreConfig.class})
    @RunWith(SpringJUnit4ClassRunner.class)
    public class SecurityAspectComponentTest {
    
        @Autowired
        private SampleSecuredClass sampleSecuredClass;
    
        @Test
        public void testSecurityRoles(){
            //SampleSecuredClass sampleSecuredClass = new SampleSecuredClass();
    
            assertTrue("We need to ensure the the @Configurable annotation injected the services correctly", sampleSecuredClass.hasSecurityService());
    
            assertTrue("We need to ensure the the method has been overwritten", sampleSecuredClass.returnFalse());
        }
    
    }
    
  • 如果我摆脱了TestCoreConfig中的bean,并在测试中使用SampleSecuredClass创建了new实例,并将其注释更改为@Configurable,则将注入(inject)服务,但不会应用该方面。
  • 如果我按此处的方式运行(通过将SampleSecuredClass作为bean注入(inject)),则该方面有效,并且已注入(inject)服务,但随后必须在框架启动时创建所有对象。我想使用@Configurable批注。
  • 如果同时使用@Configurable批注和Aspect,则会出现illegal type in constant pool错误,并且上下文不会启动。


  • 其他信息。
  • 我尝试了几种不同的Java代理-spring工具和Aspectjwrapper。没有变化。
  • 如果我包含aop.xml文件,则该方面有效,但@Configurable无效。
  • 最佳答案

    这似乎是等待docs进行的那些深潜 session 之一:)

    首先,我将启用org.springframework的调试日志记录,因为这肯定会为Spring的功能和时间提供一些有意义的见解。

    话虽这么说,我相信您的问题出在 Spring 的上下文生命周期的迷雾中,所以我会仔细检查文档,尤其是在

  • 手动指定Bean取决于配置方面depends-on="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"
  • ...或有关@Configurable(preConstruction=true)的注释


  • ...或@Configurable(autowire=Autowire.BY_NAME,dependencyCheck=true)



  • 仔细阅读文档,看看这些匹配是否适用以及如何应用,请让我们知道您找到的解决方案。它绝对应该呈现为非常有趣的阅读内容。

    10-01 19:27