Spring实例化bean的几种方法总结

1、使用构造方法(Instantiation with a constructor)

使用构造方法创建一个bean的时候,这种方法是最常见的,也是在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="login.entity.UserEntity">
		<constructor-arg name="userName" value="yedward"></constructor-arg>
		<property name="userPwd" value="123456"></property>
		<property name="email" value="admin@admin.com"></property>
	</bean>

</beans>

constructor-arg表示的是构造函数的参数,property表示的是普通setter方法的参数,上面这段配置的执行逻辑大概如下:

public class Demo {
	public static void main(String[] args) {
		UserEntity user = new UserEntity("yedward");
		user.setUserPwd("123456");
		user.setEmail("admin@admin.com");
	}
}

首先是调用了有参构造器实例化了一个bean,然后再调用setter方法去赋值;如果没有指定任何constructor-arg,那么会先调用无参构造器来实例化一个bean,如果指定了property,那么就会再实例化bean以后,把一些参数通过setter方法设置进去。

2、使用静态工厂方法(Instantiation with a static factory method)

当使用静态工厂方法去定义一个bean实例的时候,class属性需要指定为包含这个静态工厂方法的类,并且添加一个factory-method属性来指定静态工厂方法名。使用静态工厂方法来实例化bean的时候,可以使用property属性来指定参数。

<?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="login.entity.UserEntity" factory-method="newInstance">
		<property name="userName" value="yedward"></property>
	</bean>

</beans>

需要注意的是,实例化方法必须是静态方法(static)才可以。

3、使用实例工厂方法(Instantiation using an instance factory method)

和使用静态工厂方法比较类似,不过,实例工厂方法会调用一个已经存在的bean的的非静态方法(not static)去创建一个bean。使用实例工厂方法的时候,不用设置class属性,添加一个factory-bean属性,并且指定为容器中已经存在的包含有实例工厂方法的bean,然后设置factory-method属性来指定实例工厂方法名。

<?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="userFactory" class="login.entity.UserFactory"></bean>
		
	<bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>

</beans>

下面是该例子中用到的一些类:

UserEntity类:

package login.entity;

public class UserEntity {
	private Integer userId;
	private String userName;
	private String userPwd;
	private String email;
	private String enabled;
	
	public UserEntity() {}
	
	// 只定义了一个以userName为参数的有参构造
	public UserEntity(String userName) {
		this.userName = userName;
	}

	public Integer getUserId() {
		return userId;
	}

	public void setUserId(Integer userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPwd() {
		return userPwd;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getEnabled() {
		return enabled;
	}

	public void setEnabled(String enabled) {
		this.enabled = enabled;
	}
	
	public static UserEntity newInstance(String userName) {
		UserEntity user = new UserEntity();
		user.setUserName(userName);
		return user;
	}
}

UserFactory类:

package login.entity;

public class UserFactory {
	public UserEntity newInstance() {
		return new UserEntity();
	}
}

这篇文档是我在看spring官方文档的时候总结所得,可以直接去阅读官方文档的“Instantiating beans”部分内容。

本文标题:Spring实例化bean的几种方法总结

本文链接:http://yedward.net/?id=315

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章