【Spring】002-探索Spring IOC创建对象的方式

tech2023-07-25  126

一、探索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容器获取即可,只创建这一次,随后无论取几次,所取到的对象都是同一个对象;

 

 

 

 

 

 

最新回复(0)