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

当一个 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 代理 , 实现该抽象方法 .

半夜思考之查漏补缺 , Spring 中 Bean 之间的依赖问题的更多相关文章

  1. 半夜思考之查漏补缺 , Spring 中的 Bean 继承机制

    这里的继承 , 不是 Java 中的继承 , 下面就总结下 Bean继承与Java继承的区别: Spring 中的子类 Bean 和父 Bean 可以是不同类型 , 但是 Java 中的继承则可保证子 ...

  2. 半夜思考之查漏补缺, Spring 中的容器后处理器

    之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 ...

  3. 半夜思考之查漏补缺, Spring 的 Bean 后处理器

    有一篇写的是容器后处理器, 这篇是 Bean 后处理器 , 我对这个 Bean 后处理器的理解就是一个 AOP 编程 . Bean 后处理器 : 是一种特殊的 Bean , 这种 Bean 不对外提供 ...

  4. 半夜思考之查漏补缺, 在 Spring中, 所有的 bean 都是 Spring 创建的吗 ?

    Spring 是一个 bean 容器, 负责 bean 的创建, 那么所有的 bean对象都是 Spring 容器创建的吗 ? 答案是否定的. 但是乍一想, 好像所有的对象都是 Spring 容器负责 ...

  5. 【spring bean】 spring中bean之间的引用以及内部bean

    在spring中会有如下的几种情况: 1.在当前容器中,(即在spring.xml这一个配置文件中),一个bean引用了另一个bean. 使用 1>  <ref  bean="另 ...

  6. C++ Primer 查漏补缺 —— C++ 中的各种初始化

    初学者在刚开始读 C++ Primer 的时候,总是容易被书中各种初始化搞得头大:默认初始化.列表初始化.值初始化.类内初始值.构造函数初始值列表.new int 和 new int() 的区别... ...

  7. 【spring源码分析】IOC容器初始化——查漏补缺(四)

    前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...

  8. Java基础查漏补缺(2)

    Java基础查漏补缺(2) apache和spring都提供了BeanUtils的深度拷贝工具包 +=具有隐形的强制转换 object类的equals()方法容易抛出空指针异常 String a=nu ...

  9. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

随机推荐

  1. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

  2. Developing modules for the Apache HTTP Server 2.4

    Developing modules for the Apache HTTP Server 2.4 Available Languages: en This document explains how ...

  3. AndroidStudio更改包名

    最近开发一个项目 和以前开发的某一个功能类似 不想再重新搭建界面 从零开始去写... 就想把原来的项目copy一份 但是这样的话安装在手机中会把原来的项目覆盖掉 这是因为它们的applicationI ...

  4. Oracle执行SQL查询语句的步骤

    Oracle执行SQL查询语句的步骤 如果用户在SQL*Plus下输入了如下查询语句:SELECT * FROM dept: 查询语句的处理主要包括三个过程:编译(parse).执行(execute) ...

  5. ADO.net中DataTable的应用

     一.思维导图 二.知识点描述 (1)构造函数 DataTable() 不带参数初始化DataTable类的新实例 DataTable(string tableName) 用指定的表名初始化DataT ...

  6. 在IIS中部署Asp.Net网站

    在IIS中部署Asp.Net网站 1.添加IIS或者删除IIS,在控制面板=>程序和功能=>打开或关闭功能 启动iis,右键计算机=>管理=>服务和应用程序=>Inter ...

  7. React Native移动开发实战-5-Android平台的调试技巧

    Android平台的调试和其他平台的调试也很类似,例如:在Android Studio打开的工程中,打开源码MainActivity.java,然后,将鼠标移至代码编辑区的左侧后,单击鼠标即可添加断点 ...

  8. word2vec入门理解的博客整理

    深度学习word2vec笔记之基础篇 https://blog.csdn.net/mytestmy/article/details/26961315 深度学习word2vec笔记之算法篇 https: ...

  9. [Notice]博客地址转移 vitostack.com

    个人博客地址转移至vitostack.com 这里可能不会经常更新. 欢迎访问新地址.

  10. Django之Models与ORM操作

    一.models例子 from django.db import models class User(models.Model): """ 用户表 "" ...