一、 Spring的特征
Spring作为一个开源框架,创建的主要目的是用来替代更加重量级的企业级Java技术,比如EJB(Enterprise Java Beans)。为了简化Java开发的负责性,Spring采取了以下四种关键性的策略:
1. 基于POJO的轻量级和最小侵入性编程
不会强迫应用来继承他们的类或者实现他们的接口,从而导致应用与框架绑死。非侵入型编程意味着这个类在Spring应用和非Spring应用中都可以发挥同样的作用。
2. 通过依赖注入和面向接口实现松耦合
想要解决的问题是:如果每个对象负责管理和自己相互协作的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码。
解决方式:依赖注入(dependency injection) 通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或者管理他们的依赖关系。
(对于接口,在做test的时候可以用mokito去创建一个接口的mock实现,来创建一个实例,然后去验证方法的调用等等)
将实现了quest接口的类和BraveKnight装配起来有两种方式: xml以及基于Java的配置。
如何工作的: Spring通过应用上下文(Application Context)装载bean的定义并且把他们组装起来。如果选用的是xml的装配方式,那么用ClassPathXmlApplicationContext; 如果选用基于java的方式,那么用AnnotationConfigApplicationContext.
3. 基于切面和惯例进行声明式编程
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程允许你把遍布应用的各种功能分离出来形成可以重用的组件。
诸如日志、事务管理和安全这样的系统服务经常会融入到自身具有核心业务逻辑的组件里,这些系统服务被称为横切关注点,因为其会跨越系统的多个组件。如果说没有AOP(aspect-oriented programming), 那么实现系统关注点功能的代码将会重复出现在多个组件当中,这样如果需要修改,需要在每一个地方都做重写,易出错。而且,会有与核心业务无关的代码大量出现,非常混乱
AOP的作用: 使这些服务模块化,并以声明的方式将他们应用到他们需要影响的组件当中去。
使用(xml中的配置)
声明bean
定义切点,声明前置通知/ 后置通知,包括且不限于<aop:config>
<aop:aspect> <aop:pointcut> <aop:before><aop:after>
4. 通过模板减少样板式代码
利用模板减少样板式代码,即将大量重复的代码全封装起来,尽可能保持代码的整洁,全都是和业务逻辑相关的代码
二、 Spring 容器
在Spring应用中,应用对象生存于Spring容器当中,容器负责创建对象,装配对象,配置对象并且管理对象的整个生命周期。
Spring容器通过DI来管理构成应用的组件,创建相互协作的组件之间的关联。
Spring容器有BeanFactory以及ApplicationContext
ApplicationContext
基于BeanFactory构建,并提供应用框架级别的服务
AnnotationConfigApplicationContext
AnnotationConfigWebApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
Spring的架构
Spring的核心容器
Spring的AOP模块
数据访问与集成
Web与远程调用
Instrumentation
测试