1.什么是spring?
Spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IoC(Inverse of Controller,控制反转)和AOP(Aspect Oriented Programming,切面编程)为内核,它提供了展现Spring MVC、持久层Spring JDBC 及业务层事务管理等一站式的企业级应用技术。它巧妙的使用简单的JavaBean来完成以前只能由复杂的EJB框架才能完成的事情。本系统所采用的的MVC设计模式,通过Spring的IoC容器做对象的管理,通俗来说,就是不用每次初始化对象的时候通过new关键字。严格来讲,Spring容器将某一个接口的具体实现类通过Java Bean的方式来进行管理控制,不再将它的控制权交给调用它的类。另外Spring的AOP和事务管理也给开发者在“面向切面编程”和事务处理等方面提供了诸多方便。
2.使用spring框架的好处是什么?
轻量级:轻量级和重量级主要是以启动程序需要的资源来决定的。Spring是轻量级的,相对于EJB而言,系统在初始化的时候不用加载所有的服务,为系统节约了资源,而EJB框架就是重量级的,每次初始化都必须加载所有的服务。
控制反转:Spring通过控制反转实现了松散耦合,
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring包含并管理应用中对象的生命周期和配置。
MVC框架:Spring MVC基于MVC设计理念的轻量级Web框架。它是基于请求来驱动响应的模型,它在设计上采用了松散耦合的结构,比其他的MVC框架更具扩展性和灵活性。Spring MVC可以让普通的Java类在不用实现任何接口的情况下成为处理请求的控制器。它围绕DispatcherServlet这个核心展开,DispatcherServlet是处理Spring MVC的总导演、总策划,它负责截获请求并将其分派给相应的处理器处理。
事物管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC等抛出的)转化为一致的unchecked异常。
3.spring由哪些模块组成?
以下是Spring框架的基本模块:
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。
1,Spring Core
Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。
2,AOP
AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。
3,ORM
Spring 的ORM模块提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理
4,DAO模块
Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。(执行sql语句)
5,WEB模块
WEB模块提供对常见框架如Struts1,WEBWORK(Struts 2),JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。
6,Context模块
Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。
7,MVC模块
WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框架更加简洁和方便。
4.spring的核心容器都有哪些?
核心容器包括了:Beans、Core、Context、SpEL
core和beans模块提供了整个框架最基础的部分,包括了IoC(控制反转)和Dependency Injection(依赖注入)。
Context建立在Core和Beans模块提供的基础之上:他提供了框架式访问对象的方式
core、beans、context构成了Spring的骨架
SpEL:提供了一种强大的用于在运行时操作对象的表达式语言
5.BeanFactory实现举例。
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的BeanFactory实现是ClassPathXmlApplicationContext类,加载配置文件来创建factory。
6.ClassPathXmlApplicationContext
最常用的就是org.springframework.context.support.ClassPathXmlApplicationContext;它根据XML文件中定义加载beans。该容器从XML文件读取配置元数据并用它去创建一个完全配置的系统或应用。
7.解释AOP模块
如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用。
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
周边功能在 Spring 的面向切面编程AOP思想里,即被定义为切面
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
8.解释JDBC抽象和DAO模块。
通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,他在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP模块给Spring应用中的对象提供事务管理服务。
9.解释对象/关系映射集成模块。
Spring通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,SPring支持集成主流的ORM框架,如Hibreate,Mybatis。Spring的事务管理同样支持以上所有ORM框架及JDBC。
10.解释WEB模块。
Spring的WEB模块是构建在applicationContext模块基础之上的,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。
11,为什么说spring是一个容器。
因为用来形容它用来存储单例的bean对象这个特性。
12.spring配置文件。
Spring配置文件是个XML文件,这个文件包含了类信息,秒速了如何配置他们,一级如何相互调用。
13.什么是springIOC容器?
SpringIOC负责创建对象,管理对象(通过依赖注入),装配对象,配置对象,并且管理这些对象的整个生命周期。
14.IOC的优点是什么?
IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。
15.ApplicationContext通常的实现是什么?
FileSystemXmlApplicationContext
:此容器从一个XML文件中加载beans的定义。XMLBean配置你文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext
:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath,因为这个容器将在classpath里找bean配置。
WebXmlApplicationContex
:此容易加载一个XML文件,此文件定义了一个WEB应用所有的bean。
16.Bean工厂和Applicationcontexts有什么区别?
Applicationcontexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),他们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Applicationcontexts中以声明的方式处理。Applicationcontexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。
17.一个Spring的应用看起来像什么?
18.什么是spring的依赖注入?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里面直接组装你的组建和服务,但是要在配置文件里描述哪些组建需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
19.有哪些不同类型的IOC(依赖注入)方式?
构造器依赖注入
:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter方法注入
:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于Setter的依赖注入。
20.哪种依赖注入方式你建议使用,构造器注入,还是Setter方法注入?
你两种依赖方式都可以使用,最好的解决方案是用构造器参数实现强依赖,Setter方法实现可选依赖。