Java面试-Spring

2020年8月27日 332点热度 0人点赞 0条评论

图片

来源: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。

  1. AspectJ是静态代理的增强,就是AOP框架会在编译阶段生成AOP代理类,将AspectJ织入进Java字节码中,运行的时候就是增强后的AOP对象。

  2. Spring AOP使用的是动态代理,所谓动态代理就是AOP不会修改字节码,而是每次运行中在内存临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原始对象方法。

  3. 动态代理分为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;

  1. 实例化Bean

  2. 设置对象属性(依赖注入)

  3. 处理Aware接口

  4. BeanPostProcessor(是否有自定义处理)

  5. 调用init-method

  6. 清理,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法

  7. 销毁

7.Spring的几种作用域?

  1. Singleton:默认,每个容器只有一个,单例。

  2. prototype:每个请求是一个实例。

  3. request:每一个请求是一个实例,请求结束后进行垃圾回收。

  4. session:每个session中有一个bean,如果session失效,bean随之失效。

  5. global-session:全局作用域。

8.Spring的单例bean是线程安全的吗?

不是,只能自行保证线程安全。

9.Spring如何处理线程并发问题?

采用ThreadLocal进行处理,解决线程安全问题。

10.Spring自动装配@Autowired和@Resource之间的区别?

  1. Autowired默认按照类型装配注入,默认情况下依赖的对象必须存在。

  2. 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通知有哪些类型?

  1. 前置通知

  2. 返回后通知

  3. 抛出异常通知

  4. 后置通知

  5. 环绕通知

15.Spring MVC 运行流程

  1. Spring MVC会将所有请求交给DispatchServlet。

  2. DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的controller。

  3. 然后DispatcherServlet将请求提交到目标Controller。

  4. Controller进行业务逻辑处理后,返回一个ModelANdView。

  5. Dispatcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象。

  6. 视图渲染后返回给客户端。

16.Spring单例实现原理

Spring对Bean实例创建采用的是单例注册表进行实现的,这个注册表缓存是ConcurrentHashMap对象。

17.请介绍你熟悉的Spring 核心类,并说明有什么作用?

  1. BeanFactory:产生一个新的实例,实现单例模式

  2. ApplicationContext:提供框架的实现,因为是BeanFactory的子接口所以包含BeanFactory的所有功能。

18.介绍一下 Spring 的事务的了解?

使用@Transactional注解,声明式注解是建立在AOP上,对方法的前后进行拦截,然后根据目标方法来判断是提交还是回滚事务。

19.介绍一下 Spring 的事务实现方式?

1、编程式事务,在代码中硬编码。(不推荐使用)

2、声明式事务,在配置文件中配置(推荐使用)

声明式事务又分为两种:

a、基于XML的声明式事务

b、基于注解的声明式事务

20.Spring Beans理解?

Spring Beans是Spring应用的核心对象,由IOC容器实例化、组装、管理。这些对象通过容器中配置的元数据进行创建。

21. 5种自动装配的各种模式?

用来装配Beans之间的依赖注入

  1. no:默认的方式是不进行自动装配,通过手工ref属性来装配。

  2. byName:通过参数名自动装配,Spring容器会试图匹配、装配和该bean属性相同名字的bean。

  3. byType:通过参数的数据类型自动装配,Spring容器试图匹配和装配和该bean的属性类型一样的bean,如果有多个bean符合条件则报错。

  4. constructor:适用于构造器相同参数的bean,如果在容器中没有找到相同的bean,则抛出异常。

  5. autodetect:自动探测使用构造器还是byType自动装配,优先构造器,如果没有找到相对应的构造器,则适用byType进行自动装配。

22.IOC有什么优点?

单例,延迟加载,松耦合。

23.SpringBoot的核心启动主函数(main函数)的作用.用到哪些注解.注解的作用.

  1. SpringBootConfiguration:组合了@Configuration注解,实现了配置文件功能。

  2. EnableAutoConfiguration:打开自动配置。

  3. 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.切点

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

更多精彩?

在公众号对话框输入以下关键词
查看更多优质内容!
大数据 | Java | 1024 | 电子书 | 速查表 
Python进阶 | 面试 | 手册 | 成神 | 思想 | 小程序
命令行 | 人工智能 | 软件测试 | Web前端 | Python

图片

扫码关注我们

获取更多学习资料

视频 | 面试 | 技术 | 电子书 

程序员编程:javaje

小编微信:BW22266688

我知道你“在看”

图片
7860Java面试-Spring

root

这个人很懒,什么都没留下

文章评论