<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 创建方式1:空参构造方法 -->
<bean name="user" class="com.learn.bean.User" scope="singleton"></bean>
<!-- 创建方式2:静态工厂创建
调用UserFactory的createUser方法创建名为user2的对象,放入容器
-->
<!-- <bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean> -->
<!-- 创建方式2:实例工厂创建
-->
<!-- <bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean> -->
<!-- <bean name="userFactory" class="com.learn.b_create.UserFactory"></bean> -->
</beans>
package com.learn.a_hello;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.learn.bean.User;
public class Demo {
/**
* 创建方式1:空参构造
*/
@Test
public void fun1() {
/**
* 1.创建容器
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");
/**
* 2.向容器要"user"对象
*/
User u = (User)ac.getBean("user");
User u2 = (User)ac.getBean("user");
User u3 = (User)ac.getBean("user");
User u4 = (User)ac.getBean("user");
System.out.println(u2==u4);
/**
* 打印user对象
*/
// System.out.println(u);
}
/**
* 创建方式2:静态工厂
*/
@Test
public void fun2() {
/**
* 1.创建容器
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");
/**
* 2.向容器要"user"对象
*/
User u = (User)ac.getBean("user2");
/**
* 打印user对象
*/
System.out.println(u);
}
/**
* 创建方式2:动态工厂
*/
@Test
public void fun3() {
/**
* 1.创建容器
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");
/**
* 2.向容器要"user"对象
*/
User u = (User)ac.getBean("user3");
/**
* 打印user对象
*/
System.out.println(u);
}
}
User空参构造方法
true
scope属性首先从位置上来讲,它是在咱们的bean元素上加的,scope属性,然后咱们来解释这个scope属性,
他分别都有什么,代表什么意思,scope取值一般是四种,分别是什么呢,singleton,然后是prototype,
还有叫request,还有叫session,常起的就是这四种,然后其中下面这两种,标成绿色,了解,这两种标成
红色,一个一个来看,singleton这什么意思,首先是一个默认值,首先你要知道他是默认值,现在咱们没有用scope属性,
那就意味着,取值就是sigleton,就像他名字描述的一样,单例的,单例对象,所谓单例对象,就是咱们这个对象在容器中,
只会被创建一份,一个实例,被标识为单例的对象,在Spring容器中,只会存在一个实例,那其实就是在刚才这里,我把scope
等于singleton给他显示的配上,那我们在这个demo里边,就拿构造来看就行了,看得到我这是啥意思不,我这里是不是获得
四次这个对象,但是因为它配置是singleton,返回的都是同一个对象,所以直接打印u2==u4,返回应该是true,执行一下就可以
看到打印结果,是不是true,所以这就是所谓的单例,我把这个方法复制一份,单例,scope为singleton,这样的话通过这例子就可以
看出来,singleton的特点,再看第二个取值,prototype,prototype其实翻译过来的话,是多例的,多例原型,这啥意思呢,被
标识为多例的对象,每次再获得时,才会创建,不会像单例在容器时就创建了,每次获得时才会创建,并且每次创建,都是新的
对象,那接下里可以掩饰一下,把scope改成prototype,然后demo里这个方法可以继续用,刚才打印是true,如果多例的话,打印
是什么,打印情况,单例是true,多例就是false,你会看到一堆构造打印了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 创建方式1:空参构造方法 -->
<bean name="user" class="com.learn.bean.User" scope="prototype"></bean>
<!-- 创建方式2:静态工厂创建
调用UserFactory的createUser方法创建名为user2的对象,放入容器
-->
<!-- <bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean> -->
<!-- 创建方式2:实例工厂创建
-->
<!-- <bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean> -->
<!-- <bean name="userFactory" class="com.learn.b_create.UserFactory"></bean> -->
</beans>
/**
* scope:single单例
* scope:prototype多例
*/
@Test
public void fun4() {
/**
* 1.创建容器
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");
/**
* 2.向容器要"user"对象
*/
User u = (User)ac.getBean("user");
User u2 = (User)ac.getBean("user");
User u3 = (User)ac.getBean("user");
User u4 = (User)ac.getBean("user");
/**
* 单例:true
* 多例:false
*/
System.out.println(u2==u4);
/**
* 打印user对象
*/
// System.out.println(u);
}
User空参构造方法
User空参构造方法
User空参构造方法
User空参构造方法
false
这四个构造方法都打印出来了,多例的每次获得都会创建,然后再看这个取值,这个返回值,
就是false,所以这两个对象不是同一个对象,这就是多例的,那这两个是scope属性将来要使用的重点,
下面用不着的解释一下,request指的是啥呢,web环境下,对象与request生命周期一致,也就是每次请求过后,
而session的话,只有在web环境下才会有效,咱们创建被标识的对象,与谁生命周期一致呢,session生命周期一致,
咱们即使在WEB环境下也不会用这两个scope的,记住这两个没用,你说上面的singleton和prototype,就是这两个
取值,什么情况下,咱们用singleton,在什么情况下使用prototype,在未来开发中,绝大多数,scope属性的取值,
全都使用默认值,就可以,但是切记,等到与struts框架整合的时候,Spring与Struts整合的时候,咱们说Action对象,
交给Spring来负责管理,知道啥意思不,struts要去访问或者调用action的时候,都会找Spring要,那这个时候切记,
Action要配置成单例还是多例,多例,为啥,Struts2从架构设计上来说,强调过,是每次请求都会,都会创建一个新的
Action,所以,咱们Action这个Bean在使用的时候,必须声明为多例的,那如果是单例的那就完了,同时有10个请求过来,
struts找Spring要Action,结果Spring给了10个请求同一个Action,那你想他就改变了Struts的设计了,那问题就多了,
所以prototype,将来要用的话,记住,在整合struts2时,咱们的ActionBean必须配置为多例的,其他绝大多数,像DAO,
Service,全都是单例的,单例就可以,在整个容器当中,只有一个对象就够了,这就是scope属性