Spring框架的一些题
- 1.介绍一下你对Spring的认识?
- 2.控制反转(IOC)有什么用?
- 3.IOC的优点是什么?
- 4.怎么搭建Spring-IOC框架?
- 5.怎样开启注解装配?
- 6.@Component,@Controller,@Repository,@Service有什么区别?
- 7.当使用@AutoWired匹配到多个类型怎么解决?
- 8.什么是AOP
- 9.JDK动态代理和CGLIB动态代理的区别?
- 10.如何理解Spring中的代理呢?
- 11.解释一下Spring-AOP中的几个名词?
- 12.怎么搭建基于Spring的AOP?
- 13.Spring通知有哪些类型?
- 14.解释基于XML Schame方式的切面实现?(没有答案)
- 15.解释基于注解的切面实现?(没有答案)
- 16.Spring事务的实现方式和实现原理?
- 17.Spring的事务传播行为?
- 18.Spring的事务隔离?
- 19.Spring框架事务管理有哪些优点?
1.介绍一下你对Spring的认识?
spring是一个轻量级的开源框架。
spring为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题 。
spring是一个IOC和AOP的容器框架。
- IOC:控制反转
- AOP:面向切面编程
- 容器:包含并管理应用对象的生命周期
使用spring的优点 - 1、Spring通过DI、AOP和消除样板式代码来简化企业级Java开发
- 2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它 将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL
- 3、低侵入式设计,代码的污染极低
- 4、独立于各种应用服务器,基于Spring框架的应用,可以真正实现 Write Once,Run Anywhere的承诺
- 5、Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间 的解耦
- 6、Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行 集中式处理,从而提供了更好的复用
- 7、Spring的ORM和DAO提供了与第三方持久层框架的的良好整合, 并简化了底层的数据库访问
- 8、Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可 自由选用Spring框架的部分或全部
2.控制反转(IOC)有什么用?
IOC:就是对象由 spring来创建、管理,装配!通过构造函数参数,工厂方法的参数或这是从工厂方法的构造函数或返回值的对象实例设置的属性,然后容 器在创建bean时注入这些需要的依赖。就不需要我们new 对象了,用getBean()方法就可以获得。
(1)管理对象
(2)创建对象
(3)使用对象
3.IOC的优点是什么?
对象的构建如果依赖非常多的对象,且层次很深,外层在构造对象时很麻烦又不一定知道如何构建这么多层次的对象。 IOC 帮我们管理对象的创建,只需要在配置文件里指定如何构建,每一个对象的配置文件都在类编写的时候指定了,所以最外层对象不需要关心深层次对象如何创建的,框架里面都写好了。
(1) 集中管理
(2) 功能可复用(减少对象的创建和内存消耗)
(3) 使得程序的整个体系结构可维护性、灵活性、扩展性变高
(4) 解耦
4.怎么搭建Spring-IOC框架?
(1)导入jar包—配置xml
(2)maven+注解+xml
(3)springboot+javaconfig
5.怎样开启注解装配?
(1)设置注解
<context:component-scan base-package=“总包名” />
(2)在对应的类名上加对应的注解
6.@Component,@Controller,@Repository,@Service有什么区别?
@Controller
标记在控制层的类注册为Bean组件
@Service
标记在业务逻辑层的类注册为Bean组件
@Repository
标记在数据访问层的类注册为Bean组件
@Component
标记非三层的普通的类注册为Bean组件
- 不是每个层非要对应相应的注解
- 但是这样做的好处:
- (1)增强可读性
- (2)利于spring管理 —— 可以屏蔽某些注解的类不被扫描
7.当使用@AutoWired匹配到多个类型怎么解决?
- 如果匹配到多个类型则会根据名字来匹配
- 如果名字又没有匹配到,则会报错:
(1)可以修改属性的名字对应bean的名字 userServiceImpl
(2)也可以修改Bean的名字对应属性的名字 @Service(“userService”)
(3)可以通过@Qualifier设置属性的名字
(4)可以通过@Primary设置其中的一个bean为主要bean
(5)使用泛型作为自动注入的限定符
8.什么是AOP
AOP:Aspect Oriented Programming 面向切面编程:在程序运行期间,不修改原有代码的情况下增强跟主要业务没有关系的公共功能代码到之前写好的方法中的指定位置的编程方式
9.JDK动态代理和CGLIB动态代理的区别?
- JDK动态代理:必须保证代理的类实现了接口
- CGLIB动态代理:不需要实现接口
10.如何理解Spring中的代理呢?
在spring容器中,如果有接口,那么会使用jdk自带的动态 代理,如果没有接口,那么会使用cglib的动态代理。
11.解释一下Spring-AOP中的几个名词?
- 切面(Aspect): 指关注点模块化,这个关注点可能会横切多个对象。 事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP 中,切面可以使用通用类基于模式的方式(schemabased approach)或 者在普通类中以@Aspect注解(@AspectJ 注解方式)来实现。
- 连接点(Join point): 在程序执行过程中某个特定的点,例如某个方 法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总 是代表一个方法的执行。
- 通知(Advice): 在切面的某个特定的连接点上执行的动作。通知有多 种类型,包括“around”, “before” and “after”等等。通知的类型将在后面的 章节进行讨论。 许多AOP框架,包括Spring在内,都是以拦截器做通知模 型的,并维护着一个以连接点为中心的拦截器链。
- 切点(Pointcut): 匹配连接点的断言。通知和切点表达式相关联,并 在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法 时)。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用 AspectJ切点语义。
- 引入(Introduction): 声明额外的方法或者某个类型的字段。Spring 允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。例 如,可以使用引入来使bean实现 IsModified接口, 以便简化缓存机制(在 AspectJ社区,引入也被称为内部类型声明(inter))。
- 目标对象(Target object): 被一个或者多个切面所通知的对象。也被 称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现 的,那么这个对象永远是一个被代理(proxied)的对象。
- AOP代理(AOP proxy):AOP框架创建的对象,用来实现切面契约 (aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代 理可以是JDK动态代理或CGLIB代理。
- 织入(Weaving): 把切面连接到其它的应用程序类型或者对象上,并 创建一个被被通知的对象的过程。这个过程可以在编译时(例如使用 AspectJ编译器)、类加载时或运行时中完成。 Spring和其他纯Java AOP 框架一样,是在运行时完成织入的。
12.怎么搭建基于Spring的AOP?
13.Spring通知有哪些类型?
@Before
:在目标方法之前运行:前置通知
@Afte
r:在目标方法之后运行:后置通知
@AfterReturning
:在目标方法正常返回之后:返回通知
@AfterThrowing
:在目标方法抛出异常后开始运行:异常通知
@Around
:环绕:环绕通知
@Before("execution(* cn.cbyStudy.service..*.*(..))")
@After("execution(* cn.cbyStudy.service..*.*(..))")
@AfterThrowing("execution(* cn.cbyStudy.service..*.*(..))")
@AfterReturning("execution(* cn.cbyStudy.service..*.*(..))")
14.解释基于XML Schame方式的切面实现?(没有答案)
15.解释基于注解的切面实现?(没有答案)
16.Spring事务的实现方式和实现原理?
通过加@Transaction
实现
Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring 是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog 或者 redo log 实现的。
17.Spring的事务传播行为?
Spring 事务的传播行为说的是,当多个事务同时存在的时候, Spring 如何处理这些事务的行为。@Transaction中的propagation参数设置
- Propagation.REQUIRED:如果当前没有事务,就创建一个新事务,
如果当前存在事务,就加入该事务,(该设置是最常用的设置) - Propagation.SUPPORTS:支持当前事务,如果当前存在事务,就
加入该事务,如果当前不存在事务,就以非事务执行‘ - Propagation.MANDATORY:支持当前事务,如果当前存在事务,
就加入该事务,如果当前不存在事务,就抛出异常 - Propagation.REQUIRES_NEW:创建新事务,无论当前存不存在事
务,都创建新事务 - Propagation.NOT_SUPPORTED:以非事务方式执行操作,如果当
前存在事务,就把当前事务挂起 - Propagation.NEVER: 以非事务方式执行,如果当前存在事务,则
抛出异常 - Propagation.NESTED:如果当前存在事务,则在嵌套事务内执行。
如果当前没有事务,则按 REQUIRED 属性执行
18.Spring的事务隔离?
通过设置事务的隔离级别,来解决并发事务所产生的一些问题,如:脏读,不可重复读,幻影读。
@Transaction中的isolation参数设置
-
Isolation.DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别
-
Isolation.READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据
-
Isolation.READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新
-
Isolation.REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新
-
Isolation.SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新
19.Spring框架事务管理有哪些优点?
(1)为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式
(2)为编程式事务管理提供了一套简单的API而不是一些复杂的事务API
(3)支持声明式事务管理
(4)可以和Spring各种数据访问抽象层很好得集成