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 }
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 }
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>
執行結果

當創建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 }
執行結果:

當執行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 }
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>
執行結果

采用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 }
執行結果

在執行Student student1 = (Student) ctx.getBean("student1"); Student student2 = (Student) ctx.getBean("student1");創建了兩個對象,所以輸出了false。
采用prototype模式時,只有在獲取bean時,才開始創建對象,獲取多少次就創建多少個對象。
