`

Spring——IoC

阅读更多
org.springframework.beans和org.springframework.context 是spring框架IoC容器的基础。

BeanFactory接口提供了一个预先配置机制,能够有能力管理任何类型的对象。
ApplicationContext是BeanFactory的一个子类接口,集成了spring AOP; 事件管理等。并且还提供了应用层面的特殊的context,如:WebApplicationContext。

Bean:由spring管理的应用程序中得对象都被称为bean。Bean可以是一个初始化,收集等都由spring IoC容器管理的对象,也可以是应用程序中得一个简单对象。Bean和Bean之间的关系都由容器的配置文件指定和映射。


ApplicationContext Overview
ApplicationContext代表了Spring IoC的容器。负责bean的初始化、配置以及收集。容器通过配置元数据来确定对象的创建,配置以及收集。配置元数据可以是xml,java annotation或者java源码。

ApplicationContext的实现有许多中。独立的应用程序通常创建ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext。

初始化容器:构造器参数为需要加载的配置文件的位置。文件路径可以是多个的。

ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"}); 



通过 T getBean(String name, Class<T> requiredType )的方法可以取回我们需要的bean对象的实力。

Bean Overview
通常我们使用xml来定义一个bean,成为提供容器创建bean的configuration metadata。

在定义bean时,使用BeanDefinition对象

1. package-qualified class name: bean对应的实际的类名,包括了所在包的名字
2. Bean behavioral配置元素,定义了bean在容器内的表现,如:scope,lifecycle callback等。
3. bean工作时需要用到其他bean的引用。这些引用也被成为合作者或者依赖。
4. 其他配置,如:连接数用来管理bean中的连接池,或者连接池的大小。

ApplicationContext的实现也允许注册在容器外由用户创建的对象。通过访问ApplicationContext的getBeanFactory()方法获得一个BeanFactory对象——DefaultListableBeanFactory。DefaultListableBeanFactory通过registerSingleton(..)和registerBeanDefinition(..)方法来支持这种注册。

bean的命名:当一个bean没有被明确指定一个id或者name时,容器会给这个bean产生一个唯一的名字。但是如果想要引用那个bean,通过ref元素的方式或者service locator的方式,则必须给定一个名字。

Bean可以通过构造函数初始化,此时根据不同的IoC类型,可能需要一个默认构造函数。

bean也可以通过静态工厂方法初始化。这时需要用到class属性来确定包含这个静态工厂方法的类,以及factory-method来指定工厂方法的名称。
例子:
<bean id="clientService"
      class="examples.ClientService"
      factory-method="createInstance”/>
public class ClientService {
private static ClientService clientService = new ClientService(); private ClientService() {}
private ClientService createInstance(){
return clientService;
}
}

Bean也可以使用实例工厂方法(instance factory method)
与静态工厂方法类似,只不过这里使用一个实例工厂方法来调用一个已经存在的bean的非静态的方法来创建一个新的bean。
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean --> </bean>
<!-- the bean to be created via the factory bean --> <bean id="clientService"
      factory-bean="serviceLocator"
      factory-method="createClientServiceInstance"/>

factory-bean来指明现在已经在容器中且包含创建新对象方法的bean。

Dependency Injection: 一个对象通过构造器参数,工厂方法参数,属性来定义它的依赖类(一起工作的类),并在通过由构造器创建或者工厂方法返回一个对象实例后,这些依赖类被注入给对象实例。

DI分为两种类型 Constructor-based和Setter-based.

Constructor-based DI是通过容器调用构造方法以及一系列参数。每一个参数都代表了一个依赖关系。调用静态工厂方法配合特定的参数来创建bean也是等价的。

Setter-based DI是在通过一个默认构造方法或者无参数静态工厂方法创建了一个bean之后,调用setter方法来注入属性。

创建一个bean会造成一系列的bean被创建,因为这个bean的dependencies以及这些dependencies的dependencies(以此类推)都会被创建。

在使用Constructor injection时可能会造成循环依赖的情况。例如A需要一个B的实例传给构造器,B需要一个A的实例传给构造器。当A与B需要相互注入时,容器就会检测到这个循环引用的关系,抛出BeanCurrentlyInCreationException的异常。
解决方案:让某些属性通过setter来设置。或者不用constructor injection仅仅使用setter injection。


ApplicationContext在创建实例时,会立即创建所有单例的bean,作为初始化过程的一部分。大部分情况下这种预先加载是需要的。因为配置或者环境的错误能够被立即发现。也可以通过设定lazy-initialized来阻止预先实例化一个单例bean。告诉容器在第一次需要被使用时才创建。
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.foo.AnotherBean”/>


不设置scope属性,默认为单例。
当一个被设置了lazy-initialized的bean与另一个没有设置lazy-initialized的单例bean之间存在依赖关系时,这个bean也会在start-up阶段被创建。



Method Injection
在一个singleton Bean只会被初始化一次。如果这个bean中包含一个非单例的有合作关系的bean时。有以下几种方法:
1. 放弃反转控制,通过实现ApplicationContextAware接口使得bean A能够感知容器,并通过getBean(”B”)的方法来告诉容器获得一个新的Bean B的实例。
2. 用lookup方法注入。LookUp方法注入通过覆盖container managed bean中的方法,并返回容器中的一个bean。lookup方法通常返回的时一个prototype类型的bean。
Bean的几种Scope类型
1. singleton 单例,整个容器中只有一个实例
2. prototype 原型,一个bean的定义能够对应多个对象实例。
3. request
4. session
5. global session
分享到:
评论

相关推荐

    Spring——IOC(控制反转)与DI(依赖注入).docx

    Spring框架中的IOC(控制反转)和DI(依赖注入)是两种关键的设计模式,它们极大地提升了软件的可维护性和可扩展性。控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移...

    Spring源码分析_Spring_IOC

    在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色与地位。对于Spring的使用者而言,IOC容器不仅是管理Bean(即应用中的对象实例)生命周期的...

    Spring的ioc小案例

    本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...

    Spring————面试题库

    使用Spring框架能够为开发者带来许多好处,例如通过依赖注入(Dependency Injection, DI)方法,能够清晰地管理对象间的依赖关系,相比于EJB容器,Spring的IoC容器更为轻量级,更适合在有限的内存和CPU资源下进行...

    SpringIoC的简单实现

    【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)

    Spring的IoC容器初始化源码解析

    #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程),这些功能大大...

    Spring的IoC实现案例

    在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...

    Spring之IOC示例

    本文将深入探讨Spring的核心特性——控制反转(Inversion of Control,简称IOC),并通过实例解析其工作原理。 控制反转(IOC)是Spring框架的核心设计理念,它将对象的创建和管理权从代码中剥离出来,交由Spring...

    spring ioc

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

    Spring-IOC丐版

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

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作(合起

    Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作(合起来整个过程)

    Spring3.1.3 Ioc在Web容器中的建立

    综上所述,"Spring3.1.3 Ioc在Web容器中的建立"涵盖了Spring的核心特性之一——IoC,以及在Web环境下的具体配置和使用方法。这个过程涉及到Spring容器的初始化、bean的定义与依赖注入,以及Web应用的结构配置。通过...

    Spring——jar详解

    Spring框架的核心特点在于它的Inversion of Control (IoC)和Dependency Injection (DI)原则,允许开发者解耦组件,使得代码更加灵活、可测试和可维护。 Spring框架的jar文件分为多个部分,每个部分都有特定的功能和...

    spring的ioc说明

    这样,当我们需要使用某个对象时,只需从容器中获取,无需手动创建,从而实现了IoC的核心理念——控制反转。 总结来说,Spring的IOC机制通过反转对象的创建和依赖管理,提高了代码的灵活性和可测试性。它使得开发者...

    spring ioc+mvc代码

    一、Spring IOC(Inversion of Control)——控制反转 控制反转,简称IOC,是Spring框架的核心特性之一。传统的编程方式中,对象的创建和管理由程序自身负责,而在IOC中,这个责任被"反转"给了框架。Spring通过容器...

    Spring——jar包详解

    1. **Spring Core**: 这是Spring框架的基础,提供了依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)的核心实现。`spring-core.jar`包含了基本的类加载和资源处理功能,例如`...

    Spring IoC简单示例-注解配置-Maven构建

    在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...

    Spring实现原理及IoC容器的优点

    首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的编程中,对象会主动去寻找并创建它所需要的依赖。而在IoC中,这个过程被反转,由外部的容器负责创建对象及其...

Global site tag (gtag.js) - Google Analytics