Spring

2019-02-24  本文已影响0人  rabbittttt

Spring 的模块

ans: Spring 的模块

1 什么是IOC,什么是依赖注入,Spring IOC 如何实现
ans: IOC — Inversion of Control,即“控制反转”
DI — Dependency Injection,即“依赖注入”
在传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象。IOC/DI 的设计思想,是指由容器创建对象,由容器帮助装配,这样做的好处是接触了对象之间的耦合关系,便于我们复用和测试。
Spring中的 BeanFactory 和 ApplicationContext 是最常用的IOC容器,注入属性时,主要使用了JDK的反射和内省机制。
参考:https://jinnianshilongnian.iteye.com/blog/1413846

2 BeanFactory 和 ApplicationContext 有什么区别
ans:BeanFactory是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持。
ApplicationContext 是 BeanFactory 的子接口,也被成为 Spring 上下文。是 spring 中较高级的容器,不仅可以加载配置文件中定义的 bean,还添加了一些高级功能,比如从属性文件中解析文本信息和将事件传递给所指定的监听器。
一般使用的是 ApplicationContext,除非在资源比较紧张的情况下会选择 BeanFactory。

3 Spring注入bean的方式
ans: (1)基于构造函数的注入
(2)基于属性的setter方法注入
(3)基于工厂方法的注入
(4)基于注解的注入
参考:https://blog.csdn.net/qq1175421841/article/details/51884655

4 Spring AOP,动态代理(CGLIB 与 JDK)
ans: AOP(Aspect-Oriented Programming),面向方面编程。与OOP的通过继承扩展功能的方式不同,它是一种“横向”扩展的技术,常用于将公共行为插入不同的业务流程中,例如记录日志等。Spring AOP的核心有三部分:被通知的目标对象,切点(拦截位置)和 增强处理。
Spring AOP支持 前置、后置、环绕、返回、异常通知。可以用XML声明切面,也可以是使用注解。
Spring AOP 是由 IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
(1)默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。
(2)当需要代理的类未实现任何接口的时候,Spring会切换为使用CGLIB实现。
Java动态代理:Java动态代理是利用反射机制,生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGLIB:CGLIB动态代理是利用asm开源包,将被代理对象类的class文件加载进来,通过修改其字节码,生成子类来处理。

5 Spring 事务实现方式,事务隔离级别和传播性
ans: ACID:

Spring事务实现分为两种:

脏读:如果一个事务对数据进行了更新,尚未提交的情况下另一个事务“看到了”这个未提交的结果,这可能造成的问题是,当事务回滚,那么第二个事务看到的数据就是脏数据。
不可重复读:是指在一个事务过程中,对同一个数据进行多次读取,每次的结果都不同,如事务1第一次读取数据,事务2尚未更新,而第二次读物数据时事务2已经更新了数据。
幻读:幻读针对的是多笔记录,与不可重复读类似,都是在一个事务过程中多次读取结果不同,幻读针对的是结果集有差异,可能多或少了一些记录。
Spring事务隔离级别:

传播行为:

如果在事务中catch了抛出的异常,那么Spring无法感知到,也就不会回滚,此时可以:

6 Spring是单例还是多例,怎么修改,Spring 的单例实现原理
ans: 在 Spring 中定义一个 bean 时,默认是单例方式,如果需要修改它的作用域,可以显示的定义“ scope” 属性。Spring支持5种作用域:

7 Spring 框架中用到了哪些设计模式
ans: - MVC

8 介绍下Mybatis的缓存机制。
ans: Mybatis提供两级缓存。
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
Mybatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用的条件比较苛刻。
在分布式环境下,由于默认的Mybatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,不如直接用Redis、Memcache实现业务上的缓存就好。
参考:https://www.cnblogs.com/zedosu/p/6709943.html
https://www.jianshu.com/p/c553169c5921

9 Mybatis的mapper文件中#和的区别。 ans: #{variable} Mybatis会对参数做预处理,在SQL语句中用“?”占位,直到DBMS中替换。{variable} 可以插入一个不转义的字符串,但这样会导致潜在的 SQL 注入攻击!尽量避免这么做。

10 Mybatis的mapper文件中resultType和resultMap的区别。
ans: resultType用于指明 返回值的期望类型的类的完全限定名或别名
resultMap 主要用于将返回值映射到POJO对象上,解决列名不能自动匹配的问题。

11 Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的。
ans: mybatis通过Java动态代理,在启动加载配置文件时,根据配置mapper的xml去生成DAO的实现。
参考:https://blog.csdn.net/c_royi/article/details/79452255

上一篇 下一篇

猜你喜欢

热点阅读