吊打Java面试官!整理了一周的Spring面试大全(附答案)

目录
  • Q1:什 么 是 spring?
  • Q2:使 用 Spring 框 架 的 好 处 是 什 么 ?
  • 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?
  • Q16:如何通过注解配置⽂件?
  • Q17:BeanFactory、FactoryBean 和ApplicationContext 的区别?
  • Q18: 解 释 Spring 框 架 中 bean 的 生 命 周 期 。
  • Q19:怎样开启注解装配 ?
  • Q20:Spring 支 持 的 ORM有那些?,
  • Q21:Spring 框架中的单例 Beans 是线程安全的么?
  • Q22:Spring 框架中都用到了哪些设计模式?
  • Q23:请举例解释@Autowired 注解?

对于Java的小伙伴来说,Spring是面试的必问环节,我研究Spring多年,甚至我的网名都叫SpringMeng。

最新整理的数据结构和算法的值得收藏:

小孟肝了一周,继续给大家整理Spring的系列,帮你offer收到手疼。先看下Spring的家族图:

废话不多话,直接上干货。

Q1:什 么 是 spring?

Sring是个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 生命周期的代码样例如下:

<beans>

<bean id="demoBean"

class="com.springmeng.task.DemoBean"

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

</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。

<beans>

<!-- JSON Support -->

<bean name="viewResolver"

class="org.springframework.web.servlet.view.BeanNameVi
ewResolver"/>

<bean name="jsonTemplate"

class="org.springframework.web.servlet.view.json.Mappi
ngJackson2JsonView"/>

<bean id="restTemplate"

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

</beans>

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

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

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

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

<web-app>

<display-name>Archetype Created Web

Application</display-name>

<servlet>

<servlet-name>spring</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

看到这里的小伙伴,给个三连支持下,祝你offer收到手疼,嘿嘿……一起进步!

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

⽤于指定当前类是⼀个 spring 配置类,当创建容器时会从该类上加载注解,value 属性用于指定配置类的字节码。

⽤于指定 Spring 在初始化容器时要扫描的包。basePackages 属性用于指定要扫描的包。

用于加载文件中的配置。value 属性用于指定⽂件位置,如果是在类路径下需要加上 classpath。用于导⼊其他配置类,在引入其他配置类时可以不⽤再写注解。有的是父配置类,引入的是子配置类。value 属性用于指定其他配置类的字节码。

Q17:BeanFactory、FactoryBean 和ApplicationContext 的区别?

BeanFactory 是⼀个 Bean 工厂,使用简单工厂模式,是 Spring IoC 容器顶级接口,可以理解为含有Bean 集合的工厂类,作用是管理 Bean,包括实例化、定位、配置对象及建⽴这些对象间的依赖。BeanFactory 实例化后并不会自动实例化 Bean,只有当 Bean 被使⽤时才实例化与装配依赖关系,属于延迟加载,适合多例模式。

FactoryBean 是⼀个工厂Bean,使用了工厂方法模式,作⽤是⽣产其他 Bean 实例,可以通过实现该接⼝,提供⼀个工厂方法来⾃定义实例化 Bean 的逻辑。FactoryBean 接口由 BeanFactory 中配置的对象实现,这些对象本身就是用于创建对象的工厂,如果⼀个 Bean 实现了这个接口,那么它就是创建对象的工厂 Bean,而不是 Bean 实例本身。

ApplicationConext 是 BeanFactory 的子接口,扩展了 BeanFactory 的功能,提供了支持国际化的⽂本消息,统⼀的资源⽂件读取方式,事件传播以及应⽤层的特别配置等。容器会在初始化时对配置的Bean 进行预实例化,Bean 的依赖注入在容器初始化时就已经完成,属于立即加载,适合单例模式,⼀般推荐使用。

Q18: 解 释 Spring 框 架 中 bean 的 生 命 周 期 。

Spring容器从XML文件中 取 bean的定义,并实例化 bean。

Spring 根 据 bean 的定义填充所有的属 性 。

如果bean实现了BeanNameAware 接口 ,Spring 传递bean 的 ID到setBeanName 方法 。

如果 Bean实现了BeanFactoryAware 接口 ,Spring传 递 beanfactory 给 setBeanFactory方法。

如果有任何与bean 相关的BeanPostProcessors,Spring会在 postProcesserBeforeInitialization()方 法内 调 用 它 们 。

如 果 bean 实 现 IntializingBean了 ,调 用 它 的afterPropertySet 方法 ,如果 bean声明了初始化方法 ,调用此初始化方法 。

如果有BeanPostProcessors 和bean关联 ,这些 bean的postProcessAfterInitialization() 方法将 被调用 。

如果bean实现了DisposableBean, 它将调用destroy()方 法 。

Q19:怎样开启注解装配 ?

注解装配在默认情 况下是不开启的 ,为了使用注解装配 ,我们必须在Spring 配置文件中配置元素 。

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

Spring支持以下ORM:

1,Hibernate

2,iBatis

3,JPA (Java Persistence API)

4,TopLink

5,JDO (Java Data Objects)

6,OJB

Q21:Spring 框架中的单例 Beans 是线程安全的么?

Spring 框架并没有对单例 bean 进行任何多线程的封装处理。

关于单例 bean 的线程安全和并发问题需要开发者自行去搞定。但实际上大部分的 Spring bean 并没有可变的状态(比如 Serview 类和 DAO 类),所以在某种程度上说 Spring 的单例 bean 是线程安全的。如果你的 bean 有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。

最浅显的解决办法就是将多态 bean 的作用域由“singleton”变更为“prototype”。

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

Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:

1. 代理模式—在 AOP 和 remoting 中被用的比较多。

2. 单例模式—在 spring 配置文件中定义的 bean 默认为单例模式。

3. 模板方法—用来解决代码重复的问题。比如. RestTemplate,JmsTemplate, JpaTemplate。

4. 前端控制器—Spring 提供了 DispatcherServlet 来对请求进行分发。

5. 视图帮助(View Helper )—Spring 提供了一系列的 JSP 标签,高效宏来辅助将分散的代码整合在视图里。

6. 依赖注入—贯穿于 BeanFactory / ApplicationContext 接口的核心理念。

7. 工厂模式—BeanFactory 用来创建对象的实。

Q23:请举例解释@Autowired 注解?

@Autowired 注解对自动装配何时何处被实现提供了更多细粒度的控制。@Autowired 注解可以像@Required 注解、构造器一样被用于在 bean 的设值方法上自动装配 bean 的属性,一个参数或者带有任意名称或带有多个参数的方法

比如,可以在设值方法上使用@Autowired 注解来替代配置文件中的元素。当 Spring 容器在 setter 方法上找到@Autowired 注解时,会尝试用 byType 自动装配。

当然我们也可以在构造方法上使用@Autowired 注解。带有@Autowired 注解的构造方法意味着在创建一个 bean 时将会被自动装配,即便在配置文件中使用元素。

public class TextEditor {

private SpellChecker spellChecker;

@Autowired

public TextEditor(SpellChecker spellChecker){

System.out.println("Inside TextEditor
constructor." );

this.spellChecker = spellChecker;

}

public void spellCheck(){

spellChecker.checkSpelling();

}

}

下面是没有构造参数的配置方式:

<beans>

<context:annotation-config/>

<!-- Definition for textEditor bean without

constructor-arg -->

<bean id="textEditor"

class="com.springmeng.TextEditor">

</bean>

<!-- Definition for spellChecker bean -->

<bean id="spellChecker"

class="com.howtodoinjava.SpellChecker">

</bean>

</beans>

到此这篇关于吊打Java面试官!整理了一周的Spring面试大全(附答案)的文章就介绍到这了,更多相关Java面试Spring内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java经典面试题汇总:Spring

    目录 1. 什么是Spring? 有哪些优点? 2. 什么是 AOP? 3. 什么是 IOC? 4. 什么是 DI? 5. Spring 有哪些核心模块? 6. Spring 常用的注入方式有哪些? 7. Spring 中的 Bean 是线程安全的吗? 8. Spring中Bean的作用域有哪些? 9. @Qualifier 注解 10. @Resource与@Autowired注解的区别? 11. Spring底层两种动态代理实现原理及区别? 12. Spring 事务实现方式有哪些? 13.

  • Java面试题冲刺第十八天--Spring框架3

    面试题1:Bean 的加载过程是怎样的? 我们知道, Spring 的工作流主要包括以下两个环节: 解析,读 xml 配置,扫描类文件,从配置或者注解中获取 Bean 的定义信息,注册一些扩展功能. 加载,通过解析完的定义信息获取 Bean 实例. 下面是跟踪了 getBean的调用链创建的流程图,为了能够很好地理解 Bean 加载流程,省略一些异常.日志和分支处理和一些特殊条件的判断. 从上面的流程图中,可以看到一个 Bean 加载主要会经历这么几个阶段(标绿内容): 获取 BeanName,

  • 面试JAVA时,问到spring该怎么回答

    目录 Spring面试十连问 1.谈谈对IOC的理解? 2.多个AOP的顺序怎么定义 3.springBean是线程安全的吗? 4.Spring中的bean生命周期? 5.Spring 框架中都用到了哪些设计模式? 6.@Autowired和@Resource之间的区别 7.Spring支持的事务管理类型? 8.你更倾向用那种事务管理类型? 9.Spring事务中有哪几种事务传播行为? 10.Spring通知有哪些类型? 总结 Spring面试十连问 1.谈谈对IOC的理解? IOC,就是我们经

  • Java经典面试题汇总:Spring Boot

    目录 1. 什么是 Spring Boot? 2. 为什么要用 Spring Boot? 3. Spring Boot 核心配置文件是什么? 4. Spring Boot 提供了哪些常用的 Starter Project Options? 5. 如何快速构建一个Spring Boot项目? 6. Spring Boot默认的内置Web服务器是什么? 7. Spring Boot常用注解及其作用? 8. 如何使用配置文件通过 Spring Boot 配置特定环境的配置? 总结 1. 什么是 Spr

  • Java经典面试题汇总:Spring MVC

    目录 1. 什么是Spring MVC ? 2. Spring MVC 有哪些组件? 3. 说一下 Spring MVC 运行流程? 4. Spring MVC的优点: 5. @RequestMapping 的作用是什么? 6. 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置? 7. SpringMVC常用的注解有哪些? 8. SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代? 9. Spring MVC和Struts2的区别有哪些? 10. 怎么样在方法里面得到Re

  • 吊打Java面试官!整理了一周的Spring面试大全(附答案)

    目录 Q1:什 么 是 spring? Q2:使 用 Spring 框 架 的 好 处 是 什 么 ? Q3:使 用 Spring 缺点是什么? Q4:IoC 是什么? Q5:IOC的优点是什么 Q6:IoC 容器初始化过程? Q7:依赖注⼊的实现方法有哪些? Q8:依赖注入的相关注解? Q9:依赖注入的过程? Q10:Bean 的生命周期? Q11:Bean 的作⽤范围? Q12:如何通过 XML ⽅式创建 Bean? Q13:Spring 有几种配置方式? Q14:如何用基于 XML 配置的

  • 吊打Java面试官之Lambda表达式 Stream API

    目录 一.jdk8新特性简介 二.Lambda表达式 简单理解一下Lambda表达式 Lambda表达式的使用 三.函数式接口 1.什么是函数式接口 2.如何理解函数式接口 3.Java内置四大核心函数式接口 四.方法引用与构造器引用 方法引用 构造器引用和数组引用 五.Stream API 1.Stream API的说明 2.为什么要使用Stream API 3.创建Stream的四种方式 4.Stream的中间操作及其测试 5.Stream的终止操作及其测试 六.Optional类的使用 O

  • java关于持久层面试题目整理

    一.什么是ORM? 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术: 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式. 二.Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两

  • 一口气说出Java 6种延时队列的实现方法(面试官也得服)

    五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败.所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如. 知耻而后勇,这不逼着自己又学起来了,个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个demo最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:"如何实现延时队列?". 下边会介绍

  • 详解Java面试官最爱问的volatile关键字

    本文向大家分享的主要内容是Java面试中一个常见的知识点:volatile关键字.本文详细介绍了volatile关键字的方方面面,希望大家在阅读过本文之后,能完美解决volatile关键字的相关问题.  在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深入地话还可以考察JVM底层实现以及操作系统的相关知识. 下面我们以一次假想的面试过

  • Java面试官最喜欢问的关键字之volatile详解

    前言 笔者去年面试过几家公司,基本上每家公司都会问到volatile,甚至有的公司每轮面试的时候都会问到.面试官这么喜欢问volatile就是因为这个关键字涉及到的知识点较多比如Java内存模型.内存屏障.happen-befor等知识,可以继续挖掘到系统指令.超线程等知识. Java内存模型(JMM) volatile是Java虚拟机提供的最轻量的同步机制,但很难被正确的理解与使用,通过学习Java内存模型对volatile专门定义的一些特殊访问规则,或许会对理解volatile有一定帮助.

  • java中Hibernate面试知识点整理

    作为常用的框架之一,Hibernate在面试的时候难免会被问到.好在涉及的都是一些理论方面的知识点,比如概念.原理.使用之类的.我们在面试之前可以针对这方面的题目,做一个充足的准备,即使有些人对hibernate框架的了解并不深入.下面我们就hibernate框架中常见的面试题带来介绍. 1. 为什么要使用 hibernate? (1).对JDBC做了轻量级的封装,简化了数据访问层编码. (2).Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便. (3)

  • 面试官:Java中new Object()到底占用几个字节

    前言 我们来分析一下堆内布局以及Java对象在内存中的布局吧. 对象的指向 先来看一段代码: package com.zwx.jvm; public class HeapMemory { private Object obj1 = new Object(); public static void main(String[] args) { Object obj2 = new Object(); } } 上面的代码中,obj1 和obj2在内存中有什么区别? 我们先来回忆一下JVM系列1的文章中有

  • Java多线程面试题(面试官常问)

    进程和线程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是从一个进程从创建.运行到消亡的过程.在Java中,当我们启动main函数时其实就是启动了一个JVM的进程,而mian函数所在的线程就是这个进程中的一个线程,称为主线程. 线程是比进程更小的执行单位.一个进程在其执行的过程中可以产生多个线程.与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程都有自己的程序计数器.虚拟机和本地方法栈,所以系统在产生一个线程,或在各个线程之间切换工作是,

  • 面试官问如何启动Java 线程

    目录 一.线程启动分析 二.线程启动过程 1. Thread start UML 图 2. Java 层面 Thread 启动 2.1 start() 方法 2.2 start0() 本地方法 3. JVM 创建线程 3.1 JVM_StartThread 3.2 JavaThread 3.3 os::create_thread 3.4 java_start 4. JVM 启动线程 4.1 Thread::start 4.2 os::start_thread(thread) 4.3 pd_sta

随机推荐