面试知识点十:Spring/Spring MVC

90.为何要使用 spring?html

91.解释一下什么是 aop?java

92.解释一下什么是 ioc?git

93.spring 有哪些主要模块?github

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

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

96.spring 支持几种 bean 的做用域?安全

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

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)类型

  一、singleton:单例,默认做用域。

  二、prototype:原型,每次建立一个新对象。

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

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

  五、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 的做用域?

  一、singleton:单例,默认做用域。

  二、prototype:原型,每次建立一个新对象。

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

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

  五、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 的做用是什么?

相关文章
相关标签/搜索