注解
@Scope
使用 @Scope 来调整组件的作用域
ConfigurableBeanFactory#SCOPE_PROTOTYPE prototype
ConfigurableBeanFactory#SCOPE_SINGLETON singleton
org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
org.springframework.web.context.WebApplicationContext#SCOPE_SESSION session
prototype:多实例的
IOC 容器启动并不会调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象
singleton:单实例的(默认值)
ioc 容器中会调用方法创建对象放到 ioc 容器中,以后每次获取就是直接从容器中拿
request:同一次请求创建一个实例
session:同一个 session 创建一个实例
一、@Scope 调整组件作用域
创建一个配置类,在里面注册一个 Person 对象:
@Configuration
public class MainConfig2 {
@Bean(value = "person")
public Person person() {
System.out.println("给容器中添加 Person 对象。。。");
return new Person("王五", 20);
}
}
该组件在 IOC 容器中默认都是单例的:
@Test
public void test02() {
ApplicationContext ioc = new AnnotationConfigApplicationContext(MainConfig2.class);
System.out.println("IOC容器创建完成");
Person bean = (Person) ioc.getBean("person");
Person bean2 = (Person) ioc.getBean("person");
System.out.println(bean == bean2); //true
}
在Spring的 IOC 容器中,默认的 Bean 都是单例的,可以设置 @Scope 注解来进行修改。
@Configuration
public class MainConfig2 {
/*
使用 @Scope 来调整组件的作用域
ConfigurableBeanFactory#SCOPE_PROTOTYPE prototype
ConfigurableBeanFactory#SCOPE_SINGLETON singleton
org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
org.springframework.web.context.WebApplicationContext#SCOPE_SESSION session
prototype:多实例的
IOC 容器启动并不会调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象
singleton:单实例的(默认值)
ioc 容器中会调用方法创建对象放到 ioc 容器中,以后每次获取就是直接从容器中拿
request:同一次请求创建一个实例
session:同一个 session 创建一个实例
*/
//默认是单实例的
@Scope("prototype")
@Bean(value = "person")
public Person person() {
System.out.println("给容器中添加 Person 对象。。。");
return new Person("王五", 20);
}
}
其实 @Scope 注解 等价于 bean 标签中的 scope 属性: