Spring面试流程

Spring面试流程 (马丁福勒)
容器 :
以往我们创建一个实例都是通过new的关键字,耦合度过高,在维护的时候
如果有一千个就要改一千个,new不灵活,
譬如你在一个工程的很多类里写了以下声明Map map = new HashMap();假设有10000次现在,你的主管告诉你,把 HashMap统统换成ConcurrentHashMap,即Map map = new ConcurrentHashMap();那么,接下来就去搜索,改10000次吧;
如果我是这么写的Map map = Factory.getMap();那么我只需改getMap中 的实现即可,仅此一处,不会遗漏。
明显是工厂模式要好,这样创建出来的对象方便管理。
因此出现了工厂模式。但是工厂模式也有缺点工厂没有生命周期、对象之间没有依赖。。。
Spring容器提供 Spring框架的基本功能,是工厂模式的实现。
并管理容器中的Bean与Bean之间的依赖关系,解决对象与对象之间的耦合度,换句话说,Spring就是Bean的工厂,管理Bean的生命周期。

什么是Spring:
Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。它是为了解决企业应用开发的复杂性而创建的。
Spring的设计思想是单例模式和工厂模式,不依赖于web容器,Spring为开发企业应用程序提供了轻量的解决方案,

Spring的优点:
1.轻量级,低侵入的设计。
2.Spring的依赖注入和控制反转使JDBC简单化。
3.Spring不依赖于web容器,独立于各种应用服务器, Write Once,Run Anywhere(一次编译 到处运行)。
4.高度开放性:Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部,它的架构仍然是内在稳定的。
Spring的缺点:
1.不支持分布式部署。
2.配置文件比较多。
3.控制器过于灵活,缺少一个公共控制器。
4.如果开发者设计不出合理的接口,导致一改就改多处,反而造成不便。
5.代码不好调试。

公司怎么用?有什么经验和教训?
项目组中,有可能会使用spring的mvc,我们原来项目组中是要求把dispathcherServlet里面的contextConfigLocation的默认路径和名字都改成在classpath下面的web-context.xml
然后再配置一个侦听器

也是用同样的方法改成app-context.xml, web-context.xml主要是页面的一些配置,
如tiles框架,注解扫描只是扫描在controller前台处理这一层。
App-context.xml它配置dataSource的连接,aop的监控,资源文件等等。

在jsp页面发送请求个到后台的时候,我们是通过spring的注解只要在每个方法的上面加上@RequestMapping写上与页面相同的action地址,在类的上面标明@controller他是一个控制器,
在连接service层的时候,我们只要autowire 加上service的类名,但是service层和dao层都是要加@service给他们注入实例。
在dao层连接数据库的话,我们是用jdbc的模板来操作的,只要注入一个dataSourcer然后继承jdbcTempleta就可以了。
然后回到controller层的时候通过modelAndView转发给页面,或者返回页面有一个string也是可以的。
在业务需要的时候,我们会使用aop做登录日志,注册成功之后发送邮箱等等。

整体结构和源代码
Spring的组成部分 七大模块
1.Spring Core:Spring的基石,提供了Spring的最主要的核心机制:控制反转和依赖注入
2.Spring Context:提供了Spring的上下文信息,如:国际化,验证等
3.Spring Web支持:简化了处理多部分请求
4.Spring MVC框架支持:一个全功能的构建 Web 应用程序的 MVC 实现,MVC 容纳了大量 视图技术,其中包括 JSP、Velocity等。
5.Spring Dao支持:Spring的Dao支持大大的简化了JDBC操作数据库所带来的繁琐
6.Spring ORM支持 pring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink。 所有这些都遵从Spring的通用事务和DAO异常层结构。
7.Spring AOP:面向方面编程,提供了事务,日志,权限,安全等处理机制

具体解释
Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。
BeanFactory使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。

Spring AOP:通过配置管理特性,Spring AOP模块直接面向方面的编程功能集成到了Spring框架中,所以可以很容易的使Spring框架管理的任何对象支持 AOP。

Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖于EJB组件,就可以将声明性事务管理集成到应用程序中。

Spring ORM:Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink。所有这些都遵从Spring的通用事务和DAO异常层结构。

Spring DAO:JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息。异常层次结构简化了错误处理,
并且大大的降低 了需要编写的异常代码数量(例如,打开和关系连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层结构。

Spring WEB:Web上下文模块建立在上下文模块(Context)的基础之上,为基于Web服务的应用程序提供了上下文的服务。所以Spring框架支持 Jakarta Struts的集成。
Web模块还简化了处理多部分请求及将请求参数绑定到域对象的工作

Spring上下文(Context):Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化校验和调度功能。

Spring MVC:Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳的大量视图技术,包括JSP、Velocity、Tiles、iText和Pol

1.核心容器
在这个模块中我们可以找到BeanFactory这个类,它是基于spring框架系统的核心.
BeanFactory采用工厂模式实现IOC,将配置文件中的依赖关系代码冲代码中独立出来。
2. Application Context(上下文模块)
这个模块扩展了BeanFactory,添加了对I18N和系统生命周期事件以及验证的支持。同时也集成了邮件服务器,JNDI访问,EJB,远程调用以及定时服务,模板等。
3. Spring AOP模块
面向切面,其是开发切面的基础。spring大部分AOP都是基于AOP Alliance的API开发。
spring AOP也可以通过metadata编程,使用spirng的metadata,可以通过代码注解告诉spring在哪里如何应用切面。
4.JDBC 抽象以及dao模块。
例如JDBC连接,创建语句,处理结果,最后关闭连接。同时也建立了很多sql异常错误,以后就不用再去解释sql专用的错误。
这个模块利用AOP模块为spring的对象事务管理服务。
5. O/R映射集成模块
提供钩子程序,为其他ORM框架(hibernate,JDO,IBATIS)等接入提供钩子程序。并且spring事务管理支持这些ORM框架以及JDBC。
6.Spring web模块
web上下文建立在应用上下文模块基础之上。提供适合web的上下文。还支持其他的web任务,例如处理多文件上传请求,自动将请求参数绑定到业务对象中。例如对struts2的支持。
7.Spring mvc模块
spring的mvc利用IOC将控制逻辑和业务逻辑分离开。你可以声明如何将参数绑定到业务对象上面。spring还提供国际化和验证服务。


Spring框架的工作机制是什么?
(1) Spring MVC将所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。
(2) DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的
(3) DispatcherServlet请求提交到目标Controller。
(4) Controller进行业务逻辑处理后,会返回一个ModelAndView。
(5) Dispathcher查询一个或多个ViewResolver(视图解析器),找到ModelAndView对象指定的视图对象。
(6) 视图对象负责将结果返回给客户端。

4 Spring的核心机制
1).控制反转(IoC/Inverse Of Control):调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。
2).依赖注入(DI/Dependence injection) :容器创建好实例后再注入调用者称为依赖注入。

当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,
在传统的程序设计过程中,通常由调用者来创建被调用者的实例, 但在Spring里,创建被调用者的工
作不再由调用者来完成,因此称为控制反转; 创建被调用者 实例的工作通常由Spring容器来完成,
然后注入调用者,因此也称为依赖注入

5.事务种类分为: Jdbc事务(局部事务) jta事务(全局事务) 容器事务

1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。局部事务
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。全局事务
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用

两种事务的比较 :
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂 。

同类框架比较:
Spring支持aop可以很好对权限进行拦截,可以随时监控运行期时的状态。
Spring ioc 的运用更加实现了spring的动态编程以及面向接口思想,分离了接口和实现,使 代码层次结构清晰. 协调各组件间相互的依赖关系,同时大大提高了组件的可移植性,组件的重用机会也变得更多。
Spring 方便单元测试。
为什么说方便单元测试:
Spring容器解决了对象与对象之间的依赖,
学习到了什么思想?
利用延时注入思想组装代码,提高系统扩展性,灵活性,实现插件式编程。
利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。


AOP :
  面向切面编程 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式 孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

Spring的核心机制 :
1).控制反转(IoC/Inverse Of Control):调用者不再创建被调用者的实例,由spring框架实现(容器创建)所以称为控制反转。
在传统的程序中实例的创建是由调用者创建的,在spring框架中实例的创建是由spring的容器创建的,再通过它的注入方式注入给调用者。spring的容器还管理实例,建立相互依赖关系。

2).依赖注入(DI/Dependence injection) :容器创建好实例后再注入调用者称为依赖注入。
依赖注入是一个由马丁福勒提出来的。

依赖注入 :
依赖注入(DI/Dependence injection) :容器创建好实例后再注入调用者称为依赖注入。
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,
在传统的程序设计过程中,通常由调用者来创建被调用者的实例, 但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转; 创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

什么时候不使用依赖注入: 使用依赖注入没有效果的时候。 永远需要不同的实现。 永远不会需要一个不同的配置。

AOP(面向切面编程)和OOP( 面向对象编程)的区别:
AOP:面向切面编程,主要处理非业务逻辑的功能,例如。日志,权限,安全验证,事务等。他是实现技术有两种,jdk动态代理,cglib代理。

AOP编程可以再任意时刻向程序中添加新的功能,且不会影响到程序原有的功能,
OOP就是面向对象编程,主要是处理业务逻辑,有顺序的执行,AOP关注的是程序的执行过程,并对这个过程进行干预

Spring的中的事物处理和权限拦截,就是使用AOP;
Spring中主要是使用AspectJ 和Cglib来实现AOP,
Aspect就是JDK的动态代理,要提供接口;Cglib,不用提供接口,是二进级生 成对象。
1、如果目标对象实现了接口,默认情况下会采用AspectJ 的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用Cglib实现AOP
3、如果目标对象没有实现了接口,必须采用Cglib库,Spring会自动在AspectJ 和Cglib之间转换


Spring事务分为编程式事务和声明式事务两种:
<1>编程式事务:是侵入式事务,比较灵活,但编程式事务要操作逻辑代码。存在重复的代码比较多,相对繁琐,而且不利于系统的扩展。
<2>声明式事务:是一种非侵入式的事务,声明式事务只需在配置文件中配置,而不需要去操作逻辑代码。
a.spring是如何支持编程式事务的?
答:不同的平台有不同的事务管理器,spring通过事务管理器TransactionManager,事务定义transactionDefinition,事务状态TransactionStatus来支持编程式事务。
b.spring是如何支持声明式事务的?
答:利用aop的技术进行事务编程。
3>事物的特性:
<1>、原子性(atomicity):事务执行过程中的任何失败都将导致事务所做的任何修改失效。
<2>、一致性(consistency):当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
<3>、隔离性(isolation):在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
<4>、持久性(durability):已提交的数据在事务执行失败时,数据的状态都应该正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值