我們平時創建對象的方式無非就是以下兩種:
有參構造 、無參構造
我們來看看在Spring中怎麼處理這兩種情況
首先我們先創建一個實體類:
package com.MLXH.pojo;
public class User {
private String name;
private String sex;
private int age;
public User() {
System.out.println("User的無參構造");
}
public User(String name) {
System.out.println("User的有參構造");
this.name = name;
}
public User(String name, int age) {
System.out.println("User的第二種有參構造");
this.name = name;
this.age = age;
}
public User(String name, String sex, int age) {
System.out.println("User的第三種有參構造");
this.name = name;
this.sex = sex;
this.age = age;
}
public void setName(String name) {
System.out.println(name);
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Spring創建對象的方式:
- 通過有參構造
- 通過下標
- 通過參數名 【推薦】
- 通過參數類型
- 通過無參構造
- 默認會用無參構造
注意點:實體類中一定要有一個無參構造方法
接下來我們看一下Spring是如何裝配這些對象的:
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress SpringFacetInspection -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--無參構造-->
<bean id="user" class="com.MLXH.pojo.User">
</bean>
<!--無參構造,執行set方法-->
<bean id="user1" class="com.MLXH.pojo.User">
<property name="name" value="寒雪1"/>
</bean>
<!--使用構造器的參數下標進行賦值-->
<bean id="user2" class="com.MLXH.pojo.User">
<constructor-arg index="0" value="寒雪2"/>
<constructor-arg index="1" value="18"/>
</bean>
<!--通過名字進行賦值-->
<bean id="user3" class="com.MLXH.pojo.User">
<constructor-arg name="name" value="寒雪3"/>
<constructor-arg name="age" value="3"/>
</bean>
<!--通過類型進行賦值-->
<bean id="user4" class="com.MLXH.pojo.User">
<constructor-arg type="java.lang.String" value="寒雪4"/>
<constructor-arg type="java.lang.Integer" value="18"/>
<constructor-arg type="java.lang.String" value="男"/>
</bean>
</beans>
測試類:
package com.MLXH.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserTest {
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User)context.getBean("user1");
System.out.println(user.toString());
}
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user2");
System.out.println(user);
}
@Test
public void test3(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user3");
System.out.println(user);
}
}
結果:運行第一個測試類的結果:
分析:我們針對輸出的結果進行分析,我們拿到的是user1對象,那麼爲什麼會輸出這麼多的語句呢?
原因是我們執行了spring的配置文件bean.xml的全部內容,當執行ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
語句時,會加載beans.xml中的全部內容,因此其中所有的裝配信息都會進行加載,會按照我們裝配的順序進行加載。
注意:
<bean id="user1" class="com.MLXH.pojo.User">
<property name="name" value="寒雪1"/>
</bean>
看似像是執行了有參構造,但其實是執行了無參構造,然後通過set方法將,name賦值進去的…就像是執行了這樣的代碼:
User user1 = new User();
user1.setName="寒雪1";
這只是執行了Test1的,其他的類似…