在Spring的入门程序HelloSpring中,我们并没有使用“new 类();”语句,Spring帮我们自动创建了,现在让我们来探索一下Spring帮我的创建对象的过程;
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创建对象的痕迹 ;
<?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对象;
<?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>
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方法被执行了
看懂了吧!注意这里是使用无参构造方法创建对象;
必须有无参构造方法,否则报错!
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);
}
}
<?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 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>
<?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>
默认情况下,配置文件被加载时,所有的bean对象都会被实例化,而且只创建这一次,随后无论取几次,所取到的对象都是同一个对象;
默认情况下,IOC创建对象就是在配置文件被加载的时候,Spring会立即通过所配置bean对应类的无参构造方法和setter方法或带参构造方法创建所有的bean对象,当需要的时候从IOC容器获取即可,只创建这一次,随后无论取几次,所取到的对象都是同一个对象;