Spring学习笔记

我觉得对于一个程序员来说,进步不是说你每天泛泛的去了解一些新的知识。对于不去深入的学习,不注重积累,在我看来,这都是徒劳,也许别人提到一个问题,你发现自己听过,但是让你去做,这个错误的学习方式给你带来的方法只可能是无从下手。所以,在学习Spring的期间,我以笔记的形式来记录这个过程,一来深化学习过程,二来给以后查阅留下记录。

第一部分 Spring的核心

第一章 Spring之旅

1.1 简化Java开发

学习Spring,首先要知道的就是Spring是用来干什么的,如何实现自己的目的,他的核心都有什么。

  1. Spring的使命:
    Spring可以干很多事情,Spring是为了解决企业级应用开发的复杂性而创建的, 使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。 但Spring不仅仅局限于服务器端开发, 任何Java应用都能在简单性、 可测试性和松耦合等方面从Spring中获益。

    但是归根结底来说:简化Java开发。

  2. Spring如何实现自己的目的:

    Spring采用了四种关键策略:

    • 基于POJO的轻量级和最小侵入性编程; (什么叫侵入性:强迫应用继承它们的类或者实现它们的接口,从而导致应用与框架绑死)
    • 通过依赖注入和面向接口实现松耦合;
    • 基于切面和惯例进行声明式编程;
    • 通过切面和模版减少样板时代码;

    DI(Dependency Injection)能够让相互协作的软件组件保持松散耦合, 而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。

  3. DI(Dependency Injection)依赖注入
    任何一个有实际意义的应用都会由两个或者更多的类组成, 这些类相互之间进行协作来完成特定的业务逻辑。 按照传统的做法, 每个对象负责管理与自己相互协作的对象(即它所依赖的对象) 的引用, 这将会导致高度耦合和难以测试的代码。
    通过DI, 对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。 对象无需自行创建或管理它们的依赖关系。

  4. AOP(Aspect-oriented programming)

    面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。

    系统由许多不同的组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。 诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。如果将这些关注点分散到多个组件中去,你的代码将会带来双重的复杂性。

    • 实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用它的方法, 但方法的调用还是会重复出现在各个模块中。
    • 组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址, 而不应该关注它是不是安全的或者是否需要支持事务。

1.2 容纳你的Bean

在基于Spring的容器中,你的应用对象生存与Spring容器(Container)中,容器是Spring框架的核心。 Spring容器使用DI管理构成应用的组件, 它会创建相互协作的组件之间的关联。

  1. 容器两种类型:

    • Bean工厂
    • 应用上下文
  2. Spring自带了多种类型的应用上下文,下面是几个常用的:

    • AnnotationConfigApplicationContext: 从一个或多个基于Java的配置类中加载Spring应用上下文。
    • AnnotationConfigWebApplicationContext: 从一个或多个基于Java的配置类中加载Spring Web应用上下文。
    • ClassPathXmlApplicationContext: 从类路径下的一个或多个XML配置文件中加载上下文定义, 把应用上下文的定义文件作为类
      资源。
    • FileSystemXmlapplicationcontext: 从文件系统下的一个或多个XML配置文件中加载上下文定义。
    • XmlWebApplicationContext: 从Web应用下的一个或多个XML配置文件中加载上下文定义。
  3. Bean的生命周期

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

    其实这里的过程,我对这个过程不是很了解,其中的各个接口的作用是什么也无法理解,不过我们可以先在这里mark一下,然后经过学习后,再回头看看这里。

    mark-1

  4. Spring按照功能可以分为6个模块:

    • 核心容器:Beans、Core、Context、Expression、Context Support。
      容器是Spring框架最核心的部分, 它管理着Spring应用中bean的创建、 配置和管理。 除了bean工厂和应用上下文, 该模块也提供了许多企业服务, 例如E-mail、 JNDI访问、 EJB集成和调度。所有的Spring模块都构建于核心容器之上。 当你配置应用时, 其实你隐式地使用了这些类。
    • 面向切面编程模块:AOP、Aspects。
      在AOP模块中, Spring对面向切面编程提供了丰富的支持。 这个模块是Spring应用系统中开发切面的基础。 与DI一样, AOP可以帮助应用对象
      解耦。 借助于AOP, 可以将遍布系统的关注点(例如事务和安全) 从它们所应用的对象中解耦出来。
    • Instrumentation:Instrument、Instrument Tomcat。
      Spring的Instrumentation模块提供了为JVM添加代理(agent) 的功能。
    • 数据访问与集成:JDBC、Transaction、ORM(Object-Relational Mapping)、OXM、Messaging、JMS(Java Message Service)。
      Spring的JDBC和DAO(Data Access Object) 模块抽象了这些样板式代码。该模块在多种数据库服务的错误信息之上构建了一个语义丰富的异常层, 以后我们再也不需要解释那些隐晦专有的SQL错误信息了!对于那些更喜欢ORM(Object-Relational Mapping) 工具而不愿意直接使用JDBC的开发者, Spring提供了ORM模块,同样包含了在JMS(Java Message Service) 之上构建的Spring抽象层, 它会使用消息以异步的方式与其他应用集成。还包含对象到XML映射的特性, 它最初是Spring Web Service项目的一部分。除此之外, 本模块会使用Spring AOP模块为Spring应用中的对象提供事务管理服务。
    • Web与远程调用:Web、Web Servlet、Web Portlet、WebSocket。
      除了面向用户的Web应用, 该模块还提供了多种构建与其他应用交互的远程调用方案。 Spring远程调用功能集成了RMI(Remote Method Invocation) 、 Hessian、 Burlap、 JAX-WS, 同时Spring还自带了一个远程调用框架: HTTP invoker。 Spring还提供了暴露和使用REST API的良好支持。
    • 测试:Test
  5. Spring Portfolio
    Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。 概括地讲, 整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。
    关于这个部门,有很多内容,详情课件Spring in action 1.3.2 Spring Portfolio。
    下一章节开始对Spring DI进行详细学习。

第二章 装配Bean

本章主要从下面几个方面学习:

1. 声明bean
2.构造器注入和Setter方法注入
3.装配bean
4.控制bean的创建和销毁

Bean的装配大体分为三种:
- 自动装配
- 借助Java装配
- XML来进行Spring装配

2.1 自动化装配Bean

未完待续。。。

你可能感兴趣的:(Java,spring,ioc和aop)