spring配置详解-scope属性

<?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属性

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值