图片说明
图片说明
Spring框架结构

Spring优点

  1. 非常轻量级的容器:以集中的、自动化的方式进行应用程序对象创建和装配,除此之外还会负责管理对象生命周期,能组合成复杂的应用程序。Spring 容器是非侵入式的(不需要依赖任何 Spring 特定类),而且完全采用 POJOs 进行开发,使应用程序更容易测试、更容易管理。而且核心 JAR 包非常小,Spring3.0.5 不到 1 M ,而且不需要依赖任何应用服务器,可以部署在任何环境( Java SE 或 Java EE )。

  2. AOP: AOP 是 Aspect Oriented Programming 的缩写,意思是面向切面编程。从另一个角度来考虑程序结构以完善面向对象编程( OOP ),即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。通俗点说就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中;比如安全,日志记录,这些都是通用的功能,我们可以把它们提取出来,然后在程序执行的合适地方植入这些代码并执行它们,从而完成需要的功能并复用了这些功能。

  3. 简单的数据库事务管理:在使用数据库的应用程序当中,自己管理数据库事务是一项很让人头疼的事,而且很容易出现错误,Spring 支持可插入的事务管理支持,而且无需 JavaEE 环境支持,通过 Spring 管理事务可以把我们从事务管理中解放出来来专注业务逻辑。

  4. JDBC 抽象及 ORM (对象关系映射)框架支持: Spring 使 JDBC 更加容易使用;提供 DAO(数据访问对象)支持,非常方便集成第三方 ORM 框架,比如 Hibernate 等;并且完全支持 Spring 事务和使用 Spring 提供的一致的异常体系。

  5. 灵活的 Web 层支持: Spring 本身提供一套非常强大的 MVC 框架,而且可以非常容易的与第三方 MVC 框架集成,比如 Struts 等。

  6. 简化各种技术集成:提供对 Java Mail 、任务调度、 JMX 、 JMS 、 JNDI 、 EJB 、动态语言、远程访问、 Web Service 等的集成。

    理论基础

  7. 依赖注入:被注入对象依赖 IoC 容器配置依赖对象

  8. 在 Spring 中 BeanFactory 是 IoC 容器的实际代表者。org.springframework.beans 包中的 BeanFactory 接口提供了 IoC 容器最基本功能。ApplicationContext 完全继承 BeanFactory,因而 BeanFactory 所具有的语义也适用于 ApplicationContext。

  9. Spring IoC 容器如何知道哪些是它管理的对象呢?

    这就需要配置文件,Spring IoC 容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于 xml 配置文件进行配置元数据。
    org.springframework.context 包下的 ApplicationContext 接口扩展了 BeanFactory ,还提供了与Spring AOP 集成、国际化处理、事件传播及提供不同层次的 context 实现 (如针对 web 应用的 WebApplicationContext )。

  10. XmlBeanFactory : BeanFactory 实现,提供基本的 IoC 容器功能,可以从 classpath或文件系统等获取资源;
    ClassPathXmlApplicationContext : ApplicationContext 实现,从 classpath 获取配置文件;
    FileSystemXmlApplicationContext : ApplicationContext 实现 ,从文件系统获取配置文件。

  11. Spring 中 Bean 的定义及注入 Value
    (1)Spring 中,bean 的定义有三种方式:

    基于 XML 的配置
    基于注解的配置
    基于 Java 类的配置
    (2)bean的作用域
    在 Spring 中,Bean 的作用域决定了从 Spring 容器中返回的 Bean 实例的类型。在 Spring 中,支持以下 5 种类型的作用域:

    singleton — 单例模式,由 IOC 容器返回一个唯一的 bean 实例。
    prototype — 原型模式,被请求时,每次返回一个新的 bean 实例。
    request — 每个 HTTP Request 请求返回一个唯一的 Bean 实例。
    session — 每个 HTTP Session 返回一个唯一的 Bean 实例。
    globalSession — Http Session 全局 Bean 实例。

注:大多数情况下,你可能只需要处理 Spring 的核心作用域 — 单例模式( singleton )和原型模式( prototype ),默认情况下,作用域是单例模式。
(3)Spring Collections - 集合类型的 Bean
包含以下四种主要的集合类型:
List
Set
Map
Properties
(4)Spring Bean的生命周期
Spring框架中,一旦把一个Bean纳入Spring IOC容器之中,这个Bean的生命周期就会交由容器进行管理,一般担当管理角色的是BeanFactory或者ApplicationContext,认识一下Bean的生命周期活动,对更好的利用它有很大的帮助:

下面以BeanFactory为例,说明一个Bean的生命周期活动

Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
Setter注入,执行Bean的属性依赖注入
BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
Bean定义文件中定义init-method
BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法 -Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法

如果使用ApplicationContext来维护一个Bean的生命周期,则基本上与上边的流程相同,只不过在执行BeanNameAware的setBeanName()后,若有Bean类实现了org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,然后再进行BeanPostProcessors的processBeforeInitialization() 实际上,ApplicationContext除了向BeanFactory那样维护容器外,还提供了更加丰富的框架功能,如Bean的消息,事件处理机制等。
图片说明

自动扫描与自动装配