ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JAVA面试题(154~160)

JAVA面试题(154~160) 154、如何在Web项目中配置Spring的IoC容器答如果需要在Web项目中使用Spring的IoC容器可以在Web项目配置文件web.xml中做出如下配置context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:applicationContext.xml/param-value/context-paramlistenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listener155、如何在Web项目中配置Spring MVC答要使用Spring MVC需要在Web项目配置文件中配置其前端控制器DispatcherServlet如下所示web-appservletservlet-nameexample/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classload-on-startup1/load-on-startup/servletservlet-mappingservlet-nameexample/servlet-nameurl-pattern*.html/url-pattern/servlet-mapping/web-app**说明*上面的配置中使用了.html的后缀映射这样做一方面不能够通过URL推断采用了何种服务器端的技术另一方面可以欺骗搜索引擎因为搜索引擎不会搜索动态页面这种做法称为伪静态化。156、Spring MVC的工作原理是怎样的答Spring MVC的工作原理如下图所示下面是 Spring MVC 的完整工作流程图① 客户端发起请求DispatcherServlet 前端控制器② HandlerMapping 查找 Handler③ HandlerAdapter 封装处理器④ HandlerAdapter 调用 Handler 方法⑤ 返回 ModelAndView⑥ ViewResolver 解析逻辑视图⑦ 视图渲染模型数据⑧ 返回响应给客户端下面针对每个步骤给出对应的代码或配置示例帮助理解 Spring MVC 的完整工作流程。① 客户端发起请求客户端通过浏览器或 HTTP 客户端向服务器发送请求例如访问http://localhost:8080/example/user/list。该请求会先被部署在 web.xml 中的前端控制器 DispatcherServlet 拦截。② DispatcherServlet 通过 HandlerMapping 查找 HandlerDispatcherServlet 收到请求后会调用 HandlerMapping 根据请求的 URL 找到对应的 Handler即 Controller 中的处理方法。HandlerMapping 的常见配置方式如下!-- 启用 Spring MVC 注解驱动自动注册 RequestMappingHandlerMapping 等组件 --mvc:annotation-driven/!-- 配置视图解析器可选配合步骤⑥使用 --beanclassorg.springframework.web.servlet.view.InternalResourceViewResolverpropertynameprefixvalue/WEB-INF/views//propertynamesuffixvalue.jsp//bean对应的 Controller 示例ControllerpublicclassUserController{RequestMapping(/user/list)publicStringlist(Modelmodel){model.addAttribute(users,userService.findAll());returnuserList;// 逻辑视图名}}③④ HandlerAdapter 封装并调用 HandlerHandlerAdapter 是一个适配器它用统一的接口对各种 Handler 中的方法进行调用。Spring MVC 默认注册了RequestMappingHandlerAdapter负责调用带有RequestMapping注解的方法。通常无需额外配置但可以通过mvc:annotation-driven/自动注册。⑤ Handler 返回 ModelAndViewHandler 方法处理完请求后会返回一个ModelAndView对象或通过Model参数 返回视图名的方式其中包含了数据模型以及视图的逻辑名称。例如上面的list方法返回逻辑视图名userList同时通过model.addAttribute携带了用户列表数据。⑥ ViewResolver 解析逻辑视图DispatcherServlet 会借助 ViewResolver 将逻辑视图名解析为真实的视图对象。例如使用InternalResourceViewResolver时逻辑视图名userList会被解析为/WEB-INF/views/userList.jspbeanclassorg.springframework.web.servlet.view.InternalResourceViewResolverpropertynameprefixvalue/WEB-INF/views//propertynamesuffixvalue.jsp//bean⑦ 视图渲染模型数据得到真正的视图对象后DispatcherServlet 会利用视图对象对模型数据进行渲染。例如 JSP 视图会通过 JSTL 标签将模型中的数据输出到页面% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html body table c:forEach items${users} varuser tr td${user.name}/td td${user.age}/td /tr /c:forEach /table /body /html⑧ 返回响应给客户端视图渲染完成后DispatcherServlet 将最终的响应内容返回给客户端。响应可能是一个普通的 HTML 页面也可以是 XML 或 JSON 字符串还可以是一张图片或者一个 PDF 文件。例如返回 JSON 数据时只需在 Controller 方法上添加ResponseBody注解ControllerpublicclassUserController{RequestMapping(value/user/list,producesapplication/json)ResponseBodypublicListUserlistJson(){returnuserService.findAll();}}① 客户端的所有请求都交给前端控制器DispatcherServlet来处理它会负责调用系统的其他模块来真正处理用户的请求。② DispatcherServlet收到请求后将根据请求的信息包括URL、HTTP协议方法、请求头、请求参数、Cookie等以及HandlerMapping的配置找到处理该请求的Handler任何一个对象都可以作为请求的Handler。③ 在这个地方Spring会通过HandlerAdapter对该处理器进行封装。④ HandlerAdapter是一个适配器它用统一的接口对各种Handler中的方法进行调用。⑤ Handler完成对用户请求的处理后会返回一个ModelAndView对象给DispatcherServletModelAndView顾名思义包含了数据模型以及相应的视图的信息。⑥ ModelAndView的视图是逻辑视图DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。⑦ 当得到真正的视图对象后DispatcherServlet会利用视图对象对模型数据进行渲染。⑧ 客户端得到响应可能是一个普通的HTML页面也可以是XML或JSON字符串还可以是一张图片或者一个PDF文件。157、如何在Spring IoC容器中配置数据源答DBCP配置beaniddataSourceclassorg.apache.commons.dbcp.BasicDataSourcedestroy-methodclosepropertynamedriverClassNamevalue${jdbc.driverClassName}/propertynameurlvalue${jdbc.url}/propertynameusernamevalue${jdbc.username}/propertynamepasswordvalue${jdbc.password}//beancontext:property-placeholderlocationjdbc.properties/C3P0配置beaniddataSourceclasscom.mchange.v2.c3p0.ComboPooledDataSourcedestroy-methodclosepropertynamedriverClassvalue${jdbc.driverClassName}/propertynamejdbcUrlvalue${jdbc.url}/propertynameuservalue${jdbc.username}/propertynamepasswordvalue${jdbc.password}//beancontext:property-placeholderlocationjdbc.properties/提示 DBCP的详细配置在第153题中已经完整的展示过了。158、如何配置事务增强答?xml version1.0 encodingUTF-8?beansxmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!-- this is the service object that we want to make transactional --beanidfooServiceclassx.y.service.DefaultFooService/!-- the transactional advice --tx:adviceidtxAdvicetransaction-managertxManager!-- the transactional semantics... --tx:attributes!-- all methods starting with get are read-only --tx:methodnameget*read-onlytrue/!-- other methods use the default transaction settings (see below) --tx:methodname*//tx:attributes/tx:advice!-- ensure that the above transactional advice runs for any execution of an operation defined by the FooService interface --aop:configaop:pointcutidfooServiceOperationexpressionexecution(* x.y.service.FooService.*(..))/aop:advisoradvice-reftxAdvicepointcut-reffooServiceOperation//aop:config!-- dont forget the DataSource --beaniddataSourceclassorg.apache.commons.dbcp.BasicDataSourcedestroy-methodclosepropertynamedriverClassNamevalueoracle.jdbc.driver.OracleDriver/propertynameurlvaluejdbc:oracle:thin:localhost:1521:orcl/propertynameusernamevaluescott/propertynamepasswordvaluetiger//bean!-- similarly, dont forget the PlatformTransactionManager --beanidtxManagerclassorg.springframework.jdbc.datasource.DataSourceTransactionManagerpropertynamedataSourcerefdataSource//bean!-- other bean/ definitions here --/beans159、选择使用Spring框架的原因Spring框架为企业级开发带来的好处有哪些答可以从以下几个方面作答非侵入式支持基于POJO的编程模式不强制性的要求实现Spring框架中的接口或继承Spring框架中的类。IoC容器IoC容器帮助应用程序管理对象以及对象之间的依赖关系对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器程序员再也不需要自己编写工厂、单例这一点特别符合Spring的精神不要重复的发明轮子。AOP面向切面编程将所有的横切关注功能封装到切面aspect中通过配置的方式将横切关注功能动态添加到目标代码上进一步实现了业务逻辑和系统服务之间的分离。另一方面有了AOP程序员可以省去很多自己写代理类的工作。MVCSpring的MVC框架是非常优秀的从各个方面都可以甩Struts 2几条街为Web表示层提供了更好的解决方案。事务管理Spring以宽广的胸怀接纳多种持久层技术并且为其提供了声明式的事务管理在不需要任何一行代码的情况下就能够完成事务管理。其他选择Spring框架的原因还远不止于此Spring为Java企业级开发提供了一站式选择你可以在需要的时候使用它的部分和全部更重要的是你甚至可以在感觉不到Spring存在的情况下在你的项目中使用Spring提供的各种优秀的功能。160、Spring IoC容器配置Bean的方式答基于XML文件进行配置。基于注解进行配置。基于Java程序进行配置Spring 3。packagecom.jackfrued.bean;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;ComponentpublicclassPerson{privateStringname;privateintage;AutowiredprivateCarcar;publicPerson(Stringname,intage){this.namename;this.ageage;}publicvoidsetCar(Carcar){this.carcar;}OverridepublicStringtoString(){returnPerson [namename, ageage, carcar];}}packagecom.jackfrued.bean;importorg.springframework.stereotype.Component;ComponentpublicclassCar{privateStringbrand;privateintmaxSpeed;publicCar(Stringbrand,intmaxSpeed){this.brandbrand;this.maxSpeedmaxSpeed;}OverridepublicStringtoString(){returnCar [brandbrand, maxSpeedmaxSpeed];}}packagecom.jackfrued.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importcom.jackfrued.bean.Car;importcom.jackfrued.bean.Person;ConfigurationpublicclassAppConfig{BeanpublicCarcar(){returnnewCar(Benz,320);}BeanpublicPersonperson(){returnnewPerson(骆昊,34);}}packagecom.jackfrued.test;importorg.springframework.context.ConfigurableApplicationContext;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;importcom.jackfrued.bean.Person;importcom.jackfrued.config.AppConfig;classTest{publicstaticvoidmain(String[]args){// TWR (Java 7)try(ConfigurableApplicationContextfactorynewAnnotationConfigApplicationContext(AppConfig.class)){Personpersonfactory.getBean(Person.class);System.out.println(person);}}}下面是三种配置方式的对比帮助理解各自的适用场景与优缺点配置方式配置示例适用场景优点缺点基于XML配置bean idperson classcom.jackfrued.bean.Person早期Spring项目、需要集中管理大量Bean、对代码零侵入的遗留系统集中管理、与代码完全解耦、便于统一维护和替换实现配置冗长、可读性差、类型安全弱、修改需重启基于注解配置ComponentAutowired现代Spring Boot项目、团队协作开发、追求开发效率简洁直观、类型安全、就近声明、开发效率高依赖关系分散在代码中、Bean扫描范围需注意、调试时不易全局查看基于Java配置ConfigurationBean需要动态创建Bean、复杂条件装配、无XML的纯Java项目类型安全、支持复杂逻辑、可编程化装配、IDE友好配置与代码耦合、Bean较多时代码量增加如何选择新项目优先推荐注解配置配合Spring Boot的自动装配开发效率最高。需要动态或条件装配使用Java配置可以在Bean方法中编写判断逻辑灵活创建Bean。遗留系统或需要集中管理使用XML配置便于在不改动代码的情况下调整Bean定义。实际开发中三种方式可以混合使用例如用注解声明组件、用Java配置组装复杂依赖、用XML管理第三方库的Bean各取所长。
返回列表