咖啡汪——极客时间课堂笔记——IOC和AOP拓展核心——多例注入的BUG解决办法

tech2025-03-03  8

Spring框架:IOC 和 AOP是拓展的核心

1.SayHelloService extends SayServie SayByService extends SayService 在SayService中加入了数据维护,ArrayList类型属性data,会保存方法say()处理的中间数据, 每次调用say()方法,都会往data中加入新数据,可以认为SayService是有状态的:

public abstract class SayService { List<String> data = new ArrayList<>(); public void say() { data.add(IntStream.rangeClosed(1,1000000) .mapToObj(__->"a") .collect(Collectors.joining("")) + UUID.randomUUID().toString()); } }

需要将SayHelloService注入到SayContorller`

给子类加@Service注解,要看类是否有状态,默认为单例,但此时应为多例, RestController注解其实也是一个Spring Bean Bean默认单例,所以单例的Controller注入的Service也是一次性创建的,即使services设置了多例也没用

解决方法一: 在SayHelloService上加一下注解:

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS )

设置service为多例,且是以代理的方式注入的 解决方法二: Contorller不采用自动注入的方式,可以每次直接从ApplicationContext中获取Bean:

@Autowired private ApplicationContext context; @RequestMapping("test") public void test() { context.getBeansOfType(SayService.class) .values() .forEach(SayService::say) }
最新回复(0)