AOP问题,烦恼我一天了!

ASY丶丶 2019-04-01 04:10:15
问题:
切面类是记录CD里每个磁道的播放量的,每次播放都会记录磁道,但记录的那个bean和测试类里的实例不是一个,怎么解决,谢谢各位大佬!
-------------------------------------------------------------------------------------
测试类

package soundsystem;

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;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TrackCounterConfig.class)
public class CDPlayerTest {

@Autowired
private CompactDisc cd;

@Autowired
private TrackCounter counter;

@Test
public void testCDPlayer(){
cd.playTrack(1);
cd.playTrack(2);
System.out.println(counter.getTrackCounts());
System.out.println(counter.getPlayCount(1));
System.out.println(counter.getPlayCount(2));
System.out.println(counter.getPlayCount(3));
}

}


配置类

package soundsystem;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableAspectJAutoProxy
public class TrackCounterConfig {

@Bean
public CompactDisc sgtPeppers(){
BlankCompactDisc cd = new BlankCompactDisc();
cd.setTitle("Sgt. Pepper's Lonely Hearts Club Band");
cd.setArtist("The Beatles");
List<String> tracks = new ArrayList<>();
tracks.add("Sgt. Pepper's Lonely Hearts Club Band");
tracks.add("With a Little help from My Friends");
tracks.add("Lucy in the Sky with Diamonds");
tracks.add("Getting Better");
tracks.add("Fixing a Hole");
cd.setTracks(tracks);
return cd;
}

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

}



CD类

package soundsystem;

import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class BlankCompactDisc implements CompactDisc {

private String title;
private String artist;
private List<String> tracks;

@Override
public void play() {
System.out.println("Playing " + title + " by " + artist);
for(String track:tracks){
System.out.println("-Track: " + track);
}
}

@Override
public void playTrack(int trackNumber) {
System.out.println(tracks.get(trackNumber));
}

public void setTitle(String title) {
this.title = title;
}

public void setArtist(String artist) {
this.artist = artist;
}

public void setTracks(List<String> tracks) {
this.tracks = tracks;
}
}



切面类

package 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<>();

@Pointcut(
"execution(* soundsystem.CompactDisc.playTrack(int))" + " && args(trackNumber)"
)
public void trackPlayed(int trackNumber) {}

@Before("trackPlayed(trackNumber)")
public void countTrack(int trackNumber) {
int currentCount = getPlayCount(trackNumber);
currentCount++;
trackCounts.put(trackNumber, currentCount);
System.out.println("开始记录磁盘:\n" + trackCounts);
}

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

public Map<Integer, Integer> getTrackCounts() {
return trackCounts;
}
}
...全文
59 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
:: 2019-04-12
  • 打赏
  • 举报
回复
<!-- 配置切面的Bean --> <bean id="sysAspect" class="com.example.aop.SysAspect"/> <!-- 配置AOP --> <aop:config> <!-- 配置切点表达式 --> <aop:pointcut id="pointcut" expression="execution(public * com.example.controller.*Controller.*(..))"/> <!-- 配置切面及配置 --> <aop:aspect order="3" ref="sysAspect"> <!-- 前置通知 --> <aop:before method="beforMethod" pointcut-ref="pointcut" /> <!-- 后置通知 --> <aop:after method="afterMethod" pointcut-ref="pointcut"/> <!-- 返回通知 --> <aop:after-returning method="afterReturnMethod" pointcut-ref="pointcut" returning="result"/> <!-- 异常通知 --> <aop:after-throwing method="afterThrowingMethod" pointcut-ref="pointcut" throwing="ex"/> <aop:around method="aroundMethod" pointcut-ref="pointcut"/> </aop:aspect> </aop:config> 类似这种引入到测试类里面,用的bean感觉是一样的(除非测试的时候自己又创建了一个上下文) 个人猜测,公司的环境太老了RunWith这种东西都没有,没验证过。
:: 2019-04-12
  • 打赏
  • 举报
回复
你用xml文件配置aop,测试类引入xml试试
十八道胡同 2019-04-12
  • 打赏
  • 举报
回复
找到原因了吗?
ASY丶丶 2019-04-01
  • 打赏
  • 举报
回复
引用 1 楼 LCL_data 的回复:
意思是test类里面的 TrackCounter和Bean里面的TrackCounter 实例 不一样?
对的 现在发现Aspect注解的类不是bean 问题已经解决了 但我还想知道如何让这个变成一个bean
十八道胡同 2019-04-01
  • 打赏
  • 举报
回复
意思是test类里面的 TrackCounter和Bean里面的TrackCounter 实例 不一样?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧