写在前面
最近快面试了,收集相关的面试题,也是对自己知识的总结
1. 为什么要使用spring框架?
Spring是一个轻量级的开源的javaBean容器框架,他提供企业应用功能,降低应用开发的复杂性。
他的优点有:轻量:框架的体积小,部署简单,不同功能的jar包只需要添加依赖就行了
容器:工厂模式对JavaBean进行管理,通过控制反转将设计好的对象交给容器管理
松耦合:通过XML配置文件配置或注解就可以进行对Bean的注入,不用在代码中写GetSet方法
AOP(面向切面编程):通过XML配置文件和注解就可以进行面向切面编程。
方便集成:通过简单的配置和对象注入即可集成其他框架。如:mybatis,hibernate,shiro
2. 什么是Aop(Aop面向切面编程)
AOP将影响多个类的公共行为封装到一个可重用模块,组成一个切面
切面就是将那些与业务无关,却被业务模块共同调用的代码封装起来,便于减少系统的重复代码,降低模块间的耦合度.
实现AOP的方式有一是jdk的动态代理和cglib基于类代理,二是采用静态织入的方式。
通过AOP可以实现很多功能,比如权限认证、日志、事务处理
3. IOC控制反转
在java开发中,将设计好的对象交给容器控制,而不是显示的用代码进行对象的创建
把创建和查找依赖对象的控制权交给容器,由IOC容器进行注入。降低对象和对象之间的耦合度,减少对象的创建和内存消耗,便于测试。使得程序的可维护性,灵活性,扩展性变高
DI依赖注入是IOC容装配注入对象的一种方式。
4. SpringMVC的生命周期
用户发送请求给dispatchServlet
dispatchServlet调用HandlerMapping找到Handler
HandlerMapping通过请求的URL找到具体的Handler,生成Handler对象并返回给dispatchServlet
dispatchServlet调用HandlerAdapter适配Handler
Handler执行ModelAndView
HandlerAdapter将Handler的执行结果返回dispatchServlet
dispatchServlet调用视图解析器
视图解析器对ModelAndView进行解析并返回View
dispatchServlet将View进行渲染
然后将结果响应给用户
5. Spring的常用注解
1. @SpringBootApplication
@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
@ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
@Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
2. Spring Bean 相关
2.1. @Autowired
2.2. Component,@Repository,@Service, @Controller
2.3. @RestController
2.4. @Scope
四种常见的 Spring Bean 的作用域:
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
2.5. Configuration
3. 处理常见的 HTTP 请求类型
3.1. GET 请求
@GetMapping(“users”) 等价于@RequestMapping(value="/users",method=RequestMethod.GET)
3.2. POST 请求
@PostMapping(“users”) 等价于@RequestMapping(value="/users",method=RequestMethod.POST)
3.3. PUT 请求
@PutMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
3.4. DELETE 请求
@DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
4. 前后端传值
4.1. @PathVariable 和 @RequestParam
@PathVariable用于获取路径参数,@RequestParam用于获取查询参数。
4.2. @RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。
5. 读取配置信息
5.1. @value(常用)
使用 @Value("${property}") 读取比较简单的配置信息:
5.2. @ConfigurationProperties(常用)
通过@ConfigurationProperties读取配置信息并与 bean 绑定。
6. 全局处理 Controller 层异常
@ControllerAdvice :注解定义全局异常处理类
@ExceptionHandler :注解声明异常处理方法
7. 事务 @Transactional
还有jpa,hibernate,json,测试之类的少用就不写了,以后用到再写
6. SpringBean的生命周期
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
6. spring自动装配bean有哪些方式?
基于 xml 配置 bean 的装配方式:
no:默认的方式是不进行自动装配的,需要通过手工设置 ref 属性来进行装配 bean。
byName:通过 bean 的名称进行自动装配,如果一个 bean 的 property 与另一 bean 的 name 相同,就进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:通过构造函数进行装配,并且构造函数的参数通过 byType 进行装配。
基于注解完成 bean 的装配
@Autowired、@Resource、@Inject 都可以实现 bean 的注入
@Value 可以注入配置信息
7. spring事务实现方式有哪些?
编程式事务管理,在代码中调用 commit()、rollback()等事务管理相关的方法
基于注解 @Transactional 的声明式事务管理
基于 Aspectj AOP 配置(注解)事务
8. @Transactional 注解哪些情况下会失效?
1、@Transactional 作用在非 public 修饰的方法上
2、@Transactional 作用于接口,使用 CGLib 动态代理
3、@Transactional 注解属性 propagation 设置以下三种可能导致无法回滚
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
4、同一类中加 @Transactional 方法被无 @Transactional 的方法调用,事务失效
5、@Transactional 方法内异常被捕获
6、默认 RuntimeException 和 Error 及子类抛出,会回滚;rollbackFor 指定的异常及子类发生才会回滚
7、数据库不支持事务,如 MySQL 使用 MyISAM 存储引擎
9. Spring中七种Propagation类的事务属性详解:
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
10. Spring Advice 有哪些类型?
Before Advice:在连接点(Join point)之前执行
After Advice:当连接点退出的时候执行
Around Advice:环绕一个连接点的增强,这是最强大的一种增强类型。可以在方法调用前、后完成自定义的行为、是否继续执行连接点、是否进行原逻辑、是否抛出异常来结束执行
AfterReturning Advice:在连接点正常完成后执行的增强,如果连接点抛出异常,则不执行
AfterThrowing Advice:在方法抛出异常退出时执行的增强
Advice 的 执行顺序:
Around Before Advice
Before Advice
target method 执行
Around After Advice
After Advice
AfterReturning | AfterThrowing & Exception