当前位置: 首页 > 知识库问答 >
问题:

Spring Boot方面自动连接

尉迟清野
2023-03-14

我已经创建了一个注释来调用Spring Boot项目中的Spring AOP方面。所有的工作都很好,直到我尝试将一个依赖项自动转化到方面:自动转化不会发生。

我在stackoverflow的各种问题中读到,这是因为方面不是Spring管理的。如果之前已经回答了这个问题,请原谅,但是我已经尝试了stackoverflow中提到的各种解决方案,包括使用@Configurable和实现ApplicationContextAware。

/**
 * Aspect applying the annotation {@link LogDuration} to where ever it has been added, see {@link #logDuration(ProceedingJoinPoint, LogDuration)}.  
 */
@Configurable
@Aspect
public class LogDurationAspect {

    private static final Logger LOGGER = LogManager.getLogger( LogDurationAspect.class );

    @Autowired
    private TimeMeasurer timeMeasurer;// = new TimeMeasurer();

    public LogDurationAspect() {
    }

    /** For any method with @LogDuration, no matter what the return type, name, or arguments are, call this method to log how long it takes. */ 
    @Around("@annotation(annotation)")
    public Object logDuration( ProceedingJoinPoint joinPoint , LogDuration annotation ) throws Throwable {

        System.out.println( timeMeasurer );

        final long startTime = timeMeasurer.now();
        try{
            final Object result = joinPoint.proceed();

            final long duration = timeMeasurer.timeSince( startTime );

            LOGGER.info( String.format( "%s returned %s took %d ms %.3f s" , annotation.value() , result , duration , 0.001 * duration ) );

            return result;
        }
        catch ( Throwable t){
            final long duration = timeMeasurer.timeSince( startTime );
            LOGGER.error( String.format( "%s took %d ms %.3f s" , annotation.value() , duration , 0.001 * duration ) , t);
            throw t;
        }
    }
}

/**
 * Simple annotation which will log the duration of a method via {@link LogDurationAspect#logDuration(org.aspectj.lang.ProceedingJoinPoint, LogDuration)}.
 */
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface LogDuration {
   String value();
}

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = LogDurationAspectITests.TestConfiguration.class )
public class LogDurationAspectITests {

    @Autowired
    private TestListener underTest;

    @Rule 
    public OutputCapture outputCapture = new OutputCapture();

    @Autowired
    private TimeMeasurer timeMeasurer;

    @Test 
    public void annotationWorks() {

        // prove that scanning is working
        assertThat( timeMeasurer , is( notNullValue( ) ) );

        underTest.doIt( 1234 );

        assertThat( outputCapture.toString() , containsString ( "doIt 1 2 3 returned 2468 took") );
    }

    @SpringBootApplication
    @Configuration
    public static class TestConfiguration {
    }
}

@Component
public class TimeMeasurer{

    /** @return milliseconds between now and start.*/ 
    public long timeSince( long start ) {

        return now( ) - start;        
    }

    /** @return current time in milliseconds. */
    public long now( ) {

        return System.currentTimeMillis( );
    }

}

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.1.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

</dependencies>

以及如何调试方面?

谢谢

共有1个答案

单于旭东
2023-03-14

向使用Aspects.AspectOf的配置类添加了一个bean

@SpringBootApplication
@Configuration
public static class TestConfiguration {

    /** 
     * This is needed to get hold of the instance of the aspect which is created outside of the spring container, 
     * and make it available for autowiring. 
     */
    @Bean
    LogDurationAspect logDurationAspect()
    {
        final LogDurationAspect aspect = Aspects.aspectOf(LogDurationAspect.class);
        return aspect;
    }
}
 类似资料:
  • 我与SpringBoot和JPA合作。我收到一个无法完成的错误。 这是我的主要课程: 这是我的班级失败的原因: 这是类: 这是错误消息: 错误创建bean的名称'请求LoggerImpl':注入自动生成的依赖失败; 无法自动关联字段:专用com。存储库。请求logdao.com。记录器。impl。RequestLoggerImpl。请求logdao;嵌套的异常是org。springframewor

  • 这里怎么了?是否可以使用这样的PowerShell脚本? 我可以通过HTML页面调用此脚本吗(因为我将在网页上放置许多其他资源,这些资源将作为开发人员的一个链接,这样我们就不会在每次需要它们时浪费时间和精力去查找它们)?是否可以将应用程序注册到URI方案? 还有其他(标准)方法吗?

  • 我有一个应用类 我有控制器课 并且,我想为Application test编写一个测试用例,以确保创建的实例类型为HelloController 但是,我在自动连接 hello控制器变量时遇到错误(找不到 hello 控制器类型的 bean)。根据我的理解,@SpringBootTest应该创建上下文并返回一个实例。我们不需要编写任何上下文 xml 或使用任何注释Config 类来获取实例。缺少了

  • 本文向大家介绍Python自动连接ssh的方法,包括了Python自动连接ssh的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python自动连接ssh的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 4.1 根据条件的自动配置 @conditional是基于条件的自动配置,一般配合Condition接口一起使用,只有接口实现类返回true,才装配,否则不装配. 用实现了Condition接口的类传入@Conditional中 @Conditional可以标记在配置类的方法中,也可以标记在配置类上.标记的位置不同,作用域不同. @Conditional可以传入多个实现了condition接口的类

  • 我有一个简单的组件类: 在构造函数的参数中,IntelliJ报告: