@Scope注解使用
容器中的单例
1. 编写配置类
@ComponentScan("com.alex")
@Configuration
public class ScopeConfig {
@Bean
public Person person() {
return new Person(1, "alex");
}
}
2. 加载配置类并测试
@Test
void testScopeConfig() {
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(ScopeConfig.class);
Person person = (Person)ioc.getBean(Person.class);
System.out.println("person id" + person.getId());
System.out.println("person name" + person.getName());
System.out.println(person);
Person person2 = (Person)ioc.getBean(Person.class);
System.out.println("person2 id" + person2.getId());
System.out.println("person2 name" + person2.getName());
System.out.println(person2);
}
- 结果
person id 1
person name alex
com.alex.person.Person@125290e5
person2 id 1
person2 name alex
com.alex.person.Person@125290e5
两个对象地址相同, 可以看出容器中加载的对象是个单例
利用@Scope修改成多实例
@Scope
String SCOPE_SINGLETON = "singleton"; //ioc启动就创建对象放入容器了
String SCOPE_PROTOTYPE = "prototype"; //多例 获取对象的时候才调用
String SCOPE_REQUEST = "request";
String SCOPE_SESSION = "session";
- 具体使用
@Scope("prototype")
@Bean
public Person person() {
return new Person(1, "alex");
}
- 结果 地址已经不同了
person id 1
person name alex
com.alex.person.Person@27adc16e
person2 id 1
person2 name alex
com.alex.person.Person@b83a9be
懒加载@Lazy
- 容器创建单实例的时候是启动时就创建对象, 如果想用到时再创建叫做懒加载 具体使用
@Lazy
@Scope("singleton")
@Bean
public Person person() {
return new Person(1, "alex");
}