概述
org.springframework.beans和org.springframework.context包提供Spring框架的IOC容器的基 本功能,BeanFactory接口提供一个高级的配置机制用来管理对象,ApplicationContext接口是BeanFactory接口的子接 口,添加一些额外的功能,比如AOP特性,资源处理,事件派发和应用层特定的上下文(比如WebApplicationContext)。
BeanFactory接口是Spring IOC容器的核心接口,主要负责实例化,配置对象和组装对象依赖关系。其实质是一个工厂类,可以维护Bean及Bean之间的依赖关系。
容器中的Bean定义是由BeanDefinition类表示的。
三种实例化Bean的方式: 构造函数, 静态方法, 实例方法。
依赖注入
Spring 会在容器创建时验证Bean实例的配置,比如Bean的引用属性是否引用一个有效的Bean,但是Bean属性本身是直到Bean实例被创建时才设置的, 而除了单例对象和预实例化的对象,其他Bean是在请求时才创建的。这意味着Spring即使加载正确,也可能在请求Bean实例时抛出异常。 PropertyEditor类知道如何将属性从一种格式转换成另一种格式。
设值方法注入可以接纳重新配置和重新注入。
构造方法注入可以保证返回给客户的对象是完全初始化的,但是一旦初始化后不能重新配置和重新注入。
集合合并
Spring2.0支持集合合并,子类Bean实例可以合并和重写抽象父类Bean实例的集合属性。示例如下:
xml 代码
- <beans>
- <bean id="parent" abstract="true" class="example.ComplexObject">
- <property name="adminEmails">
- <props>
- <prop key="administrator">administrator@somecompany.com</prop>
- <prop key="support">support@somecompany.com</prop>
- </props>
- </property>
- </bean>
- <bean id="child" parent="parent">
- <property name="adminEmails">
-
- <props merge="true">
- <prop key="sales">sales@somecompany.com</prop>
- <prop key="support">support@somecompany.co.uk</prop>
- </props>
- </property>
- </bean>
- <beans>
范型
Spring2.0支持范型集合属性的映射。
Depends-on
大部分情况下,依赖关系是通过设值方法(ref元素)定义的,还是有些情况依赖关系不是很直接,比如某个类的实例化需要执行一段静态初始化代码(如注册数据库驱动),depends-on支持逗号分隔的属性值,可以显式指定必须之前初始化的Bean实例。
懒加载
Spring 的缺省行为是容器创建时初始化所有的单例类,可以使用lazy-init属性指定一个Bean在请求时再初始化。需要注意的是,如果一个非懒初始化的单例 Bean引用一个懒初始化的Bean,那么即便你指定了lazy-init,Spring还是会执行初始化。
可以在容器级别配置default-lazy-init属性。
自动绑定
Spring 提供几种模式自动解决Bean实例之间的依赖关系,这是通过autowire属性实现的,目前支持五种自动绑定模式:none,byname, byType,constructor,autodetect。需要注意的是显式依赖指定总是会重写自动绑定,当前还不支持简单属性的自动绑定。
自动绑定可以极大的减轻XML属性配置的工作量,但是有时候可能会产生二义性。
方法注入
如果一个单例Bean的某个方法调用时需要获取一个非单例Bean的实例,因为容器只会实例化单例Bean一次,Spring提供三种方式解决此问题。
单例Bean实现BeanFactoryAware接口,主动查找需要的非单例Bean,这种方式的缺点是造成对Spring框架的依赖。
查询方法注入:单例Bean实例定义一个抽象的查找方法,通过<lookup-method></lookup-method>元素进行配置,Spring会使用CGLIB库动态实现一个子类,重写查找方法。这种方式的缺点是测试包含抽象查找方法的Bean类比较困难,另外包含方法注入的Bean实例不能被序列化。
替换方法注入:这种方式比较高级,需要使用的时候可以查阅参考手册。
实例范围
Spring 框架可以控制创建的Bean实例的范围,目前支持五个范围设置,其中三个应用于基于WEB的应用程序,这五个范围是:singleton, prototype,request,session,global session。Spring2.0也支持用户自定义范围。
如 果需要将request,session,global session范围内的对象依赖注入到prototype,singleton范围的实例中,需要使用Spring框架提供的代理机制,为什么需要使用代 理机制?假定一个singleton实例依赖一个基于会话的实例,因为单例实例只会被初始化一次,如果按惯常的配置方式,将导致singleton实例总 是使用的同一个依赖实例,这显然不是我们需要的结果。使用代理机制,只需要加一行配置代码即可,示例如下:
xml 代码
- <bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
-
- <aop:scoped-proxy/>
- </bean>
-
- <bean id="userService" class="com.foo.SimpleUserService">
-
- <property name="userPreferences" ref="userPreferences"/>
- </bean>
通过指定merge=true,child实例将拥有parent实例的所有属性并重写parent实例的同名属性值。
标记接口
Spring提供几个标记接口改变容器中Bean实例的行为,Spring框架使用BeanPostProcessor回调这些标记接口的方法。
包括:
InitializingBean……允许Bean实例在所有的属性被设置后,执行初始化动作,通常应该避免使用此接口,因为可以配置init-method方法。
DisposableBean……允许Bean实例在容器销毁时得到回调,通常应该避免使用此接口,因为可以配置destroy-method方法。
BeanFactoryAware……允许Bean实例获取当前BeanFactory的实例,通常不推荐使用此接口,因为会与Spring紧藕合,有一个可选方式是使用ObjectFactoryCreatingFactoryBean,这个类本身实现了BeanFactoryAware接口。
BeanNameAware……允许Bean实例获取其在BeanFactory中的id属性。
优雅退出
基 于WEB的ApplicationContext实现在WEB应用程序关闭时,可以优雅的关闭容器。非WEB应用中如果希望应用关闭时,容器可以调用单例 Bean的销毁方法,优雅退出,必须向JVM请求一个shutdown钩子,这通过调用ApplicationContext实现的 registerShutdownHook()方法来实现,示例代码如下:
java 代码
- AbstractApplicationContext ctx
- = new ClassPathXmlApplicationContext(new String []{"beans.xml"});
-
- ctx.registerShutdownHook();
Bean定义继承
可以定义一个Bean,其配置数据来自于另外一个Bean,子Bean可以重写父Bean的属性,或添加一些值,使用这种Bean定义的继承可以节省很多工作量。子Bean是通过parent属性标识的。示例配置如下:
xml 代码
- <bean id="inheritedTestBean" abstract="true"
- class="org.springframework.beans.TestBean">
- <property name="name" value="parent"/>
- <property name="age" value="1"/>
- bean>
- <bean id="inheritsWithDifferentClass"
- class="org.springframework.beans.DerivedTestBean"
- parent="inheritedTestBean" init-method="initialize">
- <property name="name" value="override"/>
-
- bean>
容器扩展点
BeanPostProcessor…… 此接口定义许多回调方法,开发人员可以提供自己的实例化,依赖注入等逻辑,容器通常在已经实例化Bean后调用这些接口方法。通常 BeanPostProcessor用来检测标记接口,检查注记(Annotation)来扩展Spring IOC容器,许多AOP框架类通过实现BeanPostProcessor来提供代理机制。
BeanFactoryPostProcessors…… 此接口主要用来操作Bean定义,可以在容器实例化Bean之前读取和改变Bean配置元数据。PropertyResourceConfigurer和 PropertyPlaceholderConfigurer就是BeanFactoryPostProcessor接口的实现。
FactoryBean……此接口用来自定义Bean实例化逻辑,相当于一个Bean工厂类,核心方法getBean返回FactoryBean创建的实例,Spring框架提供很多FactoryBean接口的实现。
ApplicationContext
国际化:ApplicationContext 接口扩展MessageSource接口提供国际化功能,当ApplicationContext加载时会自动查找上下文中id为 messageSource的Bean实例,如果没有找到将使用框架提供的StaticMessageSource,然后将消息请求委托给 MessageSource实例。
事件派发:ApplicationContext 通过ApplicationEvent和ApplicationListener提供事件派发功能。如果一个Bean实例实现了 ApplicationListener接口,每次ApplicationEvent事件发送到ApplicationContext时,Bean实例都 会接到通知,这实际上是访问者模式的实现。开发者可以扩展ApplicationEvent实现自己的事件类,然后在合适的时候调用 ApplicationContext的publishEvent发布事件。
访问资源文件:ApplicationContext 实现ResourceLoader,接口可以用来加载资源文件,Bean实例可以实现ResourceLoaderAware标记接口,这样在 ApplicationContext初始化实例时,会将自己传递给Bean实例。另外Bean实例也可以提供Resource属性,由 ApplicationContext进行依赖注入。Resource属性值可以是简单的路径字符串,Spring框架提供PropertyEditor 转换这些路径字符串为Resource实例。
分享到:
相关推荐
Spring框架是Java开发中的核心组件,它为构建企业级应用提供了全面的解决...对于初学者来说,从基本的IoC容器开始,逐步深入到AOP、MVC、数据访问等主题,结合实际项目进行练习,将有助于更好地理解Spring的强大功能。
手册中详细介绍了Spring的IoC容器,它是Spring的核心,负责创建对象、管理对象的生命周期以及对象间的依赖关系。IoC容器通过XML配置文件或者基于注解的方式来实现配置,降低了代码的耦合度。 接着,手册会涵盖...
综上所述,Spring Framework 5中文参考手册为Java开发者提供了关于IoC容器和AOP技术的详细解释,覆盖了Spring框架的核心概念和实现机制。开发者可以通过阅读和理解这些内容,更好地利用Spring Framework的强大功能来...
这份中文版的Spring参考手册包含了全面的Spring框架信息,旨在帮助初学者快速掌握Spring的核心概念和使用技巧。 《SpringGuide.pdf》可能是Spring框架的基础指南,它可能涵盖以下内容: 1. **Spring概述**:解释了...
Spring MVC与Spring IoC容器无缝集成,易于测试和部署。 七、Spring Boot Spring Boot是Spring框架的现代进化,它简化了Spring应用程序的创建和配置过程。通过自动配置和起步依赖,Spring Boot能够快速启动开发,...
- **Bean工厂和ApplicationContext**:Bean工厂是Spring的IoC容器,负责创建、配置和管理Bean;ApplicationContext除了Bean工厂的功能外,还提供了更多企业级服务,如消息源、国际化支持等。 2. **数据访问集成** ...
Spring IoC容器是Spring框架的核心,它负责创建对象,管理对象间的依赖关系,通过配置元数据来配置应用程序对象。 在Spring 3.2中文参考手册中,还会有详细的模块介绍、各个特性的使用场景、最佳实践以及安全和...
其中,IoC容器是Spring的核心,它允许开发者通过配置来管理对象的生命周期和依赖关系,减少代码间的耦合。AOP则是Spring提供的另一种编程范式,用于实现如日志记录、性能监控等横切关注点。此外,手册还涵盖了Spring...
首先,Spring的IoC容器是其核心,它负责管理对象的生命周期和依赖关系。通过XML配置文件或注解,开发者可以声明组件及其依赖,由Spring容器负责实例化、装配和管理这些对象。这种控制反转的模式使得代码更加灵活,...
- **IoC(Inversion of Control)容器**:Spring的核心特性,它负责管理对象的生命周期和依赖关系,通过配置文件或注解实现。 - **AOP(Aspect-Oriented Programming)**:Spring提供的面向切面编程支持,允许...
4. **Spring核心**:Spring的核心组件包括IoC容器、AOP框架、数据访问/集成层、Web层组件等。IoC容器是Spring的基础,它负责管理对象的生命周期和装配。AOP框架允许开发者创建和应用切面,实现代码的模块化和解耦。 ...
通过这份中文开发参考手册,开发者可以深入了解Spring 2.0的每个角落,无论是核心的IoC容器、AOP,还是数据访问、Web应用,甚至是测试和Web服务,都能找到详细的解释和示例,从而更好地利用Spring 2.0构建高效、可...
### Spring 开发参考手册知识点详解 #### 一、Spring 概览 **Spring** 是一个开源框架,最初是由 Rod Johnson 创建的,旨在简化企业级 Java 应用程序的开发过程。Spring 提供了一种轻量级的方式来管理和配置 Java ...
4. **IoC容器与Bean**:在Spring中,每个Java对象被称为一个Bean,由IoC容器管理其生命周期。Bean可以通过XML、注解或Java配置进行定义,并且可以通过自动装配来简化配置工作。 5. **数据访问集成**:Spring 2.0...
### Spring框架参考手册知识点概述 #### 一、Spring框架概览 - **1.1 开始使用Spring** - Spring框架作为一个广泛使用的轻量级Java应用框架,为开发者提供了全面的解决方案,帮助他们构建高性能、可扩展的企业级...
3. **Spring Bean**:解释Spring Bean的概念,它是被Spring IoC容器管理的对象,容器负责创建、初始化、装配和管理这些Bean。讨论Bean的定义、作用域、生命周期及工厂方法。 4. **AOP**:介绍Spring的AOP支持,如何...
通过这份文档,开发者可以学习如何配置和使用Spring的IoC容器、声明式事务管理、数据访问(如JDBC、Hibernate、JPA集成)、Web MVC框架以及如何进行单元测试和集成测试。此外,文档还提供了大量的示例代码,有助于...
IoC容器是Spring的基础,它负责管理对象的生命周期和依赖关系,使得代码更加灵活且易于测试。AOP则允许开发者将关注点分离,实现代码的解耦,例如日志记录、事务管理等通用功能可以作为切面独立处理。 在数据访问/...
《Spring开发参考手册(中文版)》是针对Java开发者的一份宝贵资源,它全面涵盖了Spring框架的核心概念、配置、使用方法以及最佳实践。Spring作为Java企业级应用开发的主流框架,以其模块化、轻量级和强大的依赖注入...
- III.CoreTechnologies:深入讨论了Spring的核心技术,包括IoC容器、JMS(Java消息服务)改进、缓存增强、Web改进、Websocket消息处理和测试改进。 - 6.TheIoCcontainer:详细介绍了Spring的控制反转(IoC)容器...