使用Spring AOP的播放计数器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MASORL/article/details/82558457

接口:CompactDisc

package com.masorl.soundsystem;

public interface CompactDisc {
    void play(int i);
}

接口实现:

package com.masorl.soundsystem;

public class BlankDisc implements CompactDisc{
    public void play(int i) {

    }
}

切面类:用于play()切点的通知

getplayCount: 根据传入的参数,来获取播放次数

通过args(trackNumber) 将参数传入到切面中。

package com.masorl.soundsystem;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

import java.util.HashMap;
import java.util.Map;

@Aspect
public class TrackCounter {
    private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>();

    @Pointcut("execution(* com.masorl.soundsystem.CompactDisc.play(int)) && args(trackNumber)")
    public void trackPlayed(int trackNumber){}

    @Before("trackPlayed(trackNumber)")
    public void countTrack(int trackNumber){
        int currentCount = getPlayCount(trackNumber);
        trackCounts.put(trackNumber, currentCount+1);
    }

    public int getPlayCount(int trackNumber){
        return trackCounts.containsKey(trouble)? trackCounts.get(trackNumber): 0;
    }
}

配置类,将切面类和CompactDisc加入到Spring bean中

package com.masorl.soundsystem;

import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class JavaConfig {
    @Bean
    public CompactDisc compactDisc(){
        return new BlankDisc();
    }

    @Bean
    public TrackCounter trackCounter(){
        return new TrackCounter();
    }
}

此时,Spring容器中,有个一个BlanDisc bean,和一个切面bean,当调用play方法时,或触发切面的通知。

测试方法如下

import com.masorl.soundsystem.CompactDisc;
import com.masorl.soundsystem.JavaConfig;
import com.masorl.soundsystem.TrackCounter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.assertEquals;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class test {
//    @Autowired
//    AsceotDemo asceotDemo;

    @Autowired
    CompactDisc compactDisc;

    @Autowired
    TrackCounter trackCounter;
    @Test
    public void test(){
        compactDisc.play(1);
        compactDisc.play(1);
        compactDisc.play(3);
        compactDisc.play(3);
        compactDisc.play(3);
        compactDisc.play(3);
        compactDisc.play(7);
        compactDisc.play(8);

        assertEquals(2, trackCounter.getPlayCount(1));//1 一共执行了2次,所以对应的次数应该为2
        assertEquals(0, trackCounter.getPlayCount(2));
        assertEquals(4, trackCounter.getPlayCount(3));
        assertEquals(0, trackCounter.getPlayCount(4));
        assertEquals(0, trackCounter.getPlayCount(5));
        assertEquals(0, trackCounter.getPlayCount(6));
        assertEquals(1, trackCounter.getPlayCount(7));
        assertEquals(1, trackCounter.getPlayCount(8));
    }


}

assertEquals 断言来判断播放次数,如果不匹配,就会抛出java.lang.AssertionError:。

猜你喜欢

转载自blog.csdn.net/MASORL/article/details/82558457
今日推荐