目录
- 一、调用构造器创建Bean对象
- 二、调用静态工厂方法创建Bean对象
- 三、调用实例(动态)工厂方法创建Bean对象
一、调用构造器创建Bean对象
通过调用构造器创建Bean对象是我们在实际开发中最常用的方式,而构造器创建Bean对象又有两种方式:
1)通过无参构造方法创建
其本质是 SpringContext 利用无参的构造函数创建一个对象,然后利用setter方法进行赋值,所以要提供无参数构造函数,并定义对应字段的setter方法。如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。
类User.java示例代码:
package priv.ioc.bean;
public class User {
private String name;
public User() {
System.out.println("User的无参构造方法");
}
public void setName(String name) {
System.out.println(name);
this.name = name;
}
}
xml配置bean时使用:
<property name="属性名" value="值" ></property>
标签对属性进行赋值。
Bean.xml示例代码:
<!--无参构造,执行set方法-->
<bean id="user" class="priv.ioc.bean.User">
<property name="name" value="张三"/>
</bean>
好像是执行的有参构造,但其实是执行了无参构造方法,然后通过set方法将name赋值进去的,类似执行了这样的代码:
User user = new User();
user.setName("张三");
2)通过有参构造方法创建
通过有参构造方法创建,有三种方式:
- 通过参数下标进行赋值
类User.java示例代码:
package priv.ioc.bean;
public class User {
private String name;
private int age;
public User(String name, int age) {
System.out.println("User的有参构造方法");
this.name = name;
this.age = age;
}
}
Bean.xml示例代码:
<!--有参构造:下标进行赋值-->
<bean id="user" class="priv.ioc.bean.User">
<constructor-arg index="0" value="张三"/>
<constructor-arg index="1" value="28"/>
</bean>
- 通过参数名称进行赋值
类User.java示例代码:
package priv.ioc.bean;
public class User {
private String name;
private int age;
public User(String name, int age) {
System.out.println("User的有参构造方法");
this.name = name;
this.age = age;
}
}
Bean.xml示例代码:
<!--有参构造:名称进行赋值-->
<bean id="user" class="priv.ioc.bean.User">
<constructor-arg name="name" value="张三"/>
<constructor-arg name="age" value="28"/>
</bean>
- 通过参数类型进行赋值
类User.java示例代码:
package priv.ioc.bean;
public class User {
private String name;
private int age;
public User(String name, int age) {
System.out.println("User的有参构造方法");
this.name = name;
this.age = age;
}
}
Bean.xml示例代码:
<!--有参构造:类型进行赋值-->
<bean id="user" class="priv.ioc.bean.User">
<constructor-arg type="java.lang.String" value="张三"/>
<constructor-arg type="java.lang.Integer" value="28"/>
</bean>
二、调用静态工厂方法创建Bean对象
类User.java示例代码:
package priv.ioc.bean;
public class User {
private String name;
private int age;
public User(String name, int age) {
System.out.println("User的有参构造方法");
this.name = name;
this.age = age;
}
}
定义静态工厂方法:
package priv.ioc.factory;
import priv.ioc.bean.User;
public class UserFactory {
public static User createPerson(String name,Integer age) {
return new User(name, age);
}
}
Bean.xml示例代码:
<!-- 静态工厂方法 -->
<bean id="user" class="priv.ioc.factory.UserFactory" factory-method="createPerson">
<constructor-arg name="name" value="张三" />
<constructor-arg name="age" value="28" />
</bean>
class:priv.ioc.factory.UserFactory,指定静态工厂的实现类( 即包名.类名 )
factory-method:createPerson,该属性指定静态工厂的方法(方法名)
三、调用实例(动态)工厂方法创建Bean对象
类User.java示例代码:
package priv.ioc.bean;
public class User {
private String name;
private int age;
public User(String name, int age) {
System.out.println("User的有参构造方法");
this.name = name;
this.age = age;
}
}
定义动态工厂方法:
package priv.ioc.factory;
import priv.ioc.bean.User;
public class UserFactory {
public User createPerson(String name,Integer age) {
return new User(name, age);
}
}
Bean.xml示例代码:
<!-- 先配置工厂Bean,class指定该工厂的实现类,该Bean负责产生其他Bean实例 -->
<bean id="userFactory" class="priv.ioc.factory.UserFactory"/>
<!-- 再引用工厂Bean来配置其它的Bean -->
<bean id="user" factory-bean="userFactory" factory-method="createPerson">
<constructor-arg name="name" value="张三" />
<constructor-arg name="age" value="28" />
</bean>
factory-bean :userFactory,该属性指定工厂Bean的id
factory-method:createPerson,该属性指定实例工厂的方法(方法名)