通过Spring注解开发,简单测试单例和多例区别

通过spring注解开发,测试单例和多例区别

1.注解和配置两种用法形式

配置版:

EE414818-E5C2-21FA-2D71-2E2613952BAF.png

注解版:

7CC7C533-FC1B-A790-646A-6608361D9A79.png

2.在spring框架中,scope作用域默认是单例的。

注:以下测试均是注解版

3.(1)多例:

配置类:

@Configuration

public class PersonConfigure {

//给容器中注册一个bean,类型为返回值的类型,id为方法名

@Scope("prototype") //多例

@Bean()

public Person person() {

System.out.println("bean被加载到容器中");

return new Person("张三",23);

}

}

单元测试:

@Test

public void test02() {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PersonConfigure.class);

System.out.println("ioc容器加载完成");

Person bean = (Person) context.getBean("person");

bean.setName("lisi");

System.out.println(bean.toString());

Person bean1 = (Person) context.getBean("person");

System.out.println(bean1.toString());

System.out.println(bean==bean1);

}

}

测试结果:

FF286AE9-AA14-18C1-9C19-34DB818DDDB7.png

结论:多例情况下,容器创建完成时不调用方法创建对象到容器中,在程序中获取时,才会将对象加载到容器中,而且每次调用生成的都是不同的对象。

(2)单例(注解版)

配置类:

//默认是单例

@Configuration

public class PersonConfigure {

//给容器中注册一个bean,类型为返回值的类型,id为方法名

@Bean()

public Person person() {

System.out.println("bean被加载到容器中");

return new Person("张三",23);

}

}

单元测试:

@Test

public void test02() {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PersonConfigure.class);

System.out.println("ioc容器加载完成");

Person bean = (Person) context.getBean("person");

bean.setName("lisi");

System.out.println(bean.toString());

Person bean1 = (Person) context.getBean("person");

System.out.println(bean1.toString());

System.out.println(bean==bean1);

}

}

测试结果:

EDA8216F-E3AB-35F2-D65F-F07A8D9900DD.png

结论:单例情况下,容器创建时调用方法创建对象到容器中,在程序中调用bean,直接从容器中拿取,且每次拿取的都是同一个对象。如果上一次对bean里的属性做了修改,那下一次拿取的就是修改过的bean。

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的