Spring&SpringMVC高频面试题梳理

jupiter
2023-02-18 / 0 评论 / 594 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年02月18日,已超过425天没有更新,若内容或图片失效,请留言反馈。

0.题目汇总

  1. Spring的IOC和AOP机制?
  2. Spring中Autowired和Resouree关键字的区别和联系?
  3. 依赖注入的方式有几种,各是什么?
  4. 讲一下什么是Spring?
  5. Spring框架中都用到了哪些设计模式?
  6. Spring框架中都用到了哪些设计模式?

1.Spring的IOC和AOP机制?

IOC(Inversion of Control):IOC是控制反转的意思,这是一种面向对象编程的设计思想,可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。简单来说,就是将原本在程序中自己手动创建对象的控制权,交由 Spring 框架来管理Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 IOC 容器负责创建对象,将对象连接在一起,配置这些对象,并从创建中处理这些对象的整个生命周期,直到它们被完全销毁。在spring中IOC是通过DI(Dependency Injection)/依赖注入实现的。

AOP(Aspect Oriented Programing)是面向切面编程思想,这种思想是对OOP的补充,它可以在OOP的基础上进一步提高编程的效率。简单来说,它可以统一解决一批组件的共性需求(如权限检查、记录日志、事务管理等)。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性

2.Spring中Autowired和Resouree关键字的区别和联系?

联系

  1. @Autowired和@Resource注解都是作为bean对象注入的时候使用的
  2. 两者都可以声明在字段和setter方法上

    • 注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了

区别

  1. @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
  2. @Autowired注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
  3. @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错
  4. 讲一下什么是Spring?

3.依赖注入的方式有几种,各是什么?

构造器注入

将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。

<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <!-- index指构造方法 , 下标从0开始 -->
   <constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <!-- name指参数名 -->
   <constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>

setter方法注入

通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。

<?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">
    <bean id="address" class="com.hui.pojo.Address">
        <property name="address" value="背景"/>
    </bean>
    <!-- 依赖注入之set注入 -->
    <bean id="student" class="com.hui.pojo.Student">
        <!--1. 普通值注入,value-->
        <property name="name" value="李家辉"/>
        <!--2. bean注入,ref-->
        <property name="address" ref="address"/>
        <!--3. 数组注入,array-value -->
        <property name="books">
            <array>
                <value>李</value>
                <value>家</value>
                <value>辉</value>
            </array>
        </property>
        <!--list注入,list-value -->
        <property name="hobbys">
            <list>
                <value>语文</value>
                <value>数学</value>
                <value>英语</value>
            </list>
        </property>

        <!--Map注入,map-entry-key-value -->
        <property name="card">
            <map>
                <entry key="身份证" value="123"/>
                <entry key="银行卡" value="456"/>
            </map>
        </property>

        <!--Set注入,set-value -->
        <property name="games">
            <set>
                <value>IOC</value>
                <value>DI</value>
            </set>
        </property>

        <!--null注入-->
        <property name="wife">
            <null/>
        </property>

        <!---->
        <property name="info">
            <props>
                <prop key="学号">2019</prop>
                <prop key="username">男</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>
</beans>

c命名空间与p命名空间

p命名空间就是对应setter注入(property);c命名空间就是对应构造方法注入(constructor-arg)。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--p命名空间注入,可以直接注入属性的值:property。p命名空间注入就是对应set注入的属性注入-->
    <!--需要导入约束 xmlns:p="http://www.springframework.org/schema/p" -->
    <bean id="user" class="com.hui.pojo.User" p:name="李家辉" p:age="22"/>

    <!--c命名空间注入,对应所有的构造器注入,constructor-arg -->
    <!--需要导入约束 xmlns:c="http://www.springframework.org/schema/c" -->
    <bean id="user1" class="com.hui.pojo.User" c:name="李家毅" c:age="22"/>
</beans>

autowire byName (按名称自动装配)

<bean id="user" class="com.kuang.pojo.User" autowire="byName">
   <property name="str" value="qinjiang"/>
</bean>

autowire byType (按类型自动装配)

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>

<bean id="user" class="com.kuang.pojo.User" autowire="byType">
   <property name="str" value="qinjiang"/>
</bean>

使用注解实现自动装配

@Autowired+@Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
  • @Qualifier不能单独使用。

@Resource

  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
  • 其次再进行默认的byName方式进行装配;
  • 如果以上都不成功,则按byType的方式自动装配。
  • 都不成功,则报异常。

4.讲一下什么是Spring?

Spring是一个轻量级的IoC和AOP容器框架是为Java应用程序提供基础性服务的一套框架,
目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。简单来说,它是一个容器框架,用来装 javabean(java对象),中间层框架(万能胶)可以起一个连接作用,可以把各种技术粘合在一起运用。
主要由以下几个模块组成:

image-20220916152817650

Spring Core:SpringCore模块是Spring的核心容器,它实现了IOC模式,提供了Spring框架的基础功能。此模块中包含的BeanFactory类是Spring的核心类,负责JavaBean的配置与管理。它采用Factory模式实现了IOC即依赖注入。

Spring AOP:Spring在它的AOP模块中提供了对面向切面编程的丰富支持,Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中,可以自定义拦截器、切点、日志等操作

Spring DAO:提供了一个JDBC的抽象层和异常层次结构,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC

Spring ORM:对现有的ORM框架的支持;

Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);

Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。

5.解释Spring支持的几种bean的作用域。

类型说明
singleton在Spring容器中仅存在一个实例,即Bean以单例的形式存在。
prototype每次调用getBean()时,都会执行new操作,返回一个新的实例。
request每次HTTP请求都会创建一个新的Bean。
session同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。
globalSession同一个全局的Session共享一个Bean,一般用于Portlet环境

6.Spring框架中都用到了哪些设计模式?

  1. 工厂模式:ApplicationContext类使用工厂模式创建Bean对象
  2. 单例模式:Spring中的Bean的作用域默认就是单例Singleton的
  3. 原型模式:在 spring 中用到的原型模式有: scope="prototype" ,每次获取的是通过克隆生成的新实例,对其进行修改时对原有实例对象不造成任何影响。
  4. 代理模式:Spring AOP基于动态代理实现的
  5. 模板模式:Spring中以Template结尾的类,比如jdbcTemplate、SqlSessionTemplate等,都是使用了模板方法模式
  6. 装饰器模式(动态地给对象添加一些额外的属性或者行为 和继承相比,装饰器模式更加灵活):Spring中配置DataSource时 ,DataSource可以是不同的数据库和数据源.为了在少修改原有类的代码下动态切换不同的数据源,这时就用到了装饰器模式
  7. 责任链模式:DispatcherServlet 中的 doDispatch() 方法中获取与请求匹配的处理器
    HandlerExecutionChain,this.getHandler() 方法的处理使用到了责任链模式。
  8. 观察者模式:Spring 中的 Event 和 Listener

7.什么是MVC?

MVC是一种架构模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。

8.谈谈对 Spring MVC 的理解

Spring MVC 是一款很优秀的 MVC 框架。可以让我们的开发更简洁,而且它和 Spring 是无缝集成,是 Spring 的一个子模块,是我们上面提到 Spring 大家族中 Web 模块。

Spring MVC 框架主要由 DispatcherServlet 、处理器映射、处理器(控制器)、视图解析器、视图组成。

Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)

springMVC执行流程

image-20220505112240422

9.SpringMVC怎么样设定重定向和转发的?

Spring MVC 请求方式分为转发、重定向 2 种,分别使用 forward 和 redirect 关键字在 controller 层进行处理

重定向是将用户从当前处理请求定向到另一个视图(例如 JSP)或处理请求,以前的请求(request)中存放的信息全部失效,并进入一个新的 request 作用域;

转发是将用户对当前处理的请求转发给另一个视图或处理请求,以前的 request 中存放的信息不会失效。

转发是服务器行为,重定向是客户端行为。
1)转发过程
客户浏览器发送 http 请求,Web 服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里转发的路径必须是同一个 Web 容器下的 URL,其不能转向到其他的 Web 路径上,中间传递的是自己的容器内的 request。

在客户浏览器的地址栏中显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
2)重定向过程
客户浏览器发送 http 请求,Web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器,客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 URL 是新的 location 地址,服务器根据此请求寻找资源并发送给客户。

在这里 location 可以重定向到任意 URL,既然是浏览器重新发出了请求,那么就没有什么 request 传递的概念了。在客户浏览器的地址栏中显示的是其重定向的路径,客户可以观察到地址的变化。重定向行为是浏览器做了至少两次的访问请求。

在 Spring MVC 框架中,重定向与转发的示例代码如下:

@RequestMapping(“/login”)
public String login() {
    //转发到一个请求方法(同一个控制器类可以省略/index/)
    return “forward:/index/isLogin”;
}
@RequestMapping(“/isLogin”)
public String isLogin() {
    //重定向到一个请求方法
    return “redirect:/index/isRegister”;
}

在 Spring MVC 框架中,控制器类中处理方法的 return 语句默认就是转发实现,只不过实现的是转发到视图。

@RequestMapping(“/register”)
public String register() {
return “register”; //转发到register.jsp
}

10.SpringMVC常用的注解有哪些?

组件型注解:

作用:被注解的类将被spring初始话为一个bean,然后统一管理。

  1. @Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。
  2. @Repository 对Dao实现类进行注解 (特殊的@Component)
  3. @Service 用于对业务逻辑层进行注解, (特殊的@Component)
  4. @Controller 用于控制层注解 , (特殊的@Component)

==待完成==

参考资料

  1. @Autowired和@Resource注解的区别和联系(十分详细,不看后悔)
  2. 依赖注入三种方式
  3. 设计模式_spring框架中常用的8种设计模式
0

评论 (0)

打卡
取消