面试之框架篇

Spring

Spring中的单例bean是线程安全的吗?

不是线程安全的。

Spring框架中有一个@scope的注解,默认的值是singleton,单例的;因为一般在spring的bean中注入的都是无状态的对象,没有线程安全问题,如果在spring的bean中定义了可修改的成员变量,需要考虑线程安全问题,可以使用多例或者加锁来解决。 

 不是线程安全的。当多个用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行该请求对应的业务逻辑,如果处理逻辑有对单例状态的修改,就必须考虑线程同步问题。

spring框架并没有单例bean进行任何多线程封装处理,关于单例bean的安全问题和并发问题需要开发者自己解决。

我们通常在项目中使用的Spring bean都是不可变的状态(比如Service类和Dao类),所以在某种程度上说Spring的单例bean是线程安全的。

如果你的bean有多种状态,就需要自己考虑线程安全,最浅显的解决方案就是将多态bean的作用由"singleton"改为"prototype"。

 Spring中的事务是如何实现的

 spring实现的事务本质就是aop完成,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

Spring中事务失效的场景有哪些 

 第一个,如果方法上有异常捕获处理,自己处理了异常,没有抛出,就会导致事务失效,所以一般处理了异常以后,别忘了抛出去就行了

第二个,如果方法抛出检查异常,如果报错也会导致事务失效,最后在spring事务的注解上,就是@Transactional上配置rollbackFor属性为Exception,这样别管是什么异常,都会回滚事务

第三,我之前还遇到过一个,如果方法上不是public修饰的,也会导致事务失效

Spring 的常见注解有哪些? 

第一类是:声明bean,有@Component、@Service、@Repository、@Controller

第二类是:依赖注入相关的,有@Autowired、@Qualifier、@Resourse

第三类是:设置作用域 @Scope

第四类是:spring配置相关的,比如@Configuration,@ComponentScan 和 @Bean

第五类是:跟aop相关做增强的注解 @Aspect,@Before,@After,@Around,@Pointcut

什么是AOP? 

aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般可以做为公共日志保存,事务处理等 。

SpringMVC常见的注解有哪些? 

 有@RequestMapping:用于映射请求路径;

@RequestBody:注解实现接收http请求的json数据,将json转换为java对象;

@RequestParam:指定请求参数的名称;

@PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数;@ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。@RequestHeader:获取指定的请求头数据,还有像@PostMapping、@GetMapping这些。

 Springboot常见注解有哪些?

 Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 :

  • @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能;
  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
  • @ComponentScan:Spring组件扫描

 

 

 

 

 

SpringBoot

MyBatis 

MyBatis的一级、二级缓存?

 一级缓存:MyBatis的一级缓存是基于PerpetualCache的HashMap本地存储,其作用域是Session,当Session进行flush或close之后,Session中的Cache就将清空,一级缓存默认是打开的。

二级缓存:MyBatis的二级缓存默认是关闭的,需要单独开启,在全局配置文件和映射文件中开启配置。

二级缓存是基于namespace和mapper的作用域起作用的,它不依赖与SQL Session,默认也是PerpetualCache的HashMap存储。 

开启方式:

1.全局配置文件


    

2.映射文件

使用标签让当前mapper生效二级缓存

Mybatis的二级缓存什么时候会清理缓存中的数据 ?

 当某一个作用域(一级缓存 Session/二级缓存 namespace)进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被清空。

 Mybatis如何防止SQL注入?

首先,MyBatis里面提供了#{}和${}两种占位符, 都是去实现动态SQL的一种方式,通过这两种方式可以将参数传递到XML文件里面。在执行操作之前。Mybatis会对这两个占位符进行动态的解析。

#{}占位符等同于JDBC里面的?占位符,它相当于向PreparedStatement里面的预处理语句设置参数,而preparedStatement里面的SQL语句是预编译的,SQL语句里面使用了占位符,规定了SQL语句的一个结构,并且在设置参数的时候,如果有特殊的字符会自动进行转义,所有#{}占位符可以防止SQL注入。

而${}方式传参,相当于直接把参数拼接到原始SQL里面,MyBatis不会对它做任何特殊处理。

所以${}和#{}的最大区别在于,前者是动态参数,后者是占位符,动态参数无法防止SQL注入的问题,所以在实际应用里面尽量使用#{}占位符。

 

 

你可能感兴趣的:(面试,java,职场和发展)