1.Spring中创建对象的方式
1.1使用无参构造创建对象(默认)
spring中默认使用无参构造函数,
package com.wshy.pojo;
/**
* @title: Hello
* @Author: wshy
*/
public class Hello {
private String str;
public Hello(){
System.out.println ("spring无参构造函数!");
}
public String getStr () {
return str;
}
public void setStr (String str) {
this.str = str;
}
@Override
public String toString () {
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
main测试方法:
public static void main (String[] args) {
// 获取spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext ("bean.xml");
//我们的对象都在spring中管理了,我们要使用,直接去里面取就好了,取id为hello的Bean
Hello hello = (Hello) context.getBean ("hello");
System.out.println (hello.toString ());
}
运行结果
如果此时把无参构造方法去掉,添加有参构造函数,代码还会运行成功吗?
package com.wshy.pojo;
/**
* @title: Hello
* @Author: wshy
*/
public class Hello {
private String str;
public Hello(String str){
System.out.println ("spring有参参构造函数!");
this.str = str;
}
public String getStr () {
return str;
}
public void setStr (String str) {
this.str = str;
}
@Override
public String toString () {
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
显然,当使用有参构造函数时,启动main函数会发生报错,提示Error creating bean with name 'hello' defined in class path
创建hello对象失败,并且在xml配置文件中的class会有错误标红
,因此可以得出结论:
Spring创建对象同new对象一致,都是默认调用无参构造函数创建对象!
当然也可以只用有参构造函数创建对象,有如下几种方式:
1.2使用有参构造器创建对象
package com.wshy.pojo;
/**
* @title: User
* @Author: wshy
*/
public class User {
private String name;
private int age;
private String address;
//public User () {
// System.out.println ("Spring-User无参构造函数!");
//}
public User (String name) {
System.out.println ("Spring-User有参构造函数!");
this.name = name;
}
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
}
public int getAge () {
return age;
}
public void setAge (int age) {
this.age = age;
}
public String getAddress () {
return address;
}
public void setAddress (String address) {
this.address = address;
}
}
1.2.1 使用下标赋值创建对象
<bean id="user" class="com.wshy.spring.User">
<constructor-arg index="0" value="wshy"/>
</bean>
constructor-arg标签
:根据下标赋值创建对象,此时index=0表示对User实体类表中的第一个字段值赋值,value表示显示值
1.2.2 使用类型创建对象
<bean id="user" class="com.wshy.spring.User">
<constructor-arg type="java.lang.String" value="wshy"/>
</bean>
constructor-arg标签
:根据type类型创建对象,此时index="java.lang.String"表示对User有参构造函数的入参为String类型的字段赋值并创建对象,value表示显示值,但此时,如果有参构造函数中入参为多个时,并且都为String类型,根据类型创建对象就有局限性了!
1.2.3 使用参数创建对象(推荐使用)
<bean id="user" class="com.wshy.pojo.User">
<constructor-arg name="name" value="根据参数创建对象"/>
</bean>
constructor-arg标签
:根据type类型创建对象,name为传入参数,value指定参数传入值
另外,从上面运行结果,也可以看出,Spring创建对象时,会将bean.xml中配置的所有对象都创建出来!