一步一步学习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);}}
package com.factory;import com.manager.UserManager;public class StaticFactory {/** * factory-method指定的名字,其实就是new一个实例 * @return */public static UserManager createInstance() {return new UserManager();}}
<bean id="userDao4MySqlImpl" /><bean id="userDao4OracleImpl" factory-method="createInstance"><property name="dao" > <ref bean="userDao4MySqlImpl"/></property></bean>