什么是spring?
Spring是整个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展时针对构建J2EE平台的Web应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
使用Spring框架的好处是什么?
- 轻量:基本的版本大约2MB
- 控制反转: 实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们
- 面向切面编程AOP:Spring支持面向切面编程,并且把应用业务与系统服务分开。
- 容器: Spring容器并管理应用中对象的生命周期和配置
- MVC框架: Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品
- 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)
- 异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC, Hibernate or JDO抛出的)转化为一致的unchecked异常。
Spring由哪些模块组成?
Core
Bean
Context
Expression Language
JDBC
ORM
OXM
Java Messaging Service
Transcation
Web
Web-Servlet
Web-Struts
Web-Portlet
核心容器(应用上下文)模块
BeanFactory实现举例
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的BeanFactory实现是XmlBeanFactory类
XmlBeanFactory
根据XML文件中的定义加载beans。该容器从XML文件读取配置元数据并用它去创建一个完全配置的系统或应用。
解释AOP模块
AOP模块用于给我们的Spring应用做面向切面的开发,很多支持由AOP联盟提供,这样就确保了Spring和其他AOP框架的共通性。这个模块将元数据编程引入Spring.
解释JDBC和DAO抽象
解释对象/关系映射集成模块
解释WEB模块
Spring的WEB模块是构建在application context模块基础上,提供一个合适web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数地绑定到你的业务对象。
什么是IOC容器
IOC优点是什么?
ApplicationContext通常的实现是什么?
- FileSystemXmlApplicationContext: 容 器 从 一 个XML 文 件 中 加 载 beans 的 定 义 ,XML Bean 配 置 文 件 的全 路 径 名 必 须 提 供 给 它 的 构 造 函 数
- ClassPathXmlApplicationContext: 此 容 器 也 从 一 个XML 文 件 中 加 载 beans 的 定 义 , 这 里 , 你 需 要 正 确 设 置classpath 因 为 这 个 容 器 将 在 classpath 里 找 bean 配置
- WebXmlApplicationContext: 此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean
BeanFactory和Application contexts的区别?
Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSourc接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。
什么是Spring的依赖注入?
依赖注入是IOC的一个方面,是个通常的概念,整个概念是说你不用创建对象,而只需要描述它如何被创建。你不用在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个IOC容器负责把他们组装起来。
有哪些不同类型的IOC(依赖注入)方式?
- 构造器依赖注入:通过容器触发一个类的构造器来实现
- Setter方法注入:容器通过无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法。
- 在使用时,最好是利用构造器参数实现强制依赖,setter方法实现可选依赖。
什么是Spring beans?
是那些形成spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,管理。Spring框架定义的beans都是单例模式的,如果它被赋为True,bean就是单件,否则就是一个prototype bean.一个spring bean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情以及它的依赖。
如何给Spring容器提供配置元数据?
- xml配置文件
- 基于注解的配置
- 基于java的配置(写一个配置类)
Spring支持的几种bean的作用域
- singleton:在IOC容器中只有一个实例
- prototype:一个bean的定义可以有多个实例
- request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
- global-session:在一个全局的HTTP Session中,该作用域仅在基于web的Spring ApplicationContext情形下有效。
Spring框架中的单例bean是线程安全的么?
非线程安全,Spring并没有对单例bean进行任务多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如View Model对象),就需要自行保证线程安全。最浅显的解决办法是将多态bean的作用域由"singleton"变更为"prototype".
解释Spring框架中bean的生命周期
- Spring容器从XML文件中读取bean的定义,并实例化bean
- 容器根据bean的定义填充所有的属性
- 如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法
- 如果Bean实现了BeanFactoryAware接口,Spring传递beanFactory给setBeanFactory方法
- 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitializaion()方法内调用它们
- 如果bean实现了InitializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法
- 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserAfterInitializaion()方法内调用它们
- 如果bean实现了DisposableBean,它将调用destory()方法
哪些是重要的bean生命周期方法?能重载它们吗?
有两个,一个是setup,它是在容器加载bean的时候被调用,一个是teardown,它是在容器卸载类的时候被调用。bean标签有两个重要的属性(init-method和destory-method)。用它们可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestory)
什么是Spring的内部bean?
当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring的基于XML的配置元数据中,可以在<property/>或<constructor-arg/>元素内使用<bean/>元素,内部bean通常是匿名的,它们的Scope一般是prototype.
在Spring中如何注入一个java集合
- <list>注入一组值,允许有相同的值
- <set>注入一组值,不允许有相同的值
- <map>注入一组键值对,键和值都可以为任务类型
- <props>注入一组键值对,键和值都只能为String类型
什么是bean装配?
值的是Spring容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖关系把它们装配到一起。
什么是bean的自动装配?
能够自动装配自动合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。