Spring 4.x
一、spring 的功能依赖两个核心特效,依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP).
spring提供了更加轻量级和简单的编程模型,它增强了简单老式java对象(Plan Old Java object,POJO)使其具备了之前只有EJB和其他企业级Java规范才具有的功能。
1. 简化java开发(基于。。通过 ,基于。。通过)
基于POJO的轻量级和最小侵入性编程
通过依赖注入和面向接口实现松耦合
基于切面和惯例实现松耦合
通过切面和模板减少样板式代码
耦合具有两面性,一方面,紧密耦合的代码难以测试,复用,理解,bug连锁,另一方面,一定的耦合又是必须的--完全没有耦合的代码什么也做不了。
通过DI,对象的依赖关系又系统中负责协调各对象的第三方组件在创建对象的时候进行设定,对象无需自行创建或管理他们的依赖关系。
依赖注入,是注入接口,避免了与任何特定的实现了接口的类发生耦合。通过接口来表明依赖关系,这种依赖就能够在对象本身毫不知情的情况下,用不同的实现进行替换。也就是不同的实现以不同的方式去做同一件事情。也就是说可以在不改变所依赖类的情况下,修改依赖关系。
创建应用组件之间协作的行为通常称为装配,三种装配方式:xml,java config,xml and java config。
Spring通过应用上下文(Application Context)装载bean的定义,并把他们组装起来,Spring应用上下文全权负责对象的创建和组装,有多重上下文的实现,他们的区别仅仅在于如何加载配置。以xml文件进行配置的,会选择ClassPathXMLApplicationContext作为应用上下文相对比较合适。通过其加载xml,并获取对象的引用。
2. 应用切面
DI能够让相互协作的软件组件保持松耦合,而AOP允许将遍布应用各处的功能分离出来形成可重用的组件。例如日志,事务管理,安全。
切面--切点--通知(在切点执行切面中的方法)
3.使用模板消除样板式代码
消除大量重复性代码,例如jdbcTemplate使得执行数据库操作时,避免传统的JDBC样板式代码。
4.容纳你的bean
在基于Spring的应用中,你的应用对象生存与spring容器(container),Spring容器负责创建对象,装配他们,配置他们并管理他们的整个生命周期。Spring容器使用DI管理构成应用的组件,创建相互协作的组件之间的关联。Spring自带多个容器实现,可以归为两种类型。bean工厂是最简单的容器,提供基本的DI支持。应用上下文,基于bean工厂构建,提供应用框架级别的服务,例如从属性文件解析文本信息,发布应用事件给感兴趣的事件监听者。
5.使用应用上下文
AnnotationConfigApplicationContext:从一个或多个
基于Java的配置类中加载Spring应用上下文
AnnotationConfigWebApplicationContext:从一个或
多个基于Java的配置类中加载Spring Web应用上下文。
ClassPathXmlApplicationContext:从类路径下的一个或
多个XML配置文件中加载上下文定义,把应用上下文的定义文件
作为类资源。
FileSystemXmlapplicationcontext:从文件系统下的一
个或多个XML配置文件中加载上下文定义。
FileSystemXmlapplicationcontext:从文件系统下的一
个或多个XML配置文件中加载上下文定义。
使用FileSystemXmlApplicationContext和使用ClassPathXmlApp-licationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找knight.xml文件;而ClassPathXmlApplicationContext是在所有的类路径(包含JAR文件)下查找 knight.xml文件。
如果你想从Java配置中加载应用上下文,那么可以使用AnnotationConfig-ApplicationContext: