概述

通过Spring管理的类,默认是单例模式,但是如果有的类需要使用独立的属性,则需要配置为多例模式的. 但是多例模式不仅仅只是加一个声明,使用@Autowired进行注入,可能并不会是你想要的结果.因为多例模式的类是需要单独调用的.

不搞清楚原理直接撸

需要多例的类上加上注解@Scope("prototype")

@Component
@Scope("prototype")
public class ExampleService{

    public void test(){
        System.out.println("test,current bean is" + this);
    }
    
}

引用直接使用@Autowired

@Controller
public class ExampleService{

    @Autowired
    private ExampleService exampleService;
    
    @RequestMapping("test")
    public void test(){
        exampleService.test();
    }
    
}

结果: 每个request过来的时候,exampleService实例均为同一个实例.

解决办法

不使用@Autowired

@Controller
public class ExampleService{

    @Autowired
    private org.springframework.beans.factory.BeanFactory beanFactory;
    
    @RequestMapping("test")
    public void test(){
        ExampleService exampleService = beanFactory.getBean(ExampleService.class);
        exampleService.test();
    }
}

官方文档说明

4.5.3 Singleton beans with prototype-bean dependencies When you use singleton-scoped beans with dependencies on prototype beans, be aware that dependencies are resolved at instantiation time. Thus if you dependency-inject a prototype-scoped bean into a singleton-scoped bean, a new prototype bean is instantiated and then dependency-injected into the singleton bean. The prototype instance is the sole instance that is ever supplied to the singleton-scoped bean. However, suppose you want the singleton-scoped bean to acquire a new instance of the prototype-scoped bean repeatedly at runtime. You cannot dependency-inject a prototype-scoped bean into your singleton bean, because that injection occurs only once, when the Spring container is instantiating the singleton bean and resolving and injecting its dependencies. If you need a new instance of a prototype bean at runtime more than once, see Section 4.4.6, “Method injection”

参考

spring单例和多例详解的实验,以及如何使用多例模式