一. Spring是什么?

  • 是一个轻量级的开源容器框架,用来装JavaBean,可以把其他的一些框架进行整合使用,使得开发更快,更简洁。

    • 轻量级:占用空间小,非入侵式的(Spring中的对象不依赖于Spring的特定类)
  • IOC,AOP

二. IOC和AOP

谈谈你对AOP的理解?

  • 将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,注入到目标对象(具体业务) 中。可以在不改变目标对象的前提下进行功能扩展,做一些额外的事。
  • 在OOP的设计中,导致了大量代码的重复,不利于模块的重用。
  • AOP基于动态代理:JDK动态代理和cglib动态代理

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

  • 前置通知,后置通知,循环通知,返回后通知,抛出异常后通知

谈谈你对IOC的理解?

从三个方面谈:

  • 容器概念:

    • IOC容器就像个map一样,里面保存的是对象。这些对象通过xml,或者注解放到这个map中, 在需要的地方进行DI注入。
    • 对象的创建,消亡,管理都交给容器。
  • 控制反转:(获得依赖对象的过程被反转了)
    • 没有IOC之前,比如A对象中依赖B对象,那么在A运行到某一点,就会主动的创建B对象或者使用之前创建的B对象,不管怎样,控制权在程序的手里。引入IOC之后,对象A和B之间失去了 直接的联系,当对象A允许到需要B对象的时候,IOC会把之前创建的B对象注入到需要的位置B对象从主动创建到被动注入,控制权交给IOC
  • 依赖注入:
    • 就是实现IOC的方法,在IOC容器允许中,动态的将某种依赖关系注入到对象中

三. 简述一下Spring Bean的生命周期?

  1. 实例化Bean,通过反射
  2. 属性填充,对对象中加了@autowired的属性进行注入
  3. 处理Aware接口,Spring会检测该对象是否实现了xxxAware接口,可以拿到一些Spring 容器资源,
    • 比如BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字;
  4. 完成代理AOP,如果对象有AOP代理,生成代理类对象。
  5. BeanPostProcessor前置处理
  6. InitializingBean:如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法,可以完成一些属性的初始化操作。
  7. BeanPostProcessor后置处理
  8. 实例化bean,如果是单例,放在单例池中
  9. 调用DisposableBean()销毁bean

四. 解释一下Spring支持的几种Bean的作用域?

  • singletion:单例模式(默认) 每一个IOC容器只有一个bean对象,生命周期与IOC容器一样
  • prototype:原型模式,每次注入都会创建一个新的对象(每次调用getBean()创建一个新的对象)

其余的只能在web开放中使用!(让对象和web里的作用域一样)

  • request:每次请求创建一个对象
  • session:每个session中创建一个对象
  • application:每一个ServletContent中创建一个对象
  • websocket:每一个websocket中创建一个对象
  • global-session:全局作用域(了解)

Spring框架中的单例Bean是线程安全的吗?

不是线程安全的

  • 如果bean是无状态的,就不会保存数据。只是说一层一层的调用实例方法,比如controller调用 service,service调用dao。这样的操作是在栈中,每一个线程独有的空间,就是线程安全的。
  • 如果bean是有状态的,就会有数据存储功能。那么数据保存在堆中,就需要考虑线程安全问题了
    • 两种方式保证线程安全:

      • 把singletion改为prototype。每次是新的对象
      • 使用Threadlocal把变量变为线程私有的,如果需要共享变量,加锁。

五. Bean的自动装配

什么是Bean的自动装配,有哪些方式?

通俗的话来讲,就是一个Bean中。有些属性是引用类型的,这些类型就不需要手动注入,可以从IOC容器中自动注入,也就是自动装配。具体是给autowire的属性赋值。

五种自动装配的方式?

  • 缺省:就是手动注入
  • byType:根据类型注入
  • byName:根据id注入
  • construtor:根据构造器的参数类型进行注入。
  • autodetect:先根据构造器参数,再根据byType。

关于@autowire

自动注入俩种方式:

  • xml配置文件
  • 注解:
    • @autowired
    • @Resource

关于@autowired的理解?

  • 该注解是先ByType再ByName。可以放在属性,setter方法,构造器,任意方法上使用因为该注解使用反射进行注入。
  • 它会先把 属性/成员变量的【访问控制检查】关掉,这样就算设置为private也会注入成功。

六. BeanFactory,ApplicationContext,FactoryBean

BeanFactory和ApplicationContext的区别?

  • BeanFactory是Spring框架的基础设施,面向 Spring 本身;
  • ApplicationContext面向使用Spring 框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext而非底层的BeanFactory。
    • ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能。

具体区别:

  • ApplicationContext:

    • 继承MessageSource,支持国际化
    • 统一的资源文件访问方式
    • 同时加载多个配置文件
    • 载入多个上下文对象,使得每个上下文对象专注于一个特定的层次,比如:service层 (以上为扩展的功能)
    • 在容器启动的时候,一次性创建所有的bean对象,这样在容器启动的时候,就能发现错误
  • BeanFactory:
    • 采用延迟加载的形式创建bean,只有调用getBean()的时候,才进行对象的创建

FactoryBean 与 BeanFactory 有什么区别?

  • BeanFactory 是 IoC 底层容器,提供了 bean 的管理
  • FactoryBean 是创建 Bean 的一种方式,帮助实现复杂的初始化逻辑。 比如SqlSessionFactoryBean就是继承 FactoryBean

七. Spring事务

事务这个概念是数据库层面的,Spring只是基于数据库做了扩展,提供简单的操作事务的方式


Spring事务的实现方式和原理?

两种实现方式:

  • 编程式:自己关闭sql的自动提交,进行try-catch-final。
  • 申明式:采用xml或者@Transaction 开启事务
    • 申明式事务的原理:Spring会基于这个类生成一个代理对象,使用这个代理对象的时候,如果方法上使用@Transaction,就会把自动提交设置为false,然后执行逻辑,如果报异常,回滚,无异常,提交事务。

Spring事务的隔离级别:就是数据库的隔离级别,可以参照MYSQL事务


事务的传播特性

PROPAGATION_REQUIRED 如果没有,就开启一个事务;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)
RROPAGATION_REQUIRES_NEW 如果没有,就开启一个事务;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,方法B会起一个新的事务,等待方法B的事务完成以后,方法A才继续执行)
PROPAGATION_NESTED 如果没有,就开启一个事务;如果有,就在当前事务中嵌套其他事务
PROPAGATION_SUPPORTS 如果没有,就以非事务方式执行;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)
PROPAGATION_NOT_SUPPORTED 如果没有,就以非事务方式执行;如果有,就将当前事务挂起,(方法A所在的事务就会挂起,而方法B以非事务的状态运行完,再继续方法A的事务)
PROPAGATION_NEVER 如果没有,就以非事务方式执行;如果有,就抛出异常。
PROPAGATION_MANDATORY 如果没有,就抛出异常;如果有,就使用当前事务

Spring 事务什么时候会失效?

Spring事务的原理是AOP,进行切面增强,那么失效的原因也是AOP不起作用,常见情况如下:

  • 发生自调用,使用this调用本类的方法,此时这个this对象不是代理类,而是UserService 对象本身!

    • 解决方式很简单,让this变为代理类
  • 方法不是public的:
    • @Transaction只能使用在public方法上,否则事务会失效
    • @Transactional 作用于接口,使用 CGLib 动态代理
  • 数据库不支持事务
  • 没有被Spring管理
  • 异常被吃掉,事务没有回滚

八. Spring中用到哪些设计模式

九. 循环依赖

后期更新~

寄语:透过云端的道路,只亲吻攀登者的足迹。

请你说说Spring的更多相关文章

  1. IntelliJ idea创建Spring MVC的Maven项目

    参考:http://my.oschina.net/gaussik/blog/385697?fromerr=Pie9IlFV 创建Maven Web项目 菜单File->New Project可进 ...

  2. [Java面试五]Spring总结以及在面试中的一些问题.

    1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...

  3. Spring MVC 学习总结(一)——MVC概要与环境配置

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  4. Spring面试基本问题(1)

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  5. MyBatis使用总结+整合Spring

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...

  6. Spring4.1新特性——Spring MVC增强

    目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...

  7. Spring Mobile 1.1.0.RC1 和 1.0.2 发布

    Spring Mobile 1.1.0.RC1 发布了,该版本包含: 支持 Firefox OS 设备的检测 修复了使用 LiteDeviceDelegatingViewResolver 处理重定向和 ...

  8. Spring面试题集

    一.Spring简介       *  Spring框架有哪几部分组成? Spring框架有七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,主要功能表现如下: ...

  9. Spring面试问题

    什么是Spring框架?Spring框架有哪些主要模块? 使用Spring框架有什么好处? 什么是控制反转(IOC)?什么是依赖注入? 请解释下Spring中的IOC? BeanFactory和App ...

随机推荐

  1. centos7 date时间命令

    date "+%F %T" %F     full date; same as %Y-%m-%d  --相当于年月日格式 %T     time; same as %H:%M:%S ...

  2. Leetcode算法系列(链表)之删除链表倒数第N个节点

    Leetcode算法系列(链表)之删除链表倒数第N个节点 难度:中等给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点.示例:给定一个链表: 1->2->3->4-&g ...

  3. Mysql高性能优化

    一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 SQL 查询语句关联5,6张表且编写不够规范,导致 MySQL 在执行 SQL 语 ...

  4. 最新RabbitMQ安装指南2021.07

    一.RabbitMQ入门及安装 1.入门及安装 01 概述 简单概述: RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写,支持多种客户端(语言),用于在分布式系统中存储消 ...

  5. Java对象内存模型

    2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...

  6. 更快的Maven构建工具mvnd和Gradle哪个更快?

    Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradle,那感觉只有两个字"真香". 前段时间测评了更快的 Maven 构建工具 mvnd,感觉性能挺高 ...

  7. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  8. Android学习笔记4

    activity配置文件 //AndroidMainifest.xml <?xml version="1.0" encoding="utf-8"?> ...

  9. vue学习18-过滤器

    <!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http ...

  10. Redis命令大全(超详细)

    一:序 其实本文的命令大家都可以去官网学习,但是我出这篇文章只是以更直观的方式来解读官网上的命令,让大家一眼可以看得懂,看的明白: 注意:我全文使用的Redis版本为 6.2.x 版本,低版本可能有些 ...