一、探索Spring IOC创建对象
1、前述
在Spring的入门程序HelloSpring中,我们并没有使用“new 类();”语句,Spring帮我们自动创建了,现在让我们来探索一下Spring帮我的创建对象的过程;
2、代码示例(常规写法)
第一步:我们先写一个User实体类
package com.zibo.pojo;
public class User {
private String name;
public User() {
System.out.println("user对象被创建了!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name为:" + name);
}
}
第二步:写测试类
package com.zibo;
import com.zibo.pojo.User;
public class MyTest {
public static void main(String[] args) {
new User();
}
}
测试结果:
user对象被创建了!
总结:
我们平常使用new通过构造函数创建对象,构造函数被调用,其中代码会执行,那么让我们来探索Spring创建对象的痕迹 ;
3、Spring创建对象
第一步:编写applicationContext.xml配置文件
<?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.zibo.pojo.User"/>
</beans>
第二步:修改测试类
package com.zibo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
//获取Spring上下文容器对象
new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
测试结果:
user对象被创建了!
总结:
可以看出,在加载配置文件的时候,Spring为我们通过无参构造创建了user对象;
4、让我们再加上属性注入
第一步:修改applicationContext.xml配置文件
<?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.zibo.pojo.User">
<property name="name" value="訾博"/>
</bean>
</beans>
第二步:修改User类的setName方法
package com.zibo.pojo;
public class User {
private String name;
public User() {
System.out.println("user对象被创建了!");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("setName方法被执行了");
this.name = name;
}
public void show(){
System.out.println("name为:" + name);
}
}
测试结果:
user对象被创建了!
setName方法被执行了
总结:
看懂了吧!注意这里是使用无参构造方法创建对象;
注意:
必须有无参构造方法,否则报错!
二、继续探索Spring IOC创建对象
1、让我们使用带参构造函数进行创建对象
第一步:修改User实体类(添加带参构造)
package com.zibo.pojo;
public class User {
private String name;
public User() {
System.out.println("user对象被创建了!");
}
public User(String name) {
this.name = name;
System.out.println("使用带参构造创建对象了!");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("setName方法被执行了");
this.name = name;
}
public void show(){
System.out.println("name为:" + name);
}
}
第二步:修改applicationContext.xml配置文件
<?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.zibo.pojo.User">
<!--使用下标赋值-->
<constructor-arg index="0" value="訾博"/>
</bean>
</beans>
测试结果:
使用带参构造创建对象了!
2、applicationContext.xml配置文件中使用带参构造函数创建对象传参的几种方式
方法一:使用下标传参
<?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.zibo.pojo.User">
<!--使用下标传参-->
<constructor-arg index="0" value="訾博"/>
</bean>
</beans>
方法二:使用自动类型传参(自动根据类型传参:不建议使用)
<?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.zibo.pojo.User">
<!--使用自动类型传参(自动根据类型传参:不建议使用)-->
<constructor-arg type="java.lang.String" value="訾博"/>
</bean>
</beans>
方式三:使用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.zibo.pojo.User">
<!--使用name给对应的属性名传参-->
<constructor-arg name="name" value="訾博"/>
</bean>
</beans>
3、注意
默认情况下,配置文件被加载时,所有的bean对象都会被实例化,而且只创建这一次,随后无论取几次,所取到的对象都是同一个对象;
三、总结
默认情况下,IOC创建对象就是在配置文件被加载的时候,Spring会立即通过所配置bean对应类的无参构造方法和setter方法或带参构造方法创建所有的bean对象,当需要的时候从IOC容器获取即可,只创建这一次,随后无论取几次,所取到的对象都是同一个对象;