Spring注解(三) @Scope

239 阅读1分钟

@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");
}