目录

  • 一、调用构造器创建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)通过有参构造方法创建

通过有参构造方法创建,有三种方式:

  1. 通过参数下标进行赋值

类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>
  1. 通过参数名称进行赋值

类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>
  1. 通过参数类型进行赋值

类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,该属性指定实例工厂的方法(方法名)