spring屬性配置執行過程,單列和原型區別


  Spring配置中,采用屬性注入時,當創建IOC容器時,也直接創建對象,並且執行相對應的setter方法

Student.java

 1 package com.scope;
 2 
 3 public class Student {
 4     private String name;
 5     private String number;
 6     public String getName() {
 7         return name;
 8     }
 9     public void setName(String name) {
10         this.name = name;
11         System.out.println(name);
12     }
13     public String getNumber() {
14         return number;
15     }
16     public void setNumber(String number) {
17         this.number = number;
18     }
19     public Student() {
20         super();
21         System.out.println("hello Student!");
22         
23     }
24     
25     
26 }
View Code

Main.java

 1 package com.scope;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
 9         
10     }
11 }
View Code

beans-scope.xml

 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="student1" class="com.scope.Student">
 7         <property name="name" value="Mary"></property>
 8         <property name="number" value="1120143231"></property>
 9     </bean>
10     <bean id="student2" class="com.scope.Student">
11         <property name="name" value="Curry"></property>
12         <property name="number" value="1120111413"></property>
13     </bean>
14     
15 </beans>
View Code

執行結果

當創建IOC容器時,配置文件中有多少個bean就會創建多少個對象,並且執行相對應的setter函數。

我們對Main.java進行修改

 1 package com.scope;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
 9         Student student1 = (Student) ctx.getBean("student1");
10         Student student2 = (Student) ctx.getBean("student1");
11         System.out.println(student1 == student2);
12     }
13 }
View Code

執行結果:

當執行Student student1 = (Student) ctx.getBean("student1")時,並沒有創建對象,只是創建了一個索引而已,Student1和Student2引用的是同一個對象。

以上就是單例模式,屬性注入時,默認的就是單例模式,每個bean id只會創建一個對象,並且在創建IOC容器時,就創建對象和執行相對應的setter函數。

下面講原型模式,即prototype模式。

Main.java

 1 package com.scope;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
 9 //        Student student1 = (Student) ctx.getBean("student1");
10 //        Student student2 = (Student) ctx.getBean("student1");
11 //        System.out.println(student1 == student2);
12     }
13 }
View Code

beans-scope.xml

 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="student1" class="com.scope.Student" scope="prototype">
 7         <property name="name" value="Mary"></property>
 8         <property name="number" value="1120143231"></property>
 9     </bean>
10     <bean id="student2" class="com.scope.Student" scope="prototype">
11         <property name="name" value="Curry"></property>
12         <property name="number" value="1120111413"></property>
13     </bean>
14     
15 </beans>
View Code

執行結果

采用prototype模式時,在創建IOC容器時,並沒有創建相應的對象。我們繼續對Main.java進行修改。

 1 package com.scope;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
 9         Student student1 = (Student) ctx.getBean("student1");
10         Student student2 = (Student) ctx.getBean("student1");
11         System.out.println(student1 == student2);
12     }
13 }
View Code

執行結果

在執行Student student1 = (Student) ctx.getBean("student1"); Student student2 = (Student) ctx.getBean("student1");創建了兩個對象,所以輸出了false。

采用prototype模式時,只有在獲取bean時,才開始創建對象,獲取多少次就創建多少個對象。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM