尝试在Spring应用程序中同时使用AspectJ和@Configurable
。
@Component
批注的Spring,AspectJ包装器将工作并包装所有目标方法,并且@Autowired
批注会导致依赖项被注入(inject)。但是,无法在运行时使用new
关键字实例化该类,并且已注入(inject)依赖项。 @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
错误,并且上下文不会启动。 其他信息。
最佳答案
这似乎是等待docs进行的那些深潜 session 之一:)
首先,我将启用org.springframework
的调试日志记录,因为这肯定会为Spring的功能和时间提供一些有意义的见解。
话虽这么说,我相信您的问题出在 Spring 的上下文生命周期的迷雾中,所以我会仔细检查文档,尤其是在
depends-on="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"
@Configurable(preConstruction=true)
的注释@Configurable(autowire=Autowire.BY_NAME,dependencyCheck=true)
仔细阅读文档,看看这些匹配是否适用以及如何应用,请让我们知道您找到的解决方案。它绝对应该呈现为非常有趣的阅读内容。