来源:segmentfault.com/u/jack3021
Spring篇
1.Spring是什么?
Spring是一个轻量级的Ioc和AOP容器框架,简化开发,只需要关注业务需求。
2. Spring的优点?
-
Spring属于低侵入式设计,代码污染极低。
-
Spring的DI机制可以让容器帮我们管理对象之间的依赖,减少组件之间的耦合度。
-
Spring还提供了AOP技术可以将日志,通用任务进行集中管理,可以更好的复用。
3. Spring的AOP理解?
AOP就是面向切面,用于将和业务无关的逻辑代码抽取并封装成一个可用的模块,减少重复代码,降低模块之间的耦合度,提高系统的可维护性。
AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理,静态代理为AspectJ;动态代理为Spring AOP。
-
AspectJ是静态代理的增强,就是AOP框架会在编译阶段生成AOP代理类,将AspectJ织入进Java字节码中,运行的时候就是增强后的AOP对象。
-
Spring AOP使用的是动态代理,所谓动态代理就是AOP不会修改字节码,而是每次运行中在内存临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原始对象方法。
-
动态代理分为JDK和CGLib代理:
-
jdk动态代理是只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler通过invoke()方法反射来调用目标代码,动态的将和逻辑和业务编织在一起;然后利用InvocationHandler动态创建一个符合某一接口的实例生成目标类的代理对象。
-
如果代理类没有实现InvocationHandler接口,Spring AOP会选择CGLib代理,可以运行时动态的生成一个指定类的子类对象,并覆盖其中方法添加增强代码,CGLib是通过继承来做动态代理,如果某个类被标记为final,则无法使用CGLib做动态代理。
4.Spring的IOC理解?
IOC就是控制反转,就是对象创建时机由容器来控制,好处就是不需要主动new对象,spring会自动生产,使用java的反射机制,根据配置文件去创建对象。
有三种注入方式:1.构造器注入,2.setter注入,3.注解注入。
5. BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext都是Spring的核心接口,都可以当做Spring的容器。BeanFactroy是使用的延时加载来注入bean,只有当使用某个bean时候,才会进行加载,而ApplicationContext是在容器启动的时候就一次性创建所有Bean。
6.请解释Spring Bean的生命周期?
首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
-
实例化Bean
-
设置对象属性(依赖注入)
-
处理Aware接口
-
BeanPostProcessor(是否有自定义处理)
-
调用init-method
-
清理,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法
-
销毁
7.Spring的几种作用域?
-
Singleton:默认,每个容器只有一个,单例。
-
prototype:每个请求是一个实例。
-
request:每一个请求是一个实例,请求结束后进行垃圾回收。
-
session:每个session中有一个bean,如果session失效,bean随之失效。
-
global-session:全局作用域。
8.Spring的单例bean是线程安全的吗?
不是,只能自行保证线程安全。
9.Spring如何处理线程并发问题?
采用ThreadLocal进行处理,解决线程安全问题。
10.Spring自动装配@Autowired和@Resource之间的区别?
-
Autowired默认按照类型装配注入,默认情况下依赖的对象必须存在。
-
Resource默认按照名称来进行装配,只有当找不到名称匹配的bean的时候才会按照类型来注入。
11.Spring 框架中都用到了哪些设计模式?
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。
12. spring的事务传播行为?
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
13. Spring中的隔离级别?
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。
⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。
14.Spring通知有哪些类型?
-
前置通知
-
返回后通知
-
抛出异常通知
-
后置通知
-
环绕通知
15.Spring MVC 运行流程
-
Spring MVC会将所有请求交给DispatchServlet。
-
DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的controller。
-
然后DispatcherServlet将请求提交到目标Controller。
-
Controller进行业务逻辑处理后,返回一个ModelANdView。
-
Dispatcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象。
-
视图渲染后返回给客户端。
16.Spring单例实现原理
Spring对Bean实例创建采用的是单例注册表进行实现的,这个注册表缓存是ConcurrentHashMap对象。
17.请介绍你熟悉的Spring 核心类,并说明有什么作用?
-
BeanFactory:产生一个新的实例,实现单例模式
-
ApplicationContext:提供框架的实现,因为是BeanFactory的子接口所以包含BeanFactory的所有功能。
18.介绍一下 Spring 的事务的了解?
使用@Transactional注解,声明式注解是建立在AOP上,对方法的前后进行拦截,然后根据目标方法来判断是提交还是回滚事务。
19.介绍一下 Spring 的事务实现方式?
1、编程式事务,在代码中硬编码。(不推荐使用)
2、声明式事务,在配置文件中配置(推荐使用)
声明式事务又分为两种:
a、基于XML的声明式事务
b、基于注解的声明式事务
20.Spring Beans理解?
Spring Beans是Spring应用的核心对象,由IOC容器实例化、组装、管理。这些对象通过容器中配置的元数据进行创建。
21. 5种自动装配的各种模式?
用来装配Beans之间的依赖注入
-
no:默认的方式是不进行自动装配,通过手工ref属性来装配。
-
byName:通过参数名自动装配,Spring容器会试图匹配、装配和该bean属性相同名字的bean。
-
byType:通过参数的数据类型自动装配,Spring容器试图匹配和装配和该bean的属性类型一样的bean,如果有多个bean符合条件则报错。
-
constructor:适用于构造器相同参数的bean,如果在容器中没有找到相同的bean,则抛出异常。
-
autodetect:自动探测使用构造器还是byType自动装配,优先构造器,如果没有找到相对应的构造器,则适用byType进行自动装配。
22.IOC有什么优点?
单例,延迟加载,松耦合。
23.SpringBoot的核心启动主函数(main函数)的作用.用到哪些注解.注解的作用.
-
SpringBootConfiguration:组合了@Configuration注解,实现了配置文件功能。
-
EnableAutoConfiguration:打开自动配置。
-
ComponentScan:Spring组件扫描。
24.springboot中常用的starter的组件有哪些?
-
spring-boot-starter-parent //boot项目继承的父项目模块.
-
spring-boot-starter-web //boot项目集成web开发模块.
-
spring-boot-starter-tomcat //boot项目集成tomcat内嵌服务器.
-
spring-boot-starter-test //boot项目集成测试模块.
-
mybatis-spring-boot-starter //boot项目集成mybatis框架.
-
spring-boot-starter-jdbc //boot项目底层集成jdbc实现数据库操作支持.
25.在Spring AOP 中,关注点和横切关注的区别是什么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
26.切点
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。
更多精彩?
获取更多学习资料
视频 | 面试 | 技术 | 电子书
程序员编程:javaje
小编微信:BW22266688
我知道你“在看”
文章评论