JavaEE面试题总结 Day40 2018-12-30

struts2框架
简述struts中的mvc编程模式?

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,Struts就是MVC中的C的角色,因为他主要是负责Action处理各种请求。
谈谈Struts2的工作原理

用户发出一个HttpServletRequest请求
这个请求经过一系列的过滤器Filter来传送
调用控制器FilterDispatcher
控制器通过ActionMapper获得Action的信息
控制器调用ActionProxy
ActionProxy读取struts.xml文件获取action和interceptorStack的信息
ActionProxy把request请求传递给ActionInvocation
ActionInvocation依次调用action和interceptor
根据action的配置信息,产生result
Result信息返回给ActionInvocation
产生一个HttpServletResponse响应
产生的响应行为发送给客服端。

tocken防止重复提交

token实现的原理就是就是在表单中存放一个key(这个key也是存服务端获取),表单提交的时候带着这个key,到服务端后先判断这个key是否有效,如果有效就处理用户的请求,处理完成后把key置为失效,如果key无效就提示用户该表单已经提交过一次了。
hibernate框架
谈谈Hiberante的缓存

Hibernae中存在三种缓存,分别是一级缓存,二级缓存,查询缓存,在第一次查询的时候会把结果放到缓存里面,第二次再查的直接从缓存中获取,所以Hibernate缓存可以提高查询效率

一级缓存(session)
    对当前session中有效,当session关闭后缓存被清空,对应的方法有get或load
二级缓存(sessionFactory)
    二级缓存中的数据可使用范围是当前应用的所有会话,Hibernate中对二级缓存只提供了一个接口,具体的实现由第三方来做,常用的有EHCache,OSCache,SwarmCache和JBossCache。在访问指定的id的对象时,首先从一级缓存中查找,找到就直接使用,找不到则转到二级缓存中查找(必须配置且启用二级缓存),如果二级缓存中找到,则直接使用,否则会查询数据库,并将查询结果根据对象的id放到缓存中
查询缓存
    对于经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放在第二缓存中。以后再次执行该查询语句时,只需从缓存中获得查询结果,从而提高查询性能

谈谈Hibernate如何解决懒加载问题

可以通过设置lazy属性为false来解决懒加载的问题,这种是最简单的但是不实用。因为不管对象用或者不用Hiberate都会把其他属性或者关联对象查询出来,这样会导致资源浪费
也可以通过OpenSessionInViewFilter来解决,这个方法是将session交给servletFilter管理,每当一个请求来之后就会开启一个session,只有当响应结束后才会关闭session。

spring框架
Spring中我们配置bean是在什么时候实例化的?以及bean在容器中存在的形态

默认容器在加载的时候初始化bean,但是也可以通过设置lazy-init属性来延迟加载
首先要实例化bean
按照Spring的配置信息对bean进行装配,也就是IOC
如果Bean在Spring配置文件中配置了init-method属性会自动调用该方法发进行初始化操作
这是Bean就可以使用了
如果该Bean不在使用,这个Bean就会被清理,如果配置了destroy-method属性,会自动调用其配置的销毁方法

描述一下spring的工作原理

Spring中两大核心思想IOC和AOP,IOC控制反转将对象创建的权利交给了Spring容器,可以自动生产。利用的就是反射的原理,动态的创建对象,调用对象,Spring就是运行的时候根据配置文件来动态的创建对象和维护对象之间的关系,实现了松耦合的思想。
AOP是面向切面编程,就是可以很好的把业务逻辑和系统服务分离(事务,日志等),业务逻辑只关心业务的处理而不再去处理其他事情,这些都是通过配置来实现。

谈谈IOC和DI,AOP以及列出项目开发中的应用场景

IOC和AOP的概念上面的面试题中已经说过了,下面主要说说DI和使用场景
依赖注入(Dependency Injection)这就是DI,由Spring容器将对象注入到使用到它的地方,被注入的对象只提供对应的方法接受就行,由容器来决定对象之间的依赖关系。
使用场景
    IOC:项目中的Bean都可以交给Spring容器来维护,这样Bean的创建及销毁以及生命周期都不需要我们去处理都由Spring来管理。
    DI:比如service层需要调用Dao层访问数据库,这时可以把service层的Bean和Dao层的Bean给Spring管理,我们只需要在service中定义对应的方法来接收Spring容器给我注入的Dao层的Bean即可
    AOP:事务,日志,权限等

谈谈Spring如何配置声明式事务控制

声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解

配置文件
- 配置事务管理器
- 事务的策略(这里可以配置事务的隔离级别,传播属性,是否可读等)
- 配置事务的切入点,注入事务属性
注解
- 配置事务管理器
- 开启事务控制的注解支持
- 在类或者方法上面添加@Transactiona,事务的属性都在该注解的属性上设置

谈谈Spring的作用域有哪些?

单例(singleton)(默认)每一个Spring容器都只有一个实例对象
原型(prototype)每次调用都会创建一个新的实例
请求(request)每一个HTTP请求都有自己的Bean实例。只在基于web的Spring ApplicationContext中可用
会话(session)在一次HttpSession中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效在Web应用中使用Spring时,该作用域才有效
globalSession 在一个全局的HttpSession中,容器会返回该Bean的同一个实例,仅在使用portletContext时有效

spring aop的底层原理是什么?拦截器的优势有哪些?

Spring AOP的底层都是通过代理来实现的
    一种是基于JDK的动态代理
    一种是基于CgLIB的动态代理
拦截器是基于Java反射机制实现的,使用代理模式
    拦截器不依赖于servlet容器
    拦截器只能对action请求起作用
    拦截器可以访问action上下文
    拦截器可以获取IOC容器中的各个bean
    在action生命周期中,拦截器可以被多次调用

spring的特点?如何手写实现spring原理?

Spring量大核心思想AOP和IOC(具体上面有)
Spring是个巨大的工厂,这个工厂就是专门用来生成Bean,所以如果要手写的一定要用到工厂设计模式
写一个工厂类,对外提供一个静态方法,这个方法接受用户要创建对象的一个id,对象和id可以写到配置文件里面,工厂再提供一个init方法进行读取配置文件。用户调用的是传入id根据id在配置文件中找到要创建的对象,最后通过反射创建对象并返回给用户

你可能感兴趣的:(JavaEE面试题总结 Day40 2018-12-30)