Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring应用中非spring bean的加载时间编织_Spring_Aspectj_Spring Aop_Load Time Weaving_Spring Aspects - Fatal编程技术网

spring应用中非spring bean的加载时间编织

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

我有一个springboot应用程序,其中包含一些REST控制器、服务类和助手类。控制器和服务类是spring管理的,而助手类不是spring管理的,并且大多包含静态方法

AspectJ配置出现在java配置中,如下所示

@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日志
问题,, 1.我们如何为非spring管理的类(即没有@Bean、@Autowired、@Component等)配置aspectj建议。 2.我们如何为静态方法配置aspectj建议(我正在使用@EnableLoadTimeWeaving,但可能我遗漏了一些东西) 3.如果可能,AspectJ配置应该基于java


如果需要更多详细信息,请告诉我

使用
-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后处理。