zoukankan      html  css  js  c++  java
  • 面试知识点十:Spring/Spring MVC

    90.为什么要使用 spring?

    91.解释一下什么是 aop?

    92.解释一下什么是 ioc?

    93.spring 有哪些主要模块?

    94.spring 常用的注入方式有哪些?

    95.spring 中的 bean 是线程安全的吗?

    96.spring 支持几种 bean 的作用域?

    97.spring 自动装配 bean 有哪些方式?

    98.spring 事务实现方式有哪些?

    99.说一下 spring 的事务隔离?

    100.说一下 spring mvc 运行流程?

    101.spring mvc 有哪些组件?

    102.@RequestMapping 的作用是什么?

    103.@Autowired 的作用是什么?

    90.为什么要使用 spring?

      Spring是一款为了解决企业应用开发的复杂性而创建的轻量级Java框架。框架的主要优势之一就是其分层架构,分层架构允许使用者选择哪一个组件,同时为J2EE应用程序开发提供集成的框架。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益,Spring的核心是控制反转IOC和面向切面AOP。

      总的来说,就是简化Java开发。

    91.解释一下什么是 aop?

      AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

      AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

      在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。

    • 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
    • 所谓的周边功能,比如性能统计,日志,事务管理等等

      周边功能在 Spring 的面向切面编程AOP思想里,即被定义为切面

      在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP

      AOP 当中的概念:

    • 切入点(Pointcut)
      在哪些类,哪些方法上切入(where
    • 通知(Advice)
      在方法执行的什么时候(when:方法前/方法后/方法前后)做什么(what:增强的功能)
    • 切面(Aspect)
      切面 = 切入点 + 通知,通俗点就是:在什么时候,什么地方,做什么增强!
    • 织入(Weaving)
      把切面加入到对象,并创建出代理对象的过程。(由 Spring 来完成)

       AOP的用法

    • 使用注解来开发 Spring AOP
    • 使用 XML 配置开发 Spring AOP

      Spring(4)——面向切面编程(AOP模块)

    92.解释一下什么是 ioc?

      IoC:Inverse of Control(控制反转),不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

    • 正控:若要使用某个对象,需要自己去负责对象的创建
    • 反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权由自己反转给了Spring框架

      描述一下控制反转的概念:控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。

      • 好处:
        降低对象之间的耦合
        我们不需要理解一个类的具体实现,只需要知道它有什么用就好了(直接向 IoC 容器拿)

      Spring IoC 容器的生成十分的复杂,但是大体了解一下 Spring IoC 初始化的过程还是必要的。这对于理解 Spring 的一系列行为是很有帮助的。注意:Bean 的定义和初始化在 Spring IoC 容器是两大步骤,它是先定义,然后初始化和依赖注入的。Spring(2)——Spring IoC 详解

      DI:Dependency Injection(依赖注入)

    • 指 Spring 创建对象的过程中,将对象依赖的属性(简单值,集合,对象)通过配置设值给该对象

      总结:IoC 和 DI 其实是同一个概念的不同角度描述,DI 相对 IoC 而言,明确描述了“被注入对象依赖 IoC 容器配置其依赖对象”

      Spring学习(1)——快速入门

    93.spring 有哪些主要模块?

      Spring 的框架结构

    • Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。
    • Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。
    • AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。
    • Core Container(核心容器):包含有Beans、Core、Context和SpEL模块。
    • Test模块支持使用JUnit和TestNG对Spring组件进行测试。

      Spring学习(1)——快速入门

    94.spring 常用的注入方式有哪些?

      Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。

      Spring常用的三种注入方式

    95.spring 中的 bean 是线程安全的吗?

    先看两个概念:Spring中bean的作用域、有状态和无状态bean

    Spring 的 bean 作用域(scope)类型

      1、singleton:单例,默认作用域。

      2、prototype:原型,每次创建一个新对象。

      3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。

      4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。

      5、global-session:全局会话,所有会话共享一个实例。

    有状态的bean:对象中有实例变量(成员变量),可以保存数据,是非线程安全的。

    无状态的bean:对象中没有实例变量(成员变量),不能保存数据,可以在多线程环境下共享,是线程安全的。

    线程安全这个问题,要从单例与原型Bean分别进行说明。

    原型Bean

    对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

    单例Bean

    对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

    如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

    对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。

    使用ThreadLocal的好处

    使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程保存线程私有的数据。这是一种以空间换时间的方式。

    当然也可以通过加锁的方法来解决线程安全,这种以时间换空间的场景在高并发场景下显然是不实际的。

    spring 线程安全问题  Spring中的Bean是线程安全的吗?

    96.spring 支持几种 bean 的作用域?

      1、singleton:单例,默认作用域。

      2、prototype:原型,每次创建一个新对象。

      3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。

      4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。

      5、global-session:全局会话,所有会话共享一个实例。

    97.spring 自动装配 bean 有哪些方式?

      SpringBean的装配,所谓 ”装配“ 就是指将Bean安装到Spring容器中并进行依赖关系配置,稍微提一下IOC控制反转就是指的安装这一过程中,而DI依赖指的是配置这一过程。本章我们就Spring应用中如何进行装配Bean进行讲解;如自动化装配,Java配置装配,XML配置装配方式进行介绍

      Spring的三种装配机制

    1. 隐式Bean发现机制和自动装配的原则
    2. 在Java的接口和类中进行装配
    3. 在XML中进行装配

      值得一提的是,我们在项目中应该优先实用隐式的Bean发现机制和自动装配,其次使用在Java中进行装配,最后再使用在XML中进行装配。

    隐式的Bean发现机制和自动装配

    Spring从两个角度来实现自动化装配;组件扫描(Spring自动发现应用中上下文所需要的创建的Bean),自动装配(Spring自动满足Bean之间的依赖)

    • 使用@Component将普通Java类配置成SpringBean
    • 使用@Autowired(自动装配)使Spring满足Bean的依赖
    • 配置组件扫描包(组件扫描)
      • 在Java类中配置组件扫描      @ComponentScan("com.jimisun.controller")
      • 在XML配置文件配置组件扫描       <context:component-scan base-package="com.jimisun.controller,com.jimisun.service"/>
    复制代码
    @Component
    public class User {
    
        @Autowired
        private Article article;
    
        public void action() {
            article.action();
        }
    }
    复制代码
    注意:示例中使@Component将Java类声明成SpringBean,除了这一注解你还可以使用@Controller,@Service,@Repository等注解... 同样@Autowired也可使用其他注解来代替,这里为了简明介绍不再陈述。

    自动装配

      所谓自动装配技术是一种由 Spring 自己发现对应的 Bean,自动完成装配工作的方式,它会应用到一个十分常用的注解 @Autowired 上,这个时候 Spring 会根据类型去寻找定义的 Bean 然后将其注入。

    在Spring使用中,我们在xml配置文件通过元素或元素的ref属性向bean注入另外的依赖bean。
    如果使用自动装配(autowiring) ,就可以减少甚至消除配置元素和元素。

    设置元素的autowire属性就可以设定bean的自动装配模式。自动装配有5种模式。
    在这里插入图片描述

    在xml中使用自动装配

    首先假设User类有两个setter方法,一个是setUsername(),一个是setAccount()。
    byName方式

    <bean id="ac_100" class="twm.demo.Account"/>
    
    <bean id="user" class="twm.demo.User">
      <property name="username" value="Yanglan"/>
      <property name="account" ref="ac_100"/>
    </bean>
    
    <!--以下是使用自动装配,假设这里定义的id为account-->
    <bean id="account" class="twm.demo.Account"/>
    
    <bean id="user" class="twm.demo.User" autowire="byName">
      <property name="username" value="Yanglan"/>
    </bean>

    我们看看上下两种配置的方式的区别,user bean的属性account的值是一个定义好的Bean,在属性中通过ref引用其id(ac_100)实现注入。
    第二种方式把该Bean的id改成了与引用它的Bean属性相同的名字(id=”account” 可忽略属性首字每大小写),然后使用byName的方式来自动装配,对user bean来说省略配置一个元素。

    使用注解自动装配

    如果不想在xml文件中使用autowire属性来启用自动装配,还可以直接在类定义中使用@Autowired或@Resource来装配bean。

    使用@Autowired自动装配时,容器中只能有一个适合的Bean待选,否则的话,spring会抛出异常。(因为@Autowired默认是使用byType的方式装配)

    Spring自动装配Bean——xml方式与注解方式

    最后,总结一下,Spring装配bean有三种方式。其中一种是隐式bean的发现机制和自动装配原则,这种方式的自动装配bean又有两种实现方式,在xml中自动装配或是使用注解自动装配。

    98.spring 事务实现方式有哪些?

    99.说一下 spring 的事务隔离?

    100.说一下 spring mvc 运行流程?

    101.spring mvc 有哪些组件?

    102.@RequestMapping 的作用是什么?

    103.@Autowired 的作用是什么?

  • 相关阅读:
    MySQL IO线程及相关参数调优
    mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引
    Mysql怎么判断繁忙 checkpoint机制 innodb的主要参数
    遇见 TiDB
    TiDB 深度实践之旅--真实“踩坑”经历
    tidb使用坑记录
    MySQL mysql server与存储引擎
    DBProxy 读写分离使用说明
    DBProxy 项目全解
    Mysql 数据库意向锁意义
  • 原文地址:https://www.cnblogs.com/zfyang2429/p/11194116.html
Copyright © 2011-2022 走看看