一步一步学习spring(三)——Bean的实例化的几种方式

   大家都明白,spring容器启动时,首先会通过ResourceLoader(资源加载器)去加载指定的srping资源(spring中bean的配置信息),然后通过XmlBeanDefinitionReader对资源进行解析处理,最后得出一个一个BeanDefinition,这些BeanDefintion最终被注册到Factroy中。BeanDefiniton包含了一个真正Bean的许多信息,如创建方式、生命周期属性(singleton、request等)、重写的方法(overriedMenthod)、所依赖的其它beanDefinition等。
   下面,将大致说说spring中Bean的几种创建方式:

   一.采用构造器来实例化Bean

   这是spring中最普通、最常见的对象实例化,对class没什么要求,class不需要实现任何接口。spring中配置文件对这种的Bean的配置没什么限制,一个id以及class即可。具体实例化是在spring中的BeanUtils中完成的,部分代码如下:
public static <T> T instantiate(Class<T> clazz) throws BeanInstantiationException {
		Assert.notNull(clazz, "Class must not be null");
		if (clazz.isInterface()) {
			throw new BeanInstantiationException(clazz, "Specified class is an interface");
		}
		try {
			return clazz.newInstance();
		}
		catch (InstantiationException ex) {
			throw new BeanInstantiationException(clazz, "Is it an abstract class?", ex);
		}
		catch (IllegalAccessException ex) {
			throw new BeanInstantiationException(clazz, "Is the constructor accessible?", ex);
		}
	}

   从代码中可以看出,其实是采用java的反射来对bean的进行实例化的,和new类似。

二.采用静态工厂实例化

    这种方法用的较少,在Spring中采用此方法对Bean进行实例化时,配置文件中class的属性值不再是你将要实例化的Bean的class,而是静态工厂的class,并且,在配置文件中还要指定实例化的方法,即factory-method。下面展示一个例子,源码如下:
StaticFactory.java源码:
 package com.factory;

import com.manager.UserManager;

public class StaticFactory {

	/**
	 * factory-method指定的名字,其实就是new一个实例
	 * @return
	 */
	public static UserManager createInstance() {
		return new UserManager();
	}
}

配置文件applicationContext.xml部分配置如下:
<bean id="userDao4MySqlImpl" class="com.dao.UserMySqlDaoImple" />
	<bean id="userDao4OracleImpl"  class="com.dao.UserOracleDaoImple"/>
    
	<bean  name="userManager" class="com.factory.StaticFactory"  factory-method="createInstance">
		<property name="dao" >
		   <ref bean="userDao4MySqlImpl"/>
		</property>
	</bean>


配置完成后,执行:ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserManager um = (UserManager)act.getBean("userManager");
即可得出一个UserManager实例。

三.使用实例工厂方法实例化

    与 使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位 于另外一个bean中,容器将调用该bean的工厂方法来创建一个新的bean实例。为使 用此机制,class属性必须为空,而factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该 工厂bean的工厂方法本身必须通过factory-method属性来设定。并且,此工厂的factory-method为非静态方法。

你可能感兴趣的:(spring,bean,xml)