java面试框架篇

SpringMVC

SpringMVC生命周期/运行原理/执行流程/流转

Spring MVC在项目中充当着控制层,也就是MVC模式中C,主要是用来接收请求和处理请求,它是spring中web模块里的一个小组件。客户端请求提交到DispatcherServlet,由DispatcherServlet控制器查询处理器映射器(HandlerMapping),找到并分发到指定的Controller中。Controller调用业务逻辑处理后,返回ModelAndView,DispatcherServlet查询到视图解析器(ViewResoler),找到ModelAndView指定的视图,视图负责将结果显示到客户端

SpringMVC常用注解

注解用的挺多的,声明处理器的@Controller,映射url路径的@RequestMapping,还有比较常用的@GetMapping,@PostMapping、@PutMapping、@DeleteMapping、@RequestBody、@RequestParam,@ResponseBody、@PathVariable,@Autowired,@RestController,

Spring MVC和struts2区别

1.spring mvc 单例 非线程安全,struts2 多例 线程安全 对每个请求都产生一个实例
2.spring mvc的入口是servlet,而struts2是filter,前端控制器也不一样
3. 参数传递:struts2通过全局属性接收参数,说明参数是被多个方法共享的,springmvc 用方法来接受参数
4.spring mvc是基于方法的设计,而sturts是基于类

Spring概述

总:

容器
核心IOC AOP Aop是IOC一个扩展点
生态

IOC控制反转,是基于工厂模式的,原本需要自己实例化的对象(也就是new),全部交由spring容器去控制了,这就是控制反转。
DI 依赖注入,把对应属性的值注入到对象中,@Autworid PopulateBean 完成属性值得注入
容器 存储对象,采用map结构来存储,在spring中存在三级缓存,singletonObjects存放完整对象 ,整个bean的生命周期,从创建和销毁全部由spring容器管理(bean的生命周期)

分:

1、一般聊ioc容器的时候要涉及到容器的创建过程(beanFactory,DefaultListableBeanFactory),向bean工厂中设置一些参数(BeanPostProcessor,Aware接口的子类)等等属性

2、加载解析bean对象,准备要创建的bean对象的定义对象beanDefinition,(xml或者注解的解析过程)

3、beanFactoryPostProcessor的处理,此处是扩展点,PlaceHolderConfigurSupport,ConfigurationClassPostProcessor

4、BeanPostProcessor的注册功能,方便后续对bean对象完成具体的扩展功能

5、通过反射的方式讲BeanDefinition对象实例化成具体的bean对象,

6、bean对象的初始化过程(填充属性,调用aware子类的方法,调用BeanPostProcessor前置处理方法,调用init-mehtod方法,调用BeanPostProcessor的后置处理方法)

7、生成完整的bean对象,通过getBean方法可以直接获取

8、销毁过程

面试官,这是我对ioc的整体理解,包含了一些详细的处理过程,您看一下有什么问题,可以指点我一下(允许你把整个流程说完)

老师,我没看过源码怎么办?
​ 具体的细节我记不太清了,但是spring中的bean都是通过反射的方式生成的,同时其中包含了很多的扩展点,比如最常用的对BeanFactory的扩展,对bean的扩展(对占位符的处理),我们在公司对这方面的使用是比较多的,除此之外,ioc中最核心的也就是填充具体bean的属性,和生命周期(背一下)。

@Autowired 和 @Resource

@Autowired和@Resource都是属性注入的一个注解
@Autowired是spring里的注解,默认根据类型来注入(也可以根据名称来注入,但需要配合@Qualifier注解来注入)
@Resource是 jdk里的注解,默认根据名称来注入(找不到名称时会根据类型来注入)

Spring依赖注入的四种方式

1、构造器注入
2、setter 方法 注入
3、静态工厂注入:就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过“工程类静态方法”来获取对象,而是依然通过spring注入的形式获取。
4、实例工厂注入:获取对象实例的方法不是静态的,所以你需要首先new工厂类,在调用普通的实例方法。

AOP面向切面的编程

AOP主要是将与程序业务无关的内容分离提取, 应用程序也就是咱们本身的方法只实现它们应该做的,也就是只完成业务逻辑。我们用的AOP主要来做一些性能检测,访问控制,日志管理和事务处理这些事情
它默认使用JDK动态代理来创建AOP代理,这样就可以为任何接口创建代理了,当需要代理类不是代理接口的时候,Spring会切换为使用CGlib代理,也可强制使用CGlib,也就是说JDK的动态代理必须要有接口的支持,而cglib不需要,它是基于类的。
代理模式分为
静态代理:一个接口,分别有一个真实实现和一个代理实现。
动态代理:通过代理类的代理,接口和实现类之间可以不直接发生联系,而 可以在运行期(Runtime)实现动态关联。

Spring AOP配置事务:

在spring的配置文件里通过aop:config里面先设定一个表达式,设定对service里那些方法 如:对add* ,delete*,update*等开头的方法进行事务拦截。我们需要配置事务的传播(propagation=“REQUIRED”)特性,通常把增,删,改以外的操作需要配置成只读事务(read-only=“true”).只读事务可以提高性能。之后引入tx:advice,在tx:advice引用 transactionManager(事务管理),在事务管理里再引入sessionFactory,sessionFactory注入 dataSource,最后通过aop:config 引入txAdvice。

Spring事物的传播特性与隔离级别

spring中事务的传播特性好像有7个左右,
我做项目的时候使用最多的就是PROPAGATION_REQUIRED,
它所代表的意思支持当前事务,如果当前没有事务,就新建一个事务。

spring中事务的隔离级别有5个,默认使用的是ISOLATION_DEFAULT,
它代表使用数据库默认的事务隔离级别,也是我们项目中最常使用的。(隔离级别可参照数据库隔离级别)

propagation:
REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与 REQUIRED类似的操作。

Spring用到了那些设计模式

1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了;
2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationContext实现中也都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.策略模式,第一个地方,加载资源文件的方式,使用了不同的方法,比如:ClassPathResourece,FileSystemResource,ServletContextResource,UrlResource但他们都有共同的接口Resource;第二个地方就是在Aop的实现中,采用了两种不同的方式,JDK动态代理和CGLIB代理;
5.单例模式,这个比如在创建bean的时候。

Spring Bean的作用域

当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的创建,还可以为Bean指定特定的作用域。
scope:
1、singleton(默认):单例模式,在整个Spring容器中只会产生一个实例。容器负责跟踪Bean实例状态,并维护Bean的生命周期。
2、prototype:原型模式,每次通过容器获取bean都是一个新实例。容器只负责创建实例,不进行跟踪和维护。
(实例的创建和销毁都会导致系统开销增加,非必须情况下都使用singleton)
(单例和原型模式测试参考Spring_IOC_demo02 TestBeanSingleton和TestBeanPrototype)
3、request:每次请求都会生成一个新实例(WEB应用)。
4、session:每个Session都将产生一个新实例(WEB应用)。
5、global session:每个全局的HTTPSession对应一个Bean实例,仅在portlet Context的时候才有效(WEB应用)。

Spring bean 的声明周期/spring创建bean 的过程

只是简单了解到spring为了仅可能的把自己内部的东西机制暴露出来给用户使用,用过所谓的“processor”暴露出来,然后处理器有自己的顺序,然后注册到spring容器中,spring启动,查找并加载需要被spring管理的bean,进行bean实例,实例化一个bean,也就是我们经常说的new。按照spring上下文路径的bean进行配置,也就是ioc注入。通过bean实现不通过接口,spring容器将会调用接口中的方法,一个bean会实现spring中不同接口做不同的事情,等bean把实现的东西做完之后,当bean不再需要是,会经过清理阶段,
如果bean实现diposableBean这个接口,会调用那个其实现的destroy()方法,最后,这个bean的spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

Spring Beanfactory与factorybean的区别

Beanfactory,以factory结尾,表示它是一个工厂类(接口),用于管理bean的一个工厂。在spring中beanfactory是ioc容器的核心接口,它的指责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖

Factorybean 以bean结尾,表示他是一个bean,不同于普通的bean的是:他是实现了factorybean接口的bean,根据bean的id从beanfactory中获取的实际上是factorybean的getObject()返回的对象

hibernate

hibernate如何操作数据库

首先呢先加载hibernate配置cfg.xml和解析hbm.xml映射文件还有初始化咱们的sessionFactory,然后由sessionFactory生产会话就是咱们的session,然后打开session,开启事务transaction,(不过咱们查询的时候是不需要开启事务的)执行相关增删改查(CRUD)后,提交或回滚事务,最后就是关闭资源。

Hibernate五大核心(类/接口)简述

1 .Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。并创建一个SessionFactory对象。
2 .SessionFactory接口,负责初始化Hibernate。它充当数据存储源的代理,创建Session对象。SessionFactory是线程安全的。
3 .Session接口,Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection
4 .Query与Criteria接口,总之Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语句或SQL 语句两种表达方式。
5 .Transaction接口,Transaction(事务)接口是一个可选的API。负责操作相关的事务。

Hibernate中的两大配置文件

.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。
Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含
.hbm.xml内容,映射文件,也可以配事务。

Hibernate事务处理

开启事务 session.beginTransaction(); 执行相关的操作,如果成功则session.getTransaction().commit();
执行操作失败则 session.getTransaction.rollback();
Hibernate的三种状态以及状态的转换
Transient(临时), new 一个初始化对象后,并没有在数据库里保存数据,处于临时状态;
Persistent(持久化),当执行save()方法,调用session.close()方法之前,内存中的对象与数据库有对应关系处于持久化状态;
Detached(脱管/游离) 当执行session.close()之后,处于脱管状态;
状态的转换
处于托管状态下,调用update()方法后,转换为持久化状态;
在持久化状态下,执行delete()方法后,转换为临时状态;
在未初始化对象之前,调用get(),load(),find(),iterate()之后,直接进入持久化状态。

Hibernate缓存

hibernate分为一级缓存即session缓存也叫事务级别的缓存,二级缓存sessionFactory即应用级别的缓存
一级缓存的生命周期和session的生命周期保持一致,默认开启一级缓存,不能关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。
二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存,插件如ehcache(一卡吃),oscache等。二级缓存也只能缓存对象。

延迟加载

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。
Hibernate 中get 和 load的区别
加载方式:
    load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才发出sql语句);
    get为立即加载(执行时,会立即向数据库发出sql语句)
返回结果:
    load检索不到记录时,会抛异常(ObjectNotFoundException)
    get检索不到记录时,会返回null

Mybatis

Mybatis在我们框架中充当着持久层也就是dao层,我们用它来进行操作数据库,在项目中我们将spring与mybatis进行整合,从而更简单的使用mybatis

resultMap与resultType

resultMap和resultType都是指定返回数据类型,可以返回Map String 基本数据类型 pojo List,他们二者之间resultType属于自动映射, resultMap属于手动映射,自动映射就是数据库的列名与对象中的属性名保持一致就可以使用resultType自动赋值映射,而手动映射就是数据库列名与对象中的属性名不一致而需要使用手动映射,手动映射需配合标签来进行映射,一般情况下我们在sql语句中使用别名或者使用驼峰命名与数据库自动映射,这种就可以使用resultType了

$ 与# 的区别

$ 字符串拼接   传递什么参数就会直接赋值什么参数   会导致sql注入的问题

占位符,传递什么参数就会将这个参数加上引号看做为字符串处理,不会导致sql注入的问题,比较常用

Mybatis如何操作数据库

通过配置信息(SqlMapConfig.xml文件和mapper.xml文件即sql映射文件)构造SqlSessionFactory即会话工厂,由会话工厂创建sqlSession即会话,然后通过dao层接口输入参数到mapper.xml映射文件中的sql中拼接,并执行相关的CRUD,执行完毕后输出结果映射至java对象中。

Hibernate、mybatis、JDBC区别

三者均是持久层框架,hibernate和mybatis都是封装的jdbc,使用起来更方便,先说一下jdbc,最原始的持久层框架,jdbc呢,开发起来比较繁琐,代码量较大,不易维护,所有代码比如连接,模版,sql语句等一系列都需要我们自己手动来写,所以开发效率低,也正是因为这一点,所有东西都掌握在自己手里,自然而然执行效率是比较快的,其余两者hibernate与mybatis,hibernate是属于高精度封装的,封装的太完全了,导致咱们写代码只需要点吧点吧就已经完成了咱们的增删该查的操作,开发效率是质的提高,也是这个原因,封装的太狠了,导致咱们自己对sql语句的控制能力一点都没有,一些复杂的sql语句在进行执行的时候是由hibernate进行编译执行,会有效率问题,所以在执行效率上一些复杂的sql语句会存在性能问题,而针对于mybatis呢,我觉得是基于他两者之间的,通俗来说是该封装的封装了,不该封装的全部交给咱们自己了,比如数据库连接封装起来,sql语句需要自己来写,所以从开发上还是效率上都是比较不错的,也正是因为这一点对sql控制力较大,目前互联网项目几乎持久层都在使用mybatis,而hibernate一般用在一些内部项目(公司内部员工使用的项目),这就是我简单的对着三个框架的理解。

各个框架的作用

SpringMVC是充当控制层,主要用来接收请求和处理请求的,spring充当了管理容器的角色,将框架中所有的对象全部放到该容器中,Mybatis充当着持久层,主要是用来操作数据库的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值