zoukankan      html  css  js  c++  java
  • Spring相关原理

    Spring是什么?

    Spring是一个轻量级的IoC和AOP容器框架。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 

    模块分为以下:Spring Core;Spring Context;Spring AOP;Spring DAO;Spring ORM;Spring Web;Spring MVC。

    1.Spring MVC的工作流程(spring工作机制)?
    (1)发起请求到前端控制器disPatchServelet。
    (2)disPatchServelet调用handlerMapping寻找对应的hander,handlerMapping返回给hander给前端控制器。
    (3)disPatchServelet通过HandlerAdapter去调用controller到服务层,返回modelAndView给前端控制器。
    (4)disPatchServelet再调用视图解析器解析modelAndView,返回一个view给前端控制器。
    (5)disPatchServelet再渲染之后返回给用户。

    1、Spring Bean实例作用域:

    ① singleton:   IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。

    ② prototype:   IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。

    ③ request:  该属性仅对HTTP请求产生作用,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。

    ④ session:  该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

    ⑤ global-session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

    1、Spring容器可以管理singleton作用域下Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。

    2、对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean的生命周期。

    BeanFactoryFactoryBean是什么

    BeanFactory: 是Spring容器中的一个基本类,负责生产和管理bean。

    FactoryBean: 是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。

    事实上, Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext

    BeanFactory与ApplicationContext的作用和区别?

    1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。

    2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能。

    3、ApplicationContext的初始化和BeanFactory有一个重大的区别:

        BeanFactory在初始化容器时 并未实例化Bean, 直到第一次访问 某个Bean时才实例目标Bean;
     而ApplicationContext则在 初始化应用上下文 时就实例化所有的单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些。

    BeanFactory怎么创建并且给使用者一个bean?
    (1)我们定义一个Bean类,这个由BeanFactory工厂来生成。这个类用来存放一个Bean拥有的属性,这个Bean对象包含id,type,和properties三个属性。
    (2)然后Spring 就开始加载我们的配置文件了,将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,只有这样 我们才能通过context.getBean("animal")这个方法获得Animal这个类。
    (3)现在已经有spring工厂,需要通过反射机制把对应的bean注入进去。通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。
    (4)最后它将这个类的实例返回给我们,我们就可以用了。

    请解释Spring Bean的生命周期?
    (1)实例化Bean:
    (2)设置对象属性(依赖注入):
    (3)处理Aware接口:将相关的xxxAware实例注入给Bean
    (4)让Bean实现了BeanPostProcessor接口。
    (5)InitializingBean 与 init-method:   自动调用其配置的初始化方法。
    (7)DisposableBean:   调用其实现的destroy()方法
    (8)destroy-method:销毁
    Spring如何处理线程并发问题?
      在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
     
    Spring 框架中都用到了哪些设计模式?

    (1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;

    (2)单例模式:Bean默认为单例模式。

    (3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;

    (4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。

    (5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。


    Spring如何解决循环依赖的三种方式?

    循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。

    第一种:构造器参数循环依赖:

    表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyIn CreationException异常表示循环依赖。

    第二种:setter方式单例,默认方式:

    1、Spring是先将Bean对象实例化之后再设置对象属性的。

    2、Spring在InstantiateBean时执行构造器方法,构造出实例,如果是单例的话,会将它放入一个singletonBeanFactory的缓存中,再进行设置属性。通过一个singletonBeanFactory的缓存解决了循环依赖的问题。

    第三种:setter方式原型,作用域设置为prototype:

    对于"prototype"作用域bean,Spring容器无法完成依赖注入,因为Spring容器不进行缓存"prototype"作用域的bean,因此无法提前暴露一个创建中的bean。

     

     
     
     
     
  • 相关阅读:
    HDU3068 最长回文
    本周最后一天——4.18
    一周又结束了——4.14
    一本通1591:数字计数
    一本通1589:不要 62
    一本通1588:数字游戏
    洛谷P2657 [SCOI2009] windy 数
    一本通1587: 【例 3】Windy 数
    一本通1586:【 例 2】数字游戏
    安卓自动化测试(一)
  • 原文地址:https://www.cnblogs.com/lgg20/p/12334755.html
Copyright © 2011-2022 走看看