面经总结:框架

 

  • 什么是Spring?

答:spring的核心是一个轻量级的容器(Container),包含并管理应用程序对象的配置及生命周期。

它是实现IoC(Inversion of Control)容器和非侵入性(No intrusive)的框架,

并提供AOP(Aspect-oriented Programming)的实现方式,提供对持久层(Persistence)、事务(Transcation)的支持;

提供MVC Web框架的实现,并对一些常用的企业服务API提供了一致的模型封装,是一个全方位的应用程序框架,除此之外,对现存的各种框架(Struts、JSF、hibernate、Ibatis、Webwork等),Spring也提供了与他们相整合的方案。 

注:IOC(Inversion Of Control )控制反转;将对象的创建和依赖关系交给容器;简单说就是创建对象由以前的程序员自己new构造方法来调用,变成了交由Spring创建对象。

 

  • Spring核心功能?

核心功能是IoC反转控制和AOP面向切面编程;
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。 OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
 
 
  • IoC介绍和优点?

IoC(Inversion Of Control )控制反转;将对象的创建和依赖关系交给容器;简单说就是创建对象由以前的自己new构造方法来调用,变成了交由Spring创建对象。

Spring IoC负责创建对象、管理对象(通过依赖注入)、整合对象、配置对象以及管理这些对象的生命周期。

IOC的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

 

  • AOP介绍和优点?如何实现?

AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
 
OOP引入封装、继承和多态性等概念来建立一种 对象层次结构,用以模拟公共行为的一个集合。当我们需要为 分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义 从上到下的关系,但并不适合定义 从左到右的关系
 
例如日志功能。日志代码往往水平地散布在 所有对象层次中,而与它所散布到的 对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为 横切(cross-cutting)代码, 在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
 
而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的 公共行为封装到一个 可重用模块,并将其名为“ Aspect”,即方面。所谓“方面”,简单地说,就是将那些 与业务无关,却为业务模块所 共同调用的逻辑或责任封装起来, 便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
 
AOP的实现:

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

 

  • jdk代理和cglib代理的区别?

JDK动态代理和CGLIB字节码生成的区别?
 * JDK动态代理只能对实现了接口的类生成代理,而不能针对类。(接口代理)
 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。(类代理)

Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

如何强制使用CGLIB实现AOP?
 (1)添加CGLIB库,SPRING_HOME/cglib/*.jar
 (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK代理是不需要以来第三方的库,只要要JDK环境就可以进行代理,它有几个要求
* 实现InvocationHandler 
* 使用Proxy.newProxyInstance产生代理对象
* 被代理的对象必须要实现接口 

  • Spring的实例保存在哪?

定义bean的方式?
1)XML配置方式;2)注解方式;
bean存储?
利用java反射机制,生成bean实例,实例化的单例bean放入HashMap存储,id作为key;
 
  • Spring MVC工作流程

以DispatcherServlet(前端控制器)为中心的工作: 1.DispatcherServlet;  2.HandlerMapping;  3.HandlerAdapter  4.ViewReslover

1)首先用户向服务器发送请求,被DS捕获;(用户->DS 请求

2)DS收到请求,调用HandlerMapping(处理器映射器)获得Handler相关对象(处理器)(包括Handler及HandlerInterceptor),以HanderExecutionChain对象的形式返回;  (DS->HM  HM->DS H/HI/HEC

3)DS根据获得的Handler找到合适的HandlerAdapter(处理器适配器),调用具体的Controller,Controller执行结果ModelAndView返回给DS; (DS->HA Controller;  HA->DS MAV

4)DS将MAV传给ViewReslover(视图解析器),VR解析后返回View,DS根据Model和View渲染视图,渲染结果返回客户端; (DS->VR MAV; VR->DS View; DS->客户端 Model View

 

  • MyBatis的#和$的区别?

1.属性; 2.性能;3.注入;4.表名;5.不变
1.属性:#{para}是预编译,${para}是字符串替换;
2.性能:预编译的sql可以重复利用;所以#{}性能较优;
3.注入:${}是字符串替换,会存在sql注入问题;比如select * from table where name = ${smith or 1 = 1},这样无论是否匹配,都能查到结果;
4.表名:表名必须使用${tablename},因为预编译的占位符进行变量替换后会带上单引号。而表名不能加单引号;
5.不变:如果插入不改变的字符串,比如order by ${para} 那么就可以用${};
 
 

转载于:https://www.cnblogs.com/buwenyuwu/p/7225445.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值