Spring学习-- Bean 的作用域
本文内容纲要:Spring学习-- Bean 的作用域
Bean 的作用域:
- 在 Spring 中 , 可以在
元素的 scope 属性里设置 bean 的作用域。 - 默认情况下 , Spring 只为每个在 IOC 容器里声明的 bean 创建唯一一个实例 , 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 bean 引用都将返回这个唯一的 bean 实例 , 该作用域被称为 singleton , 他是所有 bean 的默认作用域 , 属于单例对象。
类别 | 说明 |
Singleton | 在 Spring IOC 容器中仅存在一个 bean 实例 , bean 以单例的方式存在 |
Prototype | 每调用一次 getBean() 都会生成一个新的实例 |
Request | 每次 HTTP 请求都会创建一个新的 bean , 该作用域仅适用于 WebApplicationContext 环境 |
Session | 同一个 HTTP Session 共享一个 bean , 不同的 HTTP Session 使用不同的 bean , 该作用域仅适用于 WebApplicationContext 环境 |
Singleton:
1 package com.itdjx.spring.beans.scope; 2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 /**
7 * @author Wáng Chéng Dá
8 * @create 2017-03-02 8:34
9 */
10 public class Main {
11
12 public static void main(String[] args) {
13
14 ApplicationContext app = new ClassPathXmlApplicationContext("scope_beans.xml");
15
16
17 }
18 }
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <bean id="person" class="com.itdjx.spring.beans.scope.Person">
7 <property name="name" value="华崽儿"/>
8 <property name="age" value="27"/>
9 </bean>
10
11 </beans>
1 package com.itdjx.spring.beans.scope;
2
3 /**
4 * @author Wáng Chéng Dá
5 * @create 2017-03-02 8:33
6 */
7 public class Person {
8
9 private String name;
10
11 private int age;
12
13 public String getName() {
14 return name;
15 }
16
17 public void setName(String name) {
18 this.name = name;
19 }
20
21 public int getAge() {
22 return age;
23 }
24
25 public void setAge(int age) {
26 this.age = age;
27 }
28
29 public Person() {
30 System.out.println("I am scope.Person Constructor...");
31 }
32 }
控制台输出:
I am scope.Person Constructor... |
1 package com.itdjx.spring.beans.scope; 2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 /**
7 * @author Wáng Chéng Dá
8 * @create 2017-03-02 8:34
9 */
10 public class Main {
11
12 public static void main(String[] args) {
13
14 ApplicationContext app = new ClassPathXmlApplicationContext("scope_beans.xml");
15 Person person = (Person) app.getBean("person");
16
17 Person person1 = (Person) app.getBean("person");
18 19 System.out.println("person==person1: " + (person == person1));
20
21 }
22 }
控制台输出:
I am scope.Person Constructor... |
在 IOC容器初始化时就已经将 bean 实例化。当新创建对象时 , 没有调用构造函数 , 两个实例 == 比较时是 true , 说明这只在 IOC 容器初始化的时候创建了一次 bean 的实例。
Prototype:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <bean id="person" class="com.itdjx.spring.beans.scope.Person" scope="prototype">
7 <property name="name" value="华崽儿"/>
8 <property name="age" value="27"/>
9 </bean>
10
11 </beans>
package com.itdjx.spring.beans.scope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Wáng Chéng Dá
* @create 2017-03-02 8:34
*/
public class Main {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("scope_beans.xml");
}
}
控制台输出:
控制台没有输出 |
1 package com.itdjx.spring.beans.scope; 2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 /**
7 * @author Wáng Chéng Dá
8 * @create 2017-03-02 8:34
9 */
10 public class Main {
11
12 public static void main(String[] args) {
13
14 ApplicationContext app = new ClassPathXmlApplicationContext("scope_beans.xml");
15 Person person = (Person) app.getBean("person");
16
17 Person person1 = (Person) app.getBean("person");
18
19 System.out.println("person==person1: " + (person == person1));
20
21 }
22 }
控制台输出:
I am scope.Person Constructor... |
调用两次 getBean() , 每一次都会实例化一次 , 创建两个新的实例。
本文内容总结:Spring学习-- Bean 的作用域
原文链接:https://www.cnblogs.com/chinda/p/6488687.html
以上是 Spring学习-- Bean 的作用域 的全部内容, 来源链接: utcz.com/z/362419.html