SSM框架(Spring、SpringMVC、Mybatis)文章目录
- 一、Spring
- 1. 简单介绍下Spring?
- 2. IOC(控制反转)
- 3. IOC容器有哪些?
- 4. ApplicationContext和BeanFactory的区别?
- 5. BeanFactory 和 FactoryBean 的区别?
- 6. bean标签中的属性?
- 7. Spring 中的单例bean是线程安全的么?
- 8. 简单描述下Spring容器中bean的生命周期?
- 9. DI(依赖注入)
- 10. 依赖注入的方式有哪些?
- 11. AOP(面向切面编程)的理解
- 12. Spring AOP和AspectJ AOP有什么区别?(未写)
- 13. Spring 框架都用到了哪些设计模式?
- 14. 你用到了Spring中的哪些注解?
- 15. Spring事务管理的方式有哪几种?
- 16. Spring事务中隔离级别有哪几种?(未写)
- 17. Spring什么时候@Transactional会失效?
- 18. 什么是事务的传播行为?在Spring框架中都有哪些事务的传播行为?
- 19. Spring中事务是如何实现的?(未完)
- 20. spring如何管理事务的?(高频)
- 21. spring事务什么情况下会失效?(高频)
- 22. 使用@Autowired注解自动装配的过程是怎样的?(未完)
- 23. 请解释一下spring框架有哪些自动装配模式,它们之间有何区别?(高频)
- 23. Spring支持的几种bean的作用域它们之间有什么区别?(高频)
- 24. Spring是怎么扫描注解或者xml文件的?
- 25. spring中aop的底层是怎么实现的?(高频)
- 二、SpringMVC
- 1. 简单描述下SpringMvc的工作流程?
- 2. SpringMvc中的拦截器和Servlet中的(过滤器)filter有什么区别?
- 3. Spring MVC常用的注解有哪些?(高频)
- 4. Sping MVC中的控制器的注解一般用哪个?有没有别的注解可以替代?(高频)
- 5. Spring MVC怎么处理异常?(高频)
- 6. 如果想限定发送的请求方式应该如何进行实现?
- 7. Spring MVC的Controller线程安全?如何解决?
- 8. Spring MVC如何获得request, response, session?(高频)
- 9. Spring MVC怎么处理异常?(高频)
- 10. Spring MVC的主要组件都包含了哪些?(高频)
- 三、Mybatis
- 总结
一、Spring
1. 简单介绍下Spring?
- Spring是一个Java开发框架,用来简化Java开发.有三个核心组件, IOC (控制反转),DI(依赖注入),AOP(面向切面编程).
2. IOC(控制反转)
- 控制反转 , 是一种设计思想 . 反转的是对象的创建权, 让Spring帮我们创建对象, 我们使用的时候直接从容器中获取.
- IOC容器实际上是一个Map(key , value) ,Map中存放的是各种对象 ;
3. IOC容器有哪些?
- ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, AnnottationfigApplicationContext, BeanFactory
4. ApplicationContext和BeanFactory的区别?
- ApplicationContext和BeanFacatory都是Spring容器.
- 区别是 BeanFactory 是底层接口,ApplicationContext是派生接口,功能更强大. BeanFactory是懒加载,使用的时候才会创建Bean. 内存不足时, 可以使用BeanFactory. ApplicationContext默认在容器初始化的时候就加载所有bean, 好处是使用的时候 拿来即用, 无需等待, 缺点是起始阶段比较耗费内存.
5. BeanFactory 和 FactoryBean 的区别?
- BeanFactory 是Spring容器, FactoryBean 是一个特殊的bean ,用于创建bean, 创建出来的bean会放到容器中.
6. bean标签中的属性?
<bean id="" class="" name="" scope="" init-method="" desctory-method="" lazy-init="" autowire="">
7. Spring 中的单例bean是线程安全的么?
- 不安全 . 但是Spring中的bean是无状态的, 也就是不存储数据, 所以某种程度上来讲是线程安全的.
- 怎么解决线程安全问题?
1.把bean的作用域改为非单例 prototype
2.把共享变量放到ThreadLocal中, ThreadLocal是线程私有变量, 线程间隔离, 也可以解决线程安全问题.
8. 简单描述下Spring容器中bean的生命周期?
- BeanDefinition -> 实例化 -> 依赖注入 -> 初始化 -> 使用 -> 销毁
1.先通过配置文件或者注解拿到所有BeanDefinition , 并放到BeanDefinitionMap中
2.从BeanDefinitionMap中拿到bean定义并进行实例化 new
3.依赖注入, 给容器中bean中的属性赋值
4.初始化, 给属性赋值
5.初始化完成后, bean真正创建完成, 就可以把bean放到Spring容器中, ConcurrentHashMap, 我们使用的时候就可以通过getBean来获取bean
6.容器销毁的时候, bean也会跟着销毁 - BeanDefinition 是bean定义. 描述的是 这个bean的类型, 即这个bean 的名字, 有哪些属性, 有哪些构造函数, 有哪些方法.
9. DI(依赖注入)
- 依赖注入, 给容器中bean的属性赋值就叫依赖注入.
- (在容器中建立 ,bean 与 bean 之间关系的过程) ;
10. 依赖注入的方式有哪些?
- 构造器注入
<constructor-arg name=" " ref=" " / value=" " > - setter注入
<property name=" " ref=" " / value=" '>
11. AOP(面向切面编程)的理解
- 在面向切面编程中 , 把一些对象某些类似的方面 , 横向抽象成一个切面 , 对这个切面进行权限验证 , 事务管理 , 日志记录 等公用操作处理的过程 , 称为面向切面编程思想 ;
- 一种编程范式 , 指导开发者 如何组织程序结构 ;
- Spring AOP 底层是基于动态代理 ;
12. Spring AOP和AspectJ AOP有什么区别?(未写)
13. Spring 框架都用到了哪些设计模式?
- 工厂模式 :
- BeanFactory就是简单工场模式的体现 , 用来创建对象的实例 ;
- 单例模式 :
- Bean默认为单例模式 ;
- 代理模式 :
- Spring的AOP功能 ,用到了JDK的动态代理 和 CGLIB的字节码生成技术 ;
- 模板方法 :
- 观察者模式 :
14. 你用到了Spring中的哪些注解?
1. 声明Bean的注解 | 位置 | 作用 |
---|---|---|
@Component | 类上 | 声明Bean ,通用 |
@Controller | 类上 | 声明Bean ,在表现层使用 |
@Service | 类上 | 声明Bean ,业务逻辑层使用 |
@Repository | 类上 | 声明Bean ,在数据访问层使用 (dao层) |
@Bean | ||
2. 注入bean的注解 | 位置 | 作用 |
@Autowired | 方法上 | 按类型自动注入 |
@Qualifer | 方法上 | 按名称注入 ,必须有@Autowired |
@Value | 属性字段上 | 值类型字段 |
3. 切面AOP相关注解 | 位置 | 作用 |
@Aspect | 类上 | 声明一个切面类 |
@Pointcut | 方法上 | 声明切入点 |
@Around | 方法上 | 在方法执行之前与之后执行 (方法上) 环绕通知(通知类型) |
@Before | ||
@After | ||
@AfterReturning | ||
@AfterThrowing | ||
@Transactional | 类上/方法上 | 开启事务管理者 |
@EnableAspectJAutoProxy | 开启AOP注解 | |
4. Java配置类相关注解 | 位置 | 作用 |
@Configuration | 类上 | 声明配置类 |
@ComponentScan | 包扫描 | |
@Import | 导入其他配置类 | |
@PropertySource | 导入properties配置文件 | |
@EnableTransactionManagement | 开启事务驱动 | |
@Transaction | ||
@EnableAspectJAutoProxy | 开启AOP注解 | |
@EnableWebMvc | 开启spring的mvc模式 | |
Spring 整合 MyBatis | ||
@MapperScan | 可以代替 : 扫描 mapper MapperScannerConfigurer | |
Spring 整合 Junit | ||
@RunWith(SpringJUnit4ClassRunner.class) | 单元测试类上 | spring测试驱动 |
@ContextConfiguration(classes = SpringConfig.class) | 单元测试启动需要加载的配置类 | |
spring常用注解 | 不确定 | 哈哈 |
– | – | – |
@RestController | 类上 | @Controller+@ResponseBody |
@ResponseBody | 类上/方法上 | 不进行页面跳转,把方法返回值作为响应体返回 |
@RequestMapping | 类上/方法上 | 类上:前缀,方法上:具体业务路径 |
@PostMapping | ||
@PutMapping | ||
@GetMapping | ||
@DeleteMapping | ||
@PathVariable | 形参前 | 获取路径参数 ,用于将动态值从 URI 映射到处理程序方法参数 |
@RequestParam | 接收表单或路径传参 | |
@RequestBody | 接收json数据 | |
@DateTimeFormat | 格式化时间 |
========================事务管理
15. Spring事务管理的方式有哪几种?
- 编程式声明
- 需要使用TransactionTemplate在代码中硬编码 ,这种方式实现对业务代码有侵入性(不推荐) ;
- 注解式声明
- 在配置文件中配置(推荐) , 分为基于XML的声明式事务 和基于 注解式声明事务 ;
- 声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
- 声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过**@Transactional**注解的方式,便可以将事务规则应用到业务逻辑中。
16. Spring事务中隔离级别有哪几种?(未写)
17. Spring什么时候@Transactional会失效?
- 同时如果某个方法是 private 的 , @Transactional会失效
- 因为底层cglib是基于父子类来实现的 , 而子类无法重载父类的private方法 , 所以无法很好的利用代理 ;
18. 什么是事务的传播行为?在Spring框架中都有哪些事务的传播行为?
- Spring的事务传播行为:
- 指的就是当一个事务方法被另一个事务方法调用时,这个事务方法对事务的态度。
- 举例:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。
- 在Spring中提供了7种事务的传播行为:
- 1、REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
- 2、REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
- 3、SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
- 4、NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- 5、MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
- 6、NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- 7、NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
19. Spring中事务是如何实现的?(未完)
- Spring 事务底层是基于数据库事务 和 AOP 机制的 ;
- 首先对于使用了@Transactional注解的Bean , Spring回创建一个代理对象作为Bean ;
- 当调用代理对象的方法时 , 会判断方法是否加了@Transactional注解 , 如果加了 ,会利用事务管理器创建一个数据库连接 ;
20. spring如何管理事务的?(高频)
Spring事务管理主要包括3个接口,Spring事务主要由以下三个共同完成的:
- 1、PlatformTransactionManager:事务管理器,主要用于平台相关事务的管理。
- 主要包括三个方法:
① commit:事务提交。
② rollback:事务回滚。
③ getTransaction:获取事务状态。
- 主要包括三个方法:
- 2、TransacitonDefinition:事务定义信息,用来定义事务相关属性,给事务管理器PlatformTransactionManager使用
- 主要包含的方法:
① getIsolationLevel:获取隔离级别。
② getPropagationBehavior:获取传播行为。
③ getTimeout获取超时时间。
④ isReadOnly:是否只读(保存、更新、删除时属性变为false–可读写,查询时为true–只读)
- 主要包含的方法:
- 3、TransationStatus:事务具体运行状态,事务管理过程中,每个时间点事务的状态信息。
- 主要包含的方法:
① hasSavepoint():返回这个事务内部是否包含一个保存点。
② isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚。
③ isNewTransaction():判断当前事务是否是一个新事务。
- 主要包含的方法:
21. spring事务什么情况下会失效?(高频)
事务失效的常见场景:
- 1、数据库引擎不支持事务:
- 这里以 MySQL为例,其MyISAM引擎是不支持事务操作的,InnoDB才是支持事务的引擎,一般要支持事务都会使用 InnoDB。
- 2、**bean没有被Spring 管理
- 3、方法不是public的:
- @Transactional只能用于public的方法上,否则事务不会失效。
- 4、**自身调用问题
- 5、**数据源没有配置事务管理器
- 6、**异常在方法内部通过try…catch处理掉了
- 7、**异常类型错误:事务默认回滚的是:RuntimeException
- 这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下
22. 使用@Autowired注解自动装配的过程是怎样的?(未完)
23. 请解释一下spring框架有哪些自动装配模式,它们之间有何区别?(高频)
- Spring框架XML自动装配 共有5种装配方式
- no : 默认是不进行自动装配的 , 通过手动设置ref属性来装配bean ;
- byType : 通过参数的数据类型来自动装配 ;
- byName : 通过bean的名称进行自动装配 , 如果一个bean的property与另一bean的name相同 ,就进行自动装配 ;
- autodetect : 自动探查 , 如果有构造方法 , 通过construct的方式自动装配 , 否则使用byType的方式自动装配 ;
23. Spring支持的几种bean的作用域它们之间有什么区别?(高频)
- Spring框架支持以下五种bean的作用域 :
- singleton
- 这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护 。
- prototype
- 原形范围与单例范围相反,为每一个bean请求提供一个实例 ;
- request
- 在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后, bean会失效并被垃圾回收器回收 ;
- session
- 与请求范围类似,确保每个session中有一个 bean 的实例,在session过期后, bean会随之失效
- global-session
- singleton
24. Spring是怎么扫描注解或者xml文件的?
- 根据@ComponentScan配置的扫描路径 , 扫描这个路径下的注解 ,
- 比如 @Controller , @Service , @Repository , @Component等 ;
- 然后用反射的方式实例化被注解的类 , 并放入容器中 ;
25. spring中aop的底层是怎么实现的?(高频)
- Spring中AOP底层的实现是基于动态代理进行实现的。
- 常见的动态代理技术有两种:JDK的动态代理和CGLIB。
- 两者的区别如下所示:
- 1、JDK动态代理只能对实现了接口的类生成代理,而不能针对类
- 2、Cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法进行增强,但是因为采用的是继承,所以该类或方法最好不要声明为final,对于final类或方法,是无法继承的。
- Spring如何选择是用JDK还是cglib?
- 1、当bean实现接口时,会用JDK代理模式
- 2、当bean没有实现接口,会用cglib实现
- 3、可以强制使用cglib
二、SpringMVC
1. 简单描述下SpringMvc的工作流程?
- 具体流程如下所示
-
- 用户发送出请求到前端控制器 DispathcherServlet ,DispathcherServlet 收到请求调用 HandlerMapper (处理器映射) ,获得Handler ;
-
- DispathcherServlet拿着Handler调用HandlerAdapter(处理器适配器) ,HandlerAdapter寻找合适的Handler执行业务逻辑 ,并返回ModelAndView ;
-
- DispathcherServlet拿着ModelAndView访问viewResolever(视图解析武器) ,viewResolever解析完视图并返回给DispathcherServlet ;
- DispathcherServlet在请求视图进行渲染 ,最终给用户返回视图 ;
2. SpringMvc中的拦截器和Servlet中的(过滤器)filter有什么区别?
- 实现原理上 :
- 过滤器是基于函数回调实现的 ;
- 拦截器是基于动态代理实现的 ;
- 使用范围上 :
- 过滤器必须实现Java.servlet.filter接口 , 必须依赖tomcat 等容器 ;
- 拦截器在spring包下 ,由spring管理 ;
- 触发时机上 :
- 过滤器在servlet前后执行 ;
- 拦截器在controller前后执行 ;
- 应用场景上 :
- 过滤器用于拦截非法参数 , 无效请求 ;
- 拦截器用于权限校验 , 日志记录 ;
3. Spring MVC常用的注解有哪些?(高频)
-
- @RequestMapping:用于映射请求路径,可以定义在类上和方法上。用于类上,则表示类中的所有的方法都是以该地址作为父路径。
-
- @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
-
- @RequestParam:指定请求参数的名称
-
- @PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数
-
- @ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。
- 6 @RequestHeader:获取指定的请求头数据
4. Sping MVC中的控制器的注解一般用哪个?有没有别的注解可以替代?(高频)
- 一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller ;
5. Spring MVC怎么处理异常?(高频)
- 可以直接使用Spring MVC中的全局异常处理器对异常进行统一处理,此时Contoller方法只需要编写业务逻辑代码,不用考虑异常处理代码 ;
- 开发一个全局异常处理器需要使用到两个注解:@Controlleradvice 、@ ExceptionHandler
6. 如果想限定发送的请求方式应该如何进行实现?
- 使用@RequestMapping注解的method属性 ,如下所示 :
- @RequestMapping(value = “/{id}” , method = RequestMethod.Get) ;
- 使用GetMapping :
- @GetMapping(value = “/{id}”) ;
7. Spring MVC的Controller线程安全?如何解决?
- Controller是默认单例模式 , 高并发下全局变量会出现线程安全问题 ;
- 解决方案 :
-
- 将全局变量都变成局部变量 , 通过方法参数来传递 ;
-
- 将控制器的作用域从单例改为原型 , 如下 :
- @Scope(value = “prototype”)
-
8. Spring MVC如何获得request, response, session?(高频)
- 方式一 :
- 在controller方法的形参里直接定义HttpServletRequest ,HttpServletResponse ,HttpSession ;
- 方式二 :
- 通过@Autowired 直接注入 HttpServletRequest ,HttpServletResponse ,HttpSession ;
9. Spring MVC怎么处理异常?(高频)
- 可以直接使用Spring MVC 中的全局异常处理器 进行统一异常处理 , 此时 ,controller方法只需要编写业务逻辑代码 ,不需要考虑异常处理代码 ;
- 统一异常处理器的注解有@ControllerAdvice , @ExceptionHandler ;
10. Spring MVC的主要组件都包含了哪些?(高频)
- 1、前端控制器 DispatcherServlet(不需要程序员开发):作用:接收请求、响应结果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度 ;
- 2、理器映射器HandlerMapping(不需要程序员开发)作用:根据请求的URL来查找Handler ;
- 3、处理器适配器HandlerAdapter(不需要程序员开发)作用:执行处理器 ;
- 4、处理器Handler(需要程序员开发);
- 5、视图解析器 ViewResolver(不需要程序员开发)作用:进行视图的解析 根据视图逻辑名解析成真正的视图(view);
- 6、视图View(需要程序员开发jsp)View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等);
三、Mybatis
1. 使用MyBatis的代理开发有哪些要求?
- 使用Mapper代理方式 ,必须满足以下要求:
- 定义与SQL映射文件同名的Mapper接口 ,并且将Mapper接口和SQL映射文件放置在同一目录下 ;
- 设置SQL映射文件的namespace属性为Mapper接口限定名 ;
- 在Mapper接口中定义方法 ,方法名就是SQL映射文件中sql语句的id属性值 ,并保持参数类型和返回值类型一致 ;
2. #{}和${}的区别是什么?(高频)
- #{}是预编译处理 ,${}是字符串替换 ;
- 使用 #{} 可以有效防止SQL注入 ,提高系统安全性 ;
- Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
- Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值 ;