Spring-Bean的作用域(单实例还是多实例?)
Spring-Bean的作用域(单实例还是多实例?)
默认情况下是单实例的
使用scope属性指定
Singleton:单实例(在容器启动完成之前就已经创建好了,保存在容器中了,任何时候获取都是获取之前创建好的那个对象)
Prototype:多实例(容器启动默认不会创建多实例bean对象,只有在获取的时候才创建,每次获取都会创建一个新的实例对象)
一、验证:默认情况下是单实例对象
(1)创建类
public class Book { private String bname; private String bauthor; public void setBname(String bname) { this.bname = bname; } public void setBauthor(String bauthor) { this.bauthor = bauthor; } public void getBookInfo() { System.out.println(bname+"::"+bauthor); } }
(2)配置文件
<bean name="book" class="com.company.spring5.Book" >
<property name="bname" value="jiang"></property>
<property name="bauthor" value="<<南京>>"></property>
</bean>
(3)测试
@Test public void booktest() { //1.加载Spring配置文件 ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); //2.获取配置的创建对象 Book book1 = context.getBean("book", Book.class); Book book2 = context.getBean("book", Book.class); //在spring里面,默认情况下是单实例对象 System.out.println(book1); System.out.println(book2); //book.getBookInfo(); }
(4)结果
com.company.spring5.Book@72cc7e6f
com.company.spring5.Book@72cc7e6f
二、如何设置多实例?
在spring配置文件bean标签里面有scope属性用于设置单例还是多实例
Scope属性值
默认值:singleton表示单实例对象
第二个值:prototype表示多实例对象
(1)创建对象
public class Book { private String bname; private String bauthor; public void setBname(String bname) { this.bname = bname; } public void setBauthor(String bauthor) { this.bauthor = bauthor; } public void getBookInfo() { System.out.println(bname+"::"+bauthor); } }
(2)配置文件
<bean name="book2" class="com.company.spring5.Book" scope="prototype"> <property name="bname" value="jiang"></property> <property name="bauthor" value="<<南京>>"></property> </bean>
(3)测试
@Test public void test2() { //1.加载Spring配置文件 ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); //2.获取配置的创建对象 Book book1 = context.getBean("book2", Book.class); Book book2 = context.getBean("book2", Book.class); System.out.println(book1); System.out.println(book2); //book.getBookInfo(); }
(4)结果
com.company.spring5.Book@7161d8d1
com.company.spring5.Book@74e28667