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

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)
}

猜你喜欢

转载自blog.csdn.net/weixin_42994251/article/details/108396695