Java开发框架和中间件面试题(1)

1.什么是Spring框架?

Spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性。

我们一般说的Spring框架就是Spring Framework,它是很多模块的集合,使用这些模块可以很方便的协助我们进行开发。这些模块是核心容器、数据访问/集成、web、aop(面向切面编程)、工具、消息和测试模块。比如core container中的core组件是Spring所有组件的核心,beans组件和context组件是实现IOC和DI的基础,AOP组件用来实现面向切面编程。

Spring官网列出的Spring的六个特征:

核心技术:依赖注入(DI)、AOP、事件(Events)、资源、i18n、验证、数据绑定、类型转换、SPEL。

测试:模拟对象、TestContext框架、Spring MVC测试、WebTestClient。

数据访问:事务、DAO支持、JDBC、ORM、编组XML。

Web支持:Spring MVC 和Spring Web Flux Web框架。

集成:远程处理、JMS、JCA、JMX、电子邮件、任务、调度、缓存。

语言:Kotlin,Groovy,动态语言。

2.列举一些重要的Spring模块?

下面对应的是Spring 4.X的版本,目前最新的5.X版本中Web模块的Portlet组件已经被废弃掉,同时增加了用于异常响应的Web Flux组件。

Spring Core:基础,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。

Spring Aspects:该模块为与Aspects的集成提供支持。

Spring AOP:面向切面编程。

Spring JDBC:Java数据库连接。

Spring JMS:Java消息服务。

Spring ORM:用于支持Hibernate等ORM工具。

Spring Web:为创建Web应用程序提供支持。

Spring Test:提供了对Junit和TestNG测试的支持。

3.什么事IOC?如何实现的?

IOC(控制反转)是一种设计思想,就是将本来在程序中手动创建对象的控制权,交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何创建出来的。

Spring 中的 IOC的实现原理就是工厂模式加反射机制。

4.Spring AOP和AspectJ AOP 有什么区别?

Spring AOP 是属于运行时增强,而AspectJ是编译时增强。Spring Aop 基于代理,而AspectJ基于字节码操作。

Spring AOP 已经集成了Aspect J ,Aspect J 应该算得上是Java 生态系统中最完整的AOP框架了。Aspect J相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择Aspect J ,它比Spring AOP快很多。

5.Spring中的bean的作用域有哪些?

1.singleton:唯一bean实例,Spring 中的bean默认都是单例的。

2.prototype:每次请求都会创建一个新的bean实例。

3.request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

4.session:每一次Http请求都会产生一个新的bean,该bean仅在当前Http Session内有效。

5.global session:全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5中已经没有了。

6.Spring 中的单例bean的线程安全问题了解吗?

大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

有两种常见的解决方案:

1.在bean对象中尽量避免定义可变的成员变量(不太现实)。

2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在TheadLocal中(推荐的一种方式)。

7.Spring中的bean生命周期?

bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:

bean自身的方法:这个包括类Bean本身调用的方法和通过配置文件中<bean>的初始化方法和销毁方法指定的方法。

bean 级生命周期接口方法:这个包括了BeanNameAware,BeanFactoryAware,ApplicationContextAware,

当然也包括initializingBean和DisposableBean这些接口的方法(可以被@PostConstructe和@PreDestroy注解替代)

容器级生命周期接口方法:这个包括类InstantiationAwareBeanPostProcessor和BeanPostProcessor这两个接口实现,一般称它们的实现类为后处理器。

工厂后处理器接口方法:

这个包括了AspectJWeavingEnabler,ConfigurationClassPostProcessor,

CustomAutowireCofigure等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级别的。在应用上下文装配配置文件之后立即调用。

具体而言,流程如下:

1.如果BeanFactoryPostProcessor和Bean 关联,则调用postProcessBeanFactory方法(即首先尝试从bean工厂中获取bean)。

2.如果InstantiationAwareBeanPostProcessor和Bean关联,则调用postProcessBeforeInstantiation方法。

3.根据配置情况调用Bean构造方法实例化Bean。

4.利用依赖注入完成Bean中所有属性值的配置注入。

5.如果InstantiationAwareBeanPostProcessor和Bean关联,则调用postProcessAfterInstantiation方法和post ProcessProperties.

调用xxAware接口:

第一类Aware接口

如果Bean实现了BeanNameAware接口,则Spring调用Bean的set BeanName()方法传入当前Bean的ID值。

如果Bean实现了BeanFactoryAware接口,则Spring调用set BeanFactory()方法传入当前工厂实例的引用。

第二类Aware接口

如果Bean实现了EnvironmentAware接口,则Spring调用setEnvironment()方法传入当前Environment实例的引用。

如果Bean实现了EmbeddedValueResolverAware接口,则Spring调用setEmbeddedValueResolver()方法传入当前StringValueResolver实例的引用。

如果Bean实现了ApplicationContextAware接口,则Spring调用setApplicationContext()方法传入当前的ApplicationContext实例的引用。

6.如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法。

postProcessBeforeInititiazation()对bean进行加工操作,此处非常重要,Spring 的Aop就是利用它实现的。

7.如果Bean实现了initializingBean接口,则Spring将调用afterPropertiesSet()方法。(或者执行@PostConstruct注解的方法)

8.如果在配置文件中通过init method属性指定了初始化方法,则调用该初始化方法。

9.如果BeanPostProcessor和Bean关联,则Spring将调用该接口的初始化方法。

postProcessAfterInitialization().此时,Bean已经可以被应用系统使用了。

10,如果在<bean>中指定了该Bean的作用范围为scope="singleton",则将该Bean放入SpringIoc的缓存池中,将触发Spring对该Bean的生命周期管理,如果在<bean>中指定了该Bean的作用范围为scope="prototype",则将该Bean交给调用者,,调用者管理该Bean的生命周期,Spring不再管理该Bean。

11.如果Bean实现了DisposableBean接口,则Spring会调用destroy()方法将Spring中的Bean销毁;(或者有执行@PreDestroy注解的方法)

如果在配置文件中通过destroy method属性指定了Bean的销毁方法,则Spring将调用该方法对Bean进行销毁。

相关推荐
什么想法都无10 分钟前
stream
java·java stream
m0_7482336411 分钟前
WebService简介
java
Murphy202311 分钟前
.net4.0 调用API(form-data)上传文件及传参
开发语言·c#·api·httpwebrequest·form-data·uploadfile·multipart/form-
love静思冥想11 分钟前
Stream `Collectors.toList()` 和 `Stream.toList()` 的区别(Java)
java·stream
我曾经是个程序员21 分钟前
C#Directory类文件夹基本操作大全
服务器·开发语言·c#
白云~️23 分钟前
uniappX 移动端单行/多行文字隐藏显示省略号
开发语言·前端·javascript
编码浪子28 分钟前
构建一个rust生产应用读书笔记7-确认邮件2
开发语言·后端·rust
Ch.yang30 分钟前
【Spring】 Bean 注入 HttpServletRequest 能保证线程安全的原理
java·spring·代理模式
web1508509664131 分钟前
基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)
java
昙鱼39 分钟前
springboot创建web项目
java·前端·spring boot·后端·spring·maven