java面试之框架知识整理

  1. Spring3MVC与Struts2MVC比较
    1、SpringMVC支持Restful url,这感觉爽,就开发效率而言高;
    2、SpringMVC基本实现了零配置,配置好Spring的ApplicationContext.xml和web.xml后,基本就不需要其他配置了。而且Spring的配置也相对简单。而struts2就不行了,需要的配置相对比较多,也比较复杂;
    3、SpringMVC对每次请求是方法级的拦截,拦截到方法后根据参数上的注解,将request数据注入。一个方法对应一个request请求,并且SpringMVC方法之间是相互独立的,独享request和response数据。而StrutsMVC是类级别的拦截,每次请求来了就创建一个action,然后调用getter、setter方法。一个Action对应一个request上下文。
    4、让人更爽的是SpringMVC知识JSR303,处理ajax的请求更加方面,只需要注解一个@ResponseBody,然后直接返回相应文件即可。

  2. SpringMVC的工作流程描述:
    1.用户向服务器发送请求, 请求被Spring前端控制Servlet DispatcherServlet所捕获;
    2.DispatcherServlet对请求的URL进行解析,得到资源标识符.根据URI调用HandlerMapping获得该Handler配置的所有相关对象,最后以HandlerExecutionChain对象的形式返回;
    3.DispatcherServlet根据获得的Handler选择一个合适的HandlerAdapter;
    4.提取Request中的模型数据, 填充Handler入参,执行Controller,根据配置做一些额外的工作: 比如数据转换和验证;
    5.Handler执行完成后, 向DispatcherServlet返回一个ModelAndView对象;
    6.根据返回的ModelAndView,选择一个合适的ViewResolver返回给DispatcherServlet;
    7.ViewResolver结合Model和View来渲染视图;
    8.将视图返回给客户端.

  3. Struts2的工作原理:
    1.客户端初始化一个指向Servlet容器的请求;
    2.这个请求经过一系列过滤器, Filter;
    3.接着StrutsPrepareAndExecuteFilter被调用, StrutsPrepareAndExecuteFilter询问ActionMapper来决定是否需要调用某个Action;
    4.如果ActionMapper决定调用某个Action, StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;

    1. ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
    2. ActionProxy创建一个ActionInvocation的实例;
    3. ActionInvocation实例使用命名模式来调用, 在调用Action的过程前后, 涉及到相关拦截器的调用;
      8.一旦Action执行完毕, ActionInvocation负责根据struts.xml中的配置找到对应的返回结果, 这个结果通常是一个需要被表示的JSP或者FreeMarker的模板.
  4. Spring MVC:
    一:配置阶段:
    1.配置web.xml—DispatcherServlet;
    2.设定init-param——contextConfigLocation=classpath:application…properties;
    3.设定url-pattern——/*;
    4.配置Annotation——@Controller @Service @Autowired @RequestMapping

    二:初始化阶段:

1.调用init()方法—加载配置文件;

2.扫描相关的类——scan-package=”com.gupaodu”;

3.IOC容器初始化——Map<String, Object>;
4.创建实例并保存至容器——通过反射机制将类实例化放入IOC容器中;

5.进行DI操作——扫描IOC容器中的实例,给没有赋值的属性自动赋值;

6.初始化HandlerMapping——将一个URL和一个Method进行一对一的关联映射Map<String, Method>;

三:运行阶段:

1.调用doPost()/doGet()——Web容器调用doPost/doGet方法,获得request/response对象;
2.匹配HndlerMapping——从request对象中获得用户输入的url,找到其对应的Method;
3.反射调用method.invoke()——利用反射调用方法并返回结果;
4.Response.getWrite().write()——将返回结果输出到浏览器。
5. 请用自己的语言描述SpringIOC、DI、MVC的基本执行原理
SpringIOC, 控制反转(Inversion of Control),将spring中所有Bean的控制权(创建、消费、管理)交给SpringIOC容器,整个过程包括三个步骤:
①加载配置文件
通过io流读取配置文件,并存入property对象中
③扫描相关的类
通过scan-package属性指定扫描文件夹,遍历指定文件夹下的所有类文件,找出文件名称(排除非.class类型文件),保存到文件名列表
④初始化IOC容器,将扫描到的相关的类实例化,保存到IOC容器中
类似于Map<String, Object>键值对集合,遍历文件名称列表通过反射实例化对象(类必须有类似Controller、service注解的才能去实例化),并保存到Map集合中
key取值有三种情况:
1)在多个包下出现相同类名,通过一种有效方式使其不同
2)默认的类名首字母小写
3)如果是接口,判断实现类个数,如果只有一个,默认选择这个实现类,如果多个,只能抛出异常
DI,依赖注入(Dependency Injection)
Spring 不仅保存了自己创建的对象,而且保存了对象与对象之间的关系,扫描IOC容器中的实例,找出实例的所有属性,如果有autowired注解,就在IOC容器中通过名字找到对应之前保存的对象,设置属性.
MVC M是返回的数据,V是ModeView解析给客户端返回的视图,C是Control相关的逻辑处理
存储url和类方法的键值对集合,客户端可以通过url找到对应的类方法,
通过反射机制,执行该方法并返回数据给客户端.
遍历IOC容器Map,找出含有注解为Controler的对象的所有方法,如果有类似RequestMapping注解,则获取url(clazz.getAnnotation的RequestMapping中的url+method.getAnnotation的RequestMapping中的url)值,并把以url作为key,method作为value的集合保存到HandlerMapping中,当客户端通过url匹配到HandlerMapping集合中的某个方法时,通过反射调用并返回数据视图给客户端.
6. 软件设计的基本原则:

  1. 设计模式:

  2. Spring中的编程思想:
    OOP: 面向对象编程(封装,继承,多态,一切皆对象),用程序来描述生活中一切事物(需求转换为代码实现).
    BOP: 面向Bean编程,Java本身就是一种面向对象的编程,用一个个的Bean来体现.
    不需要new Bean,只需要你声明,只需要关注bean和bean之间的联系.
    AOP编程:解耦,专人做专事, 面向切面编程:找出多个bean中有一定规律的代码,开发时将其拆开,运行时再将其合并,面向切面编程就是面向规则编程.日志监控;事务开启,关闭;权限认证,统一错误管理, 自动缓存处理.
    切面: 面向规则,具有相同规则的方法的集合体;
    通知: 回调;
    切入点: 需要代理的具体方法;
    目标对象: 被代理的对象;
    AOP代理: 主要有两种JDK和CGLib;
    前置通知: 在invoke Pointcut之前调用;
    后置通知: Pointcut之后调用, 织入的方法;
    返回后通知: 返回值为Void, 织入的方法;
    环绕通知: 只要触发调用, 织入的方法;
    异常通知: Pointcut抛出异常.
    a. Aspect(切面),通常是一个类,里面可以定义切入点和通知;
    b. JoinPoint(连接点),程序执行过程中明确的点,一般是方法的调用;
    c. Advice(通知):Aop在特定的切入点上执行的增强处理;
    d. Pointcut(切入点),就是带有通知的连接点,在程序中主要体现为书写切入点表达式;增强同一规律的方法.
    IoC:控制反转:控制权反转,把创建对象的控制权反转给Spring(BeanFactory)DI:  依赖注入,依赖查找,自动赋值,三种赋值方法:构造方法, set赋值,直接赋值(反射,暴力强吻).(@Autowired private Object object; @Resource(“bean”) public void setName(){} )
    事务用法:
    原子性:要么全部完成, 要么全部不起作用;
    一致性: 使一个一致性状态变成另一个一致性状态;
    隔离性: 一个事务的执行不能被另一个事务干扰;
    持久性: 事务一旦被提交, 它对数据库中数据的改变就是永久性的.

  3. Spring中的设计模式:
    工厂模式: 只对结果负责, 封装创建过程.(BeanFactory, Calender)
    单例模式:保证独一无二.(ApplicationContext, Calender)
    原型模式:拔一根猴毛,吹出千万根.(ArrayList[extends Cloneable], PrototypeBean)
    代理模式:找人办事增强职责.(ProxyFactoryBean, CglibAopProxy)
    委派模式:干活算你的(普通员工),功劳算我的(项目经理).(DispatcherServlet)
    策略模式:用户选择, 结果统一.(InstantiationStrategy)
    模板模式:流程标准化,自己实现定制.(jdbcTemplate, HttpServlet)
    适配器模式:兼容转换头.(AdvisorAdapter, HandlerAdapter)
    装饰器模式:他大舅他二舅都是他舅.(BufferedReader)
    观察者模式:广播, 任务完成时通知.(ContextLoaderListener)

  4. Spring框架能给我们带来哪些好处:

  5. 简化开发:
    a) DI:使得JavaBean之间的依赖关系一目了然;
    b) IOC:帮助我们管理好系统中的Bean,分阶段,分层次系统地管理,性能提高了;

  6. 万能胶:能够兼容市面上很多成熟的框架:比如Struts,MyBatis,Quartz,Timer,Shiro,Data

  7. 模块化设计:将包和类通过不同的模块完整的隔离开来,能够在使用的时候即插即用,按需分配;比如插件的引用,用哪个就引用哪个;

  8. 自带测试组件:JUnit;

  9. Web MVC:支持的非常合理,过度设计的嫌疑(Struts中Form和Action对应出现, Spring只需要Bean和Attribute不需要Form),完美分离了Servlet和普通的Bean的关联关系;

  10. 声明式事务:将非功能性代码和功能性代码分离,提出了事务管理提前声明,通过不同的切面实现不同的切面模型,大大提高了维护成本。

  11. BeanFactory和ApplicationContext的区别:

  12. ApplicationContext是BeanFactory的子接口: getBean();1.IOC容器中的Bean监控,生命周期;

  13. 支持国际化i18n;

  14. 拓展了统一资源文件读取方式URL,可以是一个本地的URL,也可以是一个网络URL,ClassPathXmlApplicationContext从ClassPath的XML中配置文件中读取上下文,生成上下文定义,即指的是程序运行的环境;
    FileSystemXmlApplicationContext,由文件系统中的XML配置文件读取上下文;
    XmlWebApplicationContext由Web应用的XML文件读取上下文;,
    AnnotationConfigApplicationContext使用他可以实现基于Java的配置类加载Spring应用的上下文,避免使用application.xml进行配置,相比XML配置来说更加敏捷。

  15. Spring Bean的生命周期:

  16. 初始化之后的回调:initializingBean;
    销毁之前的回调:DisposableBean;

  17. init()和destroy();

  18. 通过注解:@PostConstruct和@PreDestroy

  19. Spring Bean各作用域之间的区别:
    总共5个范围,对象何时创建,何时销毁:

  20. prototype: 为每一个Bean请求提供一个实例:【顶层1岁】

  21. singleton: 默认的,单例模式由Bean Factory自身来维护,跟spring同生共死;【顶层100岁】

  22. request: 用户发出请求的时候request出生【Web层10岁】

  23. session:确保每个session中有一个Bean实例,session过期Bean自然失效【Web层20岁】;

  24. globel-session Context:【80岁】

  25. Spring中的Bean是线程安全的吗:
    Spring中的Bean是由IOC容器来创建的,而创建的对象是自己定义的,BeanDefinition->BeanWrapper->Class.newInstance()->Map<String, BeanWrapper>做了一次代理,用一个新的类代替了原来的类。所以跟我们写的代码有关系,跟Spring无关的。

  26. MVC是什么?:
    MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器它们分别担负着不同的任务。
    视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
    模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
    控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。 然后根据处理的结果调用相应的视图来显示处理的结果。
    MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并 返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。
    MVC 缺点:
    (1)增加了系统结构和实现的复杂性。
    (2)视图与控制器间的过于紧密的连接。
    (3)视图对模型数据的低效率访问。
    (4) 目前,一般高级的界面工具或构造器不支持MVC 模式。
    MVC 优点:
    (1)将用户显示(视图)从动作(控制器)中分离出来,提高了代码的重用性。
    (2)实现一个模型的多个视图;采用多个控制器;当模型改变时,所有视图将自动刷新;所有的控制 器将相互独立工作。(3)它还有利于软件工程化管理。
    为什么要用MVC:

  27. 优点:降低耦合度、增强内聚性。

  28. 使人员职能分工明确,有助于团队开发

  29. 有助于分布式开发。4. 封装分解系统的复杂性

  30. Struts2框架?:
    定义: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
    底层执行过程:

  31. Struts1和Struts2框架的区别?:
    1.Action方面: 前者继承一个抽象基类, 后者的Action可以实现接口, 也可以实现其他接口, 也可以不实现任何接口,继承ActionSupport类;
    2.线程模式方面: 前者的Action与Servlet API是紧耦合的, 后者不依赖于Servlet容器;
    3.输入捕获:前者使用ActionForm对象捕获输入, 后者直接使用Action属性作为输入属性;
    4.表达式语言: 前者整合了JSTL使用他的EL;后者支持OGNL;
    5.数据校验方面: 前者支持在ActionForm的validate方法中手动校验;后者通过validate方法和XWork校验框架(拦截器机制)来进行校验;
    6.前者所有模块中的Action必须共享相同的生命周期单例; 后者支持通过堆栈为每一个Action创建不同的生命周期,多例;

  32. Spring事务的特性:
    原子性:要么全部完成, 要么全部不起作用;
    一致性: 使一个一致性状态变成另一个一致性状态;
    隔离性: 一个事务的执行不能被另一个事务干扰;
    持久性: 事务一旦被提交, 它对数据库中数据的改变就是永久性的.

  33. Spring的常用注解:
    Spring部分
    1、声明bean的注解
    @Component 组件,没有明确的角色
    @Service 在业务逻辑层使用(service层)
    @Repository 在数据访问层使用(dao层)
    @Controller 在展现层使用,控制器的声明(C)
    2、注入bean的注解
    @Autowired:由Spring提供
    @Inject:由JSR-330提供
    @Resource:由JSR-250提供
    都可以注解在set方法和属性上,推荐注解在属性上(一目了然,少写代码)。
    3、java配置类相关注解
    @Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上)
    @Bean 注解在方法上,声明当前方法的返回值为一

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值