spring默认的scope_spring默认的线程池

SpringBoot实战6-Spring基础-Scope

上篇我们通过《SpringBoot实战5-Spring基础-配置与注入》学习来Bean的配置和注入的知识。
本篇学习Bean的Scope。

Bean的Scope

容器中的Bean的Scope指的是Bean的实例在容器中创建的方式。在容器中默认是singleton,整个容器中只创建一个Bean的实例。常用的还有prototype,每次请求Bean时都会创建一个实例。我们可以通过@Scope注解来设置Scope。在本文我们只讲解常用的singletonprototype。

下面两种方式是相同的:

@Service
public class ScopeService {
}
@Service
@Scope(BeanDefinition.SCOPE_SINGLETON) //与@Scope("singleton")相同
public class ScopeService {
}

我们使用@Scope(
BeanDefinition.SCOPE_PROTOTYPE)
来指定Scope为prototype

@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE) //与@Scope("prototype")相同
public class ScopeService2 {
}

我们除了可以在方法上注解@Scope,也可以在@Bean的类上注解@Scope,如我们对类:

public class ScopeService3 {
}

JavaConfig中配置:

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //与@Scope("prototype")相同
public ScopeService3 scopeService3(){
    return new ScopeService3();
}

这时我们在ScopeInjectService Bean中分别给上面三个Bean注入两次,判断相同类型的两个注入是否相等:

@Service
public class ScopeInjectService {
    private ScopeService scopeService;
    private ScopeService scopeService1;
    private ScopeService2 scopeService2;
    private ScopeService2 scopeService21;
    private ScopeService3 scopeService3;
    private ScopeService3 scopeService31;
	//只有一个构造器,此处可省略@Autowired
    public ScopeInjectService(ScopeService scopeService,
                              ScopeService scopeService1,
                              ScopeService2 scopeService2,
                              ScopeService2 scopeService21,
                              ScopeService3 scopeService3,
                              ScopeService3 scopeService31) {
        this.scopeService = scopeService;
        this.scopeService1 = scopeService1;
        this.scopeService2 = scopeService2;
        this.scopeService21 = scopeService21;
        this.scopeService3 = scopeService3;
        this.scopeService31 = scopeService31;
    }

    public void validateScope(){
        System.out.println(scopeService.equals(scopeService1));//容器内只有一个实例,所以相等
        System.out.println(scopeService2.equals(scopeService21));//请求注入创建新的实例,不相等
        System.out.println(scopeService3.equals(scopeService31));//请求注入创建新的实例,不相等
    }
}

JavaConfig执行:

@Bean
CommandLineRunner scopeClr(ScopeInjectService scopeInjectService){
    return args -> {
      scopeInjectService.validateScope();
    };
}

输出结果是:

下一篇《SpringBoot实战7-Spring基础-生命周期

原文链接:,转发请注明来源!