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