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 通过对象关系操作数据库 单表操作,比较高效,多表查询支持不好

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值