zoukankan      html  css  js  c++  java
  • Spring面试题

    什么是Spring IOC 容器?

    容器创建对象, 将它们装配在一起, 配置它们并管理它们的完整生命周期。Sp ring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化。该元数据可以通过XML, Java 注解或Java 代码提供.

    Spring 中的IoC 的实现原理就是工厂模式加反射机制。

    什么是依赖注入?

    当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

    可以通过多少种方式完成依赖注入?

    三种

    • 构造函数注入
    • setter注入
    • 基于注解注入@Autowired
    • 接口注入(不提倡这种用法)

    详见:https://zhuanlan.zhihu.com/p/194237253?utm_source=wechat_session

    spring 中有多少种IOC 容器?

    • BeanFactory - BeanFactory 就像一个包含bean组合的工厂类。它会在客户端要求时实例化bean.
    • ApplicationContext - ApplicationContext 接口扩展了BeanFacto ry 接口。它在BeanFactory 基础上提供了一些额外的功能。

    Bean Factory 和ApplicationContext区别

    • Bean Factory
      • 它使用懒加载
      • 不支持基于依赖的注解
    • Application Context
      • 它使用即时加载
      • 支持基于依赖的注解

    什么是spring bean?

    • 它们是构成用户应用程序主干的对象。
    • Bean 由Spring IoC 容器管理,实例化、配置和装配
    • Bean 是基于用户提供给容器的配置元数据创建。

    spring 提供了哪些配置方式?

    基于xml配置

    bean 所需的依赖项和服务在XML格式的配置文件中指定。

    <bean id= "studentbean" class= "org.edureka.firstSpring.StudentBean" >
        <property name="name" value="Edureka" > </property>
    </bean>
    

    基于注解配置

    可以通过在相关的类,方法或字段声明上使用注解,将bean配置为组件类本身, 默认情况下,Spring容器中未打开注解装配。因此,您需要在使用它之前在Spring配置文件中启用它。

    <beans>
        < context:annotation-config/ >
    </beans>
    

    基于java配置

    Spring 的Java 配置是通过使用@Bean 和@Configuration 来实现。

    • Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。(和xml配置中的bean标签的作用是一样的)
    • 用@Configuration注释类表明其主要目的是作为bean定义的源,允许通过简单地调用同一个类中的其他@ Bean 方法来定义bean 间依赖关系。

    什么是spring 的内部bean?

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

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    &lt;bean id=&quot;person2&quot; class=&quot;com.itdjx.spring.dependency.injection.Person&quot;&gt;
        &lt;property name=&quot;name&quot; value=&quot;李玉&quot;/&gt;
        &lt;property name=&quot;age&quot; value=&quot;23&quot;/&gt;
        &lt;property name=&quot;sex&quot; value=&quot;女&quot;/&gt;
        &lt;property name=&quot;car&quot; &gt;
            &lt;bean class=&quot;com.itdjx.spring.dependency.injection.Car&quot;&gt;
                &lt;constructor-arg value=&quot;Ferrari&quot; index=&quot;0&quot;/&gt;
                &lt;constructor-arg value=&quot;Italy&quot; index=&quot;1&quot;/&gt;
                &lt;constructor-arg value=&quot;22500000&quot; type=&quot;double&quot;/&gt;
            &lt;/bean&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
    

    </beans>

    什么是spring 装配

    就是让应用程序上下文为你找出依赖项的过程。说的通俗一点,就是Spring会在上下文中自动查找,并自动给bean装配与其关联的属性!

    spring中实现自动装配的方式有两种,一种是通过xml文件、另一种是通过注解

    https://www.cnblogs.com/bear7/p/12531016.html

    @Component,@Repository,@Service, @Controller

    把类标识成可用于 @Autowired 注解自动装配的 bean 的类

    • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
    • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
    • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
    • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

    @Required

    @Required注释为为了保证所对应的属性必须被设置,@Required 注释应用于 bean 属性的 setter 方法

    @Autowired

    @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

    @Autowired和@Resource的区别

    @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。

    @Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

    @Qualifier

    使用 @Autowired 注解是 Spring 依赖注入的常用方法。但有时候Spring不知道需要注入哪一个bean。通过使用 @Qualifier 注解,我们可以消除需要注入哪个 bean 的问题。通过将 @Qualifier 注解与我们想要使用的特定 Spring bean 的名称一起进行装配,Spring 框架就能从多个相同类型并满足装配要求的 bean 中找到我们想要的

    @ RequestMapping 注解有什么用?

    使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求

    spring 支持的事务管理类型

    • 编程式事务管理
      • 编程帮助下实现对事务的管理
    • 声明式事务管理
      • 事务管理和业务代码分离,靠注解或者xml配置来管理事务

    声明式事务的传播属性

    隔离级别

    读未提交:READ UNCOMMITTED
    读已提交:READ COMMITTED
    可重复读:REPEATABLE READ
    串行化:SERIALIZABLE
    

    AOP概念

    • Spring AOP(Aspect Oriented Programming,面向切面编程),是OOPs(面向对象编程)的补充,它也提供了模块化。AOP的关键单元是切面,或者说关注点一些切面可能有集中的代码,但是有些可能被分散或者混杂在一起,例如日志或者事务。这些分散的切面被称为横切关注点。一个横切关注点是一个可以影响到整个应用的关注点,而且应该被尽量地集中到代码的一个地方,例如事务管理、权限、日志、安全等。
    • AOP让你可以使用简单的配置,通过不同的通知类型,在实际逻辑执行之前、之后或周围动态添加横切关注点。这让代码在当下和将来都变得易于维护。
    • Spring AOP是基于代理实现的。

    Spring中有哪些不同的通知类型

    通知(advice)是你在你的程序中想要应用在其他模块中的横切关注点的实现。Advice主要有以下5种类型:

    • 前置通知(Before Advice): 在连接点之前执行的Advice,不过除非它抛出异常,否则没有能力中断执行流。使用 @Before 注解使用这个Advice。
    • 返回之后通知(After Retuning Advice): 在连接点正常结束之后执行的Advice。例如,如果一个方法没有抛出异常正常返回。通过 @AfterReturning 关注使用它。
    • 抛出(异常)后执行通知(After Throwing Advice): 如果一个方法通过抛出异常来退出的话,这个Advice就会被执行。通用 @AfterThrowing 注解来使用。
    • 后置通知(After Advice): 无论连接点是通过什么方式退出的(正常返回或者抛出异常)都会执行在结束后执行这些Advice。通过 @After 注解使用。
    • 围绕通知(Around Advice): 围绕连接点执行的Advice,就你一个方法调用。这是最强大的Advice。通过 @Around 注解使用。

    简述一下Spring AOP的设计原理

    主要的分代理的创建和代理的调用两部分

    • 代理的创建

    创建代理工厂:拦截器数组,目标对象接口数组,目标对象。
    创建代理工厂时,默认会在拦截器数组尾部再增加一个默认拦截器 —— 用于最终的调用目标方法。
    当调用 getProxy 方法的时候,会根据接口数量大余 0 条件返回一个代理对象(JDK or Cglib)。
    注意:创建代理对象时,同时会创建一个外层拦截器,这个拦截器就是 Spring 内核的拦截器,用于控制整个 AOP 的流程。

    • 代理的调用

    当对代理对象进行调用时,就会触发外层拦截器。 外层拦截器根据代理配置信息,创建内层拦截器链。创建的过程中,会根据表达式判断当前拦截是否匹配这个拦截器。而这个拦截器链设计模式就是职责链模式。 当整个链条执行到最后时,就会触发创建代理时那个尾部的默认拦截器,从而调用目标方法,最后返回。

    在Spring AOP中关注点和横切关注点有什么不同?

    关注点:我们在应用的模块中实现以解决特定业务问题的方法。比如库存管理、航运管理、用户管理等。

    横切关注点:贯穿整个应用程序的关注点。像事务管理、权限、日志、安全等。

    Spring AOP的代理是什么?

    Spring AOP是基于代理实现的,默认为标准的 JDK 动态代理。这使得任何接口(或者接口的集合)可以被代理。

  • 相关阅读:
    班课6
    lesson one
    班课5
    ES6之Proxy及Proxy内置方法
    ES6模板字符串
    ES6之Symbol
    ES6对象及ES6对象简单拓展
    ES6函数的拓展
    ES6数组及数组方法
    ES6字符串方法
  • 原文地址:https://www.cnblogs.com/kylinxxx/p/13935162.html
Copyright © 2011-2022 走看看