AspectJ + @Configurable

试图在Spring应用程序中使用AspectJ和@Configurable

  • 如果我在一个类上使用@Component注解加载Spring,则AspectJ包装器将工作并包装所有目标方法,而@Autowired注释会导致注入依赖项。 但是该类不能在运行时使用new关键字实例化并且注入了依赖关系。
  • 如果我在没有AspectJ bean的情况下加载@Configurable类,则所有依赖项都会在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并创建一个实例SampleSecuredClass与测试new ,并改变其注解@Configurable那么这个服务被注入,但没有应用方面。
  • 如果我像这样运行(通过将SampleSecuredClass注入为bean),那么该方面将工作并且注入服务,但是必须在框架启动时创建所有对象。 我想使用@Configurable注释。
  • 如果我同时使用@Configurable注释和Aspect,那么我会illegal type in constant pool错误中得到一个illegal type in constant pool并且上下文不会启动。

  • 其他信息。

  • 我尝试了几种不同的java代理 - 弹簧工具和aspectjwrapper。 不用找了。

  • 如果我包含一个aop.xml文件,那么该方面工作,但不是@Configurable。


  • 这似乎是进入等待发生的文档的那些深潜课程之一:)

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

    这就是说我相信你的问题存在于春天的环境生命周期的薄雾中,所以我会仔细检查文档,特别是在周围

  • 手动指定该bean依赖于配置方面depends-on="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"

  • ...或者@Configurable(preConstruction=true)

  • 如果你想在构造函数体执行之前注入依赖项

  • ...或@Configurable(autowire=Autowire.BY_NAME,dependencyCheck=true)
  • 最后,您可以使用dependencyCheck属性为新创建和配置的对象中的对象引用启用Spring依赖项检查。

    仔细阅读文档,看看是否以及如何适用这些命中,请让我们知道您找到的解决方案。 它绝对应该是一个非常有趣的阅读。

    链接地址: http://www.djcxy.com/p/25413.html

    上一篇: AspectJ + @Configurable

    下一篇: Entity manager has not been injected