大家都明白,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的方式
Spring 实例化Bean的三种方式
本篇文章主要介绍了详解Spring中bean实例化的三种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://88548886.iteye.com/blog/1682243
Spring项目bean实例化代码,包括bean是如何创建的;实例化bean的三种方式,构造方法,静态工厂和实例工厂。
bean加入spring容器管理的方式,bean加入applicationcontext容器的方式
Spring Bean创建初始化流程
本篇文章主要介绍了Spring 中如何控制2个bean中的初始化顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要给大家介绍了关于spring boot中几种注入方法的一些个人看法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
spring管理bean应用实例代码;spring管理bean应用实例代码
SpringCloud——分布式配置中心(Spring Cloud Config)之高可用的分布式配置中心
获得spring里注册Bean的四种方法 很详细的解释 适合新手
关于Spring方面的常见面试题
3、通过spring的xml bean配置或bean注解指定初始化方法,如下面实例的initMethod方法通过@bean注解指定。 销毁的时候实现的方法 1、通过java提供的@PreDestroy注释; 2、通过实现spring提供的DisposableBean接口,并...
通过实例工厂方法和静态工厂方法实例化spring bean的例子。
Spring MVC Ibatis Bean 根据mysql数据表——代码生成工具
主要介绍了Spring Bean实例化实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。 2.2.1 构造器实例化 创建Web项目,导入相关Jar包; 创建名为Bean1的Java类; 创建Spring配置...
《Spring技术内幕》学习笔记2——IoC定位Bean定义资源 《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件 《Spring技术内幕》学习笔记4——IoC容器解析Bean定义资源并注册解析后的Bean 《Spring技术...