面试题-01:快手面试题_同步函数_Spring中IOC容器_Http常用状态码

点击进入本文快手面试题地址

一、快手面经

1、synchronized的代码分析和实现(锁对象和锁类)

非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。而“线程安全”就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。

同步方法:

调用关键字synchronized声明的方法一定是排队运行的。另外需要牢牢记住“共享”这两个字,只有共享资源的读写访问才需要同步化,如果不是共享资源,那么根本就没有同步的必要。

(1)A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。
(2)A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需等待,也就是同步。

发生脏读的情况是在读取实例变量时,此值已经被其他线程更改过了。可以使用synchronized关键字变脏读:

(3)当A线程调用anyObject对象加入synchronized关键字的X方法时,A线程就获得了X方法锁,更准确地讲,是获得了对象的锁,所以其他线程必须等A线程执行完毕才可以调用X方法,但B线程可以随意调用其他的非synchronized同步方法。

(4)当A线程调用anyObject对象加入synchronized关键字的X方法时,A线程就获得了X方法所在对象的锁,所以其他线程必须等A线程执行完毕才可以调用X方法,而B线程如果调用声明了synchronized关键字的非X方法时,必须等A线程将X方法执行完,也就是释放对象锁后才可以调用。

2. Spring的IOC?怎么实现依赖注入的?bean的生命周期等等

1、谈谈对Spring的理解

Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring的容器管理,大大降低了组件之间的耦合性。

2、容器中获取bean对象的2种方式

1.根据bean的id从IOC容器中获取bean对象
2.根据bean的class类型从IOC容器中获取bean对象
在这里插入图片描述

3、谈谈你对IOC容器和DI依赖注入的理解

1、IOC容器的理解:

当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会采用“new被调用者”的代码方式来创建对象。这种方式会导致调用者与被调用者之间的耦合性增加。
在这里插入图片描述

在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器来控制程序之间的关系,而不是由调用者的代码来直接控制。这样控制权由应用代码转向到了Spring容器,控制权发生了反转,这就是Spring的控制反转。

2、依赖注入DI的理解:

从Spring容器的角度,Spring容器将被依赖对象赋值给调用者的成员变量,相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。
在这里插入图片描述
在当前类需要用到其他类的对象,由Spring为我们提供,我们只需要在配置文件中说明依赖关系的维护,就称为依赖注入。

依赖注入的作用就是在使用Spring框架创建对象的时候,动态将其依赖的对象注入到Bean组件中。

4、依赖注入的2种方式

1、属性setter方法注入:

指IoC容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入。

优势:创建对象时没有明确的限制。可以直接使用默认构造函数
弊端:如果某个成员必须有值,则获取对象时有可能set方法没有执行

涉及的标签:property

property标签的属性:

  • name:用于指定注入时所调用的set方法名称
  • value:用于提供基本类型和String类型的数据
  • ref:用于指定其他bean类型的数据,指的是Spring的IOC的核心容器中出现过的bean对象。
    在这里插入图片描述将指定类配置给Spring容器,目的是让Spring容器创建对象的实例:
    在这里插入图片描述

2、 构造方法注入:

指IoC容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。

优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功
弊端:改变了类的实例化方式,导致如果用不到这些参数也要提供

使用的标签:constructor-org

标签中的属性:

  • name:用于指定给构造函数中指定名称的参数赋值(常用)
  • value:用于提供基本类型和String类型的数据
  • ref:用于指定其他的bean类型的数据,指的是Spring的IOC的核心容器中出现过的bean对象。
    在这里插入图片描述
    在这里插入图片描述

5、Bean3种实例化方式

1、使用默认的构造器实例化(创建bean对象):

构造器实例化是指Spring容器通过Bean对应类中默认的构造函数来实例化Bean。

其原理就是根据类的全限定类名通过反射来创建对象:
在这里插入图片描述
需要说明的是,如果使用了带参构造函数,那么创建对象时,默认构造函数就没了,此时就必须通过带参构造函数创建对象并注入所有参数的属性。

2、静态工厂方式创建Bean对象(实例化):

使用静态工厂是实例化Bean的另一种方式。该方式要求开发者创建一个静态工厂的方法来创建Bean的实例,其Bean配置中的class属性所指定的不再是Bean实例的实现类,而是静态工厂类,同时还需要使用factory-method属性来指定所创建的静态工厂方法。

在这里插入图片描述首先通过id属性定义了一个名称为bean2的Bean,然后由于使用的是静态工厂方法,所以需要通过class属性指定其对应的工厂实现类为MyBean2Factory。由于这种方式配置Bean后,Spring容器不知道哪个是所需要的工厂方法,所以增加了factory-method属性来告诉Spring容器,其方法名称为createBean。

3、实例工厂方式实例化:

在配置文件中,需要实例化的Bean也不是通过class属性直接指向实例化类,而是通过factory-bean属性指向配置的实例工厂,然后使用factory-method属性确定使用工厂中的哪个方法。在这里插入图片描述

6、Bean的作用域(7种)

通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以为Bean指定特定的作用域。
在这里插入图片描述
bean的作用范围调整,用于指定bean的作用范围

标签:bean标签的scope属性

取值:
 singleton:单例的,默认的
 prototype:多例的
 request:作用于web的请求范围
 session:做用于web应用的会话范围
 global-session:作用于集群环境的会话范围

singleton是Spring容器默认的作用域:单实例的
(1)在容器启动之前就已经创建好对象,保存在容器中了
(2)任何获取都是获取之前创建好的对象
在这里插入图片描述prototype:多实例的:
(1)容器启动默认不会创建实例bean
(2)获取实例时创建bean
(3)每次获取时都会创建一个新的bean
在这里插入图片描述

7、Bean的生命周期

单例对象:
 出生:当容器创建时,对象出生
 活着:只要容器还在,对象就一直存在
 死亡:容器销毁,对象消亡
多例对象:
 出生:当容器创建时,对象出生
 活着:对象只要在使用之中,就一直存在
 死亡:当对象长时间不用且没有别的对象引用时,由java的垃圾回收机制回收

单例模式下,bean对象的生命周期为:
容器启动(构造器)— 》初始化方法 —》(容器关闭)销毁方法

多实例下,bean对象的生命周期为:
获取bean(构造器)—》 初始化方法 —》 容器关闭不会调用bean的销毁方法

8、Bean的3种装配方式

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。

1、基于XML的装配:

Spring提供了两种基于XML的装配方式:setter方法注入和构造函数注入

在Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter方法来注入属性值。因此,设值注入要求一个Bean必须满足以下两点要求:
· Bean类必须提供一个默认的无参构造方法。
· Bean类必须为需要注入的属性提供对应的setter方法。

使用设值注入时,在Spring配置文件中,需要使用<bean>元素的子元素<property>来为每个属性注入值;
而使用构造注入时,在配置文件里,需要使用<bean>元素的子元素<constructor-arg>来定义构造方法的参数,可以使用其value属性来设置该参数的值。

2、基于注解的装配方式:

通过注解可以代替xml文件,在类上添加一个注解就能将这个类加入到ioc容器的管理中,id默认为类名的首字母小写:
@Repository:用于将数据访问层(Dao层)的类标识为Spring中的Bean。
@Service:用于将业务层(Service层)的类标识为Spring中的Bean。
@Controller:用于将控制层(Controller层)的类标识为Spring中的Bean。
@Component:给不属于以上任何一层的添加此注解。

通过下面介个注解可以完成属性的注入:

@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。

@Resource:其作用与Autowired一样。其区别在于@Autowired默认按照Bean类型装配,而@Resource默认按照Bean实例名称进行装配。

@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。如果指定name属性,则按实例名称进行装配;如果指定type属性,则按Bean类型进行装配;如果都不指定,则先按Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配;如果都无法匹配,则抛出NoSuchBeanDefinitionException异常。

@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。
在这里插入图片描述3、基于xml的自动装配:

Spring的<bean>元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。所谓自动装配,就是将一个Bean自动地注入到其他Bean的Property中。
在这里插入图片描述
在这里插入图片描述

3. Http常用的状态码

状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
借助状态码用户可以知道服务器是否正确处理了请求,还是出现了错误。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述这是春招的面试题,难度还是挺大的,可能因为自己从没有做过面试题的缘故看来以后要多刷面试题,有针对性的学习了

发布了665 篇原创文章 · 获赞 115 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_42764468/article/details/104892068
今日推荐