Spring-Bean

在基于Spring的应用中,应用对象生存于Spring容器中。如图1.4所示,Spring容器创建对象,装配它们,配置它们,管理它们的整个生命周期,从生存到死亡(或者从创建到销毁)。
图片说明
在Spring应用中,对象由Spring容器创建、装配和管理
容器是Spring的核心。Spring容器使用依赖注入管理构成应用的组件,它会创建相互协作的组件之间的关联。
并不存在单一的Spring容器。Spring自带了几种容器实现,可以归为两种不同的类型。Bean工厂(beanfactories,由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(application由org.springframework.context.ApplicationContext接口定义)基于BeanFactory之上构建,并提供面向应用的服务,例如从属性文件解析文本信息的能力,以及发布应用事件给感兴趣的事件监听者的能力。
但Bean工厂对于大多数应用来说往往太低级了,因此应用上下文要比Bean工厂更受欢迎。我们会把精力集中在应用上下文的使用上。

1.2.1与应用上下文公事。

Spring自带几种常用的上下文类型包括:
ClassPathXMLAppcationContext—从类路径下的XML配置文件加载。
FileSystemXmlapplicationcontext——读取文件系统下的XML配置文件并加载上下文定义。
XmlWebApplicationContext——读取Web应用下的XML配置文件并装载上下文定义。
无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文,将Bean加载到Bean工厂的过程都是相似的。例如,如下代码展示了如何加载一个FileSystemXmlAPPlicationContext:

ApplicationContextcontext=newFileSystemXmlApplicationContext("c:/foo.xml");

类似地,你可以使用ClassPathXmlApplicatioContext从应用的类路径下加载应用上下文:使用FileSystemXmlApplicationContext和使用ClassPathXmlApplicationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找fool.xml文件;
ClassPathXmlApplicationContext是在所有的类路径(包含JAR文件)下查找foo.xml文件。

ApplicationContextcontext=newClassPathXmlApplicationContext("foo.xml");

通过现有的应用上下文引用,你可以调用应用上下文的getBean()方法从Spring容器中获取Bean。

1.2.2Bean的生命周期

Bean的生命周期很简单。使用Java关键字new进行Bean实例化,然后该Bean就可以被使用了。一旦该Bean不再被使用,则由Java自动垃圾回收。
相比之下,Spring容器中的Bean的生命周期就显得相对细腻多了。正确理解SpringBean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义Bean的创建过程。下图展示了Bean装载到Spring应用上下文中的一个典型的生命周期过程。
图片说明
Bean在Spring容器中从创建到销毁经历了若干阶段,每一阶段都可以针对Spring如何管理Bean进行个性化定制
描述如下:

  • 1Spring对Bean进行实例化。
  • 2Spring将值和Bean的引用注入进Bean对应的属性中。
  • 3如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法。
  • 4如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()接口方法,将BeanFactory容器实例传入。
  • 5如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()接口方法,将应用上下文的引用传入。
  • 6如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()接口方法。
  • 7如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()接口方法。类似地,如果Bean使用init-method声明了初始化方法,该方法也会被调用。
  • 8如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postPoressAfterInitialization()方法。
  • 9此时此刻,Bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
  • 10如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果Bean使用destroy-method声明了销毁方法,该方法也会被调用。

已经了解了如何创建和加载一个Spring容器。但是一个空的容器本身并没有什么了不起,在你把东西放进去之前,它里面什么都没有。为了从Spring的依赖注入中受益,我们必须将应用对象装配进Spring容器中。

1.3Spring核心概述

1.3.1Spring模块

图片说明
模块介绍:

核心Spring容器

核心Spring容器负责Bean的创建、配置、管理。在该模块中,Bean提供了依赖注入。Bean工厂为多种的上下文实现提供了方式。
除了Bean工厂和上下文,该模块也提供了许多企业服务、如邮件、JNDI(SUN公司提供的一种标准的Java命名系统接口)访EJB集成和调度(EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序)

Spring的AOP模块

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。Spring的AOP模块是Spring应用系统开发切面的基础。AOP可以帮助应用对象解耦。借助于AOP。可以将遍布应用的关注点(事务和安全)从他们所应用的对象中解耦出来。

数据访问与集成

Spring的JDBC和DAO模块封装了这些样板式代码,还可以避免数据库资源释放失败的问题。Spring提供了ORM(object-relational mapping)模块,Spring集成了许多流行的ORM框架,包括Hibernate、Java Persisternce API、JDO和IBATIS。Spring的事务管理支持所有的ORM框架以及JDBC。

WEB和远程调用

MVC有利于分离界面逻辑与应用逻辑。Spring集成了强大的MVC框架。有助于提升Web层技术的松散耦合。该框架提供两种形式:面向传统Web应用的基于Servlet的框架和面向Java Portlet API的基于Portlet应用。
除了面向WEB,该模块还提供了几种远程交互的选择。Spring集成了RMI、Hessian、Burlap、JAX-WS,以及它自带的远程调用框架HTTPinvoker。

测试

Spring提供了测试模块来测试Spring应用。Spring为JNDI、Servlet和Portlet编写单元提供了一系列的模拟对象的实现,

1.3.2Spring Portfolio

Spring Web Flow

在MVC框架之上为基于流程的会话式的Web应用提供支持。

Spring Web Service

Spring Web Service提供了契约优先的WebService模型,服务的实现都是为了满足服务的契约而编写

Spring Security

利用Spring AOP,Spring Srcurity为Spring应用提供了声明式的安全机制。

Spring Integration

许多企业级应用都需要与其他的应用进行交互。Spring Integration提供了几种通用的应用集成模式的Spring声明风格的实现。

Spring Batch

面向POJO的编程模型使用Spring batch实现。

Spring Social

社交网络扩展模块

Spring Mobile

Spring Mobile是Spring’新的扩展模块用于支持移动Web应用开发。

Spring Dynamic Moudles

Spring Dynamic Moudles整合了Spring的声明式依赖注入和OSGi的动态组件模型。使用Spring-DM,可以采用模块化的方式构建应用,这些模块是清晰的、高内聚、低耦合的,并在OSGi框架内声明的方式发布和消费服务。

Spring LDAP

创建基于模板的抽象层来封装多余的复杂操作。例如JDBC和JMS消息处理。

Spring Rich Client

富应用工具箱

Spring .NET

Spring .NET提供了相同的松耦合和面向切片的Spring特性,但他是面向.NET平台的。
除了核心DI和AOP特性,Spring.NET还自带简化.NET开发的多个模块,包括ADO.NET、NHibernate、ASP.NET和MSMQ等。

Spring-FLex

Spring-Flex集成包使得Flex和AIR应用可以使用BlazeDS服务端和Spring Bean进行通信

Spring Roo

Rudy on Rails和Grails此类的框架产生了脚本驱动的编程模型,让构建应用变得更简单。

1.4.1Spring2.5的新特性

■使用@Autowired实现基于注解驱动的依赖注入和使用@Qualifier实现细粒度的自动装配(auto-wiring)控制。
■支持JSR-250注解,包括支持命名资源依赖注入的@Resource,以及对生命周期方法支持的@PostConstruct和@PreDestroy。
■自动扫描使用@Component注解(或其他构造型注解)所标注的Spring组件。
■一个全新的基于注解驱动的SpringMVC编程模型,极大简化了SpringWeb开发。
■基于JUnit4和注解的一个新的集成测试框架。即使注解是Spring2.5最重要的特性,但Spring2.5还拥有更多其他新特性:
■完全支持Java6和JavaEE5,涵盖JDBC4.0、JTA1.1、JavaMail1.4和JAX-WS2.0;
■通过Bean的名字来编织切面的新的Bean命名切入点表达式;
■内嵌支持AspectJ的类加载器织入;
■新的XML命名空间,包括配置应用上下文细节的context命名空间和配置消息驱动Bean的jms命名空间;
■支持在SqlJdbcTemplate中使用命名参数。

1.4.2Spring3.0新特性

■SpringMVC全面支持Rest,SpringMVC控制器响应REST风格的URL并返回XML、JSON、RSS或者其他适宜的响应。我们将在第11章介绍Spring3对Rest的支持。
■新的表达式语言把Spring的依赖注入带到了一个新的高度,允许注入各种来源,包含其他Bean和系统属性。我们将在下一章深入探讨Spring表达式语言。
■SpringMVC新的注解,包含@CookieValue和@RequestHeader,分别从Cookie和请求头中获取值。我们将在第7章学习如何使用SpringMVC的新注解。
■一个新的XML命名空间,用来减少SpringMVC配置。
■支持基于JSR-302注解的声明式校验。
■支持新的JSR-330依赖注入规范。
■通过注解驱动声明异步和调度方法。
■一个新的注解驱动的配置模型,几乎可以避免使用XML进行Spring配置,我们将在下一章节探讨新的配置风格。
■SpringWebService项目的OXM功能已被迁移到Spring框架核心。