一、SSM
1. JDBC 跟 Mybatis的区别?
- Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
- Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
- MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
- JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。
2. 简述一下事务以及事务的特性?
- 事务:事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。
- 事务具有4个特性,缺一不可,即:ACID(原子性、一致性、隔离性和持久性)
- 原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
- 一致性:事务执行时,是从一个一致状态变成另一个一致状态。
- 隔离性:一个事务的执行,不受其他事务(进程)的干扰。
- 持久性:事务一旦提交,对数据库的改变是持久的。
3. 简述Spring事务配置过程?
- Spring提供了多种事务管理器,将事务的具体工作委托给底层的持久化机制来实现(一般是数据库)。
- Spring为不同的事务提供了一致的编程模型。
- 具体使用时,可以选择使用声明式或者编程式事务。
4. 简述Spring中BeanFactory和ApplicationContext作用?
- ApplicationContext 是 BeanFactory接口的子接口
- BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
- ApplicationContext是对BeanFactory的扩展,提供了更多的功能
- 国际化处理
- 事件传递
- Bean自动装配
- 各种不同应用层的Context实现
- 结论:开发中尽量使用ApplicationContext 就可以了
5. Spring框架的优点都有什么?
- 简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
- 解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。
- 支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。
- 集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
- 轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。
6. 构造器注入和 setter 依赖注入,那种方式更好?
- 每种方式都有它的缺点和优点。
- 构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。
- 如果使用 XML 来描述依赖,Setter 注入的可读写会更强。
- 经验法则是强制依赖使用构造器注入,可选依赖使用setter注入。
7. 依赖注入和工厂模式之间有什么不同?
- 虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工厂模式更清晰。
- 通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。
- 使用工厂模式,你的类需要通过工厂来获取
8. 列出IOC的3种主要注入方式?
- 构造方法注入;
- setter属性注入;
- 接口注入。
9. 简述Spring中常用的几种Advice注解?
- @Before:在方法执行前处理
- @AfterReturning:在方法正常执行后处理
- @AfterThrowing:在方法执行期间抛出异常时处理
- @After:在方法执行前后无论是否有异常也处理
- @Around:在方法前后进行处理
10. 什么是Spring 的AOP,AOP的工作原理是什么?
- 面向切面编程简称AOP
- Spring AOP 是使用动态代理在运行期间植入增强的功能代码。
- Spring的一个关键的组件就是AOP,其中最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。
- 允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强
11. 什么是IOC/DI,实现原理是什么?
- IOC Inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理。
- DI:Dependency Injection 依赖注入,指容器通过调用构造器或者set方法来建立对象之间的依赖关系。
12. 简述Spring中常用注解?
- @Component :标准一个普通的spring Bean类。
- @Repository:标注一个DAO组件类。
- @Service:标注一个业务逻辑组件类。
- @Controller:标注一个控制器组件类。
- @Resource:注入组件
13. 简述SpringMVC的请求流程?
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户
14. 简述什么是MVC?
- MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
- 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
- View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
- Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
15. 简单的说一下spring的生命周期?
- 实例化BeanFactoryPostProcessor实现类
- 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
- 实例化BeanPostProcessor实现类
- 实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
- 执行Bean的构造器
- 执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
- 为Bean注入属性
- 调用BeanNameAware的setBeanName方法
- 调用BeanFactoryAware的setBeanFactory方法
- 执行BeanPostProcessor的postProcessBeforeInitialization方法
- 调用InitializingBean的afterPropertiesSet方法
- 调用的init-method属性指定的初始化方法
- 执行BeanPostProcessor的postProcessAfterInitialization方法
- 执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法
- 容器初始化成功,执行正常调用后,下面销毁容器
- 调用DiposibleBean的destory方法
- 调用的destroy-method属性指定的初始化方法
16. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
- ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
- ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现
- 开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
17. Spring里面applicationContext.xml文件能不能改成其他文件名?
- ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。
- 缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。
- 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。
18. SpringMVC如何解决线程安全性问题?
1. SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例,从而有可能产生线程安全问题。 2. 因此尽量避免在Controller中使用实例变量 3. 使用ThreadLocal变量。
19. 什么是事务传播?
- 事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
20. 介绍一下Spring的事物管理
- 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
- 开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
- spring提供了几个关于事务处理的类:
- TransactionDefinition //事务属性定义
- TranscationStatus //代表了当前的事务,可以提交,回滚。
- PlatformTransactionManager这个是spring提供的用于管理事务的基础接口。
21. 解释一下Spring AOP里面的几个名词
- 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
- 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
- 通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
- 切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
- 引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
- 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
- AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
- 织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
22. SpringMVC如何实现文件上载步骤?
- RFC1867 规定了HTTP文件上载协议
- 客户端
- form标签中使用属性 ENCTYPE="multipart/form-data" METHOD=POST
- 使用 input type=file 标签选择文件
- 服务器端
- 导入commons-fileupload 组件
- 配置文件上载处理器
- 在控制器方法声明MultipartFile 类型变量接收上载文件。
23. SpringMVC如何实现Excel文件下载?
- 利用 Apache POI API生成Excel
- 在控制器中设置 ContentType 为Excel文件类型
- 在控制器中设置 Content-Disposition 设定下载文件名
二、AJAX
1. 什么是Ajax?
- Ajax的全称是Asychronous JavaScript And XML(异步JavaScript和XML);
- 是一种用来改善用户体验的技术,其实质是利用浏览器内置的一种特殊对象(即ajax对象)异步地向服务器发送请求,服务器返回部分数据,浏览器利用这些数据修改当前页面,整个过程页面无刷新,不打断用户的请求。
2. 请谈一下Ajax的优点?
- 通过异步模式,提升了用户体验
- 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
- Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
- Ajax可以实现动态不刷新(局部刷新)
3. 简要描述Ajax应用的工作流程。
- 在基于Ajax的Web程序中,在用户行为和服务器端多了一层Ajax引擎,它负责处理用户的行为,并转化为对服务器的请求。
- 同时它接收服务器端的返回信息,经过处理后显示给用户。
- 由于Ajax在后台以异步的方式的工作,用户无需等待服务器的处理,可以进行并发工作,这就在用户界面层次中更为接近了CS架构的客户端平台。
4. Ajax包括哪些关键技术?
- JavaScript脚本语言;
- 可扩展标记语言(XML);
- 文档对象模型(DOM);
- 级联样式表(CSS);
- XMLHttpRequest对象。
5. 常用的Ajax框架有哪些?
- WebORB for Java,Echo 2
- DWR,SWATO
- The AJAX JSP Tag Library
- The Ajax-JSF
6. Ajax的核心对象是什么?
- Ajax的核心对象是XMLHttpRequest对象。
7. 请写出创建XMLHttpRequest对象的javascript函数?
function createXmlHttpRequest(){
if(window.ActiveXObject){ return new ActiveXObject(“Microsoft.XMLHTTP”); }else if(window.XMLHttpRequest){ return new XMLHttpRequest(); }
}
三、综合题目
1. 常用的设计模式有哪些,简单描述下其应用场景?
- 单例模式。
- 单例模式是一种常用的软件设计模式。
- 在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
- 应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
- 工厂模式。
- 工厂模式主要是为创建对象提供了接口。
- 应用场景如下:
- 在编码时不能预见需要创建哪种类的实例。
- 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
- 策略模式。
- 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
- 应用场景如下。
- 一件事情,有很多方案可以实现。
- 我可以在任何时候,决定采用哪一种实现。
- 未来可能增加更多的方案。
- 策略模式让方案的变化不会影响到使用方案的客户。
- 观察者模式。
- 观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
- 应用场景如下:
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
- 迭代器模式。
- 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
- 应用场景如下:
- 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
- 模板方法模式。
- 模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
- 应用场景如下:
- 对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。