spring是什么
开源框架,为了解决企业级应用开发复杂性而创建,让pojo可以完成之前EJB完成的事.
降低复杂性的4种关键策略:
- 基于pojo的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 面向切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
依赖注入
对象的依赖关系由系统中负责协调各对象的第三方组件在创建对象时进行设定,无需对象自行创建或管理他们的依赖关系.
应用切面
面向切面允许把遍布应用各处的功能分离出来形成可重用的组件.
使用模板消除样板式代码
比如jdbc对数据库操作这种功能需要大量的样板式代码,spring提供了多种模板让代码只关注于自己的职责,无需编写样板代码.
spring容器
配置bean和切面这些文件是如何加载的以及加载到哪里去.spring容器就是配置的bean所在的地方.
spring应用种应用对象生存于spring容器中,
他负责创建对象,装配和配置并管理他们的生命周期.
spring容器有很多,spring自带多个容器实现,可分为
- bean工厂类型(org.springframework.beans.factory.eanFactory接口定义)
- 应用上下文类型(org.springframework.context.ApplicationContext接口定义)基于bean工厂构建并提供应用框架级的服务,例如从属性文件解析文本信息以及发布应用事件给监听者.
多数情况使用应用上下文,bean工厂往往太低级
应用上下文
##### 最有可能遇到的几个应用上下文:
- 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传递给setBean-Name()方法;
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将 BeanFactory容器实例传入;
- 如果bean实现了ApplicationContextAware接口,Spring将调 用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
- 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法 也会被调用;
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
- 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到 该应用上下文被销毁;
- 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样, 如果bean使用destroy-method声明了销毁方法,该方法也会被调用