Java开发框架和中间件面试题(8)

目录

82.Mybatis一级缓存,二级缓存?

83.Mybatis如何防止SQL注入?

84.mybatis中resultType和resultMap有什么区别?

85.如何在SpringBoot中禁用Actuator断点安全性?

86.什么是SpringBoot?SpringBoot有哪些优点?

87.SpringBoot中的监视器是什么?

88.什么是yaml文件?

89.如何使用SpringBoot实现异常处理? 

90.SpringBoot中有哪些常用注解?

91.SpringBoot中有哪些选择器类?

92.SpringBoot中缓存相关的注解有哪些?

93.Springboot如何进行打包和部署?

94.SpringBoot如何访问不同数据库?

95.为什么要使用hibernate?

96.hibernate中如何在控制台查看打印的SQL语句?

97.hibernate有几种查询方式?

98.hibernate实体类可以被绑定为final吗?

99.在hibernate中使用integer和int做映射有什么区别?

100.如何搭建一个高可用的系统?

101.你认为项目中最重要的过程是哪些?


82.Mybatis一级缓存,二级缓存?

1.一级缓存:指的是Mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入sqlSession中,再次查询的时候,先去sqlSession中查询,有的话直接拿出来,当sqlSession消失时,Mybatis的一级缓存也就消失了,当调用sqlSession的修改,添加,删除,commit(),close()等方法时,会清空一级缓存。

2.二级缓存:指的是Mybatis中的sqlSessionFactory对象的缓存,由同一个sqlSessionFactory对象创建的sqlSession共享其缓存,但是其中缓存的是数据而不是对象。当命中二级缓存时,通过存储的数据构造成对象返回。查询数据的时候,查询的流程是二级缓存>一级缓存>数据库。

3.二级缓存执行时机,如果开启了二级缓存,sqlSession进行close()后,才会把sqlSession一级缓存中数据添加到二级缓存中,为了将缓存数据取出来执行反序列化,还需要将要缓存的pojo实现Serializable接口,因为二级缓存数据存储介质多种多样,不一定只存在内存中,也可能存在硬盘中。

4.Mybatis执行步骤,Mybatis框架主要是围绕SqlSessionFactory进行的,具体步骤:

   定义一个configuration对象,其中包含数据源,事务,mapper文件资源以及影响数据库行为属性设置settings.

   通过配置对象,则可以创建一个sqlSessionFactoryBuilder对象

   通过sqlSessionFactoryBuilder获得sqlSessionFactory实例。

   通过sqlSessionFactory实例创建sqlSession实例,通过SqlSession对数据库进行操作。

83.Mybatis如何防止SQL注入?

   注意:但凡是sql注入漏洞的程序,都是因为程序要结束来自客户端用户输入的变量或者URL传递的参数,并且这个变量或者参数组成sql语句的一部分。对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的【外部数据不可信任】的原则。纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的。所以自然能想到,就是变量的检测,过滤,验证下手,确保变量是开发者所预想的。

1.检查变量数据类型和格式,数据类型检查,SQL执行前,要进行数据类型检查,如果是邮箱,参数就必须是邮箱的格式,如果是日期,就必须是日期格式;

  只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式检查,确保变量是我们预想的格式,这样子很大程度上可以避免SQL注入攻击。如果上述例子中ID是int型的,效果会怎么样呢?无法注入,因为输入注入参数会失败。比如上述中的name字段,我们应该在用户注册的时候,就确定一个用户名规则,比如5~20个字符,只能由大小写字母,数字以及汉字组成,不包含特殊字符。此时我们应该有一个函数来完成统一的用户名检查。不过,仍然有很多场景并不能用到这个方法,比如写博客,评论系统,弹幕系统,必须允许用户可以提交任意形式的字符才行,否则用户体验感太差了。

2.过滤特殊符号

3.绑定变量,使用预编译语句

84.mybatis中resultType和resultMap有什么区别?

     1.resultType是直接表示返回类型的(对应着我们的Model对象中的实体)

     2.resultMap则是对外部ResultMap的引用(提前定义了db和Model之间的映射key,value关系),但是resultType跟resultMap不能同时存在。

85.如何在SpringBoot中禁用Actuator断点安全性?

    默认情况下,所有敏感的HTTP端点都是安全的,只有具有Actuator角色的用户才能访问他们。安全性是使用标准的HTTPServletRequest.isUserInRole方法实施的。

   我们可以使用managerment.security.enable=false来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

86.什么是SpringBoot?SpringBoot有哪些优点?

    1.SpringBoot简介

    基于Spring4.x的设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,引用的不稳定性得到了解决。

  2.SpringBoot有哪些优点?

   快速构建项目,可以选择一些必要的组件;

   对主流框架的无配置集成;

   内嵌Tomcat容器,项目可独立运行;

   删除了繁琐的xml配置文件;

  极大地提高了开发和部署效率;

  提供starter,简化Maven配置;

3.SpringBoot有哪些缺点?

版本迭代速度快,一些模块改动很大;

由于无需配置,报错时很难定位。

87.SpringBoot中的监视器是什么?

    监视器也叫listener,是servlet的监听器,可以用于监听Web应用程序中某些对象的创建,销毁增加,修改,删除等动作的发生,然后做出相应的响应处理。当范围对象的状态发生改变时,服务器自动调用监听器对象中的方法,常用于系统加载时进行信息初始化,统计在线人数和在线用户,统计网站的访问量。配置监听器的方法:

    通过@Component把监听器加入Spring容器中管理;

    在application.properties中添加context.listener.class配置

    在方法上加上@EventListener注解

88.什么是yaml文件?

 yaml是JSON的一个超集,可以非常方便的将外部配置以层次结构形式存储起来。yaml可以作为properties配置文件的替代。

yaml使用的注意事项:

 在properties文件中是以“."进行分割的,在yml中是用"."进行分割的;

 yml的数据格式和json的格式很像,都是KV格式,并且通过":"进行赋值;

 每个冒号后面一定要加一个空格;

89.如何使用SpringBoot实现异常处理? 

     1.使用@ExceptionHandler注解处理局部异常,该方式只能处理当前Controller中的ArithmeticException和NullPointerException异常,缺点就是只能处理单个controller的异常。

   2.使用@ControllerAdvice+@ExceptionHandler注解处理全局异常

   3.配置SimpleMappingExceptionResolver类处理异常

   4.实现HandlerExceptionResolver接口处理异常

90.SpringBoot中有哪些常用注解?

 1.@SpringBootApplication替代@SPringBootConfiguration,@EnableAutoConfiguration,@ComponentScan

2.@ImportAutoConfiguration导入配置类,一般做测试的时候用,正常优先使用@EnableAutoConfiguration.

3.@SpringBootConfiguration 替代@Configuration

4.@ImportResource将资源导入容器

5.@PropertySource导入properties文件

6.PropertySource   @PropertySource的集合

7.@Role Bean 角色定义为ROLE APPLICATION(默认值),ROLE SUPPORT(辅助角色),ROLE INFRASTRUCTURE(后台角色,用户无感)

8.@scope 指定bean的作用域,默认singleton,其他包括prototype,request,session,globalSession。

9.@Lazy使bean懒加载,取消bean与初始化。

10.@Primary自动装配时出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。

11.@Profile指定Bean在哪个环境下被激活

12.@DependsOn依赖的bean注册完成,才注册当前类,依赖bean不存在会报错。用于控制bean加载顺序。

13.@PostConstruct  bean的属性都注入完毕后,执行注解标注的方式进行初始化工作

14.@Autowired默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。

15.@Lookup根据方法返回的类型,去容器中捞出对应

16.@Qualifier申明bean名字,且可以按bean名字加载bean。

17.@Required检查bean的属性setXXX()方法,要求属性在配置阶段必须已经配置。

18.@Description添加bean的文字描述。

19.@EnableAspectConfiguration启动AspectJ自动配置

20.EnableLoadTimeWeaving启动类加载器动态增强功能,使用instrucmentation实现

21.@AutoConfigurationPackage包含该注解的package会被AutoConfigurationPackages注册

22.@AutoConfigureBefore在指定配置类初始化前加载

23.@AutoConfigureAfter在指定配置类初始化后加载

24.AutoConfigureOrder指定配置类初始化顺序,越小初始化越早。

25.@ModelAttribute   注解可以被应用到方法上和方法参数上。

91.SpringBoot中有哪些选择器类?

    常用的选择器如下:

@Conditional,当指定的条件都满足时,组件才被注册

@ConditionalOnBean,指定bean在上下文中时,才注册当前bean。用在方法上,则默认依赖类为方法的返回类型。

@ConditionalOnClass,指定类在classpath上时,才初始化当前bean。用在方法上,则默认依赖类为方法的返回类型。

@ConditionalOnCloudPlateform,在指定云平台才注册配置。

@ConditionalOnExpression,指定spel为true时注册配置。

@ConditionalOnJava,在指定Java版本时注册配置;

@ConditionalOnMissingClass,指定类不在classpath上时,才初始化当前bean。用在方法上,则默认依赖类为方法的返回类型。

@ConditionalOnNotWebApplication,不是在Web环境才注册配置。

@ConditionalOnProperty,配置文件中的值与指定值是否相等,相等才注册配置

@ConditionalOnRespurce,指定resources都在classpath上才注册配置。

@ConditionalOnSingleCondidate,上下文中只有一个候选者bean时才注册配置

@ConditionalOnWebApplication,是在Web环境才注册配置。

92.SpringBoot中缓存相关的注解有哪些?

    缓存相关注解如下:

@EnableCaching,开启缓存配置,支持子类代理或者Aspect增强;

@CacheConfig,在一个类下,提供公共缓存配置

@Cacheable,放在方法和类上,缓存方法或者类下所有方法的返回值

@CachePut,每次先执行方法,再将结果放入缓存

@CacheEvict,删除缓存

@Caching,可以配置@Cacheable,@CachePut,@CacheEvict

93.Springboot如何进行打包和部署?

   Spring和SpringBoot都支持Maven和gradle通用打包管理技术。SpringBoot相对Spring的一些优点:

  提供嵌入式容器支持;

 

部署时可以灵活指定配置文件;

最近项目是分布式的项目,都是通过分项目打包部署,然后部署在docker中运行。

94.SpringBoot如何访问不同数据库?

可以使用druidDataSource创建DataSource,然后通过jdbcTemplate执行sql.

95.为什么要使用hibernate?

   hibernate对JDBC进行了封装,简化了JDBC的重复性代码;

  hibernate对dao有一个封装类hibernateTemplate,可以继承他,实现简单的CRUD接口。

  hibernate使用注解和配置文件,可以对实体类和映射文件进行映射;

 hibernate有事务管理机制,保证了数据的安全性;

  hibernate有一级缓存和二级缓存。

96.hibernate中如何在控制台查看打印的SQL语句?

     需要在配置文件中进行如下配置:

  Java开发框架和中间件面试题(8)_第1张图片

97.hibernate有几种查询方式?

 1.导航对象图查询:根据已加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用他的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,hibernate会从数据库中加载关联的Order对象,否则就从缓存中获得Order对象。

 2.OID方式:按照对象的OID来检索对象Session的get()和load()方法提供了这种功能,如果在应用程序先知道了OID,就可以使用这种方式检索对象。get()和Load()的用法完全一样,都需要两个参数,一个是持久化对象类名class,一个是行号OID,返回固定的某一行的数据,但是需要注意的是,当输入的OID不存在时,get()会返回一个空对象,Load()则直接报错。

3.HQL检索方式使用面向对象的HQL查询语言,session的find()方法用于执行HQL查询语句。此外,hibernate还提供了query接口,他是hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。

 它具备以下功能:

    在查询语句中设定各种查询条件

   支持投影查询,即仅检索出对象的部分属性

  支持链接查询

支持分页查询

支持分组查询

支持内置函数

能够调用用户自定义的SQL函数

支持子查询

支持动态绑定参数

4.QBC检索方式:Query By Criteria的API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口。

Java开发框架和中间件面试题(8)_第2张图片

5.利用原生SQL语句进行查询

98.hibernate实体类可以被绑定为final吗?

     可以将hibernate的实体类定义为final,但这种做法不好。

    因为hibernate会使用代理模式在延迟关联的情况下提高性能。如果你把实体类定义成final类之后,因为Java不允许对final类进行扩展,所以hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。

不过,如果你的持久化类实现了一个接口,而且在该接口中声明了所有定义实体类中的所有public的方法的话,就能避免出现前面所说的不利后果。

99.在hibernate中使用integer和int做映射有什么区别?

  hibernate是面向对象的ORM,所以一般定义成封装类型,要看数据库中的定义。

如果数据库中有对应字段存在null值,就要定义integer。也可以定义基本类型,在配置文件中写清楚即可。

100.如何搭建一个高可用的系统?

  高可用系统,就是说要保证系统在几乎任何时候都要有正常运行,功能正常。我们来看下哪些情况会造成系统不可用。

单机系统下的可用性问题,单点问题会影响系统高可用,比如要是这个链路其中一个单点挂了,那么整个系统都不可用了。所以引申出来主备/集群模式,防止单点问题。

高并发场景下,请求过多也会因为后端瓶颈点引起整个系统down掉,所以一般情况下应对高并发场景我们会限流,比如肖战演出抢票。

通过采用mq等队列形式削峰,保证后端系统不会down掉。

熔断机制。容灾机制,多机房部署。

综上所述:

1.主备/集群模式,防止单点故障。

2.限流,削峰,防止后端压力过大。

3.熔断机制,类似于限流。

4.容灾机制,多机房/异地部署。

101.你认为项目中最重要的过程是哪些?

分析,设计阶段,尽量找出进度的优先级。

     

你可能感兴趣的:(面试题,java,中间件,开发语言)