尝试在Spring应用程序中同时使用AspectJ和@Configurable
。
@Component
注释的Spring,则AspectJ包装器将工作并包装所有目标方法,而@Autowired
注释会导致注入依赖项。但是,该类无法在运行时使用new
关键字进行实例化,并且已注入依赖项。@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
中的bean并使用SampleSecuredClass
在测试中创建new
的实例,并将其注释更改为@Configurable
,那么服务注入,但不应用方面。SampleSecuredClass
作为bean注入),则方面工作并注入服务,但是必须在框架启动时创建所有对象。我想使用@Configurable
注释。@Configurable
注释和Aspect,那么我会收到illegal type in constant pool
错误并且上下文无法启动。其他信息。
我尝试了一些不同的java代理 - 包括spring instrumentation和aspectjwrapper。没有变化。
如果我包含aop.xml文件,那么方面可以工作但不能@Configurable。
答案 0 :(得分:1)
这似乎是docs等待发生的深度潜水会议之一:)
首先,我要为org.springframework
启用调试日志记录,因为这肯定会提供一些有意义的见解,了解Spring的用途和时间......
据说我相信你的问题出现在Spring的上下文生命周期的 mist 中,所以我会特别仔细查看文档
手动指定bean取决于配置方面depends-on="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"
...或@Configurable(preConstruction=true)
如果希望在构造函数体执行
之前注入依赖项
@Configurable(autowire=Autowire.BY_NAME,dependencyCheck=true)
最后,您可以使用dependencyCheck属性为新创建和配置的对象中的对象引用启用Spring依赖项检查。
仔细阅读文档,了解这些匹配是否以及如何应用,请告诉我们您找到的解决方案。它绝对应该是一个非常有趣的读物。