Spring和SpringMVC常见面试题,队列java 面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

6. AspectJ 注解有哪些并说明?


1、@Before — 前置通知,在连接点方法前调用;

2、@Around — 环绕通知,它将覆盖原有方法,但是允许你通过反射调用原有方法;

3、@After — 后置通知,在连接点方法后调用;

4、@AfterReturning — 返回通知,在连接点方法执行并正常返回后调用,要求连接点方法在执行过程中没有发生异常;

5、@AfterThrowing — 异常通知,当连接点方法异常时调用。

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


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

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于

Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。

8. Spring 中的 AOP 的底层实现原理是什么?


Spring AOP的底层都是通过代理来实现的:

1、一种是基于JDK的动态代理;

2、一种是基于CgLIB的动态代理;

9. 使用拦截器的优点是什么?


拦截器是基于Java反射机制实现的,使用代理模式;

1、拦截器不依赖于servlet容器;

2、拦截器只能对action请求起作用;

3、拦截器可以访问action上下文;

4、拦截器可以获取IoC容器中的各个bean;

5、在action生命周期中,拦截器可以被多次调用;

9、SpringMvc里面拦截器是怎么写的:

有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:

mvc:interceptors

mvc:interceptor

<mvc:mapping path=“/modelMap.do” />

</mvc:interceptor>

</mvc:interceptors>

10. Spring 通知类型有哪些?


Spring 通知类型总共有 5 种:前置通知、环绕通知、后置通知、异常通知、最终通知。

1、前置通知(Before advice):在目标方法执行之前执行的通知。在某连接点( join point )之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

2、环绕通知(Around Advice):在目标方法执行之前和之后都可以执行额外代码的通知,也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

3、后置通知(After (finally) advice):目标方法执行之后(某连接点退出的时候)执行的通知(不论是正常返回还是异常退出)。

4、异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。

5、最终通知(After returning advice):在某连接点(join point)正常完成后执行的通知,例如,一个方法没有抛出任何异常,正常返回。

11. 什么是IoC?


IoC,Inversion of Control(控制反转),是一种设计思想,在Java开发中,将你设计好的对象交给容器控制,而不是显示地用代码进行对象的创建。 把创建和查找依赖对象的控制权交给 IoC 容器,由 IoC 容器进行注入、组合对象。这样对象与对象之间是松耦合、便于测试、功能可复用(减少对象的创建和内存消耗),使得程序的整个体系结构可维护性、灵活性、扩展性变高。

形象的说:你去某地旅游不再用自己亲自为订购 A 酒店还是 B 酒店而发愁了,只需要把住店的需求告诉给某个托管平台,这个托管平台就会帮你订购一个既便宜又舒适的酒店,而这个帮你订购酒店的行为就可以称之为控制反转。

12. 为什么使用IoC?


使用IoC有以下好处:

1、资源集中管理,实现资源的可配置和易管理;

2、降低了资源的依赖程度,即松耦合;

3、便于测试;

4、功能可复用(减少对象的创建和内存消耗);

5、使得程序的整个体系结构可维护性、灵活性、扩展性变高;

13. 什么是DI?


DI(Dependency Injection)依赖注入,是组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

14. IoC 和 DI 的关系是?


DI 是实现 IoC 的方法和手段;

15. spring有哪些主要模块?


1、Spring Core

框架的最基础部分,提供 IoC 容器,对 bean 进行管理。

2、Spring Context

基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。

3、Spring DAO

提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。

4、Spring ORM

提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate、MyBatis 等。

5、Spring AOP

提供了符合AOP Alliance规范的面向方面的编程实现。

6、Spring Web

提供了基础的 Web 开发的上下文信息,可与其他 web 进行集成。

7、Spring Web MVC

提供了 Web 应用的 Model-View-Controller 全功能实现。

16. 依赖注入的常见实现方式有哪些?


1、setter 注入(注入方式又分为java代码注入和XML配置注入);

2、构造方法注入;

3、注解注入;

4、静态工厂注入;

5、实例工厂注入;

17. spring中的bean是线程安全的吗?


Spring 不保证 bean 的线程安全。默认 spring 容器中的 bean 是单例的。当单例中存在竞态条件,即有线程安全问题。

18. spring支持几种bean的作用域?


1、singleton:单例模式,在整个Spring IoC容器中,使用 singleton 定义的 bean 只有一个实例;

2、prototype:原型模式,每次通过容器的getbean方法获取 prototype 定义的 bean 时,都产生一个新的 bean 实例;

只有在 Web 应用中使用Spring时,request、session、global-session 作用域才有效;

3、request:对于每次 HTTP 请求,使用 request 定义的 bean 都将产生一个新实例,即每次 HTTP 请求将会产生不同的 bean 实例;

4、session:同一个 Session 共享一个 bean 实例;

5、global-session:同 session 作用域不同的是,所有的Session共享一个Bean实例;

19. 使用单例模式的好处是什么?


对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。

20. spring自动装配bean有哪些方式?


spring 配置文件中 节点的 autowire 参数可以控制 bean 自动装配的方式;

1、default - 默认的方式和 “no” 方式一样;

2、no - 不自动装配,需要使用 < ref />节点或参数;

3、byName - 根据名称进行装配;

4、byType - 根据类型进行装配;

5、constructor - 根据构造函数进行装配;

21. 什么是 Spring 的内部 bean?


当一个 bean 仅被用作另一个 bean 的属性时,它能被声明为一个内部 bean,为了定义 inner Bean,在 Spring 的基于 XML 的配置元数据中,可以在< property/> 或 < constructor-arg/> 元素内使用 < bean/> 元素,内部 bean 通常是匿名的,它们的 Scope 一般是 prototype。

22. @Component 和 @Bean 有什么区别?


它们的作用对象不同:@Component 作用于类,而 @Bean 注解作用于方法。

@Component 通常是通过类路径扫描来自动侦测和装配对象到 Spring 容器中,比如 @ComponentScan 注解就是定义扫描路径中的类装配到 Spring 的 Bean 容器中;@Bean 注解是告诉 Spring 这是某个类的实例,当我需要用它的时把它给我,@Bean 注解比 @Component 注解自定义性更强,很多地方我们只能通过 @Bean 注解来注册 Bean,比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean 来实现。

23. 你知道 spring 中 Bean 的生命周期吗?


Spring 中 Bean 的生命周期如下:

① 实例化 Bean:对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 Bean 时,或初始化 Bean 的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefinition 对象中的信息,实例化所有的 Bean;

② 设置对象属性(依赖注入):实例化后的对象被封装在 BeanWrapper 对象中,紧接着 Spring 根据 BeanDefinition 中的信息以及通过 BeanWrapper 提供的设置属性的接口完成依赖注入;

③ 处理 Aware 接口:Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean:

如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String BeanId) 方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值;

如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory() 方法,传递的是 Spring 工厂自身;

如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用 setApplicationContext(ApplicationContext) 方法,传入 Spring 上下文;

④ BeanPostProcessor:如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization(Object obj, String s) 方法;

⑤ InitializingBean 与 init-method:如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法;

⑥ 如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s) 方法;由于这个方法是在 Bean 初始化结束时调用的,因而可以被应用于内存或缓存技术;

以上几个步骤完成后,Bean 就已经被正确创建了,之后就可以使用这个 Bean 了。

⑦ DisposableBean:当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy() 方法;

⑧ destroy-method:最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。

24. BeanFactory 和 ApplicationContext对比?


Spring使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象;

BeanFactory :延迟注入(使用到某个 bean 的时候才会注入),相比于BeanFactory 来说会占用更少的内存,程序启动速度更快。

ApplicationContext :容器启动的时候,不管你用没用到,一次性创建所有 bean 。BeanFactory 仅提供了最基本的依赖注入支持,ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能还有额外更多功能,所以一般开发人员使用ApplicationContext会更多。

25. spring 的 JdbcTemplate 对象和 JDBC 有什么区别?


Spring 的 JdbcTemplate 是对 JDBC API 的封装,提供更多的功能和更便利的操作,比如 JdbcTemplate 拥有:

1、JdbcTemplate 是线程安全的;

2、实例化操作比较简单,仅需要传递 DataSource;

3、自动完成资源的创建和释放工作;

4、创建一次 JdbcTemplate,到处可用,避免重复开发。

最后

image.png

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
操作比较简单,仅需要传递 DataSource;

3、自动完成资源的创建和释放工作;

4、创建一次 JdbcTemplate,到处可用,避免重复开发。

最后

[外链图片转存中…(img-n27fTRTR-1713574625367)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-G641Zimx-1713574625367)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值