Java面试常见问题整理(SSM框架阶段 附答案)

1、Spring 是如何管理事务的,事务管理机制?以及隔离级别?

        1. ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;
        2. ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事 务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);
        3. ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其 他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;
        4. ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数 据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交 的数据(会造成幻读),MySQL 的默认级别;
        5. ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别, 该隔离级别能防止脏读、不可重复读、幻读。
        脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务 尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
        不可重复读 :是指在一个事务内,多次读同一数据。
        幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一 次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好 像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一 个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录 就变多或者变少了。

2、Spring AOP的实现原理?

  一、 SpringAOP的面向切面编程,是面向对象编程的一种补充,用于处理系统中分布的各个模块的横切关注点,比如说事务管理、日志、缓存等。它是使用动态代理实现的,在内存中临时为增强某个方法生成一个AOP对象,这个对象包含目标对象的所有方法,在特定的切入点做了增强处理,并回调原来的方法。

二、核心:

SpringAOP的动态代理主要由两种方式实现,JDK动态代理和cglib动态代理。JDK动态代理通过反射来接收代理的类,但是被代理的类必须实现接口,核心是InvocationHandler和Proxy类,cglib动态代理的类一般是没有实现接口的类,cglib事一个代码生成类库,可以在运行时动态生成某个类的子类,所以,cglib事通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它事无法使用cglib做动态代理的

AOP能做什么?

    降低模块之间的耦合度
    使系统容易扩展
    避免修改业务代码,避免引入重复代码,更好的代码服用
 

3、IOC和DI是什么?

   IOC(控制反转):全称为:Inverse of Control。从字面上理解就是控制反转了,将对在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。

  DI(依赖注入):全称为Dependency Injection,意思自身对象中的内置对象是通过注入的方式进行创建。

     那么IOCDI这两者又是什么关系呢?

  IOC就是一种软件设计思想,DI是这种软件设计思想的一个实现。而Spring中的核心机制就是DI。

4、Spring 中用到了那些设计模式?

简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由...

工厂方法模式 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工...

单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFac...

适配器模式 在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。

5、Spring中Bean的作用域有哪些?

1、singleton:单例,默认的作用域

2、prototype:原型,每次使用(注入或调用getBean()方法都会new一个新的对象,一旦被使用或者注入,spring就不再只有Bean的引用,清楚bean并释放资源是调用者的职责;

3、request:请求作用域,针对每一次HTTP请求都会产生一个新的bean,仅适用于WebApplicationContext环境

4、session:会话作用域,每次一次新的会话都会产生一个新的对象

5、globalSession:global session为整个HTTP请求中,在作用域方面就是application;

它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么,web会自动当成session类型来使用。


6、spring框架实现实例化和依赖注入的方式分别是什么?

(1)Spring框架实现实例化的三种方式:

第一种:使用构造器实现Bean的实例化
SpringIOC容器既能使用默认空参构造器也能使用有参数的构造器创建bean
第二种;使用静态工厂方式创建Bean实例化对象
使用这种方式除了指定必须的class属性,还要指定factory-method 属性来指定实例化Bean的方法个,该方法必须是静态方法。而且使用静态工厂方法也允许指定方法参数,spring IoC 容器将调用此属性指定的方法来获取Bean。
第三种:使用实例化工厂的方式创建Bena实例化对象
使用这种方式不能指定class 属性,此时必须使用factory-bean属性来指定工厂Bean的id, factory- method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样。
(2)依赖注入方式:

依赖注入是Spring 协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性。
1)基于构造函数注入
构造函数注入就是通过Bean类的构造方法,将Bean 所依赖的对象注入。构造函数的参数一般情况 下就是依赖项,spring 容器会根据bean 中指定的构造函数参数来决定调用那个构造。
2)基于set方法注入
将Bean 所依赖的对象通过设置函数注入,Bean 需要为注入的依赖对象提供设置方法。
3)基于自动装配注入
Spring I0C容器会基于反射查看Bean定义的类。当Spring 容器发现Bean被设置为自动装配的by Type 模式后,它会根据参数类型在Spring 容器中查找与参数类型相同的被依赖Bean对象,如果已经创建,则会把被依赖的对象自动注入到Bean中,如果没有创建,则不会注入。注入过程需要借助Bean 提供的设置方法来完成,否则注入失败。
4)基于注解的依赖注入
Spring主要提供了@Autowired和@Resource注解模式,下面也重点讨论这两种注解模式。
@Autowi red装配顺序
@Autowired默认按类型装配(这个注解是属于spring 的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required 属性为false, 如: @Autowired (required=false),如果我们I想使用名称装配可以结合@Qualifier注解进行使用。
@Resource装配顺序
1.如果同时指定了name和type,则从Spring.上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一 bean进行装配,找不到或者找到多个,都会抛出异常
4.如果既没有指定name,又没有指定type,则自动按照byName.方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配
 

7、SpringMVC的工作流程?

. 说一下 spring mvc 运行流程?

  • spring mvc 先将请求发送给 DispatcherServlet。
  • DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
  • DispatcherServlet 再把请求提交到对应的 Controller。
  • Controller 进行业务逻辑处理后,会返回一个ModelAndView。
  • Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
  • 视图对象负责渲染返回给客户端。

请求处理的流程

        1.首先用户发送请求-------->前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;

        2.页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);

        3.前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;

        4.前端控制器再次收回控制权,将响应返回给用户,至此整个结束.

8、spring以及springMVC常用注解有哪些?

 9、简单介绍下springMVC和struts2的区别有哪些?

struts2和springMVC的区别

1、springmvc入口是一个servlet前端控制器( DispatcherServlet ),struts2入口是一个filter过滤器(StrutsPrepareAndExecuteFilter).

2、struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action.

springmvc通过在coontroller方法中定义形参接收参数,springmvc可以使用单例模式管理controller.

3、springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行 映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method).

struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法.

开发中建议使用springmvc,springmvc方法更类似service业务方法.

4、struts2采用值栈存储请求和相应的数据,通过OGNL存取数据;springmvc通过参数绑定期将request请求内容解析,并给方法形参赋值.

5、struts2和springmvc的速度是相当的,由于struts2的漏洞较多,跟多企业使用springmvc

6、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

7、设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

8、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

10、springmvc前端控制器是什么?处理器映射器是什么?

前端控制器DispatcherServlet,处理器映射器HandlerMapping

DispatchServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其他组件用户的请求,DispatcherServlet的存在降低了组件之间的耦合性

HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等

Handler:处理器

handler是继DispatcherServlet前端控制器的后端控制器,在DispathcerServlet的控制下Handler对具体的用户请求进行处理,由于handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler

HandlerAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

ViewResolver视图解析器

ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成view视图对象,最后对view进行渲染将处理结果通过页面展示给用户

View:视图

SpringMVC框架提供了很多的view视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需要开发具体的页面

11、springmvc如何进行参数绑定

1、参数绑定过程

springmvc参数绑定过程 – 从客户端请求key/value数据,经过参数绑定,将 key/value数据绑定到controller方法的形参上。 – springmvc中,接收页面提交的数据是通过方法形参来接收 ,而不是在controller类定义成员变量接收。
 

12、springmvc获取表单数据的几种方式?

(1)直接把表单的参数写在Controller相应的方法的形参中

(2)使用HttpServletRequest接收

(3)通过一个bean接收

(4)JSON数据接收

13、SSM架构的整合流程是怎样的?

14、mybatis和hibernate之间的优缺点比较?

1、Hibernate和Mybatis都属于ORM框架,

2、映射声明区别

        Hibernate的映射关系是通过xml文件声明;

        Mybatis是通过typeHandlers(类型转换器)来完成的;(类字段和表字段的转换), 隐式转换,如果转换不成功则需要显式声明转换

3、sql执行比较

Hibernate采用HQL执行sql,这种类型的sql针对数据库,使用哪种数据库时由数据库操作引擎转换成哪种数据库的sql(有性能消耗)--(代码迁移时)数据库的兼容性好;

Mybatis采用接口声明+xml文件的形式, 优点:执行速度快

4、使用场景

        Hibernate主要应用于企业开发;

        Mybatis主要应用于互联网开发;--性能好

5、Hibernate的懒加载与inner join fetch模式,大量减少dto数据;


15MyBatis中使用#和$书写占位符有什么区别?

#{}和${}的区别

        

        1、#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。

        

        2、变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’

        3、#{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL注入

16、MyBatis中的动态SQL是什么意思?

mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误。Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率

17、Mybatis中Mapper动态代理规范是什么?

开发规范

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
 

18、mybatis的执行流程是什么?

整个sql执行流程可以分为两大步骤:

  • 一、寻找sql

  • 二、执行sql语句

19、说说你比较熟悉的设计模式及应用场景?

1. slf4j: 门面模式
2. restTemplate : 模版方法模式
3. ribbon : 负载均衡(策略模式)
4. IOC:  单例模式 (饿汉,懒汉,登记)   
5. ***Adapter: 适配器模式
6. ***pool: 享元模式 思想
7. aop:  代理模式(正向反向)
8. interceptor:  责任链模式

20、动态代理 的2种方式以及区别?

JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。
 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是游戏数据策划常见面试问题答案: 1. 什么是游戏数据策划? 游戏数据策划是游戏开发中的一个职位,负责设计并管理游戏中的各种数据,包括但不限于数值、物品、角色、任务等。 2. 你认为数据策划在游戏开发中的作用是什么? 数据策划在游戏开发中的作用非常重要,因为游戏中的数据直接影响到游戏的玩法、难度、平衡性、奖励等方面。一个好的数据策划可以使游戏更加有趣、流畅和有挑战性。 3. 你在之前的项目中有哪些数据策划的经验? 我曾经参与了一个角色扮演游戏的开发,负责设计角色属性、技能、装备和任务等方面的数据。通过不断的测试和调整,我最终成功地设计出了一个具有平衡性、趣味性和可玩性的游戏数据。 4. 如何确定游戏中的数值平衡性? 确定游戏中的数值平衡性需要进行大量的测试和数据分析。我们可以通过观察玩家的反馈和游戏数据的变化来确定游戏中的数值平衡性,例如游戏中的经济系统、角色属性、装备等。 5. 如何设计一个好的游戏经济系统? 一个好的游戏经济系统应该具有稳定性、趣味性和可控性。我们可以通过设定货币系统、商店系统、掉落系统等来控制游戏中的经济流通,同时也要考虑玩家的需求和反馈,使经济系统更加平衡和有趣。 6. 对于玩家反馈不佳的问题,你会怎么处理? 当玩家反馈不佳的问题出现时,我会尽快进行数据分析和测试,找出问题所在,并尝试进行改善。同时,我也会与其他开发人员进行沟通和讨论,以便更好地解决问题。 7. 你认为数据策划在团队中的角色是什么? 数据策划在团队中扮演着非常重要的角色。他们需要与其他开发人员进行紧密的沟通和协作,以确保游戏数据的准确性和合理性。同时,他们还需要与玩家进行交流,以了解他们的反馈和需求,从而不断完善游戏体验。 8. 最后,请谈谈你对游戏数据策划这个职业的看法? 我认为游戏数据策划是一个非常有挑战性和有意义的职业。通过设计和管理游戏数据,我们可以为玩家提供更好的游戏体验,并且可以与其他开发人员一起创造出令人兴奋的游戏世界。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周学Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值