• 请你说说Spring


    一. 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中用到哪些设计模式

    九. 循环依赖

     后期更新~

     

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


    __EOF__

  • 本文作者: Monkey-X
  • 本文链接: https://www.cnblogs.com/monkey-xuan/p/15905335.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Es6新增内容
    【ybtoj】二分算法例题
    java面试小经历
    前端工程师应该如何去创业?
    【设计模式】26.结构型模式-代理模式(Proxy)
    hiredis/examples /example-libevent.c
    TCGAbiolinks包学习
    两万字!多线程硬核50问!
    Mac Office文档常用快捷键
    2023云栖大会,Salesforce终敲开中国CRM市场
  • 原文地址:https://www.cnblogs.com/monkey-xuan/p/15905335.html