`
XTU_xiaoxin
  • 浏览: 239610 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一步一步学习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为非静态方法。
1
0
分享到:
评论

相关推荐

    《spring in action》中文第三版

    本章节主要介绍了Spring框架中的核心概念——Bean的相关知识点。从Bean的定义、生命周期管理到作用域设定以及装配方式等方面进行了详细的阐述。通过学习这一章节,读者可以对Spring框架中的Bean有更深入的理解,并...

    spring入门实例

    在Spring中,有几种方式来配置Bean。最传统的方式是使用XML配置文件,例如`beans.xml`。在XML配置中,我们可以定义Bean的ID、类名、属性以及依赖关系。例如: ```xml &lt;bean id="exampleBean" class=...

    spring视频教程种子

    2. **IoC容器**:详述Spring的核心——IoC容器,包括Bean的生命周期管理、Bean的定义与实例化、Bean的装配方式(XML、注解和Java配置)。 3. **依赖注入**:深入解析依赖注入的概念,如何通过构造器注入、设值注入...

    Spring Annotaion Support详细介绍及简单实例

    开发者可以通过这两种方式来实现复杂和定制化的功能,从而使得Spring框架更加灵活和强大。对于有志于深入学习和掌握Spring框架的开发者来说,理解并熟练运用BeanPostProcessor和Annotation机制将有助于编写高质量、...

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    【框架源码篇 01】Spring源码-手写IOC

    4. **依赖注入**:在Bean实例化之后,根据Bean定义中的依赖关系进行注入。这一步可能涉及到递归调用,以解决复杂的依赖树。 5. **Bean管理**:最后,容器会管理Bean的生命周期,包括初始化、使用和销毁。 在实际...

    Spring-IOC丐版

    在这个名为"Spring-IOC丐版"的项目中,我们将深入探讨Spring框架的核心组件——IOC容器的基础实现。 IOC,即控制反转,是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身负责...

    Getting started with spring framwork.pdf

    - **Bean的作用域**:Spring框架提供了几种不同的Bean作用域,包括Singleton、Prototype等。选择合适的作用域对于内存管理和线程安全性至关重要。 #### 第三章:配置Bean - **Bean定义继承**:Bean定义可以继承...

    spring-developing-java-applications-enterprise

    - **容器**:Spring提供了两种类型的容器——BeanFactory和ApplicationContext,它们都实现了工厂模式,用于实例化、定位和配置对象或bean。 - **MVC框架**:Spring提供了一个轻量级的MVC框架,方便快速地开发Web...

    spring学习笔记(六)

    - `@Autowired`不适用于构造函数,因为它在bean实例化时就会被调用,而此时容器可能还没有其他bean可用。在这种情况下,可以使用带参数的构造函数,并使用`@Autowired`注解在构造函数上。 7. **启用和禁用自动装配...

    spring源代码中文详解版

    Spring提供了一种抽象,使得开发者无需关心bean是如何被实例化的,只需关注如何使用bean。XmlBeanFactory是针对BeanFactory接口的一个具体实现,它使用XML文件来定义bean。为了实现XML配置的解析,Spring使用了...

    我做了个简单的性能测试,发现从bean工厂里单例执行方法效率比new对象执行慢很多

    标题提到的问题——“从bean工厂里单例执行方法效率比new对象执行慢很多”,涉及到Java编程中的两种常见对象管理方式:单例模式和直接实例化。这个现象可能让开发者感到困惑,因为通常认为单例模式在性能上具有优势...

    spring-framework 中文文档.pdf

    - **实例化一个容器**:为了使用 Spring 容器,首先需要实例化一个容器。可以通过多种方式完成此操作,例如使用 `new ClassPathXmlApplicationContext()` 或 `new AnnotationConfigApplicationContext()` 等方法。 -...

    JSP源码——图书管理系统(struts+hibernate+spring).zip

    《JSP源码——图书管理系统(struts+hibernate+spring)》是一个基于Java Web技术构建的典型项目,主要用于学习和实践如何将Struts、Hibernate和Spring三大框架整合应用于实际的图书管理场景。这个系统展示了如何利用...

    spring_jms

    在Spring JMS中,我们可以定义消息生产者和消费者作为bean,通过IoC容器进行实例化和配置。Spring提供了`MessageListenerContainer`接口,允许我们定义监听JMS消息的策略,例如基于`DefaultMessageListenerContainer...

    详解如何在低版本的Spring中快速实现类似自动配置的功能

    Spring还提供了另一个扩展点——**BeanPostProcessor**,它允许我们对已经创建的Bean实例进行定制逻辑回调,比如在Bean创建后执行特定操作。 关于Bean的定制,有以下几种常见方式: 1. **Lifecycle Callback**:...

    Web Service实例(Spring+Hibernate+Web Service)

    【Web Service实例详解——Spring+Hibernate+Web Service】 在当今的软件开发中,Web Service作为一项重要的技术,被广泛应用于不同系统之间的数据交互和集成。本实例将详细讲解如何使用Spring、Hibernate和Web ...

    spring 3 企业应用开发

    BeanFactory是工厂模式的一种实现,它主要负责实例化、定位和配置应用程序中的对象,即Bean。 - **ApplicationContext**:这是一个更高级的容器,它继承了BeanFactory的功能并添加了一些额外的服务,比如资源加载...

Global site tag (gtag.js) - Google Analytics