最全真肝,整理了一周的Spring面试大全【含答案】,吊打Java面试官,java排序面试题

Kafka进阶篇知识点

image

Kafka高级篇知识点

image

44个Kafka知识点(基础+进阶+高级)解析如下

image

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

Q3:使 用 Spring 缺点是什么?

Q4:IoC 是什么?

Q5:IOC的优点是什么

Q6:IoC 容器初始化过程?

Q7:依赖注⼊的实现方法有哪些?

Q8:依赖注⼊的相关注解?

Q9:依赖注入的过程?

Q10:Bean 的生命周期?

Q11:Bean 的作⽤范围?

Q12:如何通过 XML ⽅式创建 Bean?

Q13:Spring 有几种配置方式?

Q14:如何用基于 XML 配置的方式配置 Spring?

Q15:如何通过注解创建 Bean?

Q17:如何通过注解配置⽂件?

Q18:BeanFactory、FactoryBean 和ApplicationContext 的区别?

Q19. 解 释 Spring 框 架 中 bean 的 生 命 周 期 。

Q20、怎样开启注解装配 ?

Q21:Spring 支 持 的 ORM有那些?,

Q22、Spring 框架中的单例 Beans 是线程安全的么?

Q23:Spring 框架中都用到了哪些设计模式?

Q24、请举例解释@Autowired 注解?


Q1 什 么 是 spring?

Spring是个java企业级应用的开源开发框架 。Spring主要用来开发 Java应用,但是有些扩展是针 对构建J2EE 平台的web应用 。Spring 框 架目标是简化Java企业级应用开发,并通过 POJO为基 础的编程模型促进良好的编程习惯 。

Q2:使 用 Spring 框 架 的 好 处 是 什 么 ?

• 轻量 :Spring 是轻量的,基本的版本大约2MB。

• 控制反转 :Spring 通过控制反转实现了松散耦合 ,对象们给出它们的依 赖 ,而不是创建或查找依赖的对象们 。面向切面的编程(AOP):Spring 支持面向切面的编程 ,并且把应用业务逻辑和系统服务分开。容器 :Spring 包含并管理应用中对象的生命周期和配置 。

Dependency Injection(DI) 方法使得构造器和 JavaBean properties 文件中的依赖关系一目了然。

与 EJB 容器相比较,IoC 容器更加趋向于轻量级。这样一来IoC 容器在有限的内存和 CPU 资源的情况下进行应用程序的开发和发布就变得十分有利。

Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部。

• MVC框架:Spring 的 WEB 框 架 是个精心设计的框架,是 Web 框架的一个很好的替代品。

• 事务管理 :Spring 提供一个持 续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA) 。

• 异常处理 :Spring 提供方便的 API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的) 转化为一致的unchecked异常。

Q3:使 用 Spring 缺点是什么?

1,缺少一个公用控制器;

2,没有SpringBoot好用;

3,Spring像一个胶水,将框架黏在一起,后面拆分的话就不容易拆分了。

总结下Spring的优点和缺点。

Q4:IoC 是什么?

IoC即控制反转,简单来说就是把原来代码⾥需要实现的对象创建、依赖反转给容器来帮忙实现,需要创建⼀个容器并且需要⼀种描述让容器知道要创建的对象间的关系,在 Spring 中管理对象及其依赖关系是通过 Spring 的 IoC 容器实现的。

IoC 的实现方式有依赖注⼊和依赖查找,由于依赖查找使⽤的很少,因此 IoC 也叫做依赖注⼊。

依赖注入具体怎么实现的呢?

依赖注⼊指对象被动地接受依赖类⽽不用自己主动去找,对象不是从容器中查找它依赖的类,而是在容器实例化对象时主动将它依赖的类注入给它。假设⼀个 Car 类需要⼀个 Engine 的对象,那么⼀般需要手动 new一个 Engine,利用 IoC 就只需要定义⼀个私有的 Engine 类型的成员变量,容器会在运行时自动创建⼀个 Engine 的实例对象并将引用自动注⼊给成员变量。

Q5:IOC的优点是什么

IOC 或依赖注入把应用的代码量 降到最低。 它使应 容易测试 ,单元测试不再 需 要 单 例 和 JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现 。IOC容器支持加 载 服务时的饿汉式初始化和懒加载 。

Q6:IoC 容器初始化过程?

基于 XML 的容器初始化,当创建⼀个 ClassPathXmlApplicationContext 时,构造方法做了两件事:

① 调用父容器的构造方法为容器设置好 Bean 资源加载器。

② 调用父类的路径。方法设置 Bean 配置信息定位。

ClassPathXmlApplicationContext 通过调用父类 AbstractApplicationContext 的方法启动

整个 IoC 容器对 Bean 定义的载入过程, refresh 是⼀个模板方法,规定了 IoC 容器的启动流程。在创建 IoC 容器前如果已有容器存在,需要把已有的容器销毁,保证在的 IoC 容器。

方法后使用的是新创建容器创建后通过方法加载 Bean 配置资源,该方法做两件事:

① 调用资源加载器的方法获取要加载的资源。

② 真正执行加载功能,由子类 XmlBeanDefinitionReader 实现。加载资源时⾸先解析配置文件路径,读取配置文件的内容,然后通过 XML 解析器将 Bean 配置信息转换成⽂档对象,之后按照 Spring Bean 的定义规则对⽂档对象进⾏解析。

Spring IoC 容器中注册解析的 Bean 信息存放在⼀个 HashMap 集合中,key 是字符串,值是BeanDefinition,注册过程中需要使⽤ synchronized 保证线程安全。当配置信息中配置的 Bean 被解析且被注册到 IoC 容器中后,初始化就算真正完成了,Bean 定义信息已经可以使⽤且可被检索。Spring IoC 容器的作用就是对这些注册的 Bean 定义信息进⾏处理和维护,注册的 Bean 定义信息是控制反转和依赖注⼊的基础。

基于注解的容器初始化分为两种:① 直接将注解 Bean 注册到容器中,可以在初始化容器时注册,也可以在容器创建之后⼿动注册,然后刷新容器使其对注册的注解 Bean 进行处理。② 通过扫描指定的包及其子包的所有类处理, 在初始化注解容器时指定要⾃动扫描的路径。

Q7:依赖注⼊的实现方法有哪些?

构造方法注入: IoC Service Provider 会检查被注⼊对象的构造⽅法,取得它所需要的依赖对象列表,进⽽为其注⼊相应的对象。这种方法的优点是在对象构造完成后就处于就绪状态,可以马上使用。缺点是当依赖对象较多时,构造⽅法的参数列表会比较长,构造方法无法被继承,无法设置默认值。对于非必需的依赖处理可能需要引⼊多个构造方法,参数数量的变动可能会造成维护的困难。

setter 方法注入:当前对象只需要为其依赖对象对应的属性添加 setter 方法,就可以通过 setter 方法将依赖对象注入到被依赖对象中。setter方法注⼊在描述性上要比构造方法注⼊强,并且可以被集成, 允许设置默认值。缺点是无法在对象构造完成后马上进⼊就绪状态。

接口注入:必须实现某个接口,接口提供方法来为其注⼊依赖对象。使用少,因为它强制要求被注入对象实现不必要接口,侵入性强。

Q8:依赖注入的相关注解?

@Autowired :自动按类型注⼊,如果有多个匹配则按照指定 Bean 的 id 查找,查找不到会报错。

@Qualifier :在自动按照类型注入的基础上再按照 Bean 的 id 注入,给变量注入时必须搭配。

@Autowired ,给方法注⼊时可单独使⽤。直接按照 Bean 的 id 注入,只能注入Bean 类型。

Q9:依赖注入的过程?

方法获取 Bean 实例,该方法调⽤Bean 的功能,也是触发依赖注入的地方。具体创建 Bean 对象的过程由 ObjectFactory 的, doGetBean 真正实现从 IoC 容器获取完成,该方法主要通过依赖注入进⾏处理。方法生成Bean 包含的 Java 对象实例和方法对 Bean 属性的。

在 populateBean 方法中,注入过程主要分为两种情况:① 属性值类型不需要强制转换时,不需要解析属性值,直接进行依赖注入。②属性值类型需要强制转换时,首先解析属性值,然后对解析后的属性值进行依赖注⼊。依赖注入的过程就是将 Bean 对象实例设置到它所依赖的 Bean 对象属性上,真正的

依赖注入是通过方法实现的,该方法使用了委派模式。

BeanWrapperImpl 类负责对完成初始化的 Bean 对象进行依赖注入,对于非集合类型属性,使用 JDK反射,通过属性的 setter 方法为属性设置注入后的值。对于集合类型的属性,将属性值解析为⽬标类型的集合后直接赋值给属性。

当容器对 Bean 的定位、载入、解析和依赖注⼊全部完成后就不再需要手动创建对象,IoC 容器会⾃动为我们创建对象并且注入依赖。

Q10:Bean 的生命周期?

在 IoC 容器的初始化过程中会对 Bean 定义完成资源定位,加载读取配置并解析,最后将解析的 Bean 信息放在⼀个 HashMap 集合中。当 IoC 容器初始化完成后,会进行对 Bean 实例的创建和依赖注⼊过程,注⼊对象依赖的各种属性值,在初始化时可以指定自定义的初始化方法。经过这⼀系列初始化操作后 Bean 达到可⽤状态,接下来就可以使⽤ Bean 了,当使用完成后会调⽤ destroy 方法进⾏销毁,此时也可以指定⾃定义的销毁方法,最终 Bean 被销毁且从容器中移除。

XML 方式通过配置 bean 标签中的 init-Method 和 destory-Method 指定自定义初始化和销毁方法。注解方式通过和注解指定⾃定义初始化和销毁方法。

@PostConstruct 和@PreDestroy 注解方式,使用 customInit()和customDestroy()方法管理 bean 生命周期的代码样例如下:

1. <beans>

2. <bean id="demoBean"

class="com.springmeng.task.DemoBean"

3. init-method="customInit" destroymethod="customDestroy"></bean>

4. </beans>

更多内容请参考:Spring 生命周期 Spring Bean Life Cycle:

https://howtodoinjava.com/spring-core/spring-beanlife-cycle/

Q11:Bean 的作⽤范围?

通过 scope 属性指定 bean 的作用范围,包括:

① singleton:单例模式,是默认作用域,不管收到多少 Bean 请求每个容器中只有⼀个唯⼀的 Bean 实例。

② prototype:原型模式,和 singleton 相反,每次 Bean 请求都会创建⼀个新的实例。

③ request:每次 HTTP 请求都会创建⼀个新的 Bean 并把它放到 request 域中,在请求完成后 Bean会失效并被垃圾收集器回收。

④ session:和 request 类似,确保每个 session 中有⼀个 Bean 实例,session 过期后bean会随之失效。

⑤ global session:当应⽤部署在 Portlet 容器时,如果想让所有 Portlet 共⽤全局存储变量,那么该变量需要存储在 global session 中。

Q12:如何通过 XML ⽅式创建 Bean?

默认无参构造方法,只需要指明 bean 标签中的 id 和 class 属性,如果没有无参构造方法报错。

静态工厂方法,通过 bean 标签中的 class 属性指明静态工厂,factory-method 属性指明静态工厂方法。

实例工厂方法,通过 bean 标签中的 factory-bean 属性指明实例工厂,factory-method 属性指明实例工厂方法。

Q13、Spring 有几种配置方式?

将 Spring 配置到应用开发中有以下三种方式:

  1. 基于 XML 的配置

  2. 基于注解的配置

  3. 基于 Java 的配置

Q14如何用基于 XML 配置的方式配置 Spring?

在 Spring 框架中,依赖和服务需要在专门的配置文件来实现,我常用的 XML 格式的配置文件。这些配置文件的格式通常用开头,然后一系列的 bean 定义和专门的应用配置选项组成。

SpringXML 配置的主要目的时候是使所有的 Spring 组件都可以用 xml 文件的形式来进行配置。这意味着不会出现其他的Spring 配置类型(比如声明的方式或基于 Java Class 的配置方式)。Spring 的 XML 配置方式是使用被 Spring 命名空间的所支持的一系列的 XML 标签来实现的。Spring 有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc 和 aso。

1. <beans>

2.

3. <!-- JSON Support -->

4. <bean name="viewResolver"

class="org.springframework.web.servlet.view.BeanNameVi

ewResolver"/>

5. <bean name="jsonTemplate"

class="org.springframework.web.servlet.view.json.Mappi

ngJackson2JsonView"/>

6.

7. <bean id="restTemplate"

class="org.springframework.web.client.RestTemplate"/>

8.

9. </beans>

Q15:如何通过注解创建 Bean?

把当前类对象存入 Spring 容器中,相当于在 xml 中配置⼀个 bean 标签。value 属性指定 bean 的 id,默认使用当前类的字母首小写的类名。

@Controller,@Service ,@Repository 三个注解都是的衍生注解,作用及属性都是⼀模⼀样的。只是提供了更加明确语义, @Controller 用于控制层,@Service用于业务层,@Repository 用于持久层。如果注解中有且只有⼀个 value 属性要赋值时可以省略 value。

如果想将第三方的类变成组件又没有源代码,也就没办法使用 进行自动配置,这种时候就要使⽤注解。被注解的⽅法返回值是⼀个对象,将会实例化,配置和初始化⼀个新对象并返回,这个对象由 Spring 的 IoC 容器管理。name 属性用于给当前注解方法创建的对象指定⼀个名称,即 bean 的 id。当使用注解配置方法时,如果方法有参数,Spring 会去容器查找是否有可⽤ bean对象,查找方式和⼀样。

1. <web-app>

2. <display-name>Archetype Created Web

Application</display-name>

3.

4. <servlet>

5. <servlet-name>spring</servlet-name>

6. <servlet-class>

7.

org.springframework.web.servlet.DispatcherServlet

8. </servlet-class>

9. <load-on-startup>1</load-on-startup>

10. </servlet>

11.

12. <servlet-mapping>

13. <servlet-name>spring</servlet-name>

14. <url-pattern>/</url-pattern>

15. </servlet-mapping>



# 最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

**《Java高级面试》**

![](https://img-blog.csdnimg.cn/img_convert/2b0338ba3eaaf43f08a6cfe3093d35eb.webp?x-oss-process=image/format,png)

**《Java高级架构知识》**

![](https://img-blog.csdnimg.cn/img_convert/d2130e4a01f6880486e638a6cea63b3c.webp?x-oss-process=image/format,png)

**《算法知识》**

![](https://img-blog.csdnimg.cn/img_convert/7bfa31b54c5299ae77d70aa7e73abb1a.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**




# 最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

**《Java高级面试》**

[外链图片转存中...(img-elqyBrhN-1715610228810)]

**《Java高级架构知识》**

[外链图片转存中...(img-S3yXryow-1715610228811)]

**《算法知识》**

[外链图片转存中...(img-QqRBYRZD-1715610228811)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值