- Spring
- 1. 什么是 Spring 框架?
- 2. 谈谈你对于 Spring IoC 的了解
- 3. 什么是依赖注入
- 4. Spring的依赖注入有几种方式
- 5. 将一个类声明为 Bean 的注解有哪些?
- 6. @Component 和 @Bean 的区别是什么?
- 7. 注入 Bean 的注解有哪些?
- 8. Bean 的作用域有哪些?
- 9. Bean 是线程安全的吗?
- 10. Bean 的生命周期了解么?
- 11. 什么是AOP,应用场景
- 11. Spring AOP 和 AspectJ
- 12. Spring AOP 的实现原理
- 13. AspectJ 定义的通知类型有哪些?
- 14. 多个切面的执行顺序如何控制?
- 15. 什么是SpringMVC
- 16. SpringMVC 核心组件
- 17. SpringMVC 工作原理
- 18. 统一异常处理怎么做?
- 19. Spring 框架中用到了哪些设计模式?
- 20. Spring 管理事务的方式有几种?
- 21. Spring 事务中哪几种事务传播行为?
- 22. Spring 事务中的隔离级别有哪几种?
- 23. @Transactional(rollbackFor = Exception.class)注解了解吗?
Spring
1. 什么是 Spring 框架?
答:
- Spring 是一款开源的轻量级 Java 开发框架。
- Spring 可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)。
- 支持IOC、AOP,使用Spring进行开发效率非常高。
2. 谈谈你对于 Spring IoC 的了解
答:
- 将需要手动创建的对象交给框架去创建。
- 我们只需要在一个类上添加一个注解,就可以使用该类的对象了。
3. 什么是依赖注入
答:
- Spring容器在创建bean时,如果发现一个bean的属性是容器中的另一个bean,Spring则会自动的去进行对象关联。
4. Spring的依赖注入有几种方式
答:
- Setter注入
- 构造器注入
- 使用注解:
@Autowired
或@value
5. 将一个类声明为 Bean 的注解有哪些?
答:
@Component
:最基本的 Bean 注解@Controller
:对应控制层@Service
:对应服务层@Repository
:对应持久层@Configuration + @Bean
:通常是在一个配置类里面,将方法的返回结果注入进来。
6. @Component 和 @Bean 的区别是什么?
答:
@Component
:是一个类级别的注解,通常用于无需编程配置即可创建bean对象的类上。Spring 会扫描对应路径上标有@Component
的类,将该类的对象注入进来。@Bean
:是一个方法级别的注解,通常需要进行对象属性的配置,然后配合@Configuration
注解,将方法的返回结果注入到 IOC 容器中。
7. 注入 Bean 的注解有哪些?
答:
@Autowired
:根据类型进行注入,如果匹配到多个Bean,则会爆出异常。可以和@Qualifier
搭配使用,指定使用哪个名称的Bean@Resource
:首先根据名称注入,如果找不到,再根据类型进行查找。可以通过name
属性指定Bean的名称。
8. Bean 的作用域有哪些?
答:
- singleton (单例):IOC容器只会存在唯一的一个Bean。
- prototype:每次获取都会创建一个新的 bean
- request:每一次 HTTP 请求都会产生一个新的 bean。该 bean 仅在当前 HTTP request 内有效。
- session:每一次来自新 session 的 HTTP 请求都会产生一个新的 bean。该 bean 仅在当前 HTTP session 内有效。
- application:每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
- 使用
@Scope
注解声明 Spring Bean 的作用域
9. Bean 是线程安全的吗?
答:
prototype
、request
、Session
每次获取都会创建一个新的 bean 实例,所以不需要考虑线程安全。Singleton
是单例的,会被多个线程共享,所以要考虑线程安全的问题。
10. Bean 的生命周期了解么?
答:
- 实例化: Spring容器在启动时,默认会扫描启动类所在的路径,并为标注为
Bean
的类创建实例。 - 属性填充: 为 Bean 设置相关属性和依赖。例如@Autowired 注入的对象
- 初始化: Spring容器会检测Bean是否实现了特定的生命周期回调接口。如果实现了则会在特定时间调用它们。
- 销毁: 当Spring容器关闭时,会销毁所有的Bean,如果销毁有回调方法的话,也会执行。
11. 什么是AOP,应用场景
答:
- 面向切面编程,把方法中通用的功能抽离出来,比如(鉴权、日志记录等),通过预编译或是动态代理方式在不修改源代码的情况下给程序进行功能增强。
- 应用场景:日志、鉴权、Spring的事务等
11. Spring AOP 和 AspectJ
答:
Spring AOP
和 AspectJ
都是AOP的具体实现。AspectJ
是完全实现了 AOP,功能比 Spring AOP 要强。
Spring AOP
中使用了 AspectJ
的切点表达式,注解(通知类型)等
区别:
AspectJ
是在编译时增强,使用字节码处理技术。Spring AOP
是在运行时动态生成的,所以性能不如AspectJ
高AspectJ
不仅可以织入方法执行,还可以字段赋值时,构造函数执行时等。完全实现了 AOP 思想。Spring AOP
只支持方法级别的切入点
12. Spring AOP 的实现原理
答:
-
Spring AOP的实现是基于
JDK动态代理
和CGLIB
实现的。 -
如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用
JDK动态代理
,去创建代理对象 -
而对于没有实现接口的对象,则使用的是
Cglib
生成一个被代理对象的子类来作为代理。
13. AspectJ 定义的通知类型有哪些?
答:
- Before(前置通知):目标对象的方法调用之前触发
- After (后置通知):目标对象的方法调用之后触发
- Around (环绕通知):可以在目标对象的方法调用之前和之后进行操作。
14. 多个切面的执行顺序如何控制?
答:
- 可以在切面类上使用
@Order
注解直接定义切面顺序。值越小优先级越高
15. 什么是SpringMVC
答:
- SpringMVC 是基于
MVC
模式设计的 Web 框架。 - MVC代表
Model-View-Controller
- 通常划分为
Controller
接口层,Service
业务层,Entity
实体类,dao
持久层
16. SpringMVC 核心组件
答:
DispatcherServlet
:中央处理器,负责接收请求、进行分发,客户端响应。HandlerMapping
:处理器映射器,根据URL
去查找对应的Handler
HandlerAdapter
:处理器适配器,指定对应的Handler
Handler
:请求处理器,负责处理请求ViewResolver
:视图解析器,视图解析器负责解析Handler
返回的视图,并将结果返回给DispatcherServlet
17. SpringMVC 工作原理
答:
客户端(浏览器)
发送请求, 首先会到达DispatcherServlet
。DispatcherServlet
收到请求后,调用HandlerMapping
处理器映射器。- 处理器映射器根据请求url找到具体的处理器
Handler
,并返回给DispatcherServlet
DispatcherServlet
通过HandlerAdapter
处理器适配器执行找到的处理器。Handler
完成对用户请求的处理后,会返回一个ModelAndView
对象给DispatcherServlet
DispatcherServlet
再调用ViewResolver
视图解析器,解析出具体的ViewDispatcherServlet
将 Model 填充到 解析出来的View中DispaterServlet
把 View 返回给浏览器
注意:
- 如果使用
@ResponseBody
或者@RestController
注解,表明方法返回值应该直接在HTTP响应体中写出 - 所以Spring MVC将直接跳过视图解析器。
18. 统一异常处理怎么做?
答:
- 可以使用
@ControllerAdvice + @ExceptionHandler
捕获 Controller 层的异常。 - 如果是业务层的异常,如果自己能处理,就自己处理。
- 如果处理不了,就抛给 Controller 层。
19. Spring 框架中用到了哪些设计模式?
答:
- 工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
- 代理设计模式 : Spring AOP 功能的实现。单例设计模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
20. Spring 管理事务的方式有几种?
答:
- 编程式事务:将事务管理的代码硬编码在业务逻辑中,手动管理事务的开启、提交、回滚等操作。
- 声明式事务:在 XML 配置文件中配置或者基于注解。
21. Spring 事务中哪几种事务传播行为?
答:
事务传播行为: 是指当在一个事务中调用另外一个事务方法时,这个被调用的事务方法应该如何进行执行,即事务如何在方法之间进行传播。
TransactionDefinition.PROPAGATION_REQUIRED
:默认的,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。TransactionDefinition.PROPAGATION_REQUIRES_NEW
:新建事务,如果当前存在事务,把当前事务挂起。TransactionDefinition.PROPAGATION_NESTED
:如果当前存在事务,则会再当前事务内嵌套一个事务,如果没有事务,则新建一个事务TransactionDefinition.PROPAGATION_MANDATORY
:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。TransactionDefinition.PROPAGATION_SUPPORTS
:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。TransactionDefinition.PROPAGATION_NOT_SUPPORTED
:以非事务方式运行,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_NEVER
:以非事务方式运行,如果当前存在事务,则抛出异常
22. Spring 事务中的隔离级别有哪几种?
答:
TransactionDefinition.ISOLATION_DEFAULT
:使用后端数据库默认的隔离级别,MySQL 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别.TransactionDefinition.ISOLATION_READ_UNCOMMITTED
:读未提交,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读TransactionDefinition.ISOLATION_READ_COMMITTED
: 读已提交,允许读取事务提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生TransactionDefinition.ISOLATION_REPEATABLE_READ
: 可重复读,多次读取结果都是一致的,可以阻止脏读和不可重复读,但幻读仍有可能发生。TransactionDefinition.ISOLATION_SERIALIZABLE
: 串行化,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
23. @Transactional(rollbackFor = Exception.class)注解了解吗?
答:
@Transactional
注解默认回滚策略是只有在遇到RuntimeException
(运行时异常) 或者Error
时才会回滚事务,而不会回滚Checked Exception
(受检查异常)- 可以使用
@Transactional
注解的rollbackFor
指定遇到什么异常回滚。