上篇我们通过《SpringBoot实战5-Spring基础-配置与注入》学习来Bean的配置和注入的知识。
本篇学习Bean的Scope。
Bean的Scope
容器中的Bean的Scope指的是Bean的实例在容器中创建的方式。在容器中默认是singleton,整个容器中只创建一个Bean的实例。常用的还有prototype,每次请求Bean时都会创建一个实例。我们可以通过@Scope注解来设置Scope。在本文我们只讲解常用的singleton和prototype。
下面两种方式是相同的:
@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();
};
}
输出结果是: