`

spring面试问题

阅读更多

1. 使用Spring框架的好处是什么?

  • 轻量:Spring 是轻量的。
  • 控制反转:将之前手动new对象的过程和管理对象的过程交给Spring来管理。实现控制权反转。
  • 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  • 容器:Spring 包含并管理应用中对象的生命周期和配置。
  • MVC框架:采用的是WEB MVC框架,为开发者提供了除了Struts和数据持久化框架以外的其他框架。且使用springmvc能够很好的结合spring,相比spring和其他框架整合会减少很多兼容性问题。做项目很快。
  • 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
  • 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

2.使用spring管理bena

 spring核心容器就是一个超级大工厂,所有的对象都会被当成spring核心容器管理的对象,spring把容器中的所有对象都称为bean。spring中的bean不同于java bean。java bean需要遵循一些特定的规范,在spring'中没有任何要求,只要是一个java类,spring就可以管理该java类。并将它当成bean处理。即一切对象都是bean

例子:

public class Axe {
   public String chop(){
	   return "调用Axe方法";
   }
}
//通过setter方法注入
public class Person{
	private Axe axe;
	public void setAxe(Axe axe){
		this.axe=axe;
	}
	public void useAxe(){
		System.out.println(axe.chop);
	}
}
//通过构造器注入
public class Person{
	private Axe axe;
	public Person(Axe axe){
		this.axe=axe;
	}
	public void useAxe(){
		System.out.println(axe.chop);
	}
}
配置文件
<beans>
<bean id ="person" classs="Person">
    <property name="axe" ref="axe">
</bean>
<bean id ="axe" classs="Axe"/>
<beans/>

 

3.spring的核心机制:依赖注入

依赖:A对象需要调用B对象方法的情形,这样情形Spring称为依赖。

spring框架的两个核心功能:

第一:spring负责创建管理所有的java对象,这些java对象称为bean

第二:spring容器管理bean之间的依赖关系。spring使用依赖注入的方式来管理bean之间的依赖关系。(依赖注入和控制反转的意义是一样的)

使用spring框架以后,调用者无需主动获取依赖对象,而是被动接受spring容器为调用者的成员变量赋值即可。

依赖注入的方式:

设值注入:IOC容器使用成员变量的setter方法来注入依赖对象

构造注入:IOC容器使用构造器来注入依赖对象

4.spring容器的使用

spring容器有两个核心接口,BeanFactory和ApplicationContext,ApplicationContext是BeanFactory的子接口。spring配置文件通常需要使用Resource对象传入。大部分都不会使用BeanFactory实例作为spring容器,而是使用ApplicationContext作为容器,因此也把spring容器成为spring的上下文。,而且增强了BeanFactory的功能。

由于spring是面向接口编程的,不管是调用者还是被依赖对象,都应该定义为接口,程序应该面向他们的接口,而不是编程实现类。便于升级和维护上边的代码改写

public interface Axe {
   public String chop();
}
public class StoneAxe implements Axe{
	public String chop(){
		   return "调用Axe方法";
	   }
}

public interface Person{
	public void useAxe();
}
public class Chinese implements Person{
	private Axe axe;
	public Chinese(Axe axe){
		this.axe=axe;
	}
	public void useAxe(){
		System.out.println(axe.chop);
	}
}
<beans>
<bean id ="chinese" class="Chinese">
    <constructor-arg ref="stoneAxe"/>
</bean>
<bean id ="stoneAxe" class="StoneAxe">
<beans/>
//给某个类中的方法传值
<bean id="" class="">
   <property name="test" value="wukong">
</bean>注意:该配置是给类中的setTest方法设置的参数

 

4.BeanFactory和ApplicationContext有什么区别?

 BeanFactory可以理解为含有bean集合的工厂类.BeanFactory包含了种bean的定义,以便在接收到客户端请求时将对应的

bean实例化.


BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。

BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。


从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。

但application context在此基础上还提供了其他的功能。


1、提供了支持国际化的文本消息

2、统一的资源文件读取方式

3、已在监听器中注册的bean的事件


以下是三种较常见的 ApplicationContext 实现方式:

1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义.应用程序上下文从程序环境变量中取得.

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。

ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml");

3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。

 

 

5、Spring有几种配置方式?

将Spring配置到应用开发中有以下三种方式:

1、基于XML的配置

2、基于注解的配置

3、基于Java的配置

 

7、如何用基于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.BeanNameViewResolver"/>
    <bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
</beans>

下面这个web.xml仅仅配置了DispatcherServlet,这件最简单的配置便能满足应用程序配置运行时组件的需求。

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

 

 

8、如何用基于Java配置的方式配置Spring?

Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、

配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与 元素类似。

被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以

通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。


最简单的@Configuration 声明类请参考下面的代码:

@Configuration
public class AppConfig{
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

对于上面的@Beans配置文件相同的XML配置文件如下:

<beans>
    <bean id="myService" class="com.howtodoinjava.services.MyServiceImpl"/>
</beans>

上述配置方式的实例化方式如下:利用AnnotationConfigApplicationContext 类进行实例化

public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}

要使用组件组建扫描,仅需用@Configuration进行注解即可:

@Configuration
@ComponentScan(basePackages = "com.howtodoinjava")
public class AppConfig  {
    ...
}

在上面的例子中,com.acme包首先会被扫到,然后再容器内查找被@Component 声明的类,

找到后将这些类按照Sring bean定义进行注册。


如果你要在你的web应用开发中选用上述的配置的方式的话,需要用AnnotationConfigWebApplicationContext类来读取配置文件,

可以用来配置Spring的Servlet监听器ContrextLoaderListener或者Spring MVC的DispatcherServlet。

<web-app>
    <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
        instead of the default XmlWebApplicationContext -->
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>

    <!-- Configuration locations must consist of one or more comma- or space-delimited
        fully-qualified @Configuration classes. Fully-qualified packages may also be
        specified for component-scanning -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.howtodoinjava.AppConfig</param-value>
    </context-param>

    <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Declare a Spring MVC DispatcherServlet as usual -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
            instead of the default XmlWebApplicationContext -->
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </init-param>
        <!-- Again, config locations must consist of one or more comma- or space-delimited
            and fully-qualified @Configuration classes -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.howtodoinjava.web.MvcConfig</param-value>
        </init-param>
    </servlet>

    <!-- map all requests for /app/* to the dispatcher servlet -->
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>

 

 

9、怎样用注解的方式配置Spring?

Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的bean描述,

可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。

注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。


注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。

如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。

<beans>

   <context:annotation-config/>
   <!-- bean definitions go here -->

</beans>

context:annotation-config/标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。


下面是几种比较重要的注解类型: 

1、@Required:该注解应用于设值方法。

2、@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

3、@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。

4、JSR-250 Annotations:Spring支持基于JSR-250注解的以下注解,@Resource、@PostConstruct和@PreDestroy。

 

 

11、Spring Bean的作用域之间有什么区别?

Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:

1、singleton:每次请求该bean都将获得相同的实例容器负责跟踪bean实例的状态维护bean的生命周期。

2、prototype:程序每次请求该id的bean,spring都会新建一个bean实例,然后返回给程序。这种情况使用new关键字创建bean实例,一旦创建成功,容器不在跟踪实例

3、request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收.默认singleton

4、Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

5、global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。

如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。


全局作用域与Servlet中的session作用域效果相同。

 

Spring注解

36. 什么是基于Java的Spring注解配置? 给一些注解的例子.

基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。

以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。

37. 什么是基于注解的容器配置?

相对于XML文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。

开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。

38. 怎样开启注解装配?

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

39. @Required  注解

这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

40. @Autowired 注解

@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

41. @Qualifier 注解

当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。

 

 

Spring支持的事务管理类型

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

  • 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
  • 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

 

Spring面向切面编程(AOP)

51.  解释AOP

面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

52. Aspect 切面

AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

52. 在Spring AOP 中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

54. 连接点

连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。

55. 通知

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用五种类型的通知:

  • before:前置通知,在一个方法执行前被调用。
  • after: 在方法执行之后调用的通知,无论方法执行是否成功。
  • after-returning: 仅当方法成功完成后执行的通知。
  • after-throwing: 在方法抛出异常退出时执行的通知。
  • around: 在方法执行之前和之后调用的通知。

56. 切点

切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

57. 什么是引入? 

引入允许我们在已存在的类中增加新的方法和属性。

58. 什么是目标对象? 

被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

59. 什么是代理?

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

60. 有几种不同类型的自动代理?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

61. 什么是织入。什么是织入应用的不同点?

织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。

织入可以在编译时,加载时,或运行时完成。

62. 解释基于XML Schema方式的切面实现。

在这种情况下,切面由常规类以及基于XML的配置实现。

63. 解释基于注解的切面实现

在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 5.3 MB
分享到:
评论

相关推荐

    25个经典的Spring面试问题包含答案

    这篇文档“25个经典的Spring面试问题包含答案”旨在帮助求职者和开发者更好地理解Spring的核心概念和实际应用。以下是对这些问题的详细解读: 1. **什么是Spring框架?** Spring是一个开源的Java平台,它为构建...

    spring面试常见问题

    文档的描述部分提到,这些面试问题是为了帮助读者熟悉可能在面试中遇到的问题类型,而问题通常会从一些基础概念开始,然后根据回答者给出的答案继续深入。这意味着在实际的面试中,候选人需要对Spring框架的基础和...

    Spring面试题【面试题大整合】(含答案)

    能学到什么:常见Spring面试问题及在相关场景下如何处理和解决这些问题。 阅读建议:通过快速阅读全文并在过程中标记自己不熟悉的问题,定期复习来提高理解和记忆。通过反复学习和复习,达到消化吸收和内化的目的。

    java面试——Spring面试专题.zip

    10. **Spring面试问题** - 什么是Spring框架的核心特性? - 如何在Spring中实现依赖注入? - 解释一下Spring的IoC容器是如何工作的。 - Spring MVC的执行流程是什么? - 如何在Spring Boot中配置数据库连接? ...

    spring 面试题集锦

    spring 面试题集锦spring 面试题集锦spring 面试题集锦spring 面试题集锦spring 面试题集锦spring 面试题集锦

    Spring面试宝典 不看后悔

    ### Spring框架核心概念详解 #### 一、Spring框架简介 Spring框架是一款开源的Java平台应用框架,它提供了全面的基础架构支持,使得开发...通过对这些知识点的理解和掌握,可以帮助开发者更好地应对面试和技术挑战。

    Spring面试专题及答案 SpringMVC SpringCloud SpringBoot面试笔试及答案学习笔记合集.zip

    Spring面试专题及答案 SpringMVC SpringCloud SpringBoot面试笔试及答案学习笔记合集: 10个高频Spring BOOT.docx 55个Spring(7模块).docx 68spring(7个模块).docx spring boot35.docx Spring Data JPA中文文档...

    spring面试题宝典

    《Spring面试题宝典》是针对Java开发者,尤其是对Spring框架有一定掌握的程序员们准备的一份面试指南。Spring作为企业级应用开发中的重要组件,其深入理解和熟练运用是面试过程中的常见考察点。本宝典将围绕Spring的...

    spring 面试 经验 文档

    本个工作7年经验,总结出的spring面试宝典,一般工作1年到5年左右面试的人 只要面试SPRING都不会离开这里面的内容,供大家学习

    Spring面试题总结.pdf

    在描述中提到,文档是“Spring面试题和答案”,这暗示文档会按照面试题的格式,提供问题以及对应的答案或解释,帮助读者更好地准备面试,对知识点有更深入的理解。 文档中提到的Spring概述包含了以下几个核心知识点...

    Spring面试问题:500多个Spring面试问题

    Spring启动和微服务面试问题 请点击 如果您喜欢这个项目。 提取请求受到高度赞赏。 目录 问: Spring Boot RESTful Web服务示例? 步骤01 :pom.xml设置 &lt;? xml version = " 1.0 " encoding = " UTF-8 " ?&gt; &...

    30 道 Spring Cloud 面试题及答案.docx

    Spring Cloud 面试题及答案 以下是对 Spring Cloud 相关知识点的详细解释: 1. 什么是 Spring Cloud? Spring Cloud 是一系列框架的有序集合,利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的...

    SpringBoot+SpringCloud面试题.doc

    Spring Boot和Spring Cloud是现代Java开发中的两个关键框架,它们在构建微服务架构中起着至关重要的作用。Spring Boot作为Spring框架的一个子项目...在面试中,这些知识点是评估候选人对现代企业级开发理解的重要标准。

    spring面试经典题目

    Spring框架是Java开发中的核心组件,它...以上是Spring框架的关键知识点,面试时,面试官可能会结合具体场景询问如何使用这些特性,或者要求解决实际问题。熟悉并理解这些概念对于成为一名合格的Spring开发者至关重要。

    spring面试题

    spring面试题总结,spring面试题总结,spring面试题总结,spring面试题总结

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集: JAVA核心知识点整理-282页 Java与哈希算法.docx Java中Lambda表达式的使用.docx JAVA多线程之线程间的通信方式.docx Java注解详解.docx ...

    Spring和SpringMVC面试问题总结(15个)

    Spring和SpringMVC面试问题总结 1.Spring中AOP的应用场景、Aop原理、好处? 2.Spring中IOC的作用与原理?对象创建的过程。 3.介绍spring框架 4.Spring常见创建对象的注解? 5.Spring中用到的设计模式 6.Spring的优点...

    spring面试题.doc

    Spring 框架是Java开发中的一...以上内容涵盖了Spring的核心概念、AOP、DI、集成其他框架以及事务管理等方面,这些都是Spring面试中常见的知识点。理解和熟练运用这些内容,将有助于提升在Spring开发和面试中的竞争力。

    【BAT必备】spring面试题,spring MVC面试题,spring boot面试题,spring cloud面试题

    Hystrix是Netflix开源的容错库,主要用于处理分布式系统的延迟和容错问题。Spring Cloud集成了Hystrix,提供了一种机制来隔离远程系统、服务和第三方库的访问点,防止出现雪崩效应。 #### 4. Zuul API网关 Zuul是...

Global site tag (gtag.js) - Google Analytics