spring应用中非spring bean的加载时间编织
我有一个springboot应用程序,其中包含一些REST控制器、服务类和助手类。控制器和服务类是spring管理的,而助手类不是spring管理的,并且大多包含静态方法 AspectJ配置出现在java配置中,如下所示spring应用中非spring bean的加载时间编织,spring,aspectj,spring-aop,load-time-weaving,spring-aspects,Spring,Aspectj,Spring Aop,Load Time Weaving,Spring Aspects,我有一个springboot应用程序,其中包含一些REST控制器、服务类和助手类。控制器和服务类是spring管理的,而助手类不是spring管理的,并且大多包含静态方法 AspectJ配置出现在java配置中,如下所示 @Configuration @EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED) public class AspectConfig { @Bean public LoggingAsp
@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AspectConfig {
@Bean
public LoggingAspect loggingAspect() {
return new LoggingAspect();
}
}
相应的LoggingAspect类如下所示
@Aspect
public class LoggingAspect {
@Before("allMethodsPointcut()")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Entering Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
}
@After("allMethodsPointcut()")
public void logAfterMethod(JoinPoint joinPoint) {
System.out.println("Exiting Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
}
@Pointcut("execution(* com.test.controller..*(..)) || execution(* com.test.service..*(..)) || execution(* com.test.helper..*(..))")
public void allMethodsPointcut() {
}
}
- 调用控制器时,启用方面的日志记录适用于控制器和服务功能,但不适用于帮助器功能
- 如果我们在控制器中自动连接helper类,那么非静态helper方法将开始显示aspectj日志。但是,静态助手方法仍然不显示aspectj日志
如果需要更多详细信息,请告诉我使用
-javaagent:/path/to/aspectjweaver-.jar
作为JVM的启动参数,以启用加载时编织。从spring配置中删除@enableAspectProxy
,这样spring就不会试图使用自己的spring AOP框架而不是纯AspectJ。或者,创建META-INF/aop.xml
。如果要将spring配置应用于非spring管理的bean(@Configurable
POJO),请添加@enableS普林gConfigured
。我已经阅读了关于堆栈溢出的类似评论,但我想知道为什么它不能与配置中包含的EnableLoadTimeWeaving一起工作。我没有包括使能性,所以春天不应该干扰编织过程。此外,部署服务器可能不在我的控制之下,因此对添加命令行VM参数持怀疑态度。对于最后一部分,您的意思是不是每个不是spring管理的类都应该用“可配置”注释?@EnableLoadTimeWeaving
通过classloader magic工作。通过类加载做这种事情总是有风险的,所以我尽量避免。这就是为什么我从不使用Spring的@EnableLoadTimeWeaving
。查看LoadTimeWeaver
class'层次结构,了解支持哪些环境。然后,选择您的环境并查看特定实现类的文档,了解您可能需要提供的任何其他配置。当然,最好的办法是去掉所有这些东西,然后继续编译时编织。或者,如果您使用的是Tomcat版本,则只需控制服务器并使用agentFor示例[6..8)您需要在war中的META-INF/context.xml
文件中明确指定类加载器:
。@Configurable
注释是需要的,如果您想让非spring管理的bean在spring构建时得到配置。您不需要它来将编织应用到类中。如果在spring上,托管类具有@Autowired
字段,或者需要对其应用任何其他Springbean后处理。