美文网首页
javaSpring面试题,安排

javaSpring面试题,安排

作者: 雅倩兰爸爸 | 来源:发表于2018-09-12 22:12 被阅读0次

    收藏一些关于Spring框架的面试题,一方面是为了准备找工作的时候看面试题,另一方面,通过面试题的方式加深一些自己的框架的理论知识。

    Beans

    spring中Bean的作用域

    singleton:

    prototype:

    request:

    session:

    global Session:

    spring中Bean的生命周期

    什么是 spring bean?

    spring 提供了哪些配置方式?

    什么是 spring 的内部 bean?

    自动装配有哪些方式

    自动装配有什么局限

    Spring中依赖注入方式

    Spring Framework 中的模块

    Spring 应用程序的组件

    Spring IOC 容器

    spring 中的两种 IOC 容器

    IoC 的一些好处

    Spring IoC 的实现机制

    注解

    基于注解的容器配置

    如何在 spring 中启动注解装配?

    @Component, @Controller, @Repository, @Service 有何区别?

    @Required 注解有什么用?

    @Qualifier 注解有什么用?

    @RequestMapping 注解有什么用?

    数据访问

    spring DAO 有什么用?

    Spring DAO 抛出的异常

    spring JDBC API 中存在哪些类?

    spring 支持的事务管理类型

    spring 支持哪些 ORM 框架

    AOP

    Aspect

    切点(JoinPoint)

    通知(Advice)

    有哪些类型的通知(Advice)?

    AOP 有哪些实现方式?

    Spring AOP and AspectJ AOP 有什么区别?

    WebApplicationContext

    Beans

    spring中Bean的作用域

    singleton:

    Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域。

    prototype:

    每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。

    request:

    在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。

    session:

    在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。

    global Session:

    在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

    spring中Bean的生命周期

    实例化一个Bean,也就是我们通常说的new。

    按照Spring上下文对实例化的Bean进行配置,也就是IOC注入。

    如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID。

    如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)。

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

    如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术。

    如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

    如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法。

    当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法。

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

    什么是 spring bean?

    它们是构成用户应用程序主干的对象。

    Bean 由 Spring IoC 容器管理。

    它们由 Spring IoC 容器实例化,配置,装配和管理。

    Bean 是基于用户提供给容器的配置元数据创建。

    spring 提供了哪些配置方式?

    基于 xml 配置

    bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常以 bean 标签开头。例如:

    基于注解配置

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

    基于 Java API 配置

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

    @Bean 注解扮演与 元素相同的角色。

    @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。

    @Configuration

    public class StudentConfig {

    @Bean

    public StudentBean myStudent() {

    return new StudentBean();

    }

    }

    什么是 spring 的内部 bean?

    只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 或 中提供了 元素的使用。内部 bean 总是匿名的,它们总是作为原型。

    例如,假设我们有一个 Student 类,其中引用了 Person 类。这里我们将只创建一个 Person 类实例并在 Student 中使用它。

    Student.java

    public class Student {

    private Person person;

    //Setters and Getters

    }

    public class Person {

    private String name;

    private String address;

    //Setters and Getters

    }

    bean.xml

    自动装配有哪些方式

    Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。

    自动装配的不同模式:

    no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。

    byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。

    byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。

    构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。

    autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

    自动装配有什么局限

    覆盖的可能性 - 您始终可以使用 和 设置指定依赖项,这将覆盖自动装配。

    基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。

    令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。

    Spring中依赖注入方式

    * 三种注入方式为:构造方法注入和设值注入以及接口注入 *

    在 Spring Framework 中,仅使用构造函数和 setter 注入。

    设值注入与传统的JavaBean的写法更相似,程序员更容易理解、接受,通过setter方式设定依赖关系显得更加直观、明显;

    对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。

    Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而会产生浪费。而使用设置注入,则避免这下问题;

    在某些属性可选的情况下,多参数的构造器更加笨拙,官方更鼓励使用设值注入。

    构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。

    对于依赖关系无须变化的Bean,构造注入更有用处,因为没有setter方法,所有的依赖关系全部在构造器内设定,因此,不用担心后续代码对依赖关系的破坏。

    构造注入使依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。

    Spring Framework 中的模块

    Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含以下模块:

    Spring Core

    Spring Bean

    SpEL (Spring Expression Language)

    Spring Context

    数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:

    JDBC (Java DataBase Connectivity)

    ORM (Object Relational Mapping)

    OXM (Object XML Mappers)

    JMS (Java Messaging Service)

    Transaction

    Web – 该层提供了创建 Web 应用程序的支持。它包含以下模块:

    Web

    Web – Servlet

    Web – Socket

    Web – Portlet

    AOP – 该层支持面向切面编程

    Instrumentation – 该层为类检测和类加载器实现提供支持。

    Test – 该层为使用 JUnit 和 TestNG 进行测试提供支持。

    Spring 应用程序的组件

    Spring 应用一般有以下组件:

    接口 - 定义功能。

    Bean 类 - 它包含属性,setter 和 getter 方法,函数等。

    Spring 面向切面编程(AOP) - 提供面向切面编程的功能。

    Bean 配置文件 - 包含类的信息以及如何配置它们。

    用户程序 - 它使用接口。

    Spring IOC 容器

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

    spring 中的两种 IOC 容器

    BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。

    ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。

    IoC 的一些好处

    它将最小化应用程序中的代码量。

    它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。

    它以最小的影响和最少的侵入机制促进松耦合。

    它支持即时的实例化和延迟加载服务。

    Spring IoC 的实现机制

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

    interface Fruit {

    public abstract void eat();

    }

    class Apple implements Fruit {

    public void eat(){

    System.out.println("Apple");

    }

    }

    class Orange implements Fruit {

    public void eat(){

    System.out.println("Orange");

    }

    }

    class Factory {

    public static Fruit getInstance(String ClassName) {

    Fruit f=null;

    try {

    f=(Fruit)Class.forName(ClassName).newInstance();

    } catch (Exception e) {

    e.printStackTrace();

    }

    return f;

    }

    }

    class Client {

    public static void main(String[] a) {

    Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");

    if(f!=null){

    f.eat();

    }

    }

    }

    注解

    基于注解的容器配置

    不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如:

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

    @Bean 注解扮演与元素相同的角色。

    @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。

    @Configuration

    public class StudentConfig {

    @Bean

    public StudentBean myStudent() {

    return new StudentBean();

    }

    }

    如何在 spring 中启动注解装配?

    默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置

    @Component, @Controller, @Repository, @Service 有何区别?

    @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

    @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。

    @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。

    @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

    @Required 注解有什么用?

    @Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。

    public class Employee {

    private String name;

    @Required

    public void setName(String name){

    this.name=name;

    }

    public string getName(){

    return name;

    }

    }

    @Qualifier 注解有什么用?

    当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。

    @RequestMapping 注解有什么用?

    @RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:

    类级别:映射请求的 URL

    方法级别:映射 URL 以及 HTTP 请求方法

    数据访问

    spring DAO 有什么用?

    Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。

    Spring DAO 抛出的异常

    spring JDBC API 中存在哪些类?

    JdbcTemplate

    SimpleJdbcTemplate

    NamedParameterJdbcTemplate

    SimpleJdbcInsert

    SimpleJdbcCall

    spring 支持的事务管理类型

    Spring 支持两种类型的事务管理:

    程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。

    声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML 的配置来管理事务。

    spring 支持哪些 ORM 框架

    Hibernate

    iBatis

    JPA

    JDO

    OJB

    AOP

    Aspect

    aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中.

    AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:

    如何通过 pointcut 和 advice 定位到特定的 joinpoint 上

    如何在 advice 中编写切面代码.

    使用 @Aspect 注解的类就是切面.

    切点(JoinPoint)

    程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理.

    在 Spring AOP 中, join point 总是方法的执行点。

    通知(Advice)

    特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。

    有哪些类型的通知(Advice)?

    Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置。

    After Returning - 这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。

    After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。

    After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。

    Around - 这些类型的 Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行配置。

    AOP 有哪些实现方式?

    实现 AOP 的技术,主要分为两大类:

    静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;[①:编译时编织(特殊编译器实现)②:类加载时编织(特殊的类加载器实现)]

    动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。[①:JDK 动态代理 ②:CGLIB]

    Spring AOP and AspectJ AOP 有什么区别?

    Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现。

    Spring AOP 仅支持方法级别的 PointCut;提供了完全的 AOP 支持,它还支持属性级别的 PointCut。

    WebApplicationContext

    WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方面有所不同。

    相关文章

      网友评论

          本文标题:javaSpring面试题,安排

          本文链接:https://www.haomeiwen.com/subject/krfigftx.html