@Scope
@Scope默认是单例模式,即scope=“singleton”。
另外scope还有prototype、request、session、global session作用域。scope="prototype"多例
例:@scope默认是单例模式(singleton)即:@scope(“prototype”)
1.singleton单例模式,
全局有且仅有一个实例
2.prototype原型模式,
每次获取Bean的时候会有一个新的实例
3.request
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,
4.session
session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
5.global session
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。
示例:
singleton: IOC容器启动时调用方法创建对象,放入容器中,以后每次获取直接拿
public class MainConfig {
//给容器中注册一个Bean,类型为返回值的类型,方法名作为id;也可以指定id:@Bean("id")
@Bean
public Person person(){
return new Person("zhangsan", 18);
}
}
@Test
public void test02(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
Object person = ac.getBean("person");
Object person2 = ac.getBean("person");
System.out.println(person == person2);//true
}
prototype: IOC容器启动时并不创建,每次获取时调用方法创建对象
public class MainConfig {
//给容器中注册一个Bean,类型为返回值的类型,方法名作为id;也可以指定id:@Bean("id")
@Bean
@Scope("prototype")
public Person person(){
return new Person("zhangsan", 18);
}
}
@Test
public void test02(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
Object person = ac.getBean("person");
Object person2 = ac.getBean("person");
System.out.println(person == person2);
}
@Lazy
针对单实例Bean(@Scope为singleton):容器启动不创建对象。第一次使用(获取)Bean时创建对象,并初始化。
//给容器中注册一个Bean,类型为返回值的类型,方法名作为id;也可以指定id:@Bean("id")
@Bean
@Scope("singleton")
@Lazy
public Person person(){
return new Person("zhangsan", 18);
}