Ioc创建对象有两种形式,分别是有参构造和无参构造,无参构造是Spring的默认创建对象的方式。
下边我们先看无参构造
先给出一个实体类
package com.zkw.pojo;
public class User {
private String age;
private String name;
public User() {
System.out.println("User的无参构造!!!!");
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
然后把实体类托管到IoC容器里边
<?xml version="1.0" encoding="UTF-8"?>
<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.zkw.pojo.User">
<property name="name" value="小海"/>
<property name="age" value="23"/>
</bean>
</beans>
测试类
import com.zkw.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
System.out.println(user.toString());
User user1 = context.getBean("user",User.class);
System.out.println(user == user1);
}
}
结果如下
在这里可以看到我们并没有new User对象,但是我们还是可以拿到User的无参构造,这就说明是spring帮我们创建了这个对象,而user对象创建是在 new ClassPathXmlApplicationContext(“beans.xml”);的时候创建;在 context.getBean(“user”);的时候被引用。并且我们可以随意拿,它表示是同一个对象。
有参构造共有三种方式:第一种,通过下标对构造器参数赋值;第二种,使用参数的基本类型来进行赋值(类型相同按照顺序赋值);第三种 使用它本身来进赋值(常用)
实体类 只需要再加一个有参构造就可以了
package com.zkw.pojo;
public class User {
private String age;
private String name;
/*public User() {
System.out.println("User的无参构造!!!!");
}*/
public User(String age, String name) {
System.out.println("User的有参构造!!!!!");
this.age = age;
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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.zkw.pojo.User">
<property name="name" value="小海"/>
<property name="age" value="23"/>
</bean>-->
<!--第一种构造器参数赋值的方法-->
<!--<bean id="user" class="com.zkw.pojo.User">
<constructor-arg index="0" value="23"/>
<constructor-arg index="1" value="小海"/>
</bean>-->
<!--第二种构造器参数赋值的方法 使用参数的基本类型来进行赋值-->
<!-- <bean id="user" class="com.zkw.pojo.User">
<constructor-arg type="java.lang.String" value="23"/>
<constructor-arg type="java.lang.String" value="小海"/>
</bean>-->
<!--第三种构造器参数赋值的方法 使用它本身来进赋值-->
<bean id="user" class="com.zkw.pojo.User" >
<constructor-arg name="age" value="23"/>
<constructor-arg name="name" value="小海"/>
</bean>
</beans>
其它不变,结果如下