Spring功能特性
Spring框架是以解决开发的复杂性为目的而创建出来的框架,使用基本的JavaBean来完成EJB的功能。
Spring简化Java开发的方式
- 基于POJO的轻量级和最小侵入性编程
对于一个POJO类在Spring应用和非Spring应用中是相同的意义,不需要通过强制性的继承框架的规范类或者实现规范接口,最多是使用Spring注解,达到最小侵入性的特性。 - 通过依赖注入和面向接口编程实现松耦合
紧耦合的代码通常难以测试,复用和理解。
紧耦合的代码容易出现修复一个BUG又会出现一个或者更多新BUG的情况。
但是完全没有耦合的代码什么都做不了,所以需要控制代码低耦合。
依赖注入在Spring框架中将交由Spring容器负责各种对象之间的依赖关系,这种依赖注入的方式可以达到对象间低耦合的要求。
依赖注入会将所依赖的关系自动交给目标对象,而不是让对象自己去获取依赖。
如果一个对象只通过接口而不是具体实现或初始化过程来表明依赖关系,那么这种依赖就能在对象本身毫不知情的情况下,用不同的具体实现进行替换,就是面向接口的编程和多态的使用。 - 切面的声明式AOP编程
面向切面编程将分布于不同模块之中相同功能抽离出来,单独形成一个部分达到重用的功能。
形成的切面那个功能可以叫横切关注点(跨越应用中的多个组件的模块)。
面向切面编程使服务模块化,使用XML或者Java代码装配的方式装配到需要使用的对象中,使代码具有高内聚性。 - 减少模板式需要大量重复编写的代码
最为常见的模板式代码就是JDBC数据库访问的七步走,但是Spring框架中通过模板封装来消除这些模板代码,使得更加关注于逻辑的实现,而不是需要考虑到JDBC API的要求。
Spring两类容器
- bean工厂(不常用)
最简单的容器提供基本的依赖注入支持。
org.springframework.beans.factory.eanFactory接口定义。 - 应用上下文
基于BeanFactory构建,提供应用框架级别的服务。
org.springframework.context.ApplicationContext接口定义。
常见的应用上下文类型:- AnnotationConfigApplicationContext:从一个或多个基于java配置类中加载Spring应用上下文。
- AnnotationConfigWebApplicationContext:从一个或多个基于Java配置类走加载Spring Web应用上下文 。
- ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
- FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
- XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。
Bean的生命周期
- Spring对bean进行实例化。
- Spring将值和bean的引用注入到bean对于的属性中。
- 如果bean实现了BeanNameAware接口,spring将bean的ID传递给setBeanName()方法。
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入。
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来。
- 如果Bean实现了BeanPostProcessor接口,Spring将调用他们的ProcessBeforeInitialization()方法。
- 如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法,如果bean使用initmethod声明初始化方法,该方法也会被调用。
- 如果Bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessAfterInitialization()方法。
- bean已经可以被使用且一直驻留在应用上下文中,知道应用上下文被销毁。
- 如果Bean实现了DisposableBean接口,Spring将调用他的destory()接口方法,如果bean使用destory声明销毁方法,该方法也会被调用。
Spring模块
- Spring核心容器,管理着Spring应用中bean的创建,配置和管理。
- AOP模块,提供对面向切面编程的支持。
- 数据访问与集成,提供抽象模板式代码,简化代码编写。
- Web与远程调用,MVC框架支持。
- Instrume ntation,提供了为JVM添加代理的功能。
- 测试模块,提供集成测试等支持。