• 半夜思考之查漏补缺 , Spring 中 Bean 之间的依赖问题


    每次看书都会发现自己的不足 .

          当一个 singten 的 Bean 依赖一个 prototype 的 Bean 时 , 如果不加注意 , 会发生一些奇怪的事情 , prototype 变为了 singten 了 , 这是为什么呢 ?

          这是 Spring 容器本身的特性 , 当初始化 Spring 容器时 , 容器会预初始化容器中所有的 singleton 的 Bean , 由于 singleton Bean 依赖于 propertype Bean , 因此 , 容器在初始化 singleton Bean 之前会先创建 propertype Bean , 然后将创建好的 propertype Bean 作为属性注入到 singleton Bean 中 , 一旦容器创建好 singleton Bean , 容器在它销毁之前都不会为它第二次注入 propertype Bean , 这样一来 , propertype Bean 却表现出了 singleton 的行为了 , 与设计的初衷违背 .

    解决这个问题有两种方式 :

    • 放弃依赖注入 : singleton 作用域的 Bean 每次都需要 propertype 作用域的 Bean 时, 主动向容器请求新的 Bean 实例 , 即可保证每次注入的 Bean , 都是新的 propertype Bean 的实例 . ( 不推荐 )
    • 利用方法注入 : 使用 <lookup-method> 标签指定一个抽象方法和 propertype Bean . 具体实现就是将 singleton Bean 的类声明为一个抽象类 , 并提供一个抽象方法 , 这个抽象方法就是用来注入 propertype Bean 的 . ( 推荐使用 )

    下面举一个栗子 :

           一个猎人 , 有打猎的功能 , 每次打猎都带上猎狗 , 但是每次带的猎狗都不同 , 也就是符合上面的一个是 singten , 一个是 prototype , 猎人依赖猎狗 .

     

    1

    注 : 利用方法注入的实质使用了代理 , 分为两种代理 , JDK 代理和 cglib 代理 , 如果目标抽象类实现过接口 , Spring 容器会采用 JDK 代理实现抽象方法 , 如果目标类没有实现过接口 , Spring 会采用 cglib 代理 , 实现该抽象方法 .

  • 相关阅读:
    bzoj3237 cdq分治+可撤销并查集
    bzoj2957 奥妙重重的线段树
    bzoj3718 树状数组
    bzoj3991 LCA + set
    codeforces794D dfs+图上hash
    [ZJOI2010]数字计数/烦人的数学作业
    [SCOI2009]windy数
    数位DP(学习笔记)
    UVA10559 方块消除 Blocks
    采蘑菇
  • 原文地址:https://www.cnblogs.com/daimajun/p/7296352.html
Copyright © 2020-2023  润新知