org.springframework.beans及org.springframework.context包是Spring IoC容器的基础。
BeanFactory提供的高级配置机制,使得管理任何性质的对象成为可能。
简介
ApplicationContext是BeanFactory的扩展,功能得到了进一步增强,比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。
容器
在Spring中,BeanFactory是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
配置元数据
到目前为止,基于XML的元数据是最常用到的配置元数据格式。然而,它并不是唯一的描述格式。Spring IoC容器在这一点上是完全开放的。
bean定义与应用程序中实际使用的对象一一对应。通常情况下bean的定义包括:服务层对象、数据访问层对象(DAO)、类似Struts Action的表示层对象、Hibernate SessionFactory对象、JMS Queue对象等等。项目的复杂程度将决定bean定义的多寡。
实例化容器
Spring IoC容器的实例化非常简单,如下面的例子:
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
或
ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
或
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) context;
组成基于XML配置元数据
为了加载多个XML文件生成一个ApplicationContext实例,可以将文件路径作为字符串数组传给ApplicationContext构造器。
另外一种方法是使用一个或多个的<import/>元素来从另外一个或多个文件加载bean定义。
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
正如你所看到的那样,开头的斜杠‘/’实际上可忽略。因此不用斜杠‘/’可能会更好一点。根据Spring XML配置文件的Schema(或DTD),被导入文件必须是完全有效的XML bean定义文件,且根节点必须为<beans/> 元素。
命名bean
每个bean都有一个或多个id(或称之为标识符或名称,在术语上可以理解成一回事)。这些id在当前IoC容器中必须唯一。如果一个bean有多个id,那么其他的id在本质上将被认为是别名。通常情况下最好为bean指定一个id。尽管XML规范规定了XML ID命名的有效字符,但是bean标识符的定义不受该限制。
在对bean进行定义时,除了使用id属性来指定名称之外,为了提供多个名称,需要通过alias属性来加以指定。而所有的这些名称都指向同一个bean,在某些情况下提供别名非常有用,比如为了让应用的每一个组件能更容易的对公共组件进行引用。在XML配置文件中,可用单独的<alias/> 元素来完成bean别名的定义。
<alias name="fromName" alias="toName"/>
实例化bean
当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。
当采用XML描述配置元数据时,将通过<bean/>元素的class属性来指定实例化对象的类型。
class属性主要有两种用途:在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。
1.用构造器来实例化
当采用构造器来创建bean实例时,根据所采用的IoC类型,class可能需要一个默认的空构造器。
此外,IoC容器不仅限于管理JavaBean,它可以管理任意的类。不过大多数使用Spring的人喜欢使用实际的JavaBean(具有默认的(无参)构造器及setter和getter方法),但在容器中使用非bean形式(non-bean style)的类也是可以的。比如遗留系统中的连接池,很显然它与JavaBean规范不符,但Spring也能管理它。
当使用基于XML的元数据配置文件,可以这样来指定bean类:
<bean id="exampleBean" class="examples.ExampleBean"/>
2.使用 静态工厂方法实例化
当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法。Spring将调用此方法(其可选参数接下来介绍)返回实例对象。
下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法。在此例中, createInstance()必须是一个static方法。
<bean id="exampleBean"
class="examples.ExampleBean2"
factory-method="createInstance"/>
3.使用实例工厂方法实例化
与使用静态工厂方法实例化类似,用来进行实例化的实例工厂方法位于另外一个已有的bean中,容器将调用该bean的工厂方法来创建一个新的bean实例。
为使用此机制,class属性必须为空,而factory-bean属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定(参看以下的例子)。
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="myFactoryBean" class="...">
...
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
factory-bean="myFactoryBean"
factory-method="createInstance"/>
使用容器
从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory我们可以访问bean定义。
InputStream is = new FileInputStream("beans.xml");
BeanFactory factory = new XmlBeanFactory(is);
接着使用getBean(String)方法就可以取得bean的实例。
BeanFactory提供的方法:
boolean containsBean(String):如果BeanFactory包含给定名称的bean定义(或bean实例),则返回true。
Object getBean(String):返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。
Object getBean(String, Class):返回以给定名称注册的bean实例,并转换为给定class类型的实例。
Class getType(String name):返回给定名称的bean的Class。
boolean isSingleton(String):判断给定名称的bean定义(或bean实例)是否为singleton模式。
String[] getAliases(String):返回给定bean名称的所有别名。
分享到:
相关推荐
【Spring框架技术——容器和bean的基本原理】 Spring框架的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,简称IoC)。这一特性改变了传统组件调用的方式,使得...
IoC使得应用程序的控制权从代码本身转移到Spring容器,而DI则负责在运行时将Bean的依赖关系注入到它们的实例中,从而实现解耦。 首先,讲解了Spring配置Bean的基本方式,这通常通过XML配置文件实现。在XML文件中,...
在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中,这些控制权被反转给了Spring容器,使得对象的生命周期管理和依赖注入变得更为灵活和可扩展。 **一、控制反转(IoC)概念*...
EJB(Enterprise JavaBeans)是Java EE平台中的一个核心...理解其原理和使用方法,能帮助开发者高效地实现企业级应用的开发。在实践中,要注意合理设计Bean的结构,充分利用EJB和JPA的特性,以优化性能和代码可维护性。
3. **Bean的生命周期管理**:容器需要提供初始化和销毁Bean的方法,如`init()`和`destroy()`,以便在合适的时间执行用户的自定义逻辑。此外,还需要支持单例(Singleton)和原型(Prototype)两种常见的Bean作用域。...
以上就是Spring创建Bean的基本步骤和相关知识点。通过这种方式,我们可以轻松地管理对象,解耦代码,提高程序的可维护性和可测试性。在实际项目中,Spring的Bean管理机制可以帮助我们构建出更加健壮和灵活的应用。
本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一种元数据,允许程序员在源代码中嵌入信息,这些信息可以被...
本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以帮助开发者更好地利用这一强大的工具。 一、IOC容器的概念 IOC,即控制反转,是面向对象编程中的一个设计原则,它的主要思想是将对象的创建和管理权...
首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。在Spring中,bean可以通过XML配置、Java配置或者注解进行定义。在...
本文将深入探讨一个简单的IOC容器实现,帮助我们理解DI的基本原理。 首先,理解IOC的概念至关重要。在传统的编程模式中,对象通常自行创建依赖的对象,这导致了代码之间的紧密耦合。而在IOC模式下,容器负责管理...
通过学习和实践手动实现IOC容器,开发者不仅能更好地理解Spring框架的工作原理,还能提升设计和实现复杂系统的能力。这个过程涉及到了许多核心的Java技术和设计模式,对提升软件工程能力大有裨益。
**EJB2 SessionBean**是Java企业版...尽管现代Java EE(现称为Jakarta EE)已经发展到了EJB3.x和更高级别,但理解EJB2 SessionBean的基本概念和工作原理对理解整个企业级应用开发的历史和演进仍然是非常有价值的。
IOC基本原理 **控制反转**的核心思想是将对象的创建和管理权交给容器,而不是由对象自身负责。这样,对象不再需要知道依赖的具体实现,只需要声明它们依赖的接口,降低了耦合性。在Spring中,IOC通过配置文件或...
通过阅读和分析这些文件,你可以更好地理解EJB实体Bean的工作原理和使用方法。 总之,EJB实体Bean是Java EE开发中的重要概念,它简化了服务器端应用程序的数据访问层。无论选择BMP还是CMP,了解其工作方式和如何...
Spring核心容器IOC原理实例解析是通过BeanFactory、BeanDefinition和BeanDefinitionReader等接口来实现的。这些接口提供了一些基本的方法来管理Bean对象,例如获取Bean实例、判断Bean是否存在、获取Bean的别名等。...
`BeanFactory`是最基本的IoC容器实现,它主要负责创建和管理bean的生命周期。BeanFactory提供了一系列基础方法,例如获取bean、判断bean的存在性、判断bean是否为单例等。它是所有Spring容器的基类,为其他容器提供...
在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC 容器的实现机制和基本原理。 一、IOC 容器 IOC容器是 Spring 框架的核心组件之一,它提供了一个统一的方式来管理应用程序中的...
Spring IOC(Inversion of ...了解这些基本原理后,开发者可以更有效地利用Spring框架,减少代码的复杂性,提高软件的可维护性和扩展性。在实际项目中,还可以结合注解配置和自动装配进一步简化配置,提升开发效率。
SpringBoot是Spring框架的一种简化和快速开发方式,它旨在简化Spring应用的初始搭建以及开发...通过对这些知识点的深入理解和实践,你可以更好地掌握SpringBoot的基本使用和内部原理,从而在开发过程中更加得心应手。