spring常见⾯试题(附答案)
1、什么是spring、为什么要⽤spring及其优点、spring有哪些模块组成 ?
什么是spring
Spring 是个Java企业级应⽤的开源开发框架。Spring主要⽤来开发Java应⽤,但是有些扩展是针对构建J2EE平台的web应⽤。Spring 框架⽬标是简化Java企业级应⽤开发,它使得开发者只需要关⼼业务需求。
spring优点
spring属于低侵⼊式设计,代码的污染极低;
spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
springmvc注解的面试题Spring提供了AOP技术,⽀持将⼀些通⽤任务,如安全、事务、⽇志、权限等进⾏集中式管理,从⽽提供更好的复⽤。
spring对于主流的应⽤框架提供了集成⽀持。
spring有哪些模块组成
Spring Core:核⼼类库,提供IOC服务;
Spring Context:提供框架式的Bean访问⽅式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的⽀持;
Spring Web:提供了基本的⾯向Web的综合特性,例如多⽅⽂件上传;
Spring MVC:提供⾯向Web应⽤的Model-View-Controller实现。
2、什么是IOC、DI 及其两者的优点、有哪⼏种注⼊⽅式
IOC:控制反转,把创建对象的控制权利由代码转移到spring的配置⽂件中。
最直观的表达就是,IOC让对象的创建不⽤去new了,可以由spring⾃动⽣产,使⽤java的反射机制,根据配置⽂件在运⾏时动态的去创建对象以及管理对象,并调⽤对象的⽅法的。
DI:依赖注⼊,在程序运⾏期间,由外部容器动态地将依赖对象注⼊到组件中。简单定义就是当⼀个对象需要另⼀个对象时,可以把另⼀个对象注⼊到对象中去。
优点就是把应⽤的代码量降到最低,达到松散耦合度。
注⼊的⽅式:
构造注⼊
Set注⼊
接⼝注⼊
Spring提供以下⼏种集合的配置元素:
<list>类型⽤于注⼊⼀列值,允许有相同的值。
<set> 类型⽤于注⼊⼀组值,不允许有相同的值。
<map> 类型⽤于注⼊⼀组键值对,键和值都可以为任意类型。
<props>类型⽤于注⼊⼀组键值对,键和值都只能为String类型。
3、谈谈对AOP理解?
aop⾯向切⾯编程,关键在于代理模式,Spring AOP使⽤的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,⽽是每次运⾏时在内存中临时为⽅法⽣成⼀个AOP对象,这个AOP对象包含了⽬标对象的全部⽅法,并且在特定的切点做了增强处理,并回调原对象的⽅法。动态代理可以减少系统中的重复代码,降低了模块间的耦合度,同时提⾼了系统的可维护性。可⽤于权限认证、⽇志、事务处理。
Spring AOP中的动态代理主要有两种⽅式,JDK动态代理和CGLIB动态代理:
JDK代理:基于接⼝的代理,不⽀持类的代理。核⼼InvocationHandler接⼝和Proxy类,InvocationHandler 通过invoke()⽅法反射来调⽤⽬标类中的代码,动态地将横切逻辑和业务编织在⼀起;接着,Proxy利⽤ InvocationHandler动态创建⼀个符合某⼀接⼝的的实例, ⽣成⽬标类的代理对象。
CGLIB动态代理:如果代理类没有实现 InvocationHandler 接⼝(或者说是基于⽗⼦类的),那么Spring AOP会选择使⽤CGLIB来动态代理⽬标类。CGLIB(Code Generation Library),是⼀个代码⽣成的类库,可以在运⾏时动态的⽣成指定类的⼀个⼦类对象,并覆盖其中特定⽅法并添加增强代码,从
⽽实现AOP。CGLIB是通过继承的⽅式做的动态代理,因此如果某个类被标记为final,那么它是⽆法使⽤CGLIB做动态代理的
Enhancer是⼀个⾮常重要的类,它允许为⾮接⼝类型创建⼀个JAVA代理,Enhancer动态的创建给定类的⼦类并且拦截代理类的所有的⽅法,和JDK动态代理不⼀样的是不管是接⼝还是类它都能正常⼯作
sping的动态代理通过代理类为⽬标对象增加额外功能。
代理本质 = ⽬标对象+额外功能+代理对象的接⼝
开发步骤:
1,创建原始对象
2,提供额外功能(实现下⾯的接⼝)
MethodBeforeAdvice 额外功能需要运⾏在原始⽅法之前执⾏.
AfterReturningAdvice 额外功能需要运⾏在原始⽅法之后执⾏
MethodInterceptor 额外功能需要运⾏在原始⽅法之前后执⾏
ThrowsAdvice 额外功能运⾏在原始⽅法抛出异常的执⾏
3,配置切⼊点
<aop:pointcut expression="execution(* *(..))"/>
4,组装切⼊点和代理功能
<aop:advisor pointcut-ref="pc" advice-ref="代理功能的bean"/>
4、spring事务的实现及其原理
Spring事务的本质其实就是数据库对事务的⽀持,没有数据库的事务⽀持,spring是⽆法提供事务功能的。
(1)Spring事务的种类:
spring⽀持编程式事务管理和声明式事务管理两种⽅式:
①编程式事务管理使⽤TransactionTemplate。
②声明式事务管理建⽴在AOP之上的。其本质是通过AOP功能,对⽅法前后进⾏拦截,将事务处理的功能编织到拦截的⽅法中,也就是在⽬标⽅法开始之前加⼊⼀个事务,在执⾏完⽬标⽅法之后根据执⾏情况提交或者回滚事务。
声明式事务最⼤的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置⽂件中做相关的事务规则声明或通过@Transactional注解的⽅式,便可以将事务规则应⽤到业务逻辑中。
声明式事务管理要优于编程式事务管理,这正是spring倡导的⾮侵⼊式的开发⽅式,使业务代码不受污染,只要加上注解就可以获得完全的事务⽀持。唯⼀不⾜地⽅是,最细粒度只能作⽤到⽅法级别,⽆法做到像编程式事务那样可以作⽤到代码块级别。
(2)spring的事务传播⾏为:
spring事务的传播⾏为说的是,当多个事务同时存在的时候,spring如何处理这些事务的⾏为。
① PROPAGATION_REQUIRED:如果当前没有事务,就创建⼀个新事务,如果当前存在事务,就加⼊该事务,该设置是最常⽤的设置。
② PROPAGATION_SUPPORTS:⽀持当前事务,如果当前存在事务,就加⼊该事务,如果当前不存在事务,就以⾮事务执⾏。‘
③ PROPAGATION_MANDATORY:⽀持当前事务,如果当前存在事务,就加⼊该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,⽆论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则按REQUIRED属性执⾏。
(3)Spring中的隔离级别:
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使⽤数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外⼀个事务可以看到这个事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证⼀个事务修改的数据提交后才能被另⼀事务读取,⽽且能看到该事务对已有记录的更新。解决脏读问题
④ ISOLATION_REPEATABLE_READ:可重复读,保证⼀个事务修改的数据提交后才能被另⼀事务读取,但是不能看到该事务对已有记录的更新。⾏锁
⑤ ISOLATION_SERIALIZABLE:⼀个事务在执⾏的过程中完全看不到其他事务对数据库所做的更新。表锁
(3)只读属性(readOnly)
false应⽤在查询操作时,提⾼查询效率, true⽤于查询,false⽤于增删改,默认是false
(4)超时属性(timeout) 秒 -1 由数据库决定
如果当前事务操作的数据,被别的事务锁住,那么通过超时数据指定最多等待多少秒.
(5)异常属性(+-Exception)
默认Spring会对RuntimeException及其⼦类进⾏回滚操作
默认Spring会对Exception及其⼦类进⾏提交操作
rollback-for=”异常的权限定名” 回滚操作
no-rollback-for=”java.lang.RuntimeException” 提交操作
简单展⽰
5、Spring有⼏种配置⽅式?
将Spring配置到应⽤开发中有以下三种⽅式:
基于XML的配置
基于注解的配置(主流)
基于Java的配置
6、Spring 框架中都⽤到了哪些设计模式?
⼯⼚模式:BeanFactory就是简单⼯⼚模式的体现,⽤来创建对象的实例;
单例模式:Bean默认为单例模式。
代理模式:Spring的AOP功能⽤到了JDK的动态代理和CGLIB字节码⽣成技术;
模板⽅法:⽤来解决代码重复的问题。⽐如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:定义对象键⼀种⼀对多的依赖关系,当⼀个对象的状态发⽣改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。
7、Spring的⾃动装配:
在spring中,对象⽆需⾃⼰查或创建与其关联的其他对象,由容器负责把需要相互协作的对象引⽤赋予各个对象,使⽤autowire来配置⾃动装载模式。
在Spring框架xml配置中共有5种⾃动装配:
(1)no:默认的⽅式是不进⾏⾃动装配的,通过⼿⼯设置ref属性来进⾏装配bean。
(2)byName:通过bean的名称进⾏⾃动装配,如果⼀个bean的 property 与另⼀bean 的name 相同,就进⾏⾃动装配。
(3)byType:通过参数的数据类型进⾏⾃动装配。
(4)constructor:利⽤构造函数进⾏装配,并且构造函数的参数通过byType进⾏装配。
(5)autodetect:⾃动探测,如果有构造⽅法,通过 construct的⽅式⾃动装配,否则使⽤ byType的⽅式⾃动装配。
基于注解的⽅式:
使⽤@Autowired注解来⾃动装配指定的bean。在使⽤@Autowired注解之前需要在Spring配置⽂件进⾏
配置,<context:annotation-config />。在启动spring IoC时,容器⾃动装载了⼀个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或
@Inject时,就会在IoC容器⾃动查需要的bean,并装配给该对象的属性。在使⽤@Autowired时,⾸先在容器中查询对应类型的bean:
如果查询结果刚好为⼀个,就将该bean装配给@Autowired指定的数据;
如果查询的结果不⽌⼀个,那么@Autowired会根据名称来查;
如果上述查的结果为空,那么会抛出异常。解决⽅法时,使⽤required=false。
@Autowired可⽤于:构造函数、成员变量、Setter⽅法
注:@Autowired和@Resource之间的区别
(1) @Autowired默认是按照类型装配注⼊的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
(2) @Resource默认是按照名称来装配注⼊的,只有当不到与名称匹配的bean才会按照类型来装配注⼊。
8、Spring如何处理线程并发问题?
在⼀般情况下,只有⽆状态的Bean才可以在多线程环境下共享,在Spring中,绝⼤部分Bean都可以声明为singleton作⽤域,因为Spring对⼀些Bean中⾮线程安全状态采⽤ThreadLocal进⾏处理,解决线程安全问题。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采⽤了“时间换空间”的⽅式,仅提供⼀份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。⽽ThreadLocal采⽤了“空间换时间”的⽅式。
ThreadLocal会为每⼀个线程提供⼀个独⽴的变量副本,从⽽隔离了多个线程对数据的访问冲突。因为每⼀个线程都拥有⾃⼰的变量副本,从⽽也就没有必要对该变量进⾏同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
9、解释Spring⽀持的⼏种bean的作⽤域。
Spring容器中的bean可以分为5个范围:
(1)singleton:默认,每个容器中只有⼀个bean的实例,单例的模式由BeanFactory⾃⾝来维护。
(2)prototype:为每⼀个bean请求提供⼀个实例。
(3)request:为每⼀个⽹络请求创建⼀个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,确保每个session中有⼀个bean的实例,在session过期后,bean会随之失效。
(5)global-session:全局作⽤域,global-session和Portlet应⽤相关。当你的应⽤部署在Portlet容器中⼯作时,它包含很多portlet。如果你想要声明让所有的portlet共⽤全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作⽤域与Servlet中的session作⽤域效果相同。
10、怎样开启注解装配?
注解装配在默认情况下是不开启的,为了使⽤注解装配,我们必须在Spring配置⽂件中配置 <context:annotation-config/>元素。
11、spring核⼼类有哪些?各有什么作⽤?
BeanFactory:产⽣⼀个新的实例,可以实现单例模式
BeanWrapper:提供统⼀的get及set⽅法
ApplicationContext:提供框架的实现,包括BeanFactory的所有功能
12、Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的。
到此这篇关于spring 常见⾯试题(附答案)的⽂章就介绍到这了,更多相关spring⾯试题内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章,希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论