1、什么是spring (spring framework)?spring有哪些优缺点?

  1. spring是一个轻量级的开源的用Java编写的JavaEE框架,旨在解决企业级开发的复杂度 。
  2. 优点:解耦;简化开发;支持AOP;轻量级、非侵入式、支持整合各种框架;内部集成了多种服务如事务管理、jpa、各个Template类,ws远程调用等;支持用户自定义某些组件或执行流程,方便替换,扩展性好。
  3. 缺点:有技术使用门槛,如果对底层不了解,出现问题难以排查跟解决;由于框架程序的加载,服务启动效率不如原生。


2、spring (spring framework)有哪些功能?

  1. IOC:控制反转,将创建对象的过程交给spring进行管理控制,实现松耦合的特点
  2. AOP:面向切面编程,即在不改变源代码的情况下可以添加新的功能,实现高内聚的特点。
  3. MVC:对web应用提供高可配置性。
  4. 事务管理:spring提供了事务管理的抽象层。
  5. JDBC异常处理:简化了JDBC异常处理策略。


3、什么是spring IOC容器 ?依赖注入又是什么?自己该如何实现IOC操作?

  1. IOC翻译过来就是控制反转,就是将创建对象的过程交给spring进行管控,并对创建的对象实行生命周期的管控,从而实现松耦合的特点,IOC容器的底层就是一个对象工厂,spring提供IOC容器实现有两种方式:一是BeanFactory [ˈfæktri] 接口,它是IOC容器的基本实现,是spring内部的使用接口,但不提倡开发人员进行使用,因为加载配置文件时不会创建对象,只有在获取对象时才会去创建对象,所谓懒加载方式。二是ApplicationContext,它是BeanFactory接口的子接口,提供了更强大的功能,一般是推荐开发人员进行使用的,因为加载配置文件时就会把配置文件中的对象进行创建,所谓饿汉式加载方式。 (说辞二:spring IoC是一种设计思想,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖,交由spring容器统一管理,从而实现松耦合)
  2. IOC过程,第一步就是配置xml文件,利用bean标签将需要注入到IOC容器的对象进行配置,第二步IOC底层利用创建对象的工厂类进行创建对象,工厂类里面会解析xml配置文件,获得文件中类的全类名,利用反射创建对象,然后将对象返回。 (IOC过程的说辞二:①基于xml配置文件方式:加载读取配置文件;对配置文件中的类名使用反射机制可以实现类加载初始化等工作,加载到IOC容器中的map,也可以调用类的方法进行属性注入,也可以根据field对象执行器set来是实现属性注入;完成实例化后,基于bean初始化配置,可以利用反射进一步执行bean的初始化方法 ②获取基础扫描包;扫描获取所有的Class;解析class,获取class及method的注解;基于反射实例化bean,封装到对应的容器中的map;基于反射及注解相关的配置实现属性依赖注入;基于反射及注解配置,执行bean初始化方法;)
  3. 就是不用创建对象,通过注解或xml配置文件的方式把属性赋值的任务交给spring完成。
  4. 实现IoC的步骤:定义一个用来描述bean的配置的Java类;解析bean的配置,将bean的配置信息转换为上面的BeanDefinition对象保存在内存中,spring中采取HashMap进行对对象的存储,其中会用到一些xml解析技术;遍历存放有BeanDefinition的HashMap对象,逐条取出BeanDefinition对象,获取bean的配置信息,利用java反射机制将bean实例化,然后将bean对象存储在另一个Map中即可;


3、spring中有多少个模块?分别是什么?

  1. spring的底层是核心容器:分别是:
    1. spring core [kɔːr]
    2. spring Beans
    3. springEL
    4. spring Context
  2. 数据的访问/集成:提供了与数据库交互的支持,分别是:
    1. JDBC
    2. ORM
    3. OXM
    4. JMS
    5. Transaction [trænˈzækʃn]
  3. Web层:提供了创建web应用程序的支持,分别是:
    1. Web
    2. Web-Servlet
    3. Web-Socket [ˈsɑːkɪt]
    4. Web-Portlet [‘pɔ:tlət]
  4. AOP:面向切面编程
  5. Instrumentation [ɪnstrəmenˈteɪʃn] :提供为类检测和类加载器的实现与支持。
  6. Test:提供了JUnit和TestNG进行测试的支持。
  7. Messaging [ˈmesɪdʒɪŋ] :提供了STOMP的支持,支持了注解编程的模型。

4、spring的配置文件是什么?

  1. spring配置文件时xml类型的文件。该文件主要包含类信息。


5、spring应用程序有哪些不同的组件?

  1. 接口:定义功能
  2. Bean类:它包含属性,提供setter和getter方法、函数等。
  3. spring面向切面编程(AOP)
  4. Bean配置文件:包含类信息以及配置bean的注入等。
  5. 用户程序:它使用的接口 。

6、使用spring的方式有哪些?

  1. 可以作为一个成熟的SpringWeb应用程序使用。
  2. 可以作为第三方web框架使用,使用spring framework中间层,
  3. 可以用于远程调用。
  4. 可以作为企业级JavaBean,包装现有的POJO。


7、依赖注入的方式有哪几种?

  1. 有三种:
    1. 通过构造函数注入:它不存在部分注入;而且不会覆盖setter属性,但任意修改都会创建一个新的实例,适用于设置很多属性。
    2. setter注入:存在部分注入;会覆盖setter属性,任意修改不会创建一个新实例。
    3. 接口注入:很少使用。
    4. 静态工厂注入
    5. 实例工厂注入
    6. 注解注入


8、IOC容器有哪些优点?

  1. 简化代码的编写
  2. 时程序易于测试
  3. 松耦合
  4. 支持对象的创建模式等等


9、什么是spring bean

  1. 它们是构成用户应用程序的主干对象
  2. bean由spring IOC容器管理并且由spring IOC进行实例化,配置,装配和管理
  3. bean是基于用户提供给容器的配置元数据的创建。

10、spring提供了哪些配置方式?

  1. 基于xml配置文件配置,通过在xml配置文件中编写bean所依赖的相关参数进行配置即可。
  2. 基于注解进行声明:通过在相关的类,方法或属性上使用相关的注解进行声明,使用注解进行声明的前提下是要在xml配置文件中指定包扫描并开启,才会生效。

11、spring支持几种spring scope?

  • ①singleton [ˈsɪŋɡltən]:设定创建出的对象保存 在 spring容器中,是一个单例(只能创建一次对象)的对象,并且是在获取spring容器(ApplicationContext)的时候创建对象;spring默认创建bean就是以singleton创建单例实例的,如果存在竞态条件是,即会有线程安全。
  • ②prototype [ˈproʊtoʊ taɪp]:设定创建出的对象保存在spring容器中,是一个非单例的对象,并且是在获取bean标签时创建对象;
  • ③request、session、application、websocket:设定创建出的对象放置在web容器对应的位置。


12、spring bean容器的生命周期有哪些

  1. 通过构造器创建bean实例(无参构造方法)
  2. 为 bean的属性设置值和对其他的bean的引用(调用set方法)
  3. 如果bean实现了BeanNameAware接口,则工厂通过传递bean的id调用setBeanName()方法。
  4. 如果bean实现了BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory()方法,
  5. 如果存在实现了BeanPostProcessors接口的后置处理器的类,则调用preProcessBeforeInitialization()方法把bean实例进行传递处理;
  6. 如果为bean指定了init方法,那么将调用init方法
  7. 如果存在实现了BeanPostProcessors接口的后置处理器的类,则调用postProcessAfterInitialization()方法把bean实例进行传递处理;
  8. 到这一步,bean就可以使用了
  9. 当容器关闭时,调用bean的销毁方法destory(),前提是在xml文件中指定了destory方法。

13、什么时spring 的内部bean?

  1. 只有将bean用作另一个bean的属性时,才能将bean声明为内部bean,为定义bean,spring的基于xml的配置元数据在或者中提供元素的使用。


14、什么是spring装配?

  1. 当bean在spring容器中组合在一起时,它被称为装配或bean装配,spring容器需要知道需要什么bean以及容器应该如何使用依赖注入来将bean绑定在一起,同时装备bean。


15、自动装配有哪些?

  1. 通过注解@Autowried或者bean标签中的Autowried属性来完成自动装配,其中注解的默认方式是byType进行装配的,它的参数取值有:
    1. no:这是默认 的方式,表示没有自动装配,应使用显式bean引用节点进行装配
    2. byName:根据名称进行装配,
    3. byType:根据类型进行装配
    4. constructor(构造函数):通过调用类的构造函数进行装配。
    5. autodetect:它首先会尝试通过构造函数来进行装配,如果不能,就尝试通过byType进行装配。


16、自动装配有什么局限性?

  1. 有被覆盖的可能性。用设置指定的依赖项,会覆盖自动装配。基本数据类型无法完成自动装配。


17、什么是基于注解的容器配置?

  1. 不使用xml来bean的装配,通过写相关的类、方法、字段上声明使用注解将配置移动到组件类本身:可以通过使用@Bean和@Configuration来实现 。
    1. 1、@Bean注解扮演与元素相同的角色 。
    2. 2、@Configuration类允许通过简单地调用同一个类中的其他@Bean方法来定义bean间依赖关系 。

18、如何在spring中启动注解装配?

  1. 默认情况下,spring容器中未打开注解装配,因此,要使用基于注解装配,我们必须通过配置元素在spring配置文件中启用它


19、定义bean相关的注解有哪些?

  1. 有@Component,它是将Java类标记为bean的注解、从它身上衍生出@Controller、@Service、@Repository,@Controller注解是将一个类标记为spring web mvc 的控制器。@service注解是标注在service层,@repository注解是标注在dao层的。

20、@Required注解有什么用?

  1. 该注解应用于bean属性的setter方法上。仅指示必须在配置时使用bean定义中的显式属性值或使用自动装配填充受到影响的bean属性,如果尚未受到影响的bean属性,则容器将抛出BeanInitalizationEeception

21、@Autowired注解有什么用?

  1. 该注解可以更准确的控制应该在何处以及如何进行自动装配。用于setter方法、构造方法、成员变量、或其他的成员方法上,默认情况下它是类型驱动的注入。


22、@qualifier注解有什么用?

  1. 当创建多个相同类型的bean,并希望仅使用属性装配其中一个bean时,可以使用@Autowired注解和@qualifier注解通过指定应该装配的bean的名称来消除歧义。


23、@requestMapping注解有什么用?

  1. 该注解用于将特定的Http请求url映射到将要处理相应请求的控制器中的特定类注解和方法注解。


24、请说明下@Controller和@RestController的区别是什么?

  1. @RestController注解相当于@ResponseBody+@Controller合在一起的作用


25、 spring dao有什么用?

  1. spring dao使得JDBC,Hibernate或JDO这样的数据访问技术变得更容易,统一化集成它们,统一化的异常处理。


26、spring JDBC API 中存在哪些类?

  1. JdbcTemplate
  2. SimpleJdbcTemplate
  3. NameParameterJdbcTemplate
  4. SimpleJdbcInsert
  5. SimpleJdbcCall


27、使用spring 访问Hibernate的方法有哪些?

  1. 我们可以通过两种方式使用spring访问Hibernate:
    1. 使用Hibernate 模板和回调进行控制反转
    2. 扩展HibernateDAOsupport并用APO拦截器节点


28、列举spring支持的事务管理类型?

  1. spring支持两种类型的事务管理:
    1. 编程式事务管理:在此过程中,在编程的帮助下管理事务即使用TransactionTemplate通过编写代码实现事务管理,它提供了极大的灵活性,但维护起来非常困难。
    2. 声明式事务管理:在此,是建立在AOP上面的,通过AOP功能,对方法前后进行拦截即环绕通知进行拦截,将事务处理的功能编织到拦截的方法当中,实现事务管理与业务代码分离,仅使用Transaction注解或基于xml的配置来管理,因此在项目开发当中会选择使用这种方式。
  2. 事务分为全局事务和局部事务,全局事务是由应用服务器管理的,需要底层服务器JTA支持如webLogic等;局部事务和底层采用的持久化方案有关,如使用JDBC进行持久化时,需要使用Connection对象操作事务,而使用Hibernate进行持久化时,需要使用Session对象操作事务。
  3. spring提供的事务的父接口时PlaformTransactionManager,该接口定义了三个接口,分别是:getTransaction方法可以开启事务;commit方法可以提交事务;rollback方法可以回滚事务。


29、spring的事务传播机制有哪些 ?

  1. PROPAGATION [prɑːpəˈɡeɪʃn]_REQUIRED [rɪˈkwaɪərd]:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务
  2. PROPAGATION_REQUIRES _NEW:无论当前存不存在事务,都创建新事务进行执行。
  3. PROPAGATION_SUPPORTS [sə’port] :如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。
  4. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  5. PROPAGATION_NESTED [nestɪd] :如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
  6. PROPAGATION_MANDATORY [mændətɔːri] :如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
  7. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。


30、spring事务的隔离级别?

  1. ISOLATION [aɪsəˈleɪʃn] _DEFAULT [diːfɔːlt] :这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
  2. ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。
  3. ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。
  4. ISOLATION_REPEATABLE [rɪˈpiːtəbl] _READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。
  5. ISOLATION_SERIALIZABLE [sɪˌriəˌlaɪzəbl] :所有事务逐个依次执行。


31、spring支持哪些ORM框架?

  1. Hibernate
  2. iBatis
  3. JPA
  4. JDO
  5. OJB


32、spring框架中用到了哪些设计模式?

  1. 工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
  2. 单例模式:Bean默认为单例模式
  3. 策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
  4. 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
  5. 模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
  6. 适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
  7. 观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
  8. 桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库

33、什么是AOP?

  1. 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离 ,从而使得业务逻辑之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率,通俗来讲,就是不通过修改源代码方式,在主干功能里添加新功能。它的底层是利用动态代理来实现的。如果是有接口的情况下,使用的就是JDK动态代理,底层会创建该接口的实现类代理对象,增强类的方法。如果是没有接口的情况下,使用的是CGLIB动态代理,底层会创建该类的子类的动态代理对象,增强类的方法。


34、什么是Aspect?

1.aspect由pointcut和advice组成,它既包含了横切逻辑的定义,也包含了连接点的定义,spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑编织在切面所指定的连接点中,AOP的工作重心在于如何将增强编织目标对象的连接点上,这里包含了两个工作:

  • 如何通过pointcut和advice定位到特定的 joinpoint上
  • 如何在advice中编写切面代码。

2.通俗来讲,aspect就是一个将通知应用到切入点的过程

35、什么是切点/连接点(joinpoint)?

  1. 一个程序在运行中的一些时间点,例如一个方法的执行,或者是一个异常的处理。通俗的讲就是一个类里面哪些方法可以被增强,那些可以被增强的方法就是连接点。


36、什么是通知(advice)?

  1. 特定JoinPoint处的Aspect所采取的动作,通俗来讲就是实际增强的逻辑代码部分。


37、有哪些类型的通知(Advice)?

  1. 前置通知 (Before):该类型的通知会在连接点(joinpoint)执行前执行。使用@before注解进行标记配置。
  2. 后置通知(After Returning):该类型的通知在连接点(joinpoint)方法正常执行之后执行,使用@afterreturning注解进行标记配置。
  3. 环绕通知(around):该类型的通知在连接点 (joinpoint)方法执行前后执行,使用@Around注解进行标记配置。
  4. 异常通知(after throwing):该类型的通知仅在连接点方法抛出异常之后执行,使用@afterThrowing注解进行标记配置
  5. 最终通知(After/finally):该类型的通知在连接点方法执行完之后最终执行,相当于try-catch-finally中的finally


38、spring AOP 与 AspectJ AOP有什么区别?

  1. 首先AspectJ AOP不是spring的组成部分,他是一个独立的AOP框架,底层实现基于静态代理方式完成的。而spring AOP的底层是基于动态代理实现的。因为spring 提供AOP支持,所以一般把AspectJ和spring框架一起使用,进行AOP操作。


39、什么是spring MVC框架? spring MVC框架有什么用?

  1. spring MVC框架是展现层提供的基于MVC即模型-视图-控制器架构的设计理念的优秀的web框架。是目前最主流的MVC框架之一 。
  2. 用于开发灵活且松耦合的Web框架,MVC模式有助于分离应用程序的不同方面,如输入逻辑、业务逻辑和UI逻辑等。同时在所有这些元素之间提供松耦合。它提供了一套注解,让POJO 成为处理请求的控制器,而无需实现任何接口。支持rest风格的URL请求。


40、SpringMVC的执行流程

  1. 请求阶段:
    1. 用户发送请求至前端控制器DispatcherServlet [dɪˈspætʃər] ;
    2. DispatcherServlet收到请求后,调用处理器映射器HandlerMapping,请求获取Handler;
    3. 处理器映射器HandlerMapping根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给前端控制器DispatcherServlet;
    4. 前端控制器DispatcherServlet 调用处理器适配器 HandlerAdapter [əˈdæptər] ,请求执行Handler;
    5. 处理器适配器HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
  2. 响应阶段
    1. Handler执行完成返回ModelAndView [vjuː];
    2. 处理器适配器HandlerAdapter将Handler执行结果ModelAndView返回给前端控制器DispatcherServlet;
    3. DispatcherServlet将ModelAndView传给视图解析器ViewResolver [rɪˈzɑːlvər] 进行解析;
    4. 视图解析器ViewResolver解析后返回具体View;
    5. 前端控制器DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
    6. 前端控制器DispatcherServlet响应用户。


41、SpringMVC的核心组件(结合执行流程理解)

  1. 前端控制器 DispatcherServlet:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
  2. 处理器映射器 HandlerMapping:根据请求的URL来查找Handler
  3. 处理器适配器 HandlerAdapter:负责执行Handler
  4. 处理器 Handler:处理器,需要程序员开发
  5. 视图解析器 ViewResolver:进行视图的解析,根据视图逻辑名将ModelAndView解析成真正的视图(view)
  6. 视图View:View是一个接口, 它的实现类支持不同的视图类型,如jsp,freemarker,pdf等等


42、SpringMVC怎么样设定重定向和转发

  1. 转发:在返回值前面加”forward:”,譬如”forward:user.do?name=method4”
  2. 重定向:在返回值前面加”redirect:”,譬如”redirect:http://www.baidu.com


43、SpringMVC常用的注解有哪些?

  1. @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
  2. @RequestBody:注解实现接收http请求的Json数据,将Json转换为java对象。
  3. @ResponseBody:注解实现将conreoller方法返回对象转化为Json对象响应给客户。


44、控制器(Controller)方法参数传递的注解有哪些,有什么区别

  1. @RequestParam:接收的参数是来自RequestHeader中,即请求头。通常用于GET请求
  2. @PathVariable:(RestFul风格规范)使用@PathVariable接收参数,参数值需要在url进行占位
  3. @RequestBody:接收的参数是来自requestBody中,即请求体,用Json格式传递参数


45、spring常用的注解有哪些?

  1. Component [kəmˈpoʊnənt] :使用在类上用于实例化bean
  2. Controller:使用在web层类上用于实例化bean
  3. Service:使用Service层类上的用于实例化bean
  4. Repository [rɪˈpɑːzətɔːri]:用于mapper层类上的用于实例化bean
  5. Autowired:使用字段上用于自动(装配)依赖注入bean
  6. Qualifier [kwɑːlɪfaɪər]:结合Autowired注解使用,用于根据名称进行依赖注入;
  7. Resource:相当于@Autowired+Qualifier注解,按照名称进行注入;
  8. Value:注入基本类型的属性;
  9. Scope:标注Bean的作用范围;
  10. PostConstuct:使用在方法上标注该方法是bean的初始化方法;
  11. PreDestroy:使用在方法上,标注该方法是bean的销毁方法


46、介绍一下WebApplicationContext

  1. WebApplicationContext是ApplicationContext的扩展,它具有Web应用程序所需的一些额外的功能。它与普通的ApplicationContext不同,在解析主题和决定与哪个servlet关联的能力方面要突出些