@DeclareParents未能引入新方法

时间:2017-01-20 05:42:00

标签: java spring aop

大家,我是春天的初学者,我遇到了 @DeclareParents 的一些问题。我按照 Spring In Action 中的说明进行操作,但我没有意识到介绍。

这是我的代码。 我首先定义接口性能

public interface Performance {
    void perform();
}

然后实现界面。

@Component
public class OnePerformance implements Performance {
    @Autowired
    public OnePerformance(){
    }

    public void perform() {
        System.out.println("The Band is performing....");
    }

}

我想将方法​​ void performEncore()引入效果。 所以我定义了接口,

public interface Encoreable {
    void performEncore();
}

实施它,

@Aspect
public class DefaultEncoreable implements Encoreable{
    public void performEncore() {
        System.out.println("performEncore");
    }
}

并介绍它,

@Aspect
@Component
public class EncoreableIntroduction {            
    @DeclareParents(value="Performance+",
        , defaultImpl=DefaultEncoreable.class)
     public static Encoreable encoreable;
}

我使用自动配置,

@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class ConcertConfig {
}

但是,在测试时,我没有引入方法void performEncore()。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= ConcertConfig.class)
public class OnePerformanceTest {
    @Autowired
    private Performance performance;

    @Test
    public void perform() throws Exception {
        performance.perform();
}}

Junit4 Test Class

我还启用了AspectJ支持插件。 My IntelliJ IDEA PLUGIN Settings

我仔细阅读了这本书和几个博客,但我仍然无法找到原因。那么这个问题可能是什么原因呢?提前谢谢。

1 个答案:

答案 0 :(得分:0)

感谢M. Deinum,NewUser和Wim Deblauwe。在他们的帮助下,我终于弄明白了这个问题。以前的JUnit4类不正确。

解决此问题的正确解决方案是将效果强制转换为 Encoreable ,然后调用performEncore()方法。

代码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= ConcertConfig.class)
public class OnePerformanceTest {
    @Autowired
    private Performance performance;

    @Test
    public void perform() throws Exception {
        Encoreable encoreable = (Encoreable)(performance);
        encoreable.performEncore();
    }
}

screen capture of the final result