Spring核心框架之IoC容器

简介:
首先定义几个关键性的概念:
Beans :在Spring 中,组成程序主体的并由Spring IoC 容器管理的对象,称为Beans Beans 以及任何与之存在依赖关系的物件,均被反射在由容器使用的Configuration Metadata 中。

IoC容器的核心    
org.springframework.beans org.springframework.context这两个包构成了Spring框架的IoC容器的核心。其中BeanFactory接口提供了能管理任何对象的高级配置机制。但是目前一般不直接使用BeanFactory类,而是用ApplicationContext替代之。ApplicationContextBeanFactory接口的派生,可以看作是BeanFactory的超集。它能够更容易的与Spring AOP特性集成,拥有消息资源处理(Message Resources Handling)和事件发布(Event Publication)等功能。
  ApplicationContext接口代表了Spring IoC容器。主要负责初始化,配置,组装Beans。这个容器从Configuration Metadata 中得到相关的指令。Configuration Metadata 一般是一个XML,JAVA 注解,或者JAVA 代码。
下面是一个典型的XML 配置文件:
< ?xml  version ="1.0"  encoding ="UTF-8"? > 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 
< bean  id ="..."  class ="..." > 
<! -- collaborators and configuration for this bean go here -- > 
</bean> 
< bean  id ="..."  class ="..." > 
<! -- collaborators and configuration for this bean go here -- > 
</bean> 
</beans> 

ApplicationContext接口主要有两种实现类,分别是 ClassPathXmlApplicationContextFileSystemXmlApplicationContext 从命名上很容易看出它们的适用范围。
初始化一个 ApplicationContext是极其容易的事情。下面是一般的初始化方式:
ApplicationContext context = 
new ClassPathXmlApplicationContext( new String[] { "services.xml""daos.xml"}); 

从以上代码可以很容易看出,应用程序可以使用多个 配置文件,这样做的好处是显而易见的。另外,还可以在某一个配置文件中引入其它的配置文件,如下所示:
< beans > 
< import  resource ="services.xml" /> 
< import  resource ="resources/messageSource.xml" /> 
< import  resource ="/resources/themeSource.xml" /> 
< bean  id ="bean1"  class ="..." /> 
< bean  id ="bean2"  class ="..." /> 
</beans> 

Beans 还可以通过静态工厂方法来初始化,例如:类的定义代码是:
public  class ClientService { 
private  static ClientService clientService =  new ClientService(); 
private ClientService() {} 
public  static ClientService createInstance() { 
return clientService; 


在配置文件中定义为:
<bean id="clientService" 
class="examples.ClientService" 
factory-method="createInstance"/> 

Beans
在容器内部,Beans BeanDefinition 对象表示。BeanDefinition 对象包含了以下一些信息:
- 完整的类名称,包含包的路径。
-Bean 行为的相关元素,说明了Bean 在容器内的行为。
-Bean 相关的引用,也就是依赖的其它的类。
-Bean 其它的设置信息。

依赖注入 (Dependency Injection)
Spring DI 主要有两种形式:基于构造方法的和基于Setter 方法的。
对于基于构造方法的,例如下面这个类:
package x.y; 
public  class Foo { 
public Foo(Bar bar, Baz baz) { 
// ... 


 
则配置文件应做如下配置:
< beans > 
< bean  id ="foo"  class ="x.y.Foo" > 
< constructor-arg  ref ="bar" /> 
< constructor-arg  ref ="baz" /> 
</ bean > 
< bean  id ="bar"  class ="x.y.Bar" /> 
   < bean  id ="baz"  class ="x.y.Baz" /> 
</ beans > 
对于参数是Bean 的时候,这种方法是可以的。但是如果参数里面含有基本数据类型,比如int 或者String ,那么Spring 便无法确定如何解析。必须采用以下的方法对待:
package examples; 
   public  class ExampleBean { 
   // No. of years to the calculate the Ultimate Answer 
   private  int years; 
   // The Answer to Life, the Universe, and Everything 
   private String ultimateAnswer; 
   public ExampleBean( int years, String ultimateAnswer) { 
     this.years = years; 
     this.ultimateAnswer = ultimateAnswer; 
  } 
}    
在配置文件中配置:
< bean  id ="exampleBean"  class ="examples.ExampleBean" > 
   < constructor-arg  type ="int"  value ="7500000" /> 
   < constructor-arg  type ="java.lang.String"  value ="42" /> 
</ bean > 
或者
< bean  id ="exampleBean"  class ="examples.ExampleBean" > 
   < constructor-arg  index ="0"  value ="7500000" /> 
   < constructor-arg  index ="1"  value ="42" /> 
</ bean > 
对于基于Setter 方法的:
例如下面这个类:
public  class ExampleBean { 
   private AnotherBean beanOne; 
   private YetAnotherBean beanTwo; 
   private  int i; 
   public  void setBeanOne(AnotherBean beanOne) { 
     this.beanOne = beanOne; 
  } 
   public  void setBeanTwo(YetAnotherBean beanTwo) { 
     this.beanTwo = beanTwo; 
  } 
   public  void setIntegerProperty( int i) { 
     this.i = i; 
  } 

则在配置文件中应做如下配置:
< bean  id ="exampleBean"  class ="examples.ExampleBean" > 
  <!--  setter injection using the nested <ref/> element --> 
   < property  name ="beanOne" > < ref  bean ="anotherExampleBean" /> </ property > 
  <!--  setter injection using the neater 'ref' attribute --> 
   < property  name ="beanTwo"  ref ="yetAnotherBean" /> 
   < property  name ="integerProperty"  value ="1" /> 
</ bean > 
< bean  id ="anotherExampleBean"  class ="examples.AnotherBean" /> 
< bean  id ="yetAnotherBean"  class ="examples.YetAnotherBean" /> 
以上例子均摘自 Spring 官方参考文档。
附Spring 3框架结构图









本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/323821,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
441 2
|
6月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
197 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
7月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
10月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
741 26
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
133 1
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
204 0
|
12月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
498 12