java面试题之框架篇


框架篇 0.框架是什么东西? 框架是一组抽象封装的设计,是一种软件半成品,程序员必须得遵守框架的api, 配置配置文件和遵循代码规范,极高的提高了开发效率. 1.Spring(Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架) 1.1 spring的特性?谈谈你对spring的理解?spring用来干嘛? spring有两大核心: IOC:(通常在项目中手动new创建对象,这不利于对象管理,现在将创建对象的权利反转给spring容器) 依赖注入:spring容器在实例化对象的时候,会根据对象之间的依赖关系,自动完成属性注入 AOP:底层是通过动态代理的机制来实现的,支持jdk和cglib两种。默认通过jdk动态代理。 通常我们在项目当中,一些公共功能的实现可以通过aop来进行解耦和统一实现,比如事务管理、日志、权限等。 我们在项目当中的事务管理是这样配置的 1:声明spring的事务管理器 transactionManager 2:配置一下事务增强的传播特性 tx:advice tx:method 对于增删改开头的方法,使用事务进行管理 对于查询开头的方法,只读模式 3:配置切面,通常我们切面设置在service实现类这一层 pointcut 1.2 jdk的动态代理和cglib动态代理有什么区别? jdk的动态代理要求业务类必须得实现业务接口,底层是通过生成业务接口的动态代理实现类来完成功能增强 cglib不需要业务类实现接口,底层是通过衍生出当前业务类的子类对象来完成功能增强 1.3 你看过spring的源码么?说说aop的源码? 平常看过一些博客,了解一部分spring的源码,spring的ioc有两大核心: 接口beanFactory和applicationContext beanFactory是通过工厂模式来生产(原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等) (BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。) bean,默认生产的是单例bean。 applicationContext(ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承, • MessageSource, 提供国际化的消息访问 • 资源访问,如URL和文件 • 事件传播 • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层; ) 是beanFactory的子接口,增强了BeanFactory的功能。 通常我们都是使用applicationContext,其中ClassPathXmlApplicationContext来初始化IOC容器 1.4 Aop的源码 aop通过设置切面,当切面设置的目标类的方法被调用时,aop框架会拦截 此次调用,我看过pointCut类的源码,里面有两个核心属性,ClassFilter 类过滤器 MethodMatcher 方法匹配器,所以aop来可以进行拦截.拦截之后,aop机制会通过 jdk或cglib帮咱们生成动态代理对象,调用增强类的增强方法,进行功能织入。 1.5 aop的实现原理 首先通过aop配置切面以及切面的增强逻辑,当spring的容器中目标类的对象的方法被调用时,aop框架就会拦截此次调用,aop框架会帮你生成一个动态代理对象,先运行增强类中的前置增强方法,再运行原业务类的业务方法,最后再运行增强类的后置增强方法 注意:aop默认通过jdk提供的proxy来生成动态代理对象,但是也可以手动指定使用cglib来生成动态代理对象 1.6 spring当中bean的作用域有哪些? singleton 单实例 protoTyle 多实例 request 请求结束就销毁 session 会话结束就销毁 globalSession 全局 1.7 spring当中bean的生命周期 bean的创建 依赖注入 功能增强 根据作用域进行销毁 1.8 spring当中的单例,是如何保障它线程安全的? spring是通过ThreadLocal来保障单例线程安全的

  1. Springmvc springmvc是spring旗下的开发mvc的一个模块,底层封装的是servlet

2.1 springmvc的原理?springmvc的工作流程?springmvc的源码你看过吗?(重点) 首先请求到达核心控制器dispatcherServlet,dispatcherServlet会判断请求 后缀是否满足格式要求,如果满足格式要求,会查询handlerMapping,查找 对用的handler,调用handlerAdapter进行参数绑定等适配工作,之后调用具体的 handler进行业务逻辑处理,返回一个modelAndView对象给dispatcherServlet。 dispatcherServlet调用viewResolver进行视图解析渲染,然后返回给客户端

(请求——dispatcherServlet(判断后缀是否满足格式要求)–handlerMapping(查找对应handler)–handerAdapter(参数绑定)–具体handler)

2.2 springmvc的常用注解有哪些?(重点) Controller 只是定义了一个控制器类 requestMapping (用于处理请求地址映射,可以作用于类和方法上。) requestBody 用于读取http请求的内容 通过springMVC提供的HttpMessageConverter接口将读取到的内容转换为json、xml等格式的数据 responseBody (可以将整个返回结果以某种格式返回)返回的结果直接写入 HTTP 响应正文 Pathvariable (用于定义路径参数值–value:参数的名称 –required:定义该传入参数是否必须 默认true) 绑定URL占位符到入参。 RequestParam (用于获取传入参数的值– value:参数的名称–required:定义该传入参数是否必须)

@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。 @Repository 对Dao实现类进行注解 (特殊的@Component) @Service 用于对业务逻辑层进行注解, (特殊的@Component) @Controller 用于控制层注解 , (特殊的@Component) @param 传入多个参数用@Param来绑定参数并命名 @Transactional 对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,则需要添加事务管理机制进行管理 @Override 是伪代码,表示重写 @Autowired 它可以对类成员变量、方法以及构造函数进行标注,完成自动装配的工作

2.3 springmvc的拦截器怎么写? 定义一个类,实现了handlerInterceptor接口,重写 preHandle postHandle afterCompletion 三个方法,之后在springmvc的配置文件当中 使用 mvc:interceptors里面可以配置多个interceptor 2.4 springmvc和struts2有什么区别? springmvc的核心控制器是servlet,struts2的核心过滤器是 strutsPreparedAndExcuteFilter springmvc的handler是单例的存在,面向方法编程的设计, struts2的处理器是多实例,每次请求都会创建一个处理器,oop的设计思想 3.Mybatis mybatis是一个半自动化轻量级的orm框架,程序员可以手写sql语句,使用起来比较灵活 3.1mybatis的二级缓存 mybatis是自动开启一级缓存的,sqlsession级别 mybatis的二级缓存需要手动开启的,mapper级别(application应用), 通常项目当中,对于字典表(大量查询,很少修改)的数据,可以使用mybatis的二级缓存机制, 提高查询效率。比如省市县、汽车品牌、配件类别、企业信息等等 如何使用Mybatis的二级缓存 1:mybatis的核心配置文件当中,需要手动开启二级缓存 2:在指定mapper文件当中,是否启用二级缓存,以及二级缓存的实现类(实现cache接口) 3:如果Mapper启动二级缓存,那么该mapper对应的实体类,必须实现序列化接口 mybatis的二级缓存通常是使用ehcache,但是咱们使用redis来充当二级缓存容器 3.2 mybatis如何主键回填? 在insert标签里面,加入select last_insert_id()标签 3.3 mybatis的mapper代理底层怎么实现? mybatis是先通过xml解析,反射,最后通过动态代理机制来生成mapper接口的实现类对象namespace的值等于mapper接口的类路径、sql标签的id值等于mapper接口的方法名 3.4 mybatis使用了哪些设计模式?你了解过哪些设计模式? mybatis当中 sqlSessionFactoryBuilder 建造者模式 sqlSessionFactory 单例 singleTon sqlSession 工厂模式 beanFactory mapper 动态代理 springaop springmvc handlerAdapter 适配器模式 BufferedReader 装饰者设计模式 思考题:装饰者模式和动态代理有什么区别? 3.5 #{}和${}有什么区别(重点) #{}代表占位符传参,底层是通过preparedStatement来实现的,对sql语句预编译 可以防止sql注入,更安全 ${}代表字符串拼接,不安全

3.6 mybatis的常用sql标签有哪些 动态sql

4.hibernate hibernate是全自动的orm框架,程序员不需要手写sql,通过hql语句来进行 查询以及结果集自动映射。 4.1 hibernate的对象状态 临时状态 持久化状态 托管状态 4.2 hibernate的缓存机制 一级缓存 session级别 二级缓存 sessionFactory级别 4.3 mybatis和hibernate有什么区别? 互联网项目使用Mybatis居多 mybatis手写sql更加灵活,对于复杂查询的支持较好, 企业的办公软件用的比较多 hibernate 通过对象关系操作数据库 单表操作,比较高效,多表查询支持不好

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/290886.html

(0)
上一篇 2022年10月11日 18:01
下一篇 2022年10月11日 18:01

发表回复

登录后才能评论