第一章-Spirng之旅

##1.1 简化java开发

Spring是一个开源框架,Spring是为了解决企业级应用开发的复杂性而创建的,所有的理念都可以追溯到Spring最根本的使命上:简化java开发

Spring是如何简化java开发的?

为了降低java开发的复杂性,Spring采取了以下4种关键策略:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码;

###1.1.1 激发POJO的潜能

很多框架通过强迫应用继承它们的类或者实现它们的接口从而导致应用与框架绑死,

Spirng不是强迫你实现Spring规范的接口或继承Spring规范的类,相反,在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring.Spring的非侵入式编程模型意味着这个类在Spring应用和非Spring应用都可以发挥同样的作用。

###1.1.2 依赖注入(DI)

任何一个有实际意义的应用都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象的引用,这将会导致高度耦合和难以测试的代码。

耦合局具有两面性。一方面,紧密耦合的代码难以测试,难以复用,难以理解,并且会表现出“打地鼠”式的bug特性。另一方面,一定程度的耦合又是必须的,完全没有耦合的代码什么都做不了。为了完成有意义的功能,不同的类必须以适当的方式进行交互。

通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无须自行创建或管理它们的依赖关系。依赖关系将被自动注入到需要它们的对象当中去。

DI带来的最大收益–松耦合。如果一个对象只通过接口来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现来替换。

创建应用组件之间协作的行为通常称为装配。Spring有多种装配bean的方式,采用XML是很常见的一种装配方式,Spring还支持使用java来描述装配配置。

Spring通过应用上下文装配bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带多种应用上下文的实现,它们之间的区别仅仅在于如果加载配置。

###1.1.3 应用切面

DI能够让相互协作的软件组件保持松耦合,而面向切面编程(AOP)能把遍布应用各处的功能分离出来形成可重用的组件。系统由许多不同的组件组成,每一个组件各负责一块特定功能,除了实现自身核心的功能之外,这些组件还经常承担额外的职责。诸如日志,事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。

如果这些关注点分散到多个组件中去,代码将会带来双重的复杂性。

AOP能过将这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且更加关注自身的业务,完全不需要了解系统服务所带来的复杂性。总之,AOP确保POJO的简单性。

###1.1.4 使用魔板消除样板式代码

样板式代码的一个常见范例是使用JDBC访问数据库,JDBC不是产生样板式代码的唯一场景。在很多编程场景中往往都有类似的样板代码。

Spring旨在通过模板封装来清除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统jdbc模板代码成为了可能,简化我们的开发。

##1.2 容纳你的Bean

在基于Spring的应用中,你的应用对象生存与Spring容器中。

Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡。

Spring容器并不是只有一个。Spring自带了多个容器实现,可以归于两种不同的类型:

  • bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。
  • 应用上下文(由org.springframewoek.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务。

bean工厂对大多数应用来说太低级了,应用上下文要比bean工厂更为欢迎。

###1.2.1 使用应用上下文

Spring自带多种类型的应用上下文,这边列举常用的几个:

  • AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;

  • ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;

  • FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;

  • AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;

  • XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

应用上下文准备就绪后,就可以通过getBean()方法获取从Spring容器回去bean。

###1.2.2 bean的生命周期

参考:https://www.cnblogs.com/kenshinobiy/p/4652008.html

Spring上下文中的Bean生命周期

1、实例化一个Bean--也就是我们常说的new;

2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

以上10步骤可以作为面试或者笔试的模板,另外我们这里描述的是应用Spring上下文Bean的生命周期,如果应用Spring的工厂也就是BeanFactory的话去掉第5步就Ok了。

##1.3 Spring模块

  • 核心容器(Spring core)

核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。BeanFactory使用依赖注入的方式提供给组件依赖。

  • Spring上下文(Spring context)

Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

  • Spring面向切面编程(Spring AOP)

通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

  • Spring DAO模块

DAO模式主要目的是将持久层相关问题与一般的的业务规则和工作流隔离开来。Spring 中的DAO提供一致的方式访问数据库,不管采用何种持久化技术,Spring都提供一直的编程模型。Spring还对不同的持久层技术提供一致的DAO方式的异常层次结构。

  • Spring ORM模块

Spring 与所有的主要的ORM映射框架都集成的很好,包括Hibernate、JDO实现、TopLink和IBatis SQL Map等。Spring为所有的这些框架提供了模板之类的辅助类,达成了一致的编程风格。

  • Spring Web模块

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web层使用Web层框架,可选的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。

  • Spring MVC框架(Spring WebMVC)

MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器。Spring支持多种视图技术。

猜你喜欢

转载自blog.csdn.net/u013447988/article/details/84310024
今日推荐