java面试-java框架

什么是控制反转(IOC)?什么是依赖注入(DI)?

控制反转(IoC): 控制反转是一种软件设计原则,它反转了传统的程序控制流程。在传统的编程中,程序通常控制创建和管理对象的流程,而在IoC中,控制权交给了外部容器或框架。简单来说,IoC就是将对象的创建和管理交给了容器,而不是由代码直接控制。这样可以实现更松耦合的代码,提高了代码的可维护性和可测试性。

依赖注入(DI): 依赖注入是实现IoC的一种方式。它是将一个对象的依赖关系传递给该对象的过程,而不是在对象内部直接创建依赖。通常,依赖通过构造函数、方法参数或属性注入到对象中。这使得对象更容易被重用,因为它们不需要知道如何创建它们的依赖项,只需接受它们。

简单来说,IoC和DI的关键思想是将控制权和依赖关系从代码中解耦,使得代码更灵活、可扩展和易于维护。

Spring容器中如何创建对象?

无参构造创建 静态工厂创建 实例工厂创建

Spring有几种配置方式 ?

基于XML文件的配置
基于注解的配置

解释什么叫延迟加载 ?

默认情况下,容器启动之后会将所有作用域为单例的bean创建好;但是有的业务场景我们并不需要它提前都创建好;
此时,我们可以在bean中设置lzay-init=“true”,这样,当容器启动之后,作用域为单例的bean,就不在创建。

解释什么是自动装配 ?

就是将一个Bean注入到其它的Bean的Property中,默认情况下,容器不会自动装配,需要我们手动设定。Spring 可以通过向Bean Factory中注入的方式来搞定bean之间的依赖关系,达到自动装配的目的。

Spring bean元素的作用域?

当通过Spring容器创建一个Bean实例的时候,不仅可以完成bean实例的实力化,还可以为bean指定作用域。Spring bean元素的支持以下5种作用域:
Singleton:单例模式,在整个spring IOC容器中,使用singleton定义的bean将只有一个实例。
Prototype:多例模式,每次通过容器中的getBean方法获取prototype定义的beans时,都会产生一个新的bean的实例。
Request:对于每次Http请求,使用request定义的bean都会产生一个新的实例,只有在web应用时候,该作用域才会有效。
Session:对于每次Http Session,使用session定义的Bean都将产生一个新的实例。
Globalsession:每个全局的Http Sesisonn,使用session定义的本都将产生一个新的实例。

BeanFactory 和 ApplicationContext 有什么区别?

1、BeanFactory是Spring的最底层接口,包含bean的定义,管理bean的加载,实例化,控制bean的生命周期,特点是每次获取对象时才会创建对象。

ApplicationContext是BeanFactory的子接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性,每次容器启动时就会创建所有的对象。

什么是ORM

它是对象关系模型的简称。它的作用是在关系型数据库和对象之间作一个映射。使程序能够通过操纵描述对象方式来操纵数据库。

请解释 Spring Bean 的生命周期?

通过构造器或工厂方法创建bean实例;
为bean的属性赋值;
调用bean的初始化方法;
使用bean;
当容器关闭时,调用bean的销毁方法;

请举例解释@Required 注解?

@Required注解应用于bean属性的setter方法,它表明影响的bean属性在配置时必须放在XML配置文件中。

mybatis 中 #{}和 ${}的区别是什么?

#{}带引号,${}不带引号;
#{}可以防止SQL注入;
KaTeX parse error: Expected 'EOF', got '#' at position 28: …rder by子句; 一般能用#̲{}就不要使用{}

mybatis 是否支持延迟加载?延迟加载的原理是什么?

1、mybatis 是否支持延迟加载?

延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。

延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。

mybatis仅支持关联对象association和关联集合对象collection的延迟加载,association是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazyloadingEnable=true/false。

2、延迟加载的原理是什么?

使用CGLIB为目标对象建立代理对象,当调用目标对象的方法时进入拦截器方法。

比如调用a.getB().getName(),拦截器方法invoke()发现a.getB()为null,会单独发送事先准备好的查询关联B对象的sql语句,把B查询出来然后调用a.setB(b),也是a的对象的属性b就有值了,然后调用getName(),这就是延迟加载的原理。

说一下 mybatis 的一级缓存和二级缓存?

一级缓存是session级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库;

二级缓存是sessionFactory级别的缓存,需要配置才会开启。当进行sql语句查询时,先查看一级缓存,如果不存在,访问二级缓存,降低数据库访问压力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值