[{"data":1,"prerenderedAt":9350},["ShallowReactive",2],{"search-docs":3,"doc-\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":526,"body":888,"description":11,"extension":9345,"meta":9346,"navigation":2002,"path":525,"seo":9347,"stem":9348,"__hash__":9349},"docs\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans.md",{"type":889,"value":890,"toc":9335},"minimark",[891,895,899,902,905,951,954,961,1029,1034,1084,1089,1142,1149,9331],[892,893,894],"h2",{"id":894},"创建子模块",[896,897,898],"p",{},"在使用 XML 管理 Bean 之前，为了防止和之前的项目冲突，我们重新创建一个子模块，叫做 spring6-ioc-xml ，并且引入 beans.xml 文件即可。",[892,900,901],{"id":901},"获取bean",[896,903,904],{},"在通过 xml 方式获取 bean 之前，我们需要先导入对应的配置文件，这里我们是 beans.xml。构建 ApplicationContext 容器。",[906,907,911],"pre",{"className":908,"code":909,"language":910,"meta":11,"style":11},"language-java shiki shiki-themes github-light github-light github-dark","\u002F\u002F 导入 bean 的 xml 配置文件\nApplicationContext context = new ClassPathXmlApplicationContext(\"beans.xml\");\n","java",[912,913,914,923],"code",{"__ignoreMap":11},[915,916,919],"span",{"class":917,"line":918},"line",1,[915,920,922],{"class":921},"sCsY4","\u002F\u002F 导入 bean 的 xml 配置文件\n",[915,924,926,930,934,937,941,944,948],{"class":917,"line":925},2,[915,927,929],{"class":928},"sxrX7","ApplicationContext context ",[915,931,933],{"class":932},"s8jYJ","=",[915,935,936],{"class":932}," new",[915,938,940],{"class":939},"snPdu"," ClassPathXmlApplicationContext",[915,942,943],{"class":928},"(",[915,945,947],{"class":946},"sIIMD","\"beans.xml\"",[915,949,950],{"class":928},");\n",[896,952,953],{},"在 xml 方式下获取 bean 对象的方式有三种：",[955,956,957],"ol",{},[958,959,960],"li",{},"根据 id 获取",[906,962,964],{"className":908,"code":963,"language":910,"meta":11,"style":11},"\u002F\u002F 1.根据 id 获取对象\nUser user1 = (User) context.getBean(\"user\");\n\u002F\u002F 调用 user 对象的 run 方法\nuser1.run();\nSystem.out.println(\"1 根据 id 获取的 User 对象\" + user1);\n",[912,965,966,971,991,997,1009],{"__ignoreMap":11},[915,967,968],{"class":917,"line":918},[915,969,970],{"class":921},"\u002F\u002F 1.根据 id 获取对象\n",[915,972,973,976,978,981,984,986,989],{"class":917,"line":925},[915,974,975],{"class":928},"User user1 ",[915,977,933],{"class":932},[915,979,980],{"class":928}," (User) context.",[915,982,983],{"class":939},"getBean",[915,985,943],{"class":928},[915,987,988],{"class":946},"\"user\"",[915,990,950],{"class":928},[915,992,994],{"class":917,"line":993},3,[915,995,996],{"class":921},"\u002F\u002F 调用 user 对象的 run 方法\n",[915,998,1000,1003,1006],{"class":917,"line":999},4,[915,1001,1002],{"class":928},"user1.",[915,1004,1005],{"class":939},"run",[915,1007,1008],{"class":928},"();\n",[915,1010,1012,1015,1018,1020,1023,1026],{"class":917,"line":1011},5,[915,1013,1014],{"class":928},"System.out.",[915,1016,1017],{"class":939},"println",[915,1019,943],{"class":928},[915,1021,1022],{"class":946},"\"1 根据 id 获取的 User 对象\"",[915,1024,1025],{"class":932}," +",[915,1027,1028],{"class":928}," user1);\n",[955,1030,1031],{"start":925},[958,1032,1033],{},"根据 Class 获取",[906,1035,1037],{"className":908,"code":1036,"language":910,"meta":11,"style":11},"\u002F\u002F 2.根据类型获取对象\nUser user2 = context.getBean(User.class);\nuser2.run();\nSystem.out.println(\"2 根据 类型 获取的 User 对象\" + user2);\n",[912,1038,1039,1044,1059,1068],{"__ignoreMap":11},[915,1040,1041],{"class":917,"line":918},[915,1042,1043],{"class":921},"\u002F\u002F 2.根据类型获取对象\n",[915,1045,1046,1049,1051,1054,1056],{"class":917,"line":925},[915,1047,1048],{"class":928},"User user2 ",[915,1050,933],{"class":932},[915,1052,1053],{"class":928}," context.",[915,1055,983],{"class":939},[915,1057,1058],{"class":928},"(User.class);\n",[915,1060,1061,1064,1066],{"class":917,"line":993},[915,1062,1063],{"class":928},"user2.",[915,1065,1005],{"class":939},[915,1067,1008],{"class":928},[915,1069,1070,1072,1074,1076,1079,1081],{"class":917,"line":999},[915,1071,1014],{"class":928},[915,1073,1017],{"class":939},[915,1075,943],{"class":928},[915,1077,1078],{"class":946},"\"2 根据 类型 获取的 User 对象\"",[915,1080,1025],{"class":932},[915,1082,1083],{"class":928}," user2);\n",[955,1085,1086],{"start":993},[958,1087,1088],{},"同时根据 id 和 Class 获取",[906,1090,1092],{"className":908,"code":1091,"language":910,"meta":11,"style":11},"\u002F\u002F 3.同时根据id和类型获取对象\nUser user3 = context.getBean(\"user\", User.class);\nuser3.run();\nSystem.out.println(\"3 同时根据 id 和 类型 获取的 User 对象\" + user3);\n",[912,1093,1094,1099,1117,1126],{"__ignoreMap":11},[915,1095,1096],{"class":917,"line":918},[915,1097,1098],{"class":921},"\u002F\u002F 3.同时根据id和类型获取对象\n",[915,1100,1101,1104,1106,1108,1110,1112,1114],{"class":917,"line":925},[915,1102,1103],{"class":928},"User user3 ",[915,1105,933],{"class":932},[915,1107,1053],{"class":928},[915,1109,983],{"class":939},[915,1111,943],{"class":928},[915,1113,988],{"class":946},[915,1115,1116],{"class":928},", User.class);\n",[915,1118,1119,1122,1124],{"class":917,"line":993},[915,1120,1121],{"class":928},"user3.",[915,1123,1005],{"class":939},[915,1125,1008],{"class":928},[915,1127,1128,1130,1132,1134,1137,1139],{"class":917,"line":999},[915,1129,1014],{"class":928},[915,1131,1017],{"class":939},[915,1133,943],{"class":928},[915,1135,1136],{"class":946},"\"3 同时根据 id 和 类型 获取的 User 对象\"",[915,1138,1025],{"class":932},[915,1140,1141],{"class":928}," user3);\n",[896,1143,1144],{},[1145,1146],"img",{"alt":1147,"src":1148},"执行结果","\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-11-37-22.png",[1150,1151,1153,1154,1213,1216,1224,1227,1230,1236,1245,1250,1255,1262,1265,1268,1271,1285,1289,1292,1297,1300,1305,5235,5239,5244,5335,5340,5402,5405,5410,5413,5546,5551,5596,5601,5607,5722,5732,5736,5859,5863,5945,5950,5954,5959,5962,6007,6010,6038,6043],"warning",{"title":1152},"注意","\n- 要注意在 bean 的配置文件中，如果定义了两个相同的类，并赋予了不同的 id，那么此时就无法仅依靠类型来创建对象。\n",[906,1155,1159],{"className":1156,"code":1157,"language":1158,"meta":11,"style":11},"language-xml shiki shiki-themes github-light github-light github-dark","\u003C!-- 创建user -->\n\u003Cbean id=\"user\" class=\"com.codermast.spring6.iocxml.User\"\u002F>\n\u003Cbean id=\"user\" class=\"com.codermast.spring6.iocxml.User\"\u002F>\n","xml",[912,1160,1161,1166,1193],{"__ignoreMap":11},[915,1162,1163],{"class":917,"line":918},[915,1164,1165],{"class":921},"\u003C!-- 创建user -->\n",[915,1167,1168,1171,1175,1178,1180,1182,1185,1187,1190],{"class":917,"line":925},[915,1169,1170],{"class":928},"\u003C",[915,1172,1174],{"class":1173},"sovSZ","bean",[915,1176,1177],{"class":939}," id",[915,1179,933],{"class":928},[915,1181,988],{"class":946},[915,1183,1184],{"class":939}," class",[915,1186,933],{"class":928},[915,1188,1189],{"class":946},"\"com.codermast.spring6.iocxml.User\"",[915,1191,1192],{"class":928},"\u002F>\n",[915,1194,1195,1197,1199,1201,1203,1205,1207,1209,1211],{"class":917,"line":993},[915,1196,1170],{"class":928},[915,1198,1174],{"class":1173},[915,1200,1177],{"class":939},[915,1202,933],{"class":928},[915,1204,988],{"class":946},[915,1206,1184],{"class":939},[915,1208,933],{"class":928},[915,1210,1189],{"class":946},[915,1212,1192],{"class":928},[896,1214,1215],{},"报错信息：",[906,1217,1222],{"className":1218,"code":1220,"language":1221,"meta":11},[1219],"language-text","Exception in thread \"main\" org.springframework.beans.factory.NoUniqueBeanDefinition\nException: No qualifying bean of type 'com.codermast.spring6.iocxml.User' \navailable: expected single matching bean but found 2: user,user1\n","text",[912,1223,1220],{"__ignoreMap":11},[896,1225,1226],{},"报错的意思就是，期望的应为单个匹配bean，但找到：user，user1 两个。",[896,1228,1229],{},"这个时候可以使用 id 或者 id和类型同时使用的方式进行获取，只要保证唯一性，理论上就可以创建。\n",[896,1231,1232],{},[1233,1234,1235],"strong",{},"是否可以根据接口类型来获取bean？",[1237,1238,1239,1242],"ul",{},[958,1240,1241],{},"如果接口的实现唯一，此时可根据接口类型来获取该实现类的Bean",[958,1243,1244],{},"如果接口的实现不唯一，那么久无法根据接口类型来获取该实现类的Bean",[896,1246,1247],{},[1145,1248],{"alt":11,"src":1249},"\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-11-53-09.png",[896,1251,1252],{},[1233,1253,1254],{},"结论",[896,1256,1257,1258,1261],{},"根据类型来获取bean时，在满足 bean 唯一性的前提下，其实只是看：『对象 ",[1233,1259,1260],{},"instanceof"," 指定的类型』的返回结果，只要返回的是 true 就可以认定为和类型匹配，能够获取到。",[896,1263,1264],{},"Java 中，instanceof运算符用于判断前面的对象是否是后面的类，或其子类、实现类的实例。如果是返回true，否则返回false。也就是说：用instanceof关键字做判断时， instanceof 操作符的左右操作必须有继承或实现关系",[892,1266,1267],{"id":1267},"依赖注入",[896,1269,1270],{},"依赖注入DI（Dependency injection），是IOC的一个方面，是个通常的概念，它有多种解释。这概念是说你不用创建对象，而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务，但是要在配置文件里描述哪些组件需要哪些服务，之后一个容器（IOC容器）负责把他们组装起来。",[1237,1272,1273,1276,1279,1282],{},[958,1274,1275],{},"降低程序间的耦合（依赖关系）",[958,1277,1278],{},"依赖关系的管理：",[958,1280,1281],{},"以后都交给spring来维护",[958,1283,1284],{},"在当前类需要用到其他类的对象，由spring为我们提供，我们只需要在配置文件中说明依赖关系的维护,就称之为依赖注入。",[1286,1287,1288],"note",{},"\n简单的来讲，依赖注入你只需要告诉他，所需要的各种数据在哪里去找即可，你不必亲自去找好交给他，让他自己去找所需要的依赖。\n",[896,1290,1291],{},"依赖注入主要有三种方式：Set方法注入、构造方法注入、注解注入",[1293,1294,1296],"h3",{"id":1295},"set注入","Set注入",[896,1298,1299],{},"在使用 Set 注入时，需要先创建对应属性的 Set 方法，否则无法进行注入。",[955,1301,1302],{},[958,1303,1304],{},"创建 Student 类",[1286,1306,1308,1309,1315,1318,1324,1329,1428,1434,1437,1440,1445,1514,1519,1624,1627,1630,1638,1642,1722,1727,1730,1733,1738,1741,1775,1780,1817,1820,1851,1856,1899,1904,1970,1973,1981,2332,2335,2340,2412,2417,2661,2882,2887,3065,3068,3072,3075,3155,3160,3377,3380,3385,3390,3481,3485,3659,3662,3667,3672,3675,3975,3978,4075,4080,4599,4604,5139,5142],{"title":1307},"details 点击展开代码","\n```java\npublic class Student {\n",[906,1310,1313],{"className":1311,"code":1312,"language":1221},[1219],"private Integer id;\n\nprivate String name;\n\nprivate Integer age;\n\nprivate String sex;\n\npublic Student() {\n}\n\npublic Integer getId() {\n    return id;\n}\n\npublic void setId(Integer id) {\n    this.id = id;\n}\n\npublic String getName() {\n    return name;\n}\n\npublic void setName(String name) {\n    this.name = name;\n}\n\npublic Integer getAge() {\n    return age;\n}\n\npublic void setAge(Integer age) {\n    this.age = age;\n}\n\npublic String getSex() {\n    return sex;\n}\n\npublic void setSex(String sex) {\n    this.sex = sex;\n}\n\n@Override\npublic String toString() {\n    return \"Student{\" +\n            \"id=\" + id +\n            \", name='\" + name + '\\'' +\n            \", age=\" + age +\n            \", sex='\" + sex + '\\'' +\n            '}';\n}\n",[912,1314,1312],{"__ignoreMap":11},[896,1316,1317],{},"}",[906,1319,1322],{"className":1320,"code":1321,"language":1221},[1219],"::::\n\n2. 配置 bean 时为属性赋值\n\n创建一个新配置文件，名为 beans-di.xml ，添加如下配置\n```xml\n\u003Cbean id=\"studentOne\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003C!-- property标签：通过组件类的setXxx()方法给组件对象设置属性 -->\n    \u003C!-- name属性：指定属性名（这个属性名是getXxx()、setXxx()方法定义的，和成员变量无关） -->\n    \u003C!-- value属性：指定属性值 -->\n    \u003Cproperty name=\"id\" value=\"1001\"\u002F>\n    \u003Cproperty name=\"name\" value=\"张三\"\u002F>\n    \u003Cproperty name=\"age\" value=\"23\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"男\"\u002F>\n\u003C\u002Fbean>\n",[912,1323,1321],{"__ignoreMap":11},[955,1325,1326],{"start":993},[958,1327,1328],{},"测试",[906,1330,1332],{"className":908,"code":1331,"language":910,"meta":11,"style":11},"@Test\npublic void setDiTest(){\n    \u002F\u002F 1.导入 beans-di 配置文件\n    ApplicationContext ac = new ClassPathXmlApplicationContext(\"beans-di.xml\");\n    \u002F\u002F 2. 创建 Student 对象\n    Student studentOne = ac.getBean(\"studentOne\", Student.class);\n    \u002F\u002F 3. 打印 Student 对象\n    System.out.println(studentOne);\n}\n",[912,1333,1334,1342,1356,1361,1379,1384,1405,1411,1422],{"__ignoreMap":11},[915,1335,1336,1339],{"class":917,"line":918},[915,1337,1338],{"class":928},"@",[915,1340,1341],{"class":932},"Test\n",[915,1343,1344,1347,1350,1353],{"class":917,"line":925},[915,1345,1346],{"class":932},"public",[915,1348,1349],{"class":932}," void",[915,1351,1352],{"class":939}," setDiTest",[915,1354,1355],{"class":928},"(){\n",[915,1357,1358],{"class":917,"line":993},[915,1359,1360],{"class":921},"    \u002F\u002F 1.导入 beans-di 配置文件\n",[915,1362,1363,1366,1368,1370,1372,1374,1377],{"class":917,"line":999},[915,1364,1365],{"class":928},"    ApplicationContext ac ",[915,1367,933],{"class":932},[915,1369,936],{"class":932},[915,1371,940],{"class":939},[915,1373,943],{"class":928},[915,1375,1376],{"class":946},"\"beans-di.xml\"",[915,1378,950],{"class":928},[915,1380,1381],{"class":917,"line":1011},[915,1382,1383],{"class":921},"    \u002F\u002F 2. 创建 Student 对象\n",[915,1385,1387,1390,1392,1395,1397,1399,1402],{"class":917,"line":1386},6,[915,1388,1389],{"class":928},"    Student studentOne ",[915,1391,933],{"class":932},[915,1393,1394],{"class":928}," ac.",[915,1396,983],{"class":939},[915,1398,943],{"class":928},[915,1400,1401],{"class":946},"\"studentOne\"",[915,1403,1404],{"class":928},", Student.class);\n",[915,1406,1408],{"class":917,"line":1407},7,[915,1409,1410],{"class":921},"    \u002F\u002F 3. 打印 Student 对象\n",[915,1412,1414,1417,1419],{"class":917,"line":1413},8,[915,1415,1416],{"class":928},"    System.out.",[915,1418,1017],{"class":939},[915,1420,1421],{"class":928},"(studentOne);\n",[915,1423,1425],{"class":917,"line":1424},9,[915,1426,1427],{"class":928},"}\n",[896,1429,1430],{},[1145,1431],{"alt":1432,"src":1433},"测试结果","\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-12-29-51.png",[1293,1435,1436],{"id":1436},"构造器注入",[896,1438,1439],{},"在使用构造器注入时和 Set 注入同理，需要先提供构造器，才可以使用构造器注入。",[955,1441,1442],{},[958,1443,1444],{},"在 Student 类中添加有参构造器",[906,1446,1448],{"className":908,"code":1447,"language":910,"meta":11,"style":11},"public Student(Integer id, String name, Integer age, String sex) {\n    this.id = id;\n    this.name = name;\n    this.age = age;\n    this.sex = sex;\n}\n",[912,1449,1450,1460,1474,1486,1498,1510],{"__ignoreMap":11},[915,1451,1452,1454,1457],{"class":917,"line":918},[915,1453,1346],{"class":932},[915,1455,1456],{"class":939}," Student",[915,1458,1459],{"class":928},"(Integer id, String name, Integer age, String sex) {\n",[915,1461,1462,1466,1469,1471],{"class":917,"line":925},[915,1463,1465],{"class":1464},"sBjJW","    this",[915,1467,1468],{"class":928},".id ",[915,1470,933],{"class":932},[915,1472,1473],{"class":928}," id;\n",[915,1475,1476,1478,1481,1483],{"class":917,"line":993},[915,1477,1465],{"class":1464},[915,1479,1480],{"class":928},".name ",[915,1482,933],{"class":932},[915,1484,1485],{"class":928}," name;\n",[915,1487,1488,1490,1493,1495],{"class":917,"line":999},[915,1489,1465],{"class":1464},[915,1491,1492],{"class":928},".age ",[915,1494,933],{"class":932},[915,1496,1497],{"class":928}," age;\n",[915,1499,1500,1502,1505,1507],{"class":917,"line":1011},[915,1501,1465],{"class":1464},[915,1503,1504],{"class":928},".sex ",[915,1506,933],{"class":932},[915,1508,1509],{"class":928}," sex;\n",[915,1511,1512],{"class":917,"line":1386},[915,1513,1427],{"class":928},[955,1515,1516],{"start":925},[958,1517,1518],{},"配置对应的 bean",[906,1520,1522],{"className":1156,"code":1521,"language":1158,"meta":11,"style":11},"\u003C!--创建构造器 bean-->\n\u003Cbean id=\"studentTwo\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cconstructor-arg value=\"1002\"\u002F>\n    \u003Cconstructor-arg value=\"李四\"\u002F>\n    \u003Cconstructor-arg value=\"33\"\u002F>\n    \u003Cconstructor-arg value=\"女\"\u002F>\n\u003C\u002Fbean>\n",[912,1523,1524,1529,1552,1570,1585,1600,1615],{"__ignoreMap":11},[915,1525,1526],{"class":917,"line":918},[915,1527,1528],{"class":921},"\u003C!--创建构造器 bean-->\n",[915,1530,1531,1533,1535,1537,1539,1542,1544,1546,1549],{"class":917,"line":925},[915,1532,1170],{"class":928},[915,1534,1174],{"class":1173},[915,1536,1177],{"class":939},[915,1538,933],{"class":928},[915,1540,1541],{"class":946},"\"studentTwo\"",[915,1543,1184],{"class":939},[915,1545,933],{"class":928},[915,1547,1548],{"class":946},"\"com.codermast.spring6.iocxml.bean.Student\"",[915,1550,1551],{"class":928},">\n",[915,1553,1554,1557,1560,1563,1565,1568],{"class":917,"line":993},[915,1555,1556],{"class":928},"    \u003C",[915,1558,1559],{"class":1173},"constructor-arg",[915,1561,1562],{"class":939}," value",[915,1564,933],{"class":928},[915,1566,1567],{"class":946},"\"1002\"",[915,1569,1192],{"class":928},[915,1571,1572,1574,1576,1578,1580,1583],{"class":917,"line":999},[915,1573,1556],{"class":928},[915,1575,1559],{"class":1173},[915,1577,1562],{"class":939},[915,1579,933],{"class":928},[915,1581,1582],{"class":946},"\"李四\"",[915,1584,1192],{"class":928},[915,1586,1587,1589,1591,1593,1595,1598],{"class":917,"line":1011},[915,1588,1556],{"class":928},[915,1590,1559],{"class":1173},[915,1592,1562],{"class":939},[915,1594,933],{"class":928},[915,1596,1597],{"class":946},"\"33\"",[915,1599,1192],{"class":928},[915,1601,1602,1604,1606,1608,1610,1613],{"class":917,"line":1386},[915,1603,1556],{"class":928},[915,1605,1559],{"class":1173},[915,1607,1562],{"class":939},[915,1609,933],{"class":928},[915,1611,1612],{"class":946},"\"女\"",[915,1614,1192],{"class":928},[915,1616,1617,1620,1622],{"class":917,"line":1407},[915,1618,1619],{"class":928},"\u003C\u002F",[915,1621,1174],{"class":1173},[915,1623,1551],{"class":928},[896,1625,1626],{},"::: tip 注意",[896,1628,1629],{},"constructor-arg标签还有两个属性可以进一步描述构造器参数：",[1237,1631,1632,1635],{},[958,1633,1634],{},"index属性：指定参数所在位置的索引（从0开始）",[958,1636,1637],{},"name属性：指定参数名\n\n",[955,1639,1640],{"start":993},[958,1641,1328],{},[906,1643,1645],{"className":908,"code":1644,"language":910,"meta":11,"style":11},"@Test\npublic void constructDITest(){\n    \u002F\u002F 1.导入 beans-di 配置文件\n    ApplicationContext ac = new ClassPathXmlApplicationContext(\"beans-di.xml\");\n    \u002F\u002F 2. 创建 Student 对象\n    Student studentTwo = ac.getBean(\"studentTwo\", Student.class);\n    \u002F\u002F 3. 打印 Student 对象\n    System.out.println(studentTwo);\n}\n",[912,1646,1647,1653,1664,1668,1684,1688,1705,1709,1718],{"__ignoreMap":11},[915,1648,1649,1651],{"class":917,"line":918},[915,1650,1338],{"class":928},[915,1652,1341],{"class":932},[915,1654,1655,1657,1659,1662],{"class":917,"line":925},[915,1656,1346],{"class":932},[915,1658,1349],{"class":932},[915,1660,1661],{"class":939}," constructDITest",[915,1663,1355],{"class":928},[915,1665,1666],{"class":917,"line":993},[915,1667,1360],{"class":921},[915,1669,1670,1672,1674,1676,1678,1680,1682],{"class":917,"line":999},[915,1671,1365],{"class":928},[915,1673,933],{"class":932},[915,1675,936],{"class":932},[915,1677,940],{"class":939},[915,1679,943],{"class":928},[915,1681,1376],{"class":946},[915,1683,950],{"class":928},[915,1685,1686],{"class":917,"line":1011},[915,1687,1383],{"class":921},[915,1689,1690,1693,1695,1697,1699,1701,1703],{"class":917,"line":1386},[915,1691,1692],{"class":928},"    Student studentTwo ",[915,1694,933],{"class":932},[915,1696,1394],{"class":928},[915,1698,983],{"class":939},[915,1700,943],{"class":928},[915,1702,1541],{"class":946},[915,1704,1404],{"class":928},[915,1706,1707],{"class":917,"line":1407},[915,1708,1410],{"class":921},[915,1710,1711,1713,1715],{"class":917,"line":1413},[915,1712,1416],{"class":928},[915,1714,1017],{"class":939},[915,1716,1717],{"class":928},"(studentTwo);\n",[915,1719,1720],{"class":917,"line":1424},[915,1721,1427],{"class":928},[896,1723,1724],{},[1145,1725],{"alt":1432,"src":1726},"\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-12-38-09.png",[892,1728,1729],{"id":1729},"数据赋值",[1293,1731,1732],{"id":1732},"特殊值赋值",[955,1734,1735],{},[958,1736,1737],{},"字面量值",[896,1739,1740],{},"> 字面量就是数据本身所代表的值，如 1、2、3、a、b、c等就代表的是实际的值，而在 int a = 10; 时，a 是变量，10为字面量。",[906,1742,1744],{"className":1156,"code":1743,"language":1158,"meta":11,"style":11},"\u003C!-- 使用value属性给bean的属性赋值时，Spring会把value属性的值看做字面量 -->\n\u003Cproperty name=\"name\" value=\"张三\"\u002F>\n",[912,1745,1746,1751],{"__ignoreMap":11},[915,1747,1748],{"class":917,"line":918},[915,1749,1750],{"class":921},"\u003C!-- 使用value属性给bean的属性赋值时，Spring会把value属性的值看做字面量 -->\n",[915,1752,1753,1755,1758,1761,1763,1766,1768,1770,1773],{"class":917,"line":925},[915,1754,1170],{"class":928},[915,1756,1757],{"class":1173},"property",[915,1759,1760],{"class":939}," name",[915,1762,933],{"class":928},[915,1764,1765],{"class":946},"\"name\"",[915,1767,1562],{"class":939},[915,1769,933],{"class":928},[915,1771,1772],{"class":946},"\"张三\"",[915,1774,1192],{"class":928},[955,1776,1777],{"start":925},[958,1778,1779],{},"null 值",[906,1781,1783],{"className":1156,"code":1782,"language":1158,"meta":11,"style":11},"\u003Cproperty name=\"name\">\n    \u003Cnull \u002F>\n\u003C\u002Fproperty>\n",[912,1784,1785,1799,1809],{"__ignoreMap":11},[915,1786,1787,1789,1791,1793,1795,1797],{"class":917,"line":918},[915,1788,1170],{"class":928},[915,1790,1757],{"class":1173},[915,1792,1760],{"class":939},[915,1794,933],{"class":928},[915,1796,1765],{"class":946},[915,1798,1551],{"class":928},[915,1800,1801,1803,1806],{"class":917,"line":925},[915,1802,1556],{"class":928},[915,1804,1805],{"class":1173},"null",[915,1807,1808],{"class":928}," \u002F>\n",[915,1810,1811,1813,1815],{"class":917,"line":993},[915,1812,1619],{"class":928},[915,1814,1757],{"class":1173},[915,1816,1551],{"class":928},[896,1818,1819],{},"需要注意的是，不能直接讲 null 作为 value 值进行传递，此时则为传递一个 内容为 null 的字符串，而并非传递 null 对象。",[906,1821,1823],{"className":1156,"code":1822,"language":1158,"meta":11,"style":11},"\u003Cproperty name=\"name\" value=\"null\">\u003C\u002Fproperty>\n",[912,1824,1825],{"__ignoreMap":11},[915,1826,1827,1829,1831,1833,1835,1837,1839,1841,1844,1847,1849],{"class":917,"line":918},[915,1828,1170],{"class":928},[915,1830,1757],{"class":1173},[915,1832,1760],{"class":939},[915,1834,933],{"class":928},[915,1836,1765],{"class":946},[915,1838,1562],{"class":939},[915,1840,933],{"class":928},[915,1842,1843],{"class":946},"\"null\"",[915,1845,1846],{"class":928},">\u003C\u002F",[915,1848,1757],{"class":1173},[915,1850,1551],{"class":928},[955,1852,1853],{"start":993},[958,1854,1855],{},"xml 实体",[906,1857,1859],{"className":1156,"code":1858,"language":1158,"meta":11,"style":11},"\u003C!-- 小于号在XML文档中用来定义标签的开始，不能随便使用 -->\n\u003C!-- 解决方案一：使用XML实体来代替 -->\n\u003Cproperty name=\"expression\" value=\"a &lt; b\"\u002F>\n",[912,1860,1861,1866,1871],{"__ignoreMap":11},[915,1862,1863],{"class":917,"line":918},[915,1864,1865],{"class":921},"\u003C!-- 小于号在XML文档中用来定义标签的开始，不能随便使用 -->\n",[915,1867,1868],{"class":917,"line":925},[915,1869,1870],{"class":921},"\u003C!-- 解决方案一：使用XML实体来代替 -->\n",[915,1872,1873,1875,1877,1879,1881,1884,1886,1888,1891,1894,1897],{"class":917,"line":993},[915,1874,1170],{"class":928},[915,1876,1757],{"class":1173},[915,1878,1760],{"class":939},[915,1880,933],{"class":928},[915,1882,1883],{"class":946},"\"expression\"",[915,1885,1562],{"class":939},[915,1887,933],{"class":928},[915,1889,1890],{"class":946},"\"a ",[915,1892,1893],{"class":1464},"&lt;",[915,1895,1896],{"class":946}," b\"",[915,1898,1192],{"class":928},[955,1900,1901],{"start":999},[958,1902,1903],{},"cdata 节",[906,1905,1907],{"className":1156,"code":1906,"language":1158,"meta":11,"style":11},"\u003Cproperty name=\"expression\">\n    \u003C!-- 解决方案二：使用CDATA节 -->\n    \u003C!-- CDATA中的C代表Character，是文本、字符的含义，CDATA就表示纯文本数据 -->\n    \u003C!-- XML解析器看到CDATA节就知道这里是纯文本，就不会当作XML标签或属性来解析 -->\n    \u003C!-- 所以CDATA节中写什么符号都随意 -->\n    \u003Cvalue>\u003C![CDATA[a \u003C b]]>\u003C\u002Fvalue>\n\u003C\u002Fproperty>\n",[912,1908,1909,1923,1928,1933,1938,1943,1962],{"__ignoreMap":11},[915,1910,1911,1913,1915,1917,1919,1921],{"class":917,"line":918},[915,1912,1170],{"class":928},[915,1914,1757],{"class":1173},[915,1916,1760],{"class":939},[915,1918,933],{"class":928},[915,1920,1883],{"class":946},[915,1922,1551],{"class":928},[915,1924,1925],{"class":917,"line":925},[915,1926,1927],{"class":921},"    \u003C!-- 解决方案二：使用CDATA节 -->\n",[915,1929,1930],{"class":917,"line":993},[915,1931,1932],{"class":921},"    \u003C!-- CDATA中的C代表Character，是文本、字符的含义，CDATA就表示纯文本数据 -->\n",[915,1934,1935],{"class":917,"line":999},[915,1936,1937],{"class":921},"    \u003C!-- XML解析器看到CDATA节就知道这里是纯文本，就不会当作XML标签或属性来解析 -->\n",[915,1939,1940],{"class":917,"line":1011},[915,1941,1942],{"class":921},"    \u003C!-- 所以CDATA节中写什么符号都随意 -->\n",[915,1944,1945,1947,1950,1953,1956,1958,1960],{"class":917,"line":1386},[915,1946,1556],{"class":928},[915,1948,1949],{"class":1173},"value",[915,1951,1952],{"class":928},">",[915,1954,1955],{"class":946},"\u003C![CDATA[a \u003C b]]>",[915,1957,1619],{"class":928},[915,1959,1949],{"class":1173},[915,1961,1551],{"class":928},[915,1963,1964,1966,1968],{"class":917,"line":1407},[915,1965,1619],{"class":928},[915,1967,1757],{"class":1173},[915,1969,1551],{"class":928},[1293,1971,1972],{"id":1972},"对象类型属性赋值",[955,1974,1975],{},[958,1976,1977,1978],{},"创建 Clazz 类\n在为对象类型属性赋值之前，我们先来创建一个名为 Clazz 的班级类（这里是为了避免和 Java 关键字 class 冲突）\n",[1286,1979],{"title":1980},"details 点我展开代码",[906,1982,1984],{"className":908,"code":1983,"language":910,"meta":11,"style":11},"public class Clazz {\n\n    private Integer clazzId;\n\n    private String clazzName;\n\n    public Integer getClazzId() {\n        return clazzId;\n    }\n\n    public void setClazzId(Integer clazzId) {\n        this.clazzId = clazzId;\n    }\n\n    public String getClazzName() {\n        return clazzName;\n    }\n\n    public void setClazzName(String clazzName) {\n        this.clazzName = clazzName;\n    }\n\n    @Override\n    public String toString() {\n        return \"Clazz{\" +\n                \"clazzId=\" + clazzId +\n                \", clazzName='\" + clazzName + '\\'' +\n                '}';\n    }\n\n    public Clazz() {\n    }\n\n    public Clazz(Integer clazzId, String clazzName) {\n        this.clazzId = clazzId;\n        this.clazzName = clazzName;\n    }\n}\n",[912,1985,1986,1998,2004,2012,2016,2023,2027,2041,2049,2054,2059,2079,2092,2097,2102,2115,2123,2128,2133,2151,2163,2168,2173,2182,2194,2205,2219,2244,2253,2258,2263,2272,2277,2282,2300,2311,2322,2327],{"__ignoreMap":11},[915,1987,1988,1990,1992,1995],{"class":917,"line":918},[915,1989,1346],{"class":932},[915,1991,1184],{"class":932},[915,1993,1994],{"class":939}," Clazz",[915,1996,1997],{"class":928}," {\n",[915,1999,2000],{"class":917,"line":925},[915,2001,2003],{"emptyLinePlaceholder":2002},true,"\n",[915,2005,2006,2009],{"class":917,"line":993},[915,2007,2008],{"class":932},"    private",[915,2010,2011],{"class":928}," Integer clazzId;\n",[915,2013,2014],{"class":917,"line":999},[915,2015,2003],{"emptyLinePlaceholder":2002},[915,2017,2018,2020],{"class":917,"line":1011},[915,2019,2008],{"class":932},[915,2021,2022],{"class":928}," String clazzName;\n",[915,2024,2025],{"class":917,"line":1386},[915,2026,2003],{"emptyLinePlaceholder":2002},[915,2028,2029,2032,2035,2038],{"class":917,"line":1407},[915,2030,2031],{"class":932},"    public",[915,2033,2034],{"class":928}," Integer ",[915,2036,2037],{"class":939},"getClazzId",[915,2039,2040],{"class":928},"() {\n",[915,2042,2043,2046],{"class":917,"line":1413},[915,2044,2045],{"class":932},"        return",[915,2047,2048],{"class":928}," clazzId;\n",[915,2050,2051],{"class":917,"line":1424},[915,2052,2053],{"class":928},"    }\n",[915,2055,2057],{"class":917,"line":2056},10,[915,2058,2003],{"emptyLinePlaceholder":2002},[915,2060,2062,2064,2066,2069,2072,2076],{"class":917,"line":2061},11,[915,2063,2031],{"class":932},[915,2065,1349],{"class":932},[915,2067,2068],{"class":939}," setClazzId",[915,2070,2071],{"class":928},"(Integer ",[915,2073,2075],{"class":2074},"sP4rz","clazzId",[915,2077,2078],{"class":928},") {\n",[915,2080,2082,2085,2088,2090],{"class":917,"line":2081},12,[915,2083,2084],{"class":1464},"        this",[915,2086,2087],{"class":928},".clazzId ",[915,2089,933],{"class":932},[915,2091,2048],{"class":928},[915,2093,2095],{"class":917,"line":2094},13,[915,2096,2053],{"class":928},[915,2098,2100],{"class":917,"line":2099},14,[915,2101,2003],{"emptyLinePlaceholder":2002},[915,2103,2105,2107,2110,2113],{"class":917,"line":2104},15,[915,2106,2031],{"class":932},[915,2108,2109],{"class":928}," String ",[915,2111,2112],{"class":939},"getClazzName",[915,2114,2040],{"class":928},[915,2116,2118,2120],{"class":917,"line":2117},16,[915,2119,2045],{"class":932},[915,2121,2122],{"class":928}," clazzName;\n",[915,2124,2126],{"class":917,"line":2125},17,[915,2127,2053],{"class":928},[915,2129,2131],{"class":917,"line":2130},18,[915,2132,2003],{"emptyLinePlaceholder":2002},[915,2134,2136,2138,2140,2143,2146,2149],{"class":917,"line":2135},19,[915,2137,2031],{"class":932},[915,2139,1349],{"class":932},[915,2141,2142],{"class":939}," setClazzName",[915,2144,2145],{"class":928},"(String ",[915,2147,2148],{"class":2074},"clazzName",[915,2150,2078],{"class":928},[915,2152,2154,2156,2159,2161],{"class":917,"line":2153},20,[915,2155,2084],{"class":1464},[915,2157,2158],{"class":928},".clazzName ",[915,2160,933],{"class":932},[915,2162,2122],{"class":928},[915,2164,2166],{"class":917,"line":2165},21,[915,2167,2053],{"class":928},[915,2169,2171],{"class":917,"line":2170},22,[915,2172,2003],{"emptyLinePlaceholder":2002},[915,2174,2176,2179],{"class":917,"line":2175},23,[915,2177,2178],{"class":928},"    @",[915,2180,2181],{"class":932},"Override\n",[915,2183,2185,2187,2189,2192],{"class":917,"line":2184},24,[915,2186,2031],{"class":932},[915,2188,2109],{"class":928},[915,2190,2191],{"class":939},"toString",[915,2193,2040],{"class":928},[915,2195,2197,2199,2202],{"class":917,"line":2196},25,[915,2198,2045],{"class":932},[915,2200,2201],{"class":946}," \"Clazz{\"",[915,2203,2204],{"class":932}," +\n",[915,2206,2208,2211,2213,2216],{"class":917,"line":2207},26,[915,2209,2210],{"class":946},"                \"clazzId=\"",[915,2212,1025],{"class":932},[915,2214,2215],{"class":928}," clazzId ",[915,2217,2218],{"class":932},"+\n",[915,2220,2222,2225,2227,2230,2233,2236,2239,2242],{"class":917,"line":2221},27,[915,2223,2224],{"class":946},"                \", clazzName='\"",[915,2226,1025],{"class":932},[915,2228,2229],{"class":928}," clazzName ",[915,2231,2232],{"class":932},"+",[915,2234,2235],{"class":946}," '",[915,2237,2238],{"class":1464},"\\'",[915,2240,2241],{"class":946},"'",[915,2243,2204],{"class":932},[915,2245,2247,2250],{"class":917,"line":2246},28,[915,2248,2249],{"class":946},"                '}'",[915,2251,2252],{"class":928},";\n",[915,2254,2256],{"class":917,"line":2255},29,[915,2257,2053],{"class":928},[915,2259,2261],{"class":917,"line":2260},30,[915,2262,2003],{"emptyLinePlaceholder":2002},[915,2264,2266,2268,2270],{"class":917,"line":2265},31,[915,2267,2031],{"class":932},[915,2269,1994],{"class":939},[915,2271,2040],{"class":928},[915,2273,2275],{"class":917,"line":2274},32,[915,2276,2053],{"class":928},[915,2278,2280],{"class":917,"line":2279},33,[915,2281,2003],{"emptyLinePlaceholder":2002},[915,2283,2285,2287,2289,2291,2293,2296,2298],{"class":917,"line":2284},34,[915,2286,2031],{"class":932},[915,2288,1994],{"class":939},[915,2290,2071],{"class":928},[915,2292,2075],{"class":2074},[915,2294,2295],{"class":928},", String ",[915,2297,2148],{"class":2074},[915,2299,2078],{"class":928},[915,2301,2303,2305,2307,2309],{"class":917,"line":2302},35,[915,2304,2084],{"class":1464},[915,2306,2087],{"class":928},[915,2308,933],{"class":932},[915,2310,2048],{"class":928},[915,2312,2314,2316,2318,2320],{"class":917,"line":2313},36,[915,2315,2084],{"class":1464},[915,2317,2158],{"class":928},[915,2319,933],{"class":932},[915,2321,2122],{"class":928},[915,2323,2325],{"class":917,"line":2324},37,[915,2326,2053],{"class":928},[915,2328,2330],{"class":917,"line":2329},38,[915,2331,1427],{"class":928},[896,2333,2334],{},"::::",[955,2336,2337],{"start":925},[958,2338,2339],{},"修改 Student 类",[906,2341,2343],{"className":908,"code":2342,"language":910,"meta":11,"style":11},"private Clazz clazz;\n\npublic Clazz getClazz() {\n    return clazz;\n}\n\npublic void setClazz(Clazz clazz) {\n    this.clazz = clazz;\n}\n",[912,2344,2345,2353,2357,2369,2377,2381,2385,2397,2408],{"__ignoreMap":11},[915,2346,2347,2350],{"class":917,"line":918},[915,2348,2349],{"class":932},"private",[915,2351,2352],{"class":928}," Clazz clazz;\n",[915,2354,2355],{"class":917,"line":925},[915,2356,2003],{"emptyLinePlaceholder":2002},[915,2358,2359,2361,2364,2367],{"class":917,"line":993},[915,2360,1346],{"class":932},[915,2362,2363],{"class":928}," Clazz ",[915,2365,2366],{"class":939},"getClazz",[915,2368,2040],{"class":928},[915,2370,2371,2374],{"class":917,"line":999},[915,2372,2373],{"class":932},"    return",[915,2375,2376],{"class":928}," clazz;\n",[915,2378,2379],{"class":917,"line":1011},[915,2380,1427],{"class":928},[915,2382,2383],{"class":917,"line":1386},[915,2384,2003],{"emptyLinePlaceholder":2002},[915,2386,2387,2389,2391,2394],{"class":917,"line":1407},[915,2388,1346],{"class":932},[915,2390,1349],{"class":932},[915,2392,2393],{"class":939}," setClazz",[915,2395,2396],{"class":928},"(Clazz clazz) {\n",[915,2398,2399,2401,2404,2406],{"class":917,"line":1413},[915,2400,1465],{"class":1464},[915,2402,2403],{"class":928},".clazz ",[915,2405,933],{"class":932},[915,2407,2376],{"class":928},[915,2409,2410],{"class":917,"line":1424},[915,2411,1427],{"class":928},[955,2413,2414],{"start":993},[958,2415,2416],{},"配置 Bean\n> 这里我们在配置 Bean 的时候，有三种方式：外部bean、内部bean、级联属性赋值",[1237,2418,2419,2658],{},[958,2420,2421,2422,2427,2506,2511],{},"外部bean",[955,2423,2424],{},[958,2425,2426],{},"配置 Clazz 类",[906,2428,2430],{"className":1156,"code":2429,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"clazzOne\" class=\"com.codermast.spring6.iocxml.bean.Clazz\">\n    \u003Cproperty name=\"clazzId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"clazzName\" value=\"财源滚滚班\"\u002F>\n\u003C\u002Fbean>\n",[912,2431,2432,2454,2476,2498],{"__ignoreMap":11},[915,2433,2434,2436,2438,2440,2442,2445,2447,2449,2452],{"class":917,"line":918},[915,2435,1170],{"class":928},[915,2437,1174],{"class":1173},[915,2439,1177],{"class":939},[915,2441,933],{"class":928},[915,2443,2444],{"class":946},"\"clazzOne\"",[915,2446,1184],{"class":939},[915,2448,933],{"class":928},[915,2450,2451],{"class":946},"\"com.codermast.spring6.iocxml.bean.Clazz\"",[915,2453,1551],{"class":928},[915,2455,2456,2458,2460,2462,2464,2467,2469,2471,2474],{"class":917,"line":925},[915,2457,1556],{"class":928},[915,2459,1757],{"class":1173},[915,2461,1760],{"class":939},[915,2463,933],{"class":928},[915,2465,2466],{"class":946},"\"clazzId\"",[915,2468,1562],{"class":939},[915,2470,933],{"class":928},[915,2472,2473],{"class":946},"\"1111\"",[915,2475,1192],{"class":928},[915,2477,2478,2480,2482,2484,2486,2489,2491,2493,2496],{"class":917,"line":993},[915,2479,1556],{"class":928},[915,2481,1757],{"class":1173},[915,2483,1760],{"class":939},[915,2485,933],{"class":928},[915,2487,2488],{"class":946},"\"clazzName\"",[915,2490,1562],{"class":939},[915,2492,933],{"class":928},[915,2494,2495],{"class":946},"\"财源滚滚班\"",[915,2497,1192],{"class":928},[915,2499,2500,2502,2504],{"class":917,"line":999},[915,2501,1619],{"class":928},[915,2503,1174],{"class":1173},[915,2505,1551],{"class":928},[955,2507,2508],{"start":925},[958,2509,2510],{},"为 Student 中的 clazz 属性赋值",[906,2512,2514],{"className":1156,"code":2513,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"studentFour\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cproperty name=\"id\" value=\"1004\"\u002F>\n    \u003Cproperty name=\"name\" value=\"赵六\"\u002F>\n    \u003Cproperty name=\"age\" value=\"26\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"女\"\u002F>\n    \u003C!-- ref属性：引用IOC容器中某个bean的id，将所对应的bean为属性赋值 -->\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n\u003C\u002Fbean>\n",[912,2515,2516,2537,2559,2580,2602,2623,2628,2650],{"__ignoreMap":11},[915,2517,2518,2520,2522,2524,2526,2529,2531,2533,2535],{"class":917,"line":918},[915,2519,1170],{"class":928},[915,2521,1174],{"class":1173},[915,2523,1177],{"class":939},[915,2525,933],{"class":928},[915,2527,2528],{"class":946},"\"studentFour\"",[915,2530,1184],{"class":939},[915,2532,933],{"class":928},[915,2534,1548],{"class":946},[915,2536,1551],{"class":928},[915,2538,2539,2541,2543,2545,2547,2550,2552,2554,2557],{"class":917,"line":925},[915,2540,1556],{"class":928},[915,2542,1757],{"class":1173},[915,2544,1760],{"class":939},[915,2546,933],{"class":928},[915,2548,2549],{"class":946},"\"id\"",[915,2551,1562],{"class":939},[915,2553,933],{"class":928},[915,2555,2556],{"class":946},"\"1004\"",[915,2558,1192],{"class":928},[915,2560,2561,2563,2565,2567,2569,2571,2573,2575,2578],{"class":917,"line":993},[915,2562,1556],{"class":928},[915,2564,1757],{"class":1173},[915,2566,1760],{"class":939},[915,2568,933],{"class":928},[915,2570,1765],{"class":946},[915,2572,1562],{"class":939},[915,2574,933],{"class":928},[915,2576,2577],{"class":946},"\"赵六\"",[915,2579,1192],{"class":928},[915,2581,2582,2584,2586,2588,2590,2593,2595,2597,2600],{"class":917,"line":999},[915,2583,1556],{"class":928},[915,2585,1757],{"class":1173},[915,2587,1760],{"class":939},[915,2589,933],{"class":928},[915,2591,2592],{"class":946},"\"age\"",[915,2594,1562],{"class":939},[915,2596,933],{"class":928},[915,2598,2599],{"class":946},"\"26\"",[915,2601,1192],{"class":928},[915,2603,2604,2606,2608,2610,2612,2615,2617,2619,2621],{"class":917,"line":1011},[915,2605,1556],{"class":928},[915,2607,1757],{"class":1173},[915,2609,1760],{"class":939},[915,2611,933],{"class":928},[915,2613,2614],{"class":946},"\"sex\"",[915,2616,1562],{"class":939},[915,2618,933],{"class":928},[915,2620,1612],{"class":946},[915,2622,1192],{"class":928},[915,2624,2625],{"class":917,"line":1386},[915,2626,2627],{"class":921},"    \u003C!-- ref属性：引用IOC容器中某个bean的id，将所对应的bean为属性赋值 -->\n",[915,2629,2630,2632,2634,2636,2638,2641,2644,2646,2648],{"class":917,"line":1407},[915,2631,1556],{"class":928},[915,2633,1757],{"class":1173},[915,2635,1760],{"class":939},[915,2637,933],{"class":928},[915,2639,2640],{"class":946},"\"clazz\"",[915,2642,2643],{"class":939}," ref",[915,2645,933],{"class":928},[915,2647,2444],{"class":946},[915,2649,1192],{"class":928},[915,2651,2652,2654,2656],{"class":917,"line":1413},[915,2653,1619],{"class":928},[915,2655,1174],{"class":1173},[915,2657,1551],{"class":928},[958,2659,2660],{},"内部bean",[906,2662,2664],{"className":1156,"code":2663,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"studentFive\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cproperty name=\"id\" value=\"1004\"\u002F>\n    \u003Cproperty name=\"name\" value=\"赵六\"\u002F>\n    \u003Cproperty name=\"age\" value=\"26\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"女\"\u002F>\n    \u003Cproperty name=\"clazz\">\n        \u003C!-- 在一个bean中再声明一个bean就是内部bean -->\n        \u003C!-- 内部bean只能用于给属性赋值，不能在外部通过IOC容器获取，因此可以省略id属性 -->\n        \u003Cbean id=\"clazzInner\" class=\"com.codermast.spring6.iocxml.bean.Clazz\">\n            \u003Cproperty name=\"clazzId\" value=\"2222\"\u002F>\n            \u003Cproperty name=\"clazzName\" value=\"远大前程班\"\u002F>\n        \u003C\u002Fbean>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[912,2665,2666,2687,2707,2727,2747,2767,2781,2786,2791,2813,2835,2856,2865,2874],{"__ignoreMap":11},[915,2667,2668,2670,2672,2674,2676,2679,2681,2683,2685],{"class":917,"line":918},[915,2669,1170],{"class":928},[915,2671,1174],{"class":1173},[915,2673,1177],{"class":939},[915,2675,933],{"class":928},[915,2677,2678],{"class":946},"\"studentFive\"",[915,2680,1184],{"class":939},[915,2682,933],{"class":928},[915,2684,1548],{"class":946},[915,2686,1551],{"class":928},[915,2688,2689,2691,2693,2695,2697,2699,2701,2703,2705],{"class":917,"line":925},[915,2690,1556],{"class":928},[915,2692,1757],{"class":1173},[915,2694,1760],{"class":939},[915,2696,933],{"class":928},[915,2698,2549],{"class":946},[915,2700,1562],{"class":939},[915,2702,933],{"class":928},[915,2704,2556],{"class":946},[915,2706,1192],{"class":928},[915,2708,2709,2711,2713,2715,2717,2719,2721,2723,2725],{"class":917,"line":993},[915,2710,1556],{"class":928},[915,2712,1757],{"class":1173},[915,2714,1760],{"class":939},[915,2716,933],{"class":928},[915,2718,1765],{"class":946},[915,2720,1562],{"class":939},[915,2722,933],{"class":928},[915,2724,2577],{"class":946},[915,2726,1192],{"class":928},[915,2728,2729,2731,2733,2735,2737,2739,2741,2743,2745],{"class":917,"line":999},[915,2730,1556],{"class":928},[915,2732,1757],{"class":1173},[915,2734,1760],{"class":939},[915,2736,933],{"class":928},[915,2738,2592],{"class":946},[915,2740,1562],{"class":939},[915,2742,933],{"class":928},[915,2744,2599],{"class":946},[915,2746,1192],{"class":928},[915,2748,2749,2751,2753,2755,2757,2759,2761,2763,2765],{"class":917,"line":1011},[915,2750,1556],{"class":928},[915,2752,1757],{"class":1173},[915,2754,1760],{"class":939},[915,2756,933],{"class":928},[915,2758,2614],{"class":946},[915,2760,1562],{"class":939},[915,2762,933],{"class":928},[915,2764,1612],{"class":946},[915,2766,1192],{"class":928},[915,2768,2769,2771,2773,2775,2777,2779],{"class":917,"line":1386},[915,2770,1556],{"class":928},[915,2772,1757],{"class":1173},[915,2774,1760],{"class":939},[915,2776,933],{"class":928},[915,2778,2640],{"class":946},[915,2780,1551],{"class":928},[915,2782,2783],{"class":917,"line":1407},[915,2784,2785],{"class":921},"        \u003C!-- 在一个bean中再声明一个bean就是内部bean -->\n",[915,2787,2788],{"class":917,"line":1413},[915,2789,2790],{"class":921},"        \u003C!-- 内部bean只能用于给属性赋值，不能在外部通过IOC容器获取，因此可以省略id属性 -->\n",[915,2792,2793,2796,2798,2800,2802,2805,2807,2809,2811],{"class":917,"line":1424},[915,2794,2795],{"class":928},"        \u003C",[915,2797,1174],{"class":1173},[915,2799,1177],{"class":939},[915,2801,933],{"class":928},[915,2803,2804],{"class":946},"\"clazzInner\"",[915,2806,1184],{"class":939},[915,2808,933],{"class":928},[915,2810,2451],{"class":946},[915,2812,1551],{"class":928},[915,2814,2815,2818,2820,2822,2824,2826,2828,2830,2833],{"class":917,"line":2056},[915,2816,2817],{"class":928},"            \u003C",[915,2819,1757],{"class":1173},[915,2821,1760],{"class":939},[915,2823,933],{"class":928},[915,2825,2466],{"class":946},[915,2827,1562],{"class":939},[915,2829,933],{"class":928},[915,2831,2832],{"class":946},"\"2222\"",[915,2834,1192],{"class":928},[915,2836,2837,2839,2841,2843,2845,2847,2849,2851,2854],{"class":917,"line":2061},[915,2838,2817],{"class":928},[915,2840,1757],{"class":1173},[915,2842,1760],{"class":939},[915,2844,933],{"class":928},[915,2846,2488],{"class":946},[915,2848,1562],{"class":939},[915,2850,933],{"class":928},[915,2852,2853],{"class":946},"\"远大前程班\"",[915,2855,1192],{"class":928},[915,2857,2858,2861,2863],{"class":917,"line":2081},[915,2859,2860],{"class":928},"        \u003C\u002F",[915,2862,1174],{"class":1173},[915,2864,1551],{"class":928},[915,2866,2867,2870,2872],{"class":917,"line":2094},[915,2868,2869],{"class":928},"    \u003C\u002F",[915,2871,1757],{"class":1173},[915,2873,1551],{"class":928},[915,2875,2876,2878,2880],{"class":917,"line":2099},[915,2877,1619],{"class":928},[915,2879,1174],{"class":1173},[915,2881,1551],{"class":928},[1237,2883,2884],{},[958,2885,2886],{},"级联属性赋值",[906,2888,2890],{"className":1156,"code":2889,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"studentSix\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cproperty name=\"id\" value=\"1004\"\u002F>\n    \u003Cproperty name=\"name\" value=\"赵六\"\u002F>\n    \u003Cproperty name=\"age\" value=\"26\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"女\"\u002F>\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n    \u003Cproperty name=\"clazz.clazzId\" value=\"3333\"\u002F>\n    \u003Cproperty name=\"clazz.clazzName\" value=\"最强王者班\"\u002F>\n\u003C\u002Fbean>\n",[912,2891,2892,2913,2933,2953,2973,2993,3013,3035,3057],{"__ignoreMap":11},[915,2893,2894,2896,2898,2900,2902,2905,2907,2909,2911],{"class":917,"line":918},[915,2895,1170],{"class":928},[915,2897,1174],{"class":1173},[915,2899,1177],{"class":939},[915,2901,933],{"class":928},[915,2903,2904],{"class":946},"\"studentSix\"",[915,2906,1184],{"class":939},[915,2908,933],{"class":928},[915,2910,1548],{"class":946},[915,2912,1551],{"class":928},[915,2914,2915,2917,2919,2921,2923,2925,2927,2929,2931],{"class":917,"line":925},[915,2916,1556],{"class":928},[915,2918,1757],{"class":1173},[915,2920,1760],{"class":939},[915,2922,933],{"class":928},[915,2924,2549],{"class":946},[915,2926,1562],{"class":939},[915,2928,933],{"class":928},[915,2930,2556],{"class":946},[915,2932,1192],{"class":928},[915,2934,2935,2937,2939,2941,2943,2945,2947,2949,2951],{"class":917,"line":993},[915,2936,1556],{"class":928},[915,2938,1757],{"class":1173},[915,2940,1760],{"class":939},[915,2942,933],{"class":928},[915,2944,1765],{"class":946},[915,2946,1562],{"class":939},[915,2948,933],{"class":928},[915,2950,2577],{"class":946},[915,2952,1192],{"class":928},[915,2954,2955,2957,2959,2961,2963,2965,2967,2969,2971],{"class":917,"line":999},[915,2956,1556],{"class":928},[915,2958,1757],{"class":1173},[915,2960,1760],{"class":939},[915,2962,933],{"class":928},[915,2964,2592],{"class":946},[915,2966,1562],{"class":939},[915,2968,933],{"class":928},[915,2970,2599],{"class":946},[915,2972,1192],{"class":928},[915,2974,2975,2977,2979,2981,2983,2985,2987,2989,2991],{"class":917,"line":1011},[915,2976,1556],{"class":928},[915,2978,1757],{"class":1173},[915,2980,1760],{"class":939},[915,2982,933],{"class":928},[915,2984,2614],{"class":946},[915,2986,1562],{"class":939},[915,2988,933],{"class":928},[915,2990,1612],{"class":946},[915,2992,1192],{"class":928},[915,2994,2995,2997,2999,3001,3003,3005,3007,3009,3011],{"class":917,"line":1386},[915,2996,1556],{"class":928},[915,2998,1757],{"class":1173},[915,3000,1760],{"class":939},[915,3002,933],{"class":928},[915,3004,2640],{"class":946},[915,3006,2643],{"class":939},[915,3008,933],{"class":928},[915,3010,2444],{"class":946},[915,3012,1192],{"class":928},[915,3014,3015,3017,3019,3021,3023,3026,3028,3030,3033],{"class":917,"line":1407},[915,3016,1556],{"class":928},[915,3018,1757],{"class":1173},[915,3020,1760],{"class":939},[915,3022,933],{"class":928},[915,3024,3025],{"class":946},"\"clazz.clazzId\"",[915,3027,1562],{"class":939},[915,3029,933],{"class":928},[915,3031,3032],{"class":946},"\"3333\"",[915,3034,1192],{"class":928},[915,3036,3037,3039,3041,3043,3045,3048,3050,3052,3055],{"class":917,"line":1413},[915,3038,1556],{"class":928},[915,3040,1757],{"class":1173},[915,3042,1760],{"class":939},[915,3044,933],{"class":928},[915,3046,3047],{"class":946},"\"clazz.clazzName\"",[915,3049,1562],{"class":939},[915,3051,933],{"class":928},[915,3053,3054],{"class":946},"\"最强王者班\"",[915,3056,1192],{"class":928},[915,3058,3059,3061,3063],{"class":917,"line":1424},[915,3060,1619],{"class":928},[915,3062,1174],{"class":1173},[915,3064,1551],{"class":928},[1293,3066,3067],{"id":3067},"数组类型属性赋值",[955,3069,3070],{},[958,3071,2339],{},[896,3073,3074],{},"在 Student 类中增加如下代码：",[906,3076,3078],{"className":908,"code":3077,"language":910,"meta":11,"style":11},"private String[] hobbies;\n\npublic String[] getHobbies() {\n    return hobbies;\n}\n\npublic void setHobbies(String[] hobbies) {\n    this.hobbies = hobbies;\n}\n",[912,3079,3080,3090,3094,3108,3115,3119,3123,3140,3151],{"__ignoreMap":11},[915,3081,3082,3084,3087],{"class":917,"line":918},[915,3083,2349],{"class":932},[915,3085,3086],{"class":932}," String",[915,3088,3089],{"class":928},"[] hobbies;\n",[915,3091,3092],{"class":917,"line":925},[915,3093,2003],{"emptyLinePlaceholder":2002},[915,3095,3096,3098,3100,3103,3106],{"class":917,"line":993},[915,3097,1346],{"class":932},[915,3099,3086],{"class":932},[915,3101,3102],{"class":928},"[] ",[915,3104,3105],{"class":939},"getHobbies",[915,3107,2040],{"class":928},[915,3109,3110,3112],{"class":917,"line":999},[915,3111,2373],{"class":932},[915,3113,3114],{"class":928}," hobbies;\n",[915,3116,3117],{"class":917,"line":1011},[915,3118,1427],{"class":928},[915,3120,3121],{"class":917,"line":1386},[915,3122,2003],{"emptyLinePlaceholder":2002},[915,3124,3125,3127,3129,3132,3134,3137],{"class":917,"line":1407},[915,3126,1346],{"class":932},[915,3128,1349],{"class":932},[915,3130,3131],{"class":939}," setHobbies",[915,3133,943],{"class":928},[915,3135,3136],{"class":932},"String",[915,3138,3139],{"class":928},"[] hobbies) {\n",[915,3141,3142,3144,3147,3149],{"class":917,"line":1413},[915,3143,1465],{"class":1464},[915,3145,3146],{"class":928},".hobbies ",[915,3148,933],{"class":932},[915,3150,3114],{"class":928},[915,3152,3153],{"class":917,"line":1424},[915,3154,1427],{"class":928},[955,3156,3157],{"start":925},[958,3158,3159],{},"配置 bean",[906,3161,3163],{"className":1156,"code":3162,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"studentSeven\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cproperty name=\"id\" value=\"1004\"\u002F>\n    \u003Cproperty name=\"name\" value=\"赵六\"\u002F>\n    \u003Cproperty name=\"age\" value=\"26\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"女\"\u002F>\n    \u003C!-- ref属性：引用IOC容器中某个bean的id，将所对应的bean为属性赋值 -->\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n    \u003Cproperty name=\"hobbies\">\n        \u003Carray>\n            \u003Cvalue>抽烟\u003C\u002Fvalue>\n            \u003Cvalue>喝酒\u003C\u002Fvalue>\n            \u003Cvalue>烫头\u003C\u002Fvalue>\n        \u003C\u002Farray>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[912,3164,3165,3186,3206,3226,3246,3266,3270,3290,3305,3314,3327,3340,3353,3361,3369],{"__ignoreMap":11},[915,3166,3167,3169,3171,3173,3175,3178,3180,3182,3184],{"class":917,"line":918},[915,3168,1170],{"class":928},[915,3170,1174],{"class":1173},[915,3172,1177],{"class":939},[915,3174,933],{"class":928},[915,3176,3177],{"class":946},"\"studentSeven\"",[915,3179,1184],{"class":939},[915,3181,933],{"class":928},[915,3183,1548],{"class":946},[915,3185,1551],{"class":928},[915,3187,3188,3190,3192,3194,3196,3198,3200,3202,3204],{"class":917,"line":925},[915,3189,1556],{"class":928},[915,3191,1757],{"class":1173},[915,3193,1760],{"class":939},[915,3195,933],{"class":928},[915,3197,2549],{"class":946},[915,3199,1562],{"class":939},[915,3201,933],{"class":928},[915,3203,2556],{"class":946},[915,3205,1192],{"class":928},[915,3207,3208,3210,3212,3214,3216,3218,3220,3222,3224],{"class":917,"line":993},[915,3209,1556],{"class":928},[915,3211,1757],{"class":1173},[915,3213,1760],{"class":939},[915,3215,933],{"class":928},[915,3217,1765],{"class":946},[915,3219,1562],{"class":939},[915,3221,933],{"class":928},[915,3223,2577],{"class":946},[915,3225,1192],{"class":928},[915,3227,3228,3230,3232,3234,3236,3238,3240,3242,3244],{"class":917,"line":999},[915,3229,1556],{"class":928},[915,3231,1757],{"class":1173},[915,3233,1760],{"class":939},[915,3235,933],{"class":928},[915,3237,2592],{"class":946},[915,3239,1562],{"class":939},[915,3241,933],{"class":928},[915,3243,2599],{"class":946},[915,3245,1192],{"class":928},[915,3247,3248,3250,3252,3254,3256,3258,3260,3262,3264],{"class":917,"line":1011},[915,3249,1556],{"class":928},[915,3251,1757],{"class":1173},[915,3253,1760],{"class":939},[915,3255,933],{"class":928},[915,3257,2614],{"class":946},[915,3259,1562],{"class":939},[915,3261,933],{"class":928},[915,3263,1612],{"class":946},[915,3265,1192],{"class":928},[915,3267,3268],{"class":917,"line":1386},[915,3269,2627],{"class":921},[915,3271,3272,3274,3276,3278,3280,3282,3284,3286,3288],{"class":917,"line":1407},[915,3273,1556],{"class":928},[915,3275,1757],{"class":1173},[915,3277,1760],{"class":939},[915,3279,933],{"class":928},[915,3281,2640],{"class":946},[915,3283,2643],{"class":939},[915,3285,933],{"class":928},[915,3287,2444],{"class":946},[915,3289,1192],{"class":928},[915,3291,3292,3294,3296,3298,3300,3303],{"class":917,"line":1413},[915,3293,1556],{"class":928},[915,3295,1757],{"class":1173},[915,3297,1760],{"class":939},[915,3299,933],{"class":928},[915,3301,3302],{"class":946},"\"hobbies\"",[915,3304,1551],{"class":928},[915,3306,3307,3309,3312],{"class":917,"line":1424},[915,3308,2795],{"class":928},[915,3310,3311],{"class":1173},"array",[915,3313,1551],{"class":928},[915,3315,3316,3318,3320,3323,3325],{"class":917,"line":2056},[915,3317,2817],{"class":928},[915,3319,1949],{"class":1173},[915,3321,3322],{"class":928},">抽烟\u003C\u002F",[915,3324,1949],{"class":1173},[915,3326,1551],{"class":928},[915,3328,3329,3331,3333,3336,3338],{"class":917,"line":2061},[915,3330,2817],{"class":928},[915,3332,1949],{"class":1173},[915,3334,3335],{"class":928},">喝酒\u003C\u002F",[915,3337,1949],{"class":1173},[915,3339,1551],{"class":928},[915,3341,3342,3344,3346,3349,3351],{"class":917,"line":2081},[915,3343,2817],{"class":928},[915,3345,1949],{"class":1173},[915,3347,3348],{"class":928},">烫头\u003C\u002F",[915,3350,1949],{"class":1173},[915,3352,1551],{"class":928},[915,3354,3355,3357,3359],{"class":917,"line":2094},[915,3356,2860],{"class":928},[915,3358,3311],{"class":1173},[915,3360,1551],{"class":928},[915,3362,3363,3365,3367],{"class":917,"line":2099},[915,3364,2869],{"class":928},[915,3366,1757],{"class":1173},[915,3368,1551],{"class":928},[915,3370,3371,3373,3375],{"class":917,"line":2104},[915,3372,1619],{"class":928},[915,3374,1174],{"class":1173},[915,3376,1551],{"class":928},[1293,3378,3379],{"id":3379},"集合类型属性赋值",[1237,3381,3382],{},[958,3383,3384],{},"List 集合",[955,3386,3387],{},[958,3388,3389],{},"在 Clazz 类中加入如下代码",[906,3391,3393],{"className":908,"code":3392,"language":910,"meta":11,"style":11},"private List\u003CStudent> students;\n\npublic List\u003CStudent> getStudents() {\n    return students;\n}\n\npublic void setStudents(List\u003CStudent> students) {\n    this.students = students;\n}\n",[912,3394,3395,3408,3412,3430,3437,3441,3445,3466,3477],{"__ignoreMap":11},[915,3396,3397,3399,3402,3405],{"class":917,"line":918},[915,3398,2349],{"class":932},[915,3400,3401],{"class":928}," List\u003C",[915,3403,3404],{"class":932},"Student",[915,3406,3407],{"class":928},"> students;\n",[915,3409,3410],{"class":917,"line":925},[915,3411,2003],{"emptyLinePlaceholder":2002},[915,3413,3414,3416,3419,3421,3423,3425,3428],{"class":917,"line":993},[915,3415,1346],{"class":932},[915,3417,3418],{"class":928}," List",[915,3420,1170],{"class":932},[915,3422,3404],{"class":928},[915,3424,1952],{"class":932},[915,3426,3427],{"class":939}," getStudents",[915,3429,2040],{"class":928},[915,3431,3432,3434],{"class":917,"line":999},[915,3433,2373],{"class":932},[915,3435,3436],{"class":928}," students;\n",[915,3438,3439],{"class":917,"line":1011},[915,3440,1427],{"class":928},[915,3442,3443],{"class":917,"line":1386},[915,3444,2003],{"emptyLinePlaceholder":2002},[915,3446,3447,3449,3451,3454,3457,3459,3461,3463],{"class":917,"line":1407},[915,3448,1346],{"class":932},[915,3450,1349],{"class":932},[915,3452,3453],{"class":939}," setStudents",[915,3455,3456],{"class":928},"(List",[915,3458,1170],{"class":932},[915,3460,3404],{"class":928},[915,3462,1952],{"class":932},[915,3464,3465],{"class":928}," students) {\n",[915,3467,3468,3470,3473,3475],{"class":917,"line":1413},[915,3469,1465],{"class":1464},[915,3471,3472],{"class":928},".students ",[915,3474,933],{"class":932},[915,3476,3436],{"class":928},[915,3478,3479],{"class":917,"line":1424},[915,3480,1427],{"class":928},[955,3482,3483],{"start":925},[958,3484,3159],{},[906,3486,3488],{"className":1156,"code":3487,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"clazzTwo\" class=\"com.codermast.spring6.iocxml.bean.Clazz\">\n    \u003Cproperty name=\"clazzId\" value=\"4444\"\u002F>\n    \u003Cproperty name=\"clazzName\" value=\"Javaee0222\"\u002F>\n    \u003Cproperty name=\"students\">\n        \u003Clist>\n            \u003Cref bean=\"studentOne\"\u002F>\n            \u003Cref bean=\"studentTwo\"\u002F>\n            \u003Cref bean=\"studentFour\"\u002F>\n            \u003Cref bean=\"studentFive\"\u002F>\n        \u003C\u002Flist>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[912,3489,3490,3511,3532,3553,3568,3577,3593,3607,3621,3635,3643,3651],{"__ignoreMap":11},[915,3491,3492,3494,3496,3498,3500,3503,3505,3507,3509],{"class":917,"line":918},[915,3493,1170],{"class":928},[915,3495,1174],{"class":1173},[915,3497,1177],{"class":939},[915,3499,933],{"class":928},[915,3501,3502],{"class":946},"\"clazzTwo\"",[915,3504,1184],{"class":939},[915,3506,933],{"class":928},[915,3508,2451],{"class":946},[915,3510,1551],{"class":928},[915,3512,3513,3515,3517,3519,3521,3523,3525,3527,3530],{"class":917,"line":925},[915,3514,1556],{"class":928},[915,3516,1757],{"class":1173},[915,3518,1760],{"class":939},[915,3520,933],{"class":928},[915,3522,2466],{"class":946},[915,3524,1562],{"class":939},[915,3526,933],{"class":928},[915,3528,3529],{"class":946},"\"4444\"",[915,3531,1192],{"class":928},[915,3533,3534,3536,3538,3540,3542,3544,3546,3548,3551],{"class":917,"line":993},[915,3535,1556],{"class":928},[915,3537,1757],{"class":1173},[915,3539,1760],{"class":939},[915,3541,933],{"class":928},[915,3543,2488],{"class":946},[915,3545,1562],{"class":939},[915,3547,933],{"class":928},[915,3549,3550],{"class":946},"\"Javaee0222\"",[915,3552,1192],{"class":928},[915,3554,3555,3557,3559,3561,3563,3566],{"class":917,"line":999},[915,3556,1556],{"class":928},[915,3558,1757],{"class":1173},[915,3560,1760],{"class":939},[915,3562,933],{"class":928},[915,3564,3565],{"class":946},"\"students\"",[915,3567,1551],{"class":928},[915,3569,3570,3572,3575],{"class":917,"line":1011},[915,3571,2795],{"class":928},[915,3573,3574],{"class":1173},"list",[915,3576,1551],{"class":928},[915,3578,3579,3581,3584,3587,3589,3591],{"class":917,"line":1386},[915,3580,2817],{"class":928},[915,3582,3583],{"class":1173},"ref",[915,3585,3586],{"class":939}," bean",[915,3588,933],{"class":928},[915,3590,1401],{"class":946},[915,3592,1192],{"class":928},[915,3594,3595,3597,3599,3601,3603,3605],{"class":917,"line":1407},[915,3596,2817],{"class":928},[915,3598,3583],{"class":1173},[915,3600,3586],{"class":939},[915,3602,933],{"class":928},[915,3604,1541],{"class":946},[915,3606,1192],{"class":928},[915,3608,3609,3611,3613,3615,3617,3619],{"class":917,"line":1413},[915,3610,2817],{"class":928},[915,3612,3583],{"class":1173},[915,3614,3586],{"class":939},[915,3616,933],{"class":928},[915,3618,2528],{"class":946},[915,3620,1192],{"class":928},[915,3622,3623,3625,3627,3629,3631,3633],{"class":917,"line":1424},[915,3624,2817],{"class":928},[915,3626,3583],{"class":1173},[915,3628,3586],{"class":939},[915,3630,933],{"class":928},[915,3632,2678],{"class":946},[915,3634,1192],{"class":928},[915,3636,3637,3639,3641],{"class":917,"line":2056},[915,3638,2860],{"class":928},[915,3640,3574],{"class":1173},[915,3642,1551],{"class":928},[915,3644,3645,3647,3649],{"class":917,"line":2061},[915,3646,2869],{"class":928},[915,3648,1757],{"class":1173},[915,3650,1551],{"class":928},[915,3652,3653,3655,3657],{"class":917,"line":2081},[915,3654,1619],{"class":928},[915,3656,1174],{"class":1173},[915,3658,1551],{"class":928},[896,3660,3661],{},"若为 Set 集合类型属性赋值，只需要将其中的 list 标签改为set标签即可。",[1237,3663,3664],{},[958,3665,3666],{},"Map 集合",[955,3668,3669],{},[958,3670,3671],{},"创建 Teacher 类",[896,3673,3674],{},":::: details 点我展开代码",[906,3676,3678],{"className":908,"code":3677,"language":910,"meta":11,"style":11},"public class Teacher {\n\n    private Integer teacherId;\n\n    private String teacherName;\n\n    public Integer getTeacherId() {\n        return teacherId;\n    }\n\n    public void setTeacherId(Integer teacherId) {\n        this.teacherId = teacherId;\n    }\n\n    public String getTeacherName() {\n        return teacherName;\n    }\n\n    public void setTeacherName(String teacherName) {\n        this.teacherName = teacherName;\n    }\n\n    public Teacher(Integer teacherId, String teacherName) {\n        this.teacherId = teacherId;\n        this.teacherName = teacherName;\n    }\n\n    public Teacher() {\n\n    }\n\n    @Override\n    public String toString() {\n        return \"Teacher{\" +\n                \"teacherId=\" + teacherId +\n                \", teacherName='\" + teacherName + '\\'' +\n                '}';\n    }\n}\n",[912,3679,3680,3691,3695,3702,3706,3713,3717,3728,3735,3739,3743,3759,3770,3774,3778,3789,3796,3800,3804,3820,3831,3835,3839,3855,3865,3875,3879,3883,3891,3895,3899,3903,3909,3919,3928,3940,3960,3966,3970],{"__ignoreMap":11},[915,3681,3682,3684,3686,3689],{"class":917,"line":918},[915,3683,1346],{"class":932},[915,3685,1184],{"class":932},[915,3687,3688],{"class":939}," Teacher",[915,3690,1997],{"class":928},[915,3692,3693],{"class":917,"line":925},[915,3694,2003],{"emptyLinePlaceholder":2002},[915,3696,3697,3699],{"class":917,"line":993},[915,3698,2008],{"class":932},[915,3700,3701],{"class":928}," Integer teacherId;\n",[915,3703,3704],{"class":917,"line":999},[915,3705,2003],{"emptyLinePlaceholder":2002},[915,3707,3708,3710],{"class":917,"line":1011},[915,3709,2008],{"class":932},[915,3711,3712],{"class":928}," String teacherName;\n",[915,3714,3715],{"class":917,"line":1386},[915,3716,2003],{"emptyLinePlaceholder":2002},[915,3718,3719,3721,3723,3726],{"class":917,"line":1407},[915,3720,2031],{"class":932},[915,3722,2034],{"class":928},[915,3724,3725],{"class":939},"getTeacherId",[915,3727,2040],{"class":928},[915,3729,3730,3732],{"class":917,"line":1413},[915,3731,2045],{"class":932},[915,3733,3734],{"class":928}," teacherId;\n",[915,3736,3737],{"class":917,"line":1424},[915,3738,2053],{"class":928},[915,3740,3741],{"class":917,"line":2056},[915,3742,2003],{"emptyLinePlaceholder":2002},[915,3744,3745,3747,3749,3752,3754,3757],{"class":917,"line":2061},[915,3746,2031],{"class":932},[915,3748,1349],{"class":932},[915,3750,3751],{"class":939}," setTeacherId",[915,3753,2071],{"class":928},[915,3755,3756],{"class":2074},"teacherId",[915,3758,2078],{"class":928},[915,3760,3761,3763,3766,3768],{"class":917,"line":2081},[915,3762,2084],{"class":1464},[915,3764,3765],{"class":928},".teacherId ",[915,3767,933],{"class":932},[915,3769,3734],{"class":928},[915,3771,3772],{"class":917,"line":2094},[915,3773,2053],{"class":928},[915,3775,3776],{"class":917,"line":2099},[915,3777,2003],{"emptyLinePlaceholder":2002},[915,3779,3780,3782,3784,3787],{"class":917,"line":2104},[915,3781,2031],{"class":932},[915,3783,2109],{"class":928},[915,3785,3786],{"class":939},"getTeacherName",[915,3788,2040],{"class":928},[915,3790,3791,3793],{"class":917,"line":2117},[915,3792,2045],{"class":932},[915,3794,3795],{"class":928}," teacherName;\n",[915,3797,3798],{"class":917,"line":2125},[915,3799,2053],{"class":928},[915,3801,3802],{"class":917,"line":2130},[915,3803,2003],{"emptyLinePlaceholder":2002},[915,3805,3806,3808,3810,3813,3815,3818],{"class":917,"line":2135},[915,3807,2031],{"class":932},[915,3809,1349],{"class":932},[915,3811,3812],{"class":939}," setTeacherName",[915,3814,2145],{"class":928},[915,3816,3817],{"class":2074},"teacherName",[915,3819,2078],{"class":928},[915,3821,3822,3824,3827,3829],{"class":917,"line":2153},[915,3823,2084],{"class":1464},[915,3825,3826],{"class":928},".teacherName ",[915,3828,933],{"class":932},[915,3830,3795],{"class":928},[915,3832,3833],{"class":917,"line":2165},[915,3834,2053],{"class":928},[915,3836,3837],{"class":917,"line":2170},[915,3838,2003],{"emptyLinePlaceholder":2002},[915,3840,3841,3843,3845,3847,3849,3851,3853],{"class":917,"line":2175},[915,3842,2031],{"class":932},[915,3844,3688],{"class":939},[915,3846,2071],{"class":928},[915,3848,3756],{"class":2074},[915,3850,2295],{"class":928},[915,3852,3817],{"class":2074},[915,3854,2078],{"class":928},[915,3856,3857,3859,3861,3863],{"class":917,"line":2184},[915,3858,2084],{"class":1464},[915,3860,3765],{"class":928},[915,3862,933],{"class":932},[915,3864,3734],{"class":928},[915,3866,3867,3869,3871,3873],{"class":917,"line":2196},[915,3868,2084],{"class":1464},[915,3870,3826],{"class":928},[915,3872,933],{"class":932},[915,3874,3795],{"class":928},[915,3876,3877],{"class":917,"line":2207},[915,3878,2053],{"class":928},[915,3880,3881],{"class":917,"line":2221},[915,3882,2003],{"emptyLinePlaceholder":2002},[915,3884,3885,3887,3889],{"class":917,"line":2246},[915,3886,2031],{"class":932},[915,3888,3688],{"class":939},[915,3890,2040],{"class":928},[915,3892,3893],{"class":917,"line":2255},[915,3894,2003],{"emptyLinePlaceholder":2002},[915,3896,3897],{"class":917,"line":2260},[915,3898,2053],{"class":928},[915,3900,3901],{"class":917,"line":2265},[915,3902,2003],{"emptyLinePlaceholder":2002},[915,3904,3905,3907],{"class":917,"line":2274},[915,3906,2178],{"class":928},[915,3908,2181],{"class":932},[915,3910,3911,3913,3915,3917],{"class":917,"line":2279},[915,3912,2031],{"class":932},[915,3914,2109],{"class":928},[915,3916,2191],{"class":939},[915,3918,2040],{"class":928},[915,3920,3921,3923,3926],{"class":917,"line":2284},[915,3922,2045],{"class":932},[915,3924,3925],{"class":946}," \"Teacher{\"",[915,3927,2204],{"class":932},[915,3929,3930,3933,3935,3938],{"class":917,"line":2302},[915,3931,3932],{"class":946},"                \"teacherId=\"",[915,3934,1025],{"class":932},[915,3936,3937],{"class":928}," teacherId ",[915,3939,2218],{"class":932},[915,3941,3942,3945,3947,3950,3952,3954,3956,3958],{"class":917,"line":2313},[915,3943,3944],{"class":946},"                \", teacherName='\"",[915,3946,1025],{"class":932},[915,3948,3949],{"class":928}," teacherName ",[915,3951,2232],{"class":932},[915,3953,2235],{"class":946},[915,3955,2238],{"class":1464},[915,3957,2241],{"class":946},[915,3959,2204],{"class":932},[915,3961,3962,3964],{"class":917,"line":2324},[915,3963,2249],{"class":946},[915,3965,2252],{"class":928},[915,3967,3968],{"class":917,"line":2329},[915,3969,2053],{"class":928},[915,3971,3973],{"class":917,"line":3972},39,[915,3974,1427],{"class":928},[896,3976,3977],{},"::::\n2. 在 Student 类中加入如下代码",[906,3979,3981],{"className":908,"code":3980,"language":910,"meta":11,"style":11},"private Map\u003CString, Teacher> teacherMap;\n\npublic Map\u003CString, Teacher> getTeacherMap() {\n    return teacherMap;\n}\n\npublic void setTeacherMap(Map\u003CString, Teacher> teacherMap) {\n    this.teacherMap = teacherMap;\n}\n",[912,3982,3983,4001,4005,4024,4031,4035,4039,4060,4071],{"__ignoreMap":11},[915,3984,3985,3987,3990,3992,3995,3998],{"class":917,"line":918},[915,3986,2349],{"class":932},[915,3988,3989],{"class":928}," Map\u003C",[915,3991,3136],{"class":932},[915,3993,3994],{"class":928},", ",[915,3996,3997],{"class":932},"Teacher",[915,3999,4000],{"class":928},"> teacherMap;\n",[915,4002,4003],{"class":917,"line":925},[915,4004,2003],{"emptyLinePlaceholder":2002},[915,4006,4007,4009,4012,4014,4017,4019,4022],{"class":917,"line":993},[915,4008,1346],{"class":932},[915,4010,4011],{"class":928}," Map",[915,4013,1170],{"class":932},[915,4015,4016],{"class":928},"String, Teacher",[915,4018,1952],{"class":932},[915,4020,4021],{"class":939}," getTeacherMap",[915,4023,2040],{"class":928},[915,4025,4026,4028],{"class":917,"line":999},[915,4027,2373],{"class":932},[915,4029,4030],{"class":928}," teacherMap;\n",[915,4032,4033],{"class":917,"line":1011},[915,4034,1427],{"class":928},[915,4036,4037],{"class":917,"line":1386},[915,4038,2003],{"emptyLinePlaceholder":2002},[915,4040,4041,4043,4045,4048,4051,4053,4055,4057],{"class":917,"line":1407},[915,4042,1346],{"class":932},[915,4044,1349],{"class":932},[915,4046,4047],{"class":939}," setTeacherMap",[915,4049,4050],{"class":928},"(Map",[915,4052,1170],{"class":932},[915,4054,4016],{"class":928},[915,4056,1952],{"class":932},[915,4058,4059],{"class":928}," teacherMap) {\n",[915,4061,4062,4064,4067,4069],{"class":917,"line":1413},[915,4063,1465],{"class":1464},[915,4065,4066],{"class":928},".teacherMap ",[915,4068,933],{"class":932},[915,4070,4030],{"class":928},[915,4072,4073],{"class":917,"line":1424},[915,4074,1427],{"class":928},[955,4076,4077],{"start":993},[958,4078,4079],{},"配置bean",[906,4081,4083],{"className":1156,"code":4082,"language":1158,"meta":11,"style":11},"\u003C!-- Map 集合配置-->\n\u003Cbean id=\"teacherOne\" class=\"com.codermast.spring6.iocxml.bean.Teacher\">\n    \u003Cproperty name=\"teacherId\" value=\"10010\"\u002F>\n    \u003Cproperty name=\"teacherName\" value=\"大宝\"\u002F>\n\u003C\u002Fbean>\n\n\u003Cbean id=\"teacherTwo\" class=\"com.codermast.spring6.iocxml.bean.Teacher\">\n    \u003Cproperty name=\"teacherId\" value=\"10086\"\u002F>\n    \u003Cproperty name=\"teacherName\" value=\"二宝\"\u002F>\n\u003C\u002Fbean>\n\n\u003Cbean id=\"studentFour\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cproperty name=\"id\" value=\"1004\"\u002F>\n    \u003Cproperty name=\"name\" value=\"赵六\"\u002F>\n    \u003Cproperty name=\"age\" value=\"26\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"女\"\u002F>\n    \u003C!-- ref属性：引用IOC容器中某个bean的id，将所对应的bean为属性赋值 -->\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n    \u003Cproperty name=\"hobbies\">\n        \u003Carray>\n            \u003Cvalue>抽烟\u003C\u002Fvalue>\n            \u003Cvalue>喝酒\u003C\u002Fvalue>\n            \u003Cvalue>烫头\u003C\u002Fvalue>\n        \u003C\u002Farray>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"teacherMap\">\n        \u003Cmap>\n            \u003Centry value-ref=\"teacherOne\">\n                \u003Ckey>\n                    \u003Cvalue>10010\u003C\u002Fvalue>\n                \u003C\u002Fkey>\n            \u003C\u002Fentry>\n            \u003Centry value-ref=\"teacherTwo\">\n                \u003Ckey>\n                    \u003Cvalue>10086\u003C\u002Fvalue>\n                \u003C\u002Fkey>\n            \u003C\u002Fentry>\n        \u003C\u002Fmap>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[912,4084,4085,4090,4112,4134,4156,4164,4168,4189,4210,4231,4239,4243,4263,4283,4303,4323,4343,4347,4367,4381,4389,4401,4413,4425,4433,4441,4456,4465,4481,4491,4505,4514,4523,4537,4545,4558,4566,4574,4582,4590],{"__ignoreMap":11},[915,4086,4087],{"class":917,"line":918},[915,4088,4089],{"class":921},"\u003C!-- Map 集合配置-->\n",[915,4091,4092,4094,4096,4098,4100,4103,4105,4107,4110],{"class":917,"line":925},[915,4093,1170],{"class":928},[915,4095,1174],{"class":1173},[915,4097,1177],{"class":939},[915,4099,933],{"class":928},[915,4101,4102],{"class":946},"\"teacherOne\"",[915,4104,1184],{"class":939},[915,4106,933],{"class":928},[915,4108,4109],{"class":946},"\"com.codermast.spring6.iocxml.bean.Teacher\"",[915,4111,1551],{"class":928},[915,4113,4114,4116,4118,4120,4122,4125,4127,4129,4132],{"class":917,"line":993},[915,4115,1556],{"class":928},[915,4117,1757],{"class":1173},[915,4119,1760],{"class":939},[915,4121,933],{"class":928},[915,4123,4124],{"class":946},"\"teacherId\"",[915,4126,1562],{"class":939},[915,4128,933],{"class":928},[915,4130,4131],{"class":946},"\"10010\"",[915,4133,1192],{"class":928},[915,4135,4136,4138,4140,4142,4144,4147,4149,4151,4154],{"class":917,"line":999},[915,4137,1556],{"class":928},[915,4139,1757],{"class":1173},[915,4141,1760],{"class":939},[915,4143,933],{"class":928},[915,4145,4146],{"class":946},"\"teacherName\"",[915,4148,1562],{"class":939},[915,4150,933],{"class":928},[915,4152,4153],{"class":946},"\"大宝\"",[915,4155,1192],{"class":928},[915,4157,4158,4160,4162],{"class":917,"line":1011},[915,4159,1619],{"class":928},[915,4161,1174],{"class":1173},[915,4163,1551],{"class":928},[915,4165,4166],{"class":917,"line":1386},[915,4167,2003],{"emptyLinePlaceholder":2002},[915,4169,4170,4172,4174,4176,4178,4181,4183,4185,4187],{"class":917,"line":1407},[915,4171,1170],{"class":928},[915,4173,1174],{"class":1173},[915,4175,1177],{"class":939},[915,4177,933],{"class":928},[915,4179,4180],{"class":946},"\"teacherTwo\"",[915,4182,1184],{"class":939},[915,4184,933],{"class":928},[915,4186,4109],{"class":946},[915,4188,1551],{"class":928},[915,4190,4191,4193,4195,4197,4199,4201,4203,4205,4208],{"class":917,"line":1413},[915,4192,1556],{"class":928},[915,4194,1757],{"class":1173},[915,4196,1760],{"class":939},[915,4198,933],{"class":928},[915,4200,4124],{"class":946},[915,4202,1562],{"class":939},[915,4204,933],{"class":928},[915,4206,4207],{"class":946},"\"10086\"",[915,4209,1192],{"class":928},[915,4211,4212,4214,4216,4218,4220,4222,4224,4226,4229],{"class":917,"line":1424},[915,4213,1556],{"class":928},[915,4215,1757],{"class":1173},[915,4217,1760],{"class":939},[915,4219,933],{"class":928},[915,4221,4146],{"class":946},[915,4223,1562],{"class":939},[915,4225,933],{"class":928},[915,4227,4228],{"class":946},"\"二宝\"",[915,4230,1192],{"class":928},[915,4232,4233,4235,4237],{"class":917,"line":2056},[915,4234,1619],{"class":928},[915,4236,1174],{"class":1173},[915,4238,1551],{"class":928},[915,4240,4241],{"class":917,"line":2061},[915,4242,2003],{"emptyLinePlaceholder":2002},[915,4244,4245,4247,4249,4251,4253,4255,4257,4259,4261],{"class":917,"line":2081},[915,4246,1170],{"class":928},[915,4248,1174],{"class":1173},[915,4250,1177],{"class":939},[915,4252,933],{"class":928},[915,4254,2528],{"class":946},[915,4256,1184],{"class":939},[915,4258,933],{"class":928},[915,4260,1548],{"class":946},[915,4262,1551],{"class":928},[915,4264,4265,4267,4269,4271,4273,4275,4277,4279,4281],{"class":917,"line":2094},[915,4266,1556],{"class":928},[915,4268,1757],{"class":1173},[915,4270,1760],{"class":939},[915,4272,933],{"class":928},[915,4274,2549],{"class":946},[915,4276,1562],{"class":939},[915,4278,933],{"class":928},[915,4280,2556],{"class":946},[915,4282,1192],{"class":928},[915,4284,4285,4287,4289,4291,4293,4295,4297,4299,4301],{"class":917,"line":2099},[915,4286,1556],{"class":928},[915,4288,1757],{"class":1173},[915,4290,1760],{"class":939},[915,4292,933],{"class":928},[915,4294,1765],{"class":946},[915,4296,1562],{"class":939},[915,4298,933],{"class":928},[915,4300,2577],{"class":946},[915,4302,1192],{"class":928},[915,4304,4305,4307,4309,4311,4313,4315,4317,4319,4321],{"class":917,"line":2104},[915,4306,1556],{"class":928},[915,4308,1757],{"class":1173},[915,4310,1760],{"class":939},[915,4312,933],{"class":928},[915,4314,2592],{"class":946},[915,4316,1562],{"class":939},[915,4318,933],{"class":928},[915,4320,2599],{"class":946},[915,4322,1192],{"class":928},[915,4324,4325,4327,4329,4331,4333,4335,4337,4339,4341],{"class":917,"line":2117},[915,4326,1556],{"class":928},[915,4328,1757],{"class":1173},[915,4330,1760],{"class":939},[915,4332,933],{"class":928},[915,4334,2614],{"class":946},[915,4336,1562],{"class":939},[915,4338,933],{"class":928},[915,4340,1612],{"class":946},[915,4342,1192],{"class":928},[915,4344,4345],{"class":917,"line":2125},[915,4346,2627],{"class":921},[915,4348,4349,4351,4353,4355,4357,4359,4361,4363,4365],{"class":917,"line":2130},[915,4350,1556],{"class":928},[915,4352,1757],{"class":1173},[915,4354,1760],{"class":939},[915,4356,933],{"class":928},[915,4358,2640],{"class":946},[915,4360,2643],{"class":939},[915,4362,933],{"class":928},[915,4364,2444],{"class":946},[915,4366,1192],{"class":928},[915,4368,4369,4371,4373,4375,4377,4379],{"class":917,"line":2135},[915,4370,1556],{"class":928},[915,4372,1757],{"class":1173},[915,4374,1760],{"class":939},[915,4376,933],{"class":928},[915,4378,3302],{"class":946},[915,4380,1551],{"class":928},[915,4382,4383,4385,4387],{"class":917,"line":2153},[915,4384,2795],{"class":928},[915,4386,3311],{"class":1173},[915,4388,1551],{"class":928},[915,4390,4391,4393,4395,4397,4399],{"class":917,"line":2165},[915,4392,2817],{"class":928},[915,4394,1949],{"class":1173},[915,4396,3322],{"class":928},[915,4398,1949],{"class":1173},[915,4400,1551],{"class":928},[915,4402,4403,4405,4407,4409,4411],{"class":917,"line":2170},[915,4404,2817],{"class":928},[915,4406,1949],{"class":1173},[915,4408,3335],{"class":928},[915,4410,1949],{"class":1173},[915,4412,1551],{"class":928},[915,4414,4415,4417,4419,4421,4423],{"class":917,"line":2175},[915,4416,2817],{"class":928},[915,4418,1949],{"class":1173},[915,4420,3348],{"class":928},[915,4422,1949],{"class":1173},[915,4424,1551],{"class":928},[915,4426,4427,4429,4431],{"class":917,"line":2184},[915,4428,2860],{"class":928},[915,4430,3311],{"class":1173},[915,4432,1551],{"class":928},[915,4434,4435,4437,4439],{"class":917,"line":2196},[915,4436,2869],{"class":928},[915,4438,1757],{"class":1173},[915,4440,1551],{"class":928},[915,4442,4443,4445,4447,4449,4451,4454],{"class":917,"line":2207},[915,4444,1556],{"class":928},[915,4446,1757],{"class":1173},[915,4448,1760],{"class":939},[915,4450,933],{"class":928},[915,4452,4453],{"class":946},"\"teacherMap\"",[915,4455,1551],{"class":928},[915,4457,4458,4460,4463],{"class":917,"line":2221},[915,4459,2795],{"class":928},[915,4461,4462],{"class":1173},"map",[915,4464,1551],{"class":928},[915,4466,4467,4469,4472,4475,4477,4479],{"class":917,"line":2246},[915,4468,2817],{"class":928},[915,4470,4471],{"class":1173},"entry",[915,4473,4474],{"class":939}," value-ref",[915,4476,933],{"class":928},[915,4478,4102],{"class":946},[915,4480,1551],{"class":928},[915,4482,4483,4486,4489],{"class":917,"line":2255},[915,4484,4485],{"class":928},"                \u003C",[915,4487,4488],{"class":1173},"key",[915,4490,1551],{"class":928},[915,4492,4493,4496,4498,4501,4503],{"class":917,"line":2260},[915,4494,4495],{"class":928},"                    \u003C",[915,4497,1949],{"class":1173},[915,4499,4500],{"class":928},">10010\u003C\u002F",[915,4502,1949],{"class":1173},[915,4504,1551],{"class":928},[915,4506,4507,4510,4512],{"class":917,"line":2265},[915,4508,4509],{"class":928},"                \u003C\u002F",[915,4511,4488],{"class":1173},[915,4513,1551],{"class":928},[915,4515,4516,4519,4521],{"class":917,"line":2274},[915,4517,4518],{"class":928},"            \u003C\u002F",[915,4520,4471],{"class":1173},[915,4522,1551],{"class":928},[915,4524,4525,4527,4529,4531,4533,4535],{"class":917,"line":2279},[915,4526,2817],{"class":928},[915,4528,4471],{"class":1173},[915,4530,4474],{"class":939},[915,4532,933],{"class":928},[915,4534,4180],{"class":946},[915,4536,1551],{"class":928},[915,4538,4539,4541,4543],{"class":917,"line":2284},[915,4540,4485],{"class":928},[915,4542,4488],{"class":1173},[915,4544,1551],{"class":928},[915,4546,4547,4549,4551,4554,4556],{"class":917,"line":2302},[915,4548,4495],{"class":928},[915,4550,1949],{"class":1173},[915,4552,4553],{"class":928},">10086\u003C\u002F",[915,4555,1949],{"class":1173},[915,4557,1551],{"class":928},[915,4559,4560,4562,4564],{"class":917,"line":2313},[915,4561,4509],{"class":928},[915,4563,4488],{"class":1173},[915,4565,1551],{"class":928},[915,4567,4568,4570,4572],{"class":917,"line":2324},[915,4569,4518],{"class":928},[915,4571,4471],{"class":1173},[915,4573,1551],{"class":928},[915,4575,4576,4578,4580],{"class":917,"line":2329},[915,4577,2860],{"class":928},[915,4579,4462],{"class":1173},[915,4581,1551],{"class":928},[915,4583,4584,4586,4588],{"class":917,"line":3972},[915,4585,2869],{"class":928},[915,4587,1757],{"class":1173},[915,4589,1551],{"class":928},[915,4591,4593,4595,4597],{"class":917,"line":4592},40,[915,4594,1619],{"class":928},[915,4596,1174],{"class":1173},[915,4598,1551],{"class":928},[1237,4600,4601],{},[958,4602,4603],{},"引用集合类型",[906,4605,4607],{"className":1156,"code":4606,"language":1158,"meta":11,"style":11},"\u003C!--list集合类型的bean-->\n\u003Cutil:list id=\"students\">\n    \u003Cref bean=\"studentOne\"\u002F>\n    \u003Cref bean=\"studentTwo\"\u002F>\n    \u003Cref bean=\"studentFour\"\u002F>\n\u003C\u002Futil:list>\n\u003C!--map集合类型的bean-->\n\u003Cutil:map id=\"teacherMap\">\n    \u003Centry>\n        \u003Ckey>\n            \u003Cvalue>10010\u003C\u002Fvalue>\n        \u003C\u002Fkey>\n        \u003Cref bean=\"teacherOne\"\u002F>\n    \u003C\u002Fentry>\n    \u003Centry>\n        \u003Ckey>\n            \u003Cvalue>10086\u003C\u002Fvalue>\n        \u003C\u002Fkey>\n        \u003Cref bean=\"teacherTwo\"\u002F>\n    \u003C\u002Fentry>\n\u003C\u002Futil:map>\n\u003Cbean id=\"clazzTwo\" class=\"com.codermast.spring6.iocxml.bean.Clazz\">\n    \u003Cproperty name=\"clazzId\" value=\"4444\"\u002F>\n    \u003Cproperty name=\"clazzName\" value=\"Javaee0222\"\u002F>\n    \u003Cproperty name=\"students\" ref=\"students\"\u002F>\n\u003C\u002Fbean>\n\u003Cbean id=\"studentFour\" class=\"com.codermast.spring6.iocxml.bean.Student\">\n    \u003Cproperty name=\"id\" value=\"1004\"\u002F>\n    \u003Cproperty name=\"name\" value=\"赵六\"\u002F>\n    \u003Cproperty name=\"age\" value=\"26\"\u002F>\n    \u003Cproperty name=\"sex\" value=\"女\"\u002F>\n    \u003C!-- ref属性：引用IOC容器中某个bean的id，将所对应的bean为属性赋值 -->\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n    \u003Cproperty name=\"hobbies\">\n        \u003Carray>\n            \u003Cvalue>抽烟\u003C\u002Fvalue>\n            \u003Cvalue>喝酒\u003C\u002Fvalue>\n            \u003Cvalue>烫头\u003C\u002Fvalue>\n        \u003C\u002Farray>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"teacherMap\" ref=\"teacherMap\"\u002F>\n\u003C\u002Fbean>\n",[912,4608,4609,4614,4629,4643,4657,4671,4679,4684,4699,4707,4715,4727,4735,4749,4757,4765,4773,4785,4793,4807,4815,4823,4843,4863,4883,4903,4911,4931,4951,4971,4991,5011,5015,5035,5049,5057,5069,5081,5093,5101,5109,5130],{"__ignoreMap":11},[915,4610,4611],{"class":917,"line":918},[915,4612,4613],{"class":921},"\u003C!--list集合类型的bean-->\n",[915,4615,4616,4618,4621,4623,4625,4627],{"class":917,"line":925},[915,4617,1170],{"class":928},[915,4619,4620],{"class":1173},"util:list",[915,4622,1177],{"class":939},[915,4624,933],{"class":928},[915,4626,3565],{"class":946},[915,4628,1551],{"class":928},[915,4630,4631,4633,4635,4637,4639,4641],{"class":917,"line":993},[915,4632,1556],{"class":928},[915,4634,3583],{"class":1173},[915,4636,3586],{"class":939},[915,4638,933],{"class":928},[915,4640,1401],{"class":946},[915,4642,1192],{"class":928},[915,4644,4645,4647,4649,4651,4653,4655],{"class":917,"line":999},[915,4646,1556],{"class":928},[915,4648,3583],{"class":1173},[915,4650,3586],{"class":939},[915,4652,933],{"class":928},[915,4654,1541],{"class":946},[915,4656,1192],{"class":928},[915,4658,4659,4661,4663,4665,4667,4669],{"class":917,"line":1011},[915,4660,1556],{"class":928},[915,4662,3583],{"class":1173},[915,4664,3586],{"class":939},[915,4666,933],{"class":928},[915,4668,2528],{"class":946},[915,4670,1192],{"class":928},[915,4672,4673,4675,4677],{"class":917,"line":1386},[915,4674,1619],{"class":928},[915,4676,4620],{"class":1173},[915,4678,1551],{"class":928},[915,4680,4681],{"class":917,"line":1407},[915,4682,4683],{"class":921},"\u003C!--map集合类型的bean-->\n",[915,4685,4686,4688,4691,4693,4695,4697],{"class":917,"line":1413},[915,4687,1170],{"class":928},[915,4689,4690],{"class":1173},"util:map",[915,4692,1177],{"class":939},[915,4694,933],{"class":928},[915,4696,4453],{"class":946},[915,4698,1551],{"class":928},[915,4700,4701,4703,4705],{"class":917,"line":1424},[915,4702,1556],{"class":928},[915,4704,4471],{"class":1173},[915,4706,1551],{"class":928},[915,4708,4709,4711,4713],{"class":917,"line":2056},[915,4710,2795],{"class":928},[915,4712,4488],{"class":1173},[915,4714,1551],{"class":928},[915,4716,4717,4719,4721,4723,4725],{"class":917,"line":2061},[915,4718,2817],{"class":928},[915,4720,1949],{"class":1173},[915,4722,4500],{"class":928},[915,4724,1949],{"class":1173},[915,4726,1551],{"class":928},[915,4728,4729,4731,4733],{"class":917,"line":2081},[915,4730,2860],{"class":928},[915,4732,4488],{"class":1173},[915,4734,1551],{"class":928},[915,4736,4737,4739,4741,4743,4745,4747],{"class":917,"line":2094},[915,4738,2795],{"class":928},[915,4740,3583],{"class":1173},[915,4742,3586],{"class":939},[915,4744,933],{"class":928},[915,4746,4102],{"class":946},[915,4748,1192],{"class":928},[915,4750,4751,4753,4755],{"class":917,"line":2099},[915,4752,2869],{"class":928},[915,4754,4471],{"class":1173},[915,4756,1551],{"class":928},[915,4758,4759,4761,4763],{"class":917,"line":2104},[915,4760,1556],{"class":928},[915,4762,4471],{"class":1173},[915,4764,1551],{"class":928},[915,4766,4767,4769,4771],{"class":917,"line":2117},[915,4768,2795],{"class":928},[915,4770,4488],{"class":1173},[915,4772,1551],{"class":928},[915,4774,4775,4777,4779,4781,4783],{"class":917,"line":2125},[915,4776,2817],{"class":928},[915,4778,1949],{"class":1173},[915,4780,4553],{"class":928},[915,4782,1949],{"class":1173},[915,4784,1551],{"class":928},[915,4786,4787,4789,4791],{"class":917,"line":2130},[915,4788,2860],{"class":928},[915,4790,4488],{"class":1173},[915,4792,1551],{"class":928},[915,4794,4795,4797,4799,4801,4803,4805],{"class":917,"line":2135},[915,4796,2795],{"class":928},[915,4798,3583],{"class":1173},[915,4800,3586],{"class":939},[915,4802,933],{"class":928},[915,4804,4180],{"class":946},[915,4806,1192],{"class":928},[915,4808,4809,4811,4813],{"class":917,"line":2153},[915,4810,2869],{"class":928},[915,4812,4471],{"class":1173},[915,4814,1551],{"class":928},[915,4816,4817,4819,4821],{"class":917,"line":2165},[915,4818,1619],{"class":928},[915,4820,4690],{"class":1173},[915,4822,1551],{"class":928},[915,4824,4825,4827,4829,4831,4833,4835,4837,4839,4841],{"class":917,"line":2170},[915,4826,1170],{"class":928},[915,4828,1174],{"class":1173},[915,4830,1177],{"class":939},[915,4832,933],{"class":928},[915,4834,3502],{"class":946},[915,4836,1184],{"class":939},[915,4838,933],{"class":928},[915,4840,2451],{"class":946},[915,4842,1551],{"class":928},[915,4844,4845,4847,4849,4851,4853,4855,4857,4859,4861],{"class":917,"line":2175},[915,4846,1556],{"class":928},[915,4848,1757],{"class":1173},[915,4850,1760],{"class":939},[915,4852,933],{"class":928},[915,4854,2466],{"class":946},[915,4856,1562],{"class":939},[915,4858,933],{"class":928},[915,4860,3529],{"class":946},[915,4862,1192],{"class":928},[915,4864,4865,4867,4869,4871,4873,4875,4877,4879,4881],{"class":917,"line":2184},[915,4866,1556],{"class":928},[915,4868,1757],{"class":1173},[915,4870,1760],{"class":939},[915,4872,933],{"class":928},[915,4874,2488],{"class":946},[915,4876,1562],{"class":939},[915,4878,933],{"class":928},[915,4880,3550],{"class":946},[915,4882,1192],{"class":928},[915,4884,4885,4887,4889,4891,4893,4895,4897,4899,4901],{"class":917,"line":2196},[915,4886,1556],{"class":928},[915,4888,1757],{"class":1173},[915,4890,1760],{"class":939},[915,4892,933],{"class":928},[915,4894,3565],{"class":946},[915,4896,2643],{"class":939},[915,4898,933],{"class":928},[915,4900,3565],{"class":946},[915,4902,1192],{"class":928},[915,4904,4905,4907,4909],{"class":917,"line":2207},[915,4906,1619],{"class":928},[915,4908,1174],{"class":1173},[915,4910,1551],{"class":928},[915,4912,4913,4915,4917,4919,4921,4923,4925,4927,4929],{"class":917,"line":2221},[915,4914,1170],{"class":928},[915,4916,1174],{"class":1173},[915,4918,1177],{"class":939},[915,4920,933],{"class":928},[915,4922,2528],{"class":946},[915,4924,1184],{"class":939},[915,4926,933],{"class":928},[915,4928,1548],{"class":946},[915,4930,1551],{"class":928},[915,4932,4933,4935,4937,4939,4941,4943,4945,4947,4949],{"class":917,"line":2246},[915,4934,1556],{"class":928},[915,4936,1757],{"class":1173},[915,4938,1760],{"class":939},[915,4940,933],{"class":928},[915,4942,2549],{"class":946},[915,4944,1562],{"class":939},[915,4946,933],{"class":928},[915,4948,2556],{"class":946},[915,4950,1192],{"class":928},[915,4952,4953,4955,4957,4959,4961,4963,4965,4967,4969],{"class":917,"line":2255},[915,4954,1556],{"class":928},[915,4956,1757],{"class":1173},[915,4958,1760],{"class":939},[915,4960,933],{"class":928},[915,4962,1765],{"class":946},[915,4964,1562],{"class":939},[915,4966,933],{"class":928},[915,4968,2577],{"class":946},[915,4970,1192],{"class":928},[915,4972,4973,4975,4977,4979,4981,4983,4985,4987,4989],{"class":917,"line":2260},[915,4974,1556],{"class":928},[915,4976,1757],{"class":1173},[915,4978,1760],{"class":939},[915,4980,933],{"class":928},[915,4982,2592],{"class":946},[915,4984,1562],{"class":939},[915,4986,933],{"class":928},[915,4988,2599],{"class":946},[915,4990,1192],{"class":928},[915,4992,4993,4995,4997,4999,5001,5003,5005,5007,5009],{"class":917,"line":2265},[915,4994,1556],{"class":928},[915,4996,1757],{"class":1173},[915,4998,1760],{"class":939},[915,5000,933],{"class":928},[915,5002,2614],{"class":946},[915,5004,1562],{"class":939},[915,5006,933],{"class":928},[915,5008,1612],{"class":946},[915,5010,1192],{"class":928},[915,5012,5013],{"class":917,"line":2274},[915,5014,2627],{"class":921},[915,5016,5017,5019,5021,5023,5025,5027,5029,5031,5033],{"class":917,"line":2279},[915,5018,1556],{"class":928},[915,5020,1757],{"class":1173},[915,5022,1760],{"class":939},[915,5024,933],{"class":928},[915,5026,2640],{"class":946},[915,5028,2643],{"class":939},[915,5030,933],{"class":928},[915,5032,2444],{"class":946},[915,5034,1192],{"class":928},[915,5036,5037,5039,5041,5043,5045,5047],{"class":917,"line":2284},[915,5038,1556],{"class":928},[915,5040,1757],{"class":1173},[915,5042,1760],{"class":939},[915,5044,933],{"class":928},[915,5046,3302],{"class":946},[915,5048,1551],{"class":928},[915,5050,5051,5053,5055],{"class":917,"line":2302},[915,5052,2795],{"class":928},[915,5054,3311],{"class":1173},[915,5056,1551],{"class":928},[915,5058,5059,5061,5063,5065,5067],{"class":917,"line":2313},[915,5060,2817],{"class":928},[915,5062,1949],{"class":1173},[915,5064,3322],{"class":928},[915,5066,1949],{"class":1173},[915,5068,1551],{"class":928},[915,5070,5071,5073,5075,5077,5079],{"class":917,"line":2324},[915,5072,2817],{"class":928},[915,5074,1949],{"class":1173},[915,5076,3335],{"class":928},[915,5078,1949],{"class":1173},[915,5080,1551],{"class":928},[915,5082,5083,5085,5087,5089,5091],{"class":917,"line":2329},[915,5084,2817],{"class":928},[915,5086,1949],{"class":1173},[915,5088,3348],{"class":928},[915,5090,1949],{"class":1173},[915,5092,1551],{"class":928},[915,5094,5095,5097,5099],{"class":917,"line":3972},[915,5096,2860],{"class":928},[915,5098,3311],{"class":1173},[915,5100,1551],{"class":928},[915,5102,5103,5105,5107],{"class":917,"line":4592},[915,5104,2869],{"class":928},[915,5106,1757],{"class":1173},[915,5108,1551],{"class":928},[915,5110,5112,5114,5116,5118,5120,5122,5124,5126,5128],{"class":917,"line":5111},41,[915,5113,1556],{"class":928},[915,5115,1757],{"class":1173},[915,5117,1760],{"class":939},[915,5119,933],{"class":928},[915,5121,4453],{"class":946},[915,5123,2643],{"class":939},[915,5125,933],{"class":928},[915,5127,4453],{"class":946},[915,5129,1192],{"class":928},[915,5131,5133,5135,5137],{"class":917,"line":5132},42,[915,5134,1619],{"class":928},[915,5136,1174],{"class":1173},[915,5138,1551],{"class":928},[896,5140,5141],{},"::: note 使用util:list、util:map标签必须引入相应的命名空间",[906,5143,5145],{"className":1156,"code":5144,"language":1158,"meta":11,"style":11},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cbeans xmlns=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\"\n    xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n    xmlns:util=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\"\n    xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\n    http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\u002Fspring-util.xsd\n    http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n    http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n",[912,5146,5147,5173,5188,5198,5208,5218,5223,5228],{"__ignoreMap":11},[915,5148,5149,5152,5154,5157,5159,5162,5165,5167,5170],{"class":917,"line":918},[915,5150,5151],{"class":928},"\u003C?",[915,5153,1158],{"class":1173},[915,5155,5156],{"class":939}," version",[915,5158,933],{"class":928},[915,5160,5161],{"class":946},"\"1.0\"",[915,5163,5164],{"class":939}," encoding",[915,5166,933],{"class":928},[915,5168,5169],{"class":946},"\"UTF-8\"",[915,5171,5172],{"class":928},"?>\n",[915,5174,5175,5177,5180,5183,5185],{"class":917,"line":925},[915,5176,1170],{"class":928},[915,5178,5179],{"class":1173},"beans",[915,5181,5182],{"class":939}," xmlns",[915,5184,933],{"class":928},[915,5186,5187],{"class":946},"\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\"\n",[915,5189,5190,5193,5195],{"class":917,"line":993},[915,5191,5192],{"class":939},"    xmlns:xsi",[915,5194,933],{"class":928},[915,5196,5197],{"class":946},"\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n",[915,5199,5200,5203,5205],{"class":917,"line":999},[915,5201,5202],{"class":939},"    xmlns:util",[915,5204,933],{"class":928},[915,5206,5207],{"class":946},"\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\"\n",[915,5209,5210,5213,5215],{"class":917,"line":1011},[915,5211,5212],{"class":939},"    xsi:schemaLocation",[915,5214,933],{"class":928},[915,5216,5217],{"class":946},"\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\n",[915,5219,5220],{"class":917,"line":1386},[915,5221,5222],{"class":946},"    http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\u002Fspring-util.xsd\n",[915,5224,5225],{"class":917,"line":1407},[915,5226,5227],{"class":946},"    http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n",[915,5229,5230,5233],{"class":917,"line":1413},[915,5231,5232],{"class":946},"    http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\"",[915,5234,1551],{"class":928},[892,5236,5238],{"id":5237},"p命名空间","P命名空间",[1237,5240,5241],{},[958,5242,5243],{},"引入 P 命名空间",[906,5245,5247],{"className":1156,"code":5246,"language":1158,"meta":11,"style":11},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cbeans xmlns=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\"\n       xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n       xmlns:util=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\"\n       xmlns:p=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fp\"\n       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\n       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\u002Fspring-util.xsd\n       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n",[912,5248,5249,5269,5281,5290,5299,5309,5318,5323,5328],{"__ignoreMap":11},[915,5250,5251,5253,5255,5257,5259,5261,5263,5265,5267],{"class":917,"line":918},[915,5252,5151],{"class":928},[915,5254,1158],{"class":1173},[915,5256,5156],{"class":939},[915,5258,933],{"class":928},[915,5260,5161],{"class":946},[915,5262,5164],{"class":939},[915,5264,933],{"class":928},[915,5266,5169],{"class":946},[915,5268,5172],{"class":928},[915,5270,5271,5273,5275,5277,5279],{"class":917,"line":925},[915,5272,1170],{"class":928},[915,5274,5179],{"class":1173},[915,5276,5182],{"class":939},[915,5278,933],{"class":928},[915,5280,5187],{"class":946},[915,5282,5283,5286,5288],{"class":917,"line":993},[915,5284,5285],{"class":939},"       xmlns:xsi",[915,5287,933],{"class":928},[915,5289,5197],{"class":946},[915,5291,5292,5295,5297],{"class":917,"line":999},[915,5293,5294],{"class":939},"       xmlns:util",[915,5296,933],{"class":928},[915,5298,5207],{"class":946},[915,5300,5301,5304,5306],{"class":917,"line":1011},[915,5302,5303],{"class":939},"       xmlns:p",[915,5305,933],{"class":928},[915,5307,5308],{"class":946},"\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fp\"\n",[915,5310,5311,5314,5316],{"class":917,"line":1386},[915,5312,5313],{"class":939},"       xsi:schemaLocation",[915,5315,933],{"class":928},[915,5317,5217],{"class":946},[915,5319,5320],{"class":917,"line":1407},[915,5321,5322],{"class":946},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Futil\u002Fspring-util.xsd\n",[915,5324,5325],{"class":917,"line":1413},[915,5326,5327],{"class":946},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n",[915,5329,5330,5333],{"class":917,"line":1424},[915,5331,5332],{"class":946},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\"",[915,5334,1551],{"class":928},[1237,5336,5337],{},[958,5338,5339],{},"引入p命名空间后，可以通过以下方式为bean的各个属性赋值",[906,5341,5343],{"className":1156,"code":5342,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"studentSix\" class=\"com.codermast.spring6.iocxml.bean.Student\"\n    p:id=\"1006\" p:name=\"小明\" p:clazz-ref=\"clazzOne\" p:teacherMap-ref=\"teacherMap\">\u003C\u002Fbean>\n",[912,5344,5345,5364],{"__ignoreMap":11},[915,5346,5347,5349,5351,5353,5355,5357,5359,5361],{"class":917,"line":918},[915,5348,1170],{"class":928},[915,5350,1174],{"class":1173},[915,5352,1177],{"class":939},[915,5354,933],{"class":928},[915,5356,2904],{"class":946},[915,5358,1184],{"class":939},[915,5360,933],{"class":928},[915,5362,5363],{"class":946},"\"com.codermast.spring6.iocxml.bean.Student\"\n",[915,5365,5366,5369,5371,5374,5377,5379,5382,5385,5387,5389,5392,5394,5396,5398,5400],{"class":917,"line":925},[915,5367,5368],{"class":939},"    p:id",[915,5370,933],{"class":928},[915,5372,5373],{"class":946},"\"1006\"",[915,5375,5376],{"class":939}," p:name",[915,5378,933],{"class":928},[915,5380,5381],{"class":946},"\"小明\"",[915,5383,5384],{"class":939}," p:clazz-ref",[915,5386,933],{"class":928},[915,5388,2444],{"class":946},[915,5390,5391],{"class":939}," p:teacherMap-ref",[915,5393,933],{"class":928},[915,5395,4453],{"class":946},[915,5397,1846],{"class":928},[915,5399,1174],{"class":1173},[915,5401,1551],{"class":928},[892,5403,5404],{"id":5404},"引入外部属性文件",[955,5406,5407],{},[958,5408,5409],{},"加入依赖",[896,5411,5412],{},"即将下面的代码，加入到对应子模块中的 pom.xml 文件中",[906,5414,5416],{"className":1156,"code":5415,"language":1158,"meta":11,"style":11},"\u003C!-- MySQL驱动 -->\n\u003Cdependency>\n    \u003CgroupId>mysql\u003C\u002FgroupId>\n    \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n    \u003Cversion>8.0.30\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003C!-- 数据源 -->\n\u003Cdependency>\n    \u003CgroupId>com.alibaba\u003C\u002FgroupId>\n    \u003CartifactId>druid\u003C\u002FartifactId>\n    \u003Cversion>1.2.15\u003C\u002Fversion>\n\u003C\u002Fdependency>\n",[912,5417,5418,5423,5432,5446,5460,5474,5482,5486,5491,5499,5512,5525,5538],{"__ignoreMap":11},[915,5419,5420],{"class":917,"line":918},[915,5421,5422],{"class":921},"\u003C!-- MySQL驱动 -->\n",[915,5424,5425,5427,5430],{"class":917,"line":925},[915,5426,1170],{"class":928},[915,5428,5429],{"class":1173},"dependency",[915,5431,1551],{"class":928},[915,5433,5434,5436,5439,5442,5444],{"class":917,"line":993},[915,5435,1556],{"class":928},[915,5437,5438],{"class":1173},"groupId",[915,5440,5441],{"class":928},">mysql\u003C\u002F",[915,5443,5438],{"class":1173},[915,5445,1551],{"class":928},[915,5447,5448,5450,5453,5456,5458],{"class":917,"line":999},[915,5449,1556],{"class":928},[915,5451,5452],{"class":1173},"artifactId",[915,5454,5455],{"class":928},">mysql-connector-java\u003C\u002F",[915,5457,5452],{"class":1173},[915,5459,1551],{"class":928},[915,5461,5462,5464,5467,5470,5472],{"class":917,"line":1011},[915,5463,1556],{"class":928},[915,5465,5466],{"class":1173},"version",[915,5468,5469],{"class":928},">8.0.30\u003C\u002F",[915,5471,5466],{"class":1173},[915,5473,1551],{"class":928},[915,5475,5476,5478,5480],{"class":917,"line":1386},[915,5477,1619],{"class":928},[915,5479,5429],{"class":1173},[915,5481,1551],{"class":928},[915,5483,5484],{"class":917,"line":1407},[915,5485,2003],{"emptyLinePlaceholder":2002},[915,5487,5488],{"class":917,"line":1413},[915,5489,5490],{"class":921},"\u003C!-- 数据源 -->\n",[915,5492,5493,5495,5497],{"class":917,"line":1424},[915,5494,1170],{"class":928},[915,5496,5429],{"class":1173},[915,5498,1551],{"class":928},[915,5500,5501,5503,5505,5508,5510],{"class":917,"line":2056},[915,5502,1556],{"class":928},[915,5504,5438],{"class":1173},[915,5506,5507],{"class":928},">com.alibaba\u003C\u002F",[915,5509,5438],{"class":1173},[915,5511,1551],{"class":928},[915,5513,5514,5516,5518,5521,5523],{"class":917,"line":2061},[915,5515,1556],{"class":928},[915,5517,5452],{"class":1173},[915,5519,5520],{"class":928},">druid\u003C\u002F",[915,5522,5452],{"class":1173},[915,5524,1551],{"class":928},[915,5526,5527,5529,5531,5534,5536],{"class":917,"line":2081},[915,5528,1556],{"class":928},[915,5530,5466],{"class":1173},[915,5532,5533],{"class":928},">1.2.15\u003C\u002F",[915,5535,5466],{"class":1173},[915,5537,1551],{"class":928},[915,5539,5540,5542,5544],{"class":917,"line":2094},[915,5541,1619],{"class":928},[915,5543,5429],{"class":1173},[915,5545,1551],{"class":928},[955,5547,5548],{"start":925},[958,5549,5550],{},"创建外部属性配置文件jdbc.properties",[906,5552,5556],{"className":5553,"code":5554,"language":5555,"meta":11,"style":11},"language-properties shiki shiki-themes github-light github-light github-dark","jdbc.user=codermast\njdbc.password=123456\njdbc.url=jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fssm?serverTimezone=UTC\njdbc.driver=com.mysql.cj.jdbc.Driver\n","properties",[912,5557,5558,5566,5574,5588],{"__ignoreMap":11},[915,5559,5560,5563],{"class":917,"line":918},[915,5561,5562],{"class":932},"jdbc.user",[915,5564,5565],{"class":928},"=codermast\n",[915,5567,5568,5571],{"class":917,"line":925},[915,5569,5570],{"class":932},"jdbc.password",[915,5572,5573],{"class":928},"=123456\n",[915,5575,5576,5579,5582,5585],{"class":917,"line":993},[915,5577,5578],{"class":932},"jdbc.url",[915,5580,5581],{"class":928},"=jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fssm?",[915,5583,5584],{"class":932},"serverTimezone",[915,5586,5587],{"class":928},"=UTC\n",[915,5589,5590,5593],{"class":917,"line":999},[915,5591,5592],{"class":932},"jdbc.driver",[915,5594,5595],{"class":928},"=com.mysql.cj.jdbc.Driver\n",[955,5597,5598],{"start":993},[958,5599,5600],{},"引入配置文件",[896,5602,5603,5604],{},"引入context 名称空间，这里我们为了防止和之前的冲突，新建一个 bean 配置文件，名为 ",[912,5605,5606],{},"spring-datasource.xml",[906,5608,5610],{"className":1156,"code":5609,"language":1158,"meta":11,"style":11},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cbeans xmlns=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\"\n       xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n       xmlns:context=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\"\n       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\n       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\n       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n\n    \u003C!-- 引入外部属性文件 -->\n    \u003Ccontext:property-placeholder location=\"classpath:jdbc.properties\"\u002F>\n\u003C\u002Fbeans>\n",[912,5611,5612,5632,5644,5652,5662,5671,5676,5681,5688,5692,5697,5714],{"__ignoreMap":11},[915,5613,5614,5616,5618,5620,5622,5624,5626,5628,5630],{"class":917,"line":918},[915,5615,5151],{"class":928},[915,5617,1158],{"class":1173},[915,5619,5156],{"class":939},[915,5621,933],{"class":928},[915,5623,5161],{"class":946},[915,5625,5164],{"class":939},[915,5627,933],{"class":928},[915,5629,5169],{"class":946},[915,5631,5172],{"class":928},[915,5633,5634,5636,5638,5640,5642],{"class":917,"line":925},[915,5635,1170],{"class":928},[915,5637,5179],{"class":1173},[915,5639,5182],{"class":939},[915,5641,933],{"class":928},[915,5643,5187],{"class":946},[915,5645,5646,5648,5650],{"class":917,"line":993},[915,5647,5285],{"class":939},[915,5649,933],{"class":928},[915,5651,5197],{"class":946},[915,5653,5654,5657,5659],{"class":917,"line":999},[915,5655,5656],{"class":939},"       xmlns:context",[915,5658,933],{"class":928},[915,5660,5661],{"class":946},"\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\"\n",[915,5663,5664,5666,5668],{"class":917,"line":1011},[915,5665,5313],{"class":939},[915,5667,933],{"class":928},[915,5669,5670],{"class":946},"\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n",[915,5672,5673],{"class":917,"line":1386},[915,5674,5675],{"class":946},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\n",[915,5677,5678],{"class":917,"line":1407},[915,5679,5680],{"class":946},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\n",[915,5682,5683,5686],{"class":917,"line":1413},[915,5684,5685],{"class":946},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\"",[915,5687,1551],{"class":928},[915,5689,5690],{"class":917,"line":1424},[915,5691,2003],{"emptyLinePlaceholder":2002},[915,5693,5694],{"class":917,"line":2056},[915,5695,5696],{"class":921},"    \u003C!-- 引入外部属性文件 -->\n",[915,5698,5699,5701,5704,5707,5709,5712],{"class":917,"line":2061},[915,5700,1556],{"class":928},[915,5702,5703],{"class":1173},"context:property-placeholder",[915,5705,5706],{"class":939}," location",[915,5708,933],{"class":928},[915,5710,5711],{"class":946},"\"classpath:jdbc.properties\"",[915,5713,1192],{"class":928},[915,5715,5716,5718,5720],{"class":917,"line":2081},[915,5717,1619],{"class":928},[915,5719,5179],{"class":1173},[915,5721,1551],{"class":928},[1286,5723,5725,5726],{"title":5724},"注意：","\n在使用 `",[5703,5727,5728,5729],{},"` 元素加载外包配置文件功能前，首先需要在 XML 配置的一级标签 `",[5179,5730,5731],{},"` 中添加 context 相关的约束。\n",[955,5733,5734],{"start":999},[958,5735,4079],{},[906,5737,5739],{"className":1156,"code":5738,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"druidDataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\">\n    \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n    \u003Cproperty name=\"driverClassName\" value=\"${jdbc.driver}\"\u002F>\n    \u003Cproperty name=\"username\" value=\"${jdbc.user}\"\u002F>\n    \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n\u003C\u002Fbean>\n",[912,5740,5741,5763,5785,5807,5829,5851],{"__ignoreMap":11},[915,5742,5743,5745,5747,5749,5751,5754,5756,5758,5761],{"class":917,"line":918},[915,5744,1170],{"class":928},[915,5746,1174],{"class":1173},[915,5748,1177],{"class":939},[915,5750,933],{"class":928},[915,5752,5753],{"class":946},"\"druidDataSource\"",[915,5755,1184],{"class":939},[915,5757,933],{"class":928},[915,5759,5760],{"class":946},"\"com.alibaba.druid.pool.DruidDataSource\"",[915,5762,1551],{"class":928},[915,5764,5765,5767,5769,5771,5773,5776,5778,5780,5783],{"class":917,"line":925},[915,5766,1556],{"class":928},[915,5768,1757],{"class":1173},[915,5770,1760],{"class":939},[915,5772,933],{"class":928},[915,5774,5775],{"class":946},"\"url\"",[915,5777,1562],{"class":939},[915,5779,933],{"class":928},[915,5781,5782],{"class":946},"\"${jdbc.url}\"",[915,5784,1192],{"class":928},[915,5786,5787,5789,5791,5793,5795,5798,5800,5802,5805],{"class":917,"line":993},[915,5788,1556],{"class":928},[915,5790,1757],{"class":1173},[915,5792,1760],{"class":939},[915,5794,933],{"class":928},[915,5796,5797],{"class":946},"\"driverClassName\"",[915,5799,1562],{"class":939},[915,5801,933],{"class":928},[915,5803,5804],{"class":946},"\"${jdbc.driver}\"",[915,5806,1192],{"class":928},[915,5808,5809,5811,5813,5815,5817,5820,5822,5824,5827],{"class":917,"line":999},[915,5810,1556],{"class":928},[915,5812,1757],{"class":1173},[915,5814,1760],{"class":939},[915,5816,933],{"class":928},[915,5818,5819],{"class":946},"\"username\"",[915,5821,1562],{"class":939},[915,5823,933],{"class":928},[915,5825,5826],{"class":946},"\"${jdbc.user}\"",[915,5828,1192],{"class":928},[915,5830,5831,5833,5835,5837,5839,5842,5844,5846,5849],{"class":917,"line":1011},[915,5832,1556],{"class":928},[915,5834,1757],{"class":1173},[915,5836,1760],{"class":939},[915,5838,933],{"class":928},[915,5840,5841],{"class":946},"\"password\"",[915,5843,1562],{"class":939},[915,5845,933],{"class":928},[915,5847,5848],{"class":946},"\"${jdbc.password}\"",[915,5850,1192],{"class":928},[915,5852,5853,5855,5857],{"class":917,"line":1386},[915,5854,1619],{"class":928},[915,5856,1174],{"class":1173},[915,5858,1551],{"class":928},[955,5860,5861],{"start":1011},[958,5862,1328],{},[906,5864,5866],{"className":908,"code":5865,"language":910,"meta":11,"style":11},"@Test\npublic void testDataSource() throws SQLException {\n    ApplicationContext ac = new ClassPathXmlApplicationContext(\"spring-datasource.xml\");\n    DataSource dataSource = ac.getBean(DataSource.class);\n    Connection connection = dataSource.getConnection();\n    System.out.println(connection);\n}\n",[912,5867,5868,5874,5886,5903,5917,5932,5941],{"__ignoreMap":11},[915,5869,5870,5872],{"class":917,"line":918},[915,5871,1338],{"class":928},[915,5873,1341],{"class":932},[915,5875,5876,5878,5880,5883],{"class":917,"line":925},[915,5877,1346],{"class":932},[915,5879,1349],{"class":932},[915,5881,5882],{"class":939}," testDataSource",[915,5884,5885],{"class":928},"() throws SQLException {\n",[915,5887,5888,5890,5892,5894,5896,5898,5901],{"class":917,"line":993},[915,5889,1365],{"class":928},[915,5891,933],{"class":932},[915,5893,936],{"class":932},[915,5895,940],{"class":939},[915,5897,943],{"class":928},[915,5899,5900],{"class":946},"\"spring-datasource.xml\"",[915,5902,950],{"class":928},[915,5904,5905,5908,5910,5912,5914],{"class":917,"line":999},[915,5906,5907],{"class":928},"    DataSource dataSource ",[915,5909,933],{"class":932},[915,5911,1394],{"class":928},[915,5913,983],{"class":939},[915,5915,5916],{"class":928},"(DataSource.class);\n",[915,5918,5919,5922,5924,5927,5930],{"class":917,"line":1011},[915,5920,5921],{"class":928},"    Connection connection ",[915,5923,933],{"class":932},[915,5925,5926],{"class":928}," dataSource.",[915,5928,5929],{"class":939},"getConnection",[915,5931,1008],{"class":928},[915,5933,5934,5936,5938],{"class":917,"line":1386},[915,5935,1416],{"class":928},[915,5937,1017],{"class":939},[915,5939,5940],{"class":928},"(connection);\n",[915,5942,5943],{"class":917,"line":1407},[915,5944,1427],{"class":928},[896,5946,5947],{},[1145,5948],{"alt":1432,"src":5949},"\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-17-52-28.png",[892,5951,5953],{"id":5952},"bean的作用域","Bean的作用域",[955,5955,5956],{},[958,5957,5958],{},"概念",[896,5960,5961],{},"在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围，各取值含义参加下表：",[5963,5964,5965,5981],"table",{},[5966,5967,5968],"thead",{},[5969,5970,5971,5975,5978],"tr",{},[5972,5973,5974],"th",{},"取值",[5972,5976,5977],{},"含义",[5972,5979,5980],{},"创建对象的时机",[5982,5983,5984,5996],"tbody",{},[5969,5985,5986,5990,5993],{},[5987,5988,5989],"td",{},"singleton（默认）",[5987,5991,5992],{},"在IOC容器中，这个bean的对象始终为单实例",[5987,5994,5995],{},"IOC容器初始化时",[5969,5997,5998,6001,6004],{},[5987,5999,6000],{},"prototype",[5987,6002,6003],{},"这个bean在IOC容器中有多个实例",[5987,6005,6006],{},"获取bean时",[896,6008,6009],{},"如果是在WebApplicationContext环境下还会有另外几个作用域（但不常用）：",[5963,6011,6012,6020],{},[5966,6013,6014],{},[5969,6015,6016,6018],{},[5972,6017,5974],{},[5972,6019,5977],{},[5982,6021,6022,6030],{},[5969,6023,6024,6027],{},[5987,6025,6026],{},"request",[5987,6028,6029],{},"在一个请求范围内有效",[5969,6031,6032,6035],{},[5987,6033,6034],{},"session",[5987,6036,6037],{},"在一个会话范围内有效",[955,6039,6040],{"start":925},[958,6041,6042],{},"创建 User 类",[1286,6044,6045,6046,6052,6054,6060,6064,6148,6153,6157,6162,6188,6193,6846,6848,6851,6855,7001,7005,7085,7091,7097,7100,7105,7108,7111,7285,7288,7320,7326,7330,7335,7338,7341,7344,8332,8334,8339,8440,8444,8470,8474,8564,8569,8572,8575,8580,8583,8680,8683,8720,8723,8828,8831,8867,8870,8928,8931,8934,8939,8942,8945,8948,8953,9055,9060,9063,9068,9213,9217,9326],{"title":1980},"\n```java\npackage com.atguigu.spring6.bean;\npublic class User {\n",[906,6047,6050],{"className":6048,"code":6049,"language":1221},[1219],"private Integer id;\n\nprivate String username;\n\nprivate String password;\n\nprivate Integer age;\n\npublic User() {\n}\n\npublic User(Integer id, String username, String password, Integer age) {\n    this.id = id;\n    this.username = username;\n    this.password = password;\n    this.age = age;\n}\n\npublic Integer getId() {\n    return id;\n}\n\npublic void setId(Integer id) {\n    this.id = id;\n}\n\npublic String getUsername() {\n    return username;\n}\n\npublic void setUsername(String username) {\n    this.username = username;\n}\n\npublic String getPassword() {\n    return password;\n}\n\npublic void setPassword(String password) {\n    this.password = password;\n}\n\npublic Integer getAge() {\n    return age;\n}\n\npublic void setAge(Integer age) {\n    this.age = age;\n}\n\n@Override\npublic String toString() {\n    return \"User{\" +\n            \"id=\" + id +\n            \", username='\" + username + '\\'' +\n            \", password='\" + password + '\\'' +\n            \", age=\" + age +\n            '}';\n}\n",[912,6051,6049],{"__ignoreMap":11},[896,6053,1317],{},[906,6055,6058],{"className":6056,"code":6057,"language":1221},[1219],"::::\n\n这里也可以使用我们之前的 User 类，不影响后续的操作。\n\n3. 配置bean\n\n```xml\n\u003C!-- 配置 User 类 -->\n\u003Cbean id=\"userSingleton\" class=\"com.codermast.spring6.iocxml.bean.User\" scope=\"singleton\"\u002F>\n\u003Cbean id=\"userPrototype\" class=\"com.codermast.spring6.iocxml.bean.User\" scope=\"prototype\"\u002F>\n",[912,6059,6057],{"__ignoreMap":11},[955,6061,6062],{"start":999},[958,6063,1328],{},[906,6065,6067],{"className":908,"code":6066,"language":910,"meta":11,"style":11},"@Test\npublic void testBeanScope(){\n    ApplicationContext ac = new ClassPathXmlApplicationContext(\"spring-scope.xml\");\n    User user1 = ac.getBean(User.class);\n    User user2 = ac.getBean(User.class);\n    System.out.println(user1==user2);\n}\n",[912,6068,6069,6075,6086,6103,6116,6129,6144],{"__ignoreMap":11},[915,6070,6071,6073],{"class":917,"line":918},[915,6072,1338],{"class":928},[915,6074,1341],{"class":932},[915,6076,6077,6079,6081,6084],{"class":917,"line":925},[915,6078,1346],{"class":932},[915,6080,1349],{"class":932},[915,6082,6083],{"class":939}," testBeanScope",[915,6085,1355],{"class":928},[915,6087,6088,6090,6092,6094,6096,6098,6101],{"class":917,"line":993},[915,6089,1365],{"class":928},[915,6091,933],{"class":932},[915,6093,936],{"class":932},[915,6095,940],{"class":939},[915,6097,943],{"class":928},[915,6099,6100],{"class":946},"\"spring-scope.xml\"",[915,6102,950],{"class":928},[915,6104,6105,6108,6110,6112,6114],{"class":917,"line":999},[915,6106,6107],{"class":928},"    User user1 ",[915,6109,933],{"class":932},[915,6111,1394],{"class":928},[915,6113,983],{"class":939},[915,6115,1058],{"class":928},[915,6117,6118,6121,6123,6125,6127],{"class":917,"line":1011},[915,6119,6120],{"class":928},"    User user2 ",[915,6122,933],{"class":932},[915,6124,1394],{"class":928},[915,6126,983],{"class":939},[915,6128,1058],{"class":928},[915,6130,6131,6133,6135,6138,6141],{"class":917,"line":1386},[915,6132,1416],{"class":928},[915,6134,1017],{"class":939},[915,6136,6137],{"class":928},"(user1",[915,6139,6140],{"class":932},"==",[915,6142,6143],{"class":928},"user2);\n",[915,6145,6146],{"class":917,"line":1407},[915,6147,1427],{"class":928},[896,6149,6150],{},[1145,6151],{"alt":1432,"src":6152},"\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-18-04-12.png",[892,6154,6156],{"id":6155},"bean生命周期","Bean生命周期",[955,6158,6159],{},[958,6160,6161],{},"具体的生命周期过程",[1237,6163,6164,6167,6170,6173,6176,6179,6182,6185],{},[958,6165,6166],{},"bean对象创建（调用无参构造器）",[958,6168,6169],{},"给bean对象设置属性",[958,6171,6172],{},"bean的后置处理器（初始化之前）",[958,6174,6175],{},"bean对象初始化（需在配置bean时指定初始化方法）",[958,6177,6178],{},"bean的后置处理器（初始化之后）",[958,6180,6181],{},"bean对象就绪可以使用",[958,6183,6184],{},"bean对象销毁（需在配置bean时指定销毁方法）",[958,6186,6187],{},"IOC容器关闭",[955,6189,6190],{"start":925},[958,6191,6192],{},"修改 User 类\n:::: details 点我展开代码",[906,6194,6196],{"className":908,"code":6195,"language":910,"meta":11,"style":11},"public class User {\n\n    private Integer id;\n\n    private String username;\n\n    private String password;\n\n    private Integer age;\n\n    public User() {\n        System.out.println(\"生命周期：1、创建对象\");\n    }\n\n    public User(Integer id, String username, String password, Integer age) {\n        this.id = id;\n        this.username = username;\n        this.password = password;\n        this.age = age;\n    }\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        System.out.println(\"生命周期：2、依赖注入\");\n        this.id = id;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public Integer getAge() {\n        return age;\n    }\n\n    public void setAge(Integer age) {\n        this.age = age;\n    }\n\n    public void initMethod(){\n        System.out.println(\"生命周期：3、初始化\");\n    }\n\n    public void destroyMethod(){\n        System.out.println(\"生命周期：5、销毁\");\n    }\n\n    @Override\n    public String toString() {\n        return \"User{\" +\n                \"id=\" + id +\n                \", username='\" + username + '\\'' +\n                \", password='\" + password + '\\'' +\n                \", age=\" + age +\n                '}';\n    }\n\n    public void run(){\n        System.out.println(\"run ......\");\n    }\n}\n",[912,6197,6198,6209,6213,6220,6224,6231,6235,6242,6246,6253,6257,6265,6279,6283,6287,6316,6326,6338,6350,6360,6364,6368,6379,6385,6389,6393,6408,6421,6431,6435,6439,6450,6456,6460,6464,6479,6489,6493,6497,6508,6514,6518,6522,6538,6549,6554,6559,6571,6578,6583,6588,6604,6615,6620,6625,6637,6651,6656,6661,6673,6687,6692,6697,6704,6715,6725,6738,6759,6780,6793,6800,6805,6810,6822,6836,6841],{"__ignoreMap":11},[915,6199,6200,6202,6204,6207],{"class":917,"line":918},[915,6201,1346],{"class":932},[915,6203,1184],{"class":932},[915,6205,6206],{"class":939}," User",[915,6208,1997],{"class":928},[915,6210,6211],{"class":917,"line":925},[915,6212,2003],{"emptyLinePlaceholder":2002},[915,6214,6215,6217],{"class":917,"line":993},[915,6216,2008],{"class":932},[915,6218,6219],{"class":928}," Integer id;\n",[915,6221,6222],{"class":917,"line":999},[915,6223,2003],{"emptyLinePlaceholder":2002},[915,6225,6226,6228],{"class":917,"line":1011},[915,6227,2008],{"class":932},[915,6229,6230],{"class":928}," String username;\n",[915,6232,6233],{"class":917,"line":1386},[915,6234,2003],{"emptyLinePlaceholder":2002},[915,6236,6237,6239],{"class":917,"line":1407},[915,6238,2008],{"class":932},[915,6240,6241],{"class":928}," String password;\n",[915,6243,6244],{"class":917,"line":1413},[915,6245,2003],{"emptyLinePlaceholder":2002},[915,6247,6248,6250],{"class":917,"line":1424},[915,6249,2008],{"class":932},[915,6251,6252],{"class":928}," Integer age;\n",[915,6254,6255],{"class":917,"line":2056},[915,6256,2003],{"emptyLinePlaceholder":2002},[915,6258,6259,6261,6263],{"class":917,"line":2061},[915,6260,2031],{"class":932},[915,6262,6206],{"class":939},[915,6264,2040],{"class":928},[915,6266,6267,6270,6272,6274,6277],{"class":917,"line":2081},[915,6268,6269],{"class":928},"        System.out.",[915,6271,1017],{"class":939},[915,6273,943],{"class":928},[915,6275,6276],{"class":946},"\"生命周期：1、创建对象\"",[915,6278,950],{"class":928},[915,6280,6281],{"class":917,"line":2094},[915,6282,2053],{"class":928},[915,6284,6285],{"class":917,"line":2099},[915,6286,2003],{"emptyLinePlaceholder":2002},[915,6288,6289,6291,6293,6295,6298,6300,6303,6305,6308,6311,6314],{"class":917,"line":2104},[915,6290,2031],{"class":932},[915,6292,6206],{"class":939},[915,6294,2071],{"class":928},[915,6296,6297],{"class":2074},"id",[915,6299,2295],{"class":928},[915,6301,6302],{"class":2074},"username",[915,6304,2295],{"class":928},[915,6306,6307],{"class":2074},"password",[915,6309,6310],{"class":928},", Integer ",[915,6312,6313],{"class":2074},"age",[915,6315,2078],{"class":928},[915,6317,6318,6320,6322,6324],{"class":917,"line":2117},[915,6319,2084],{"class":1464},[915,6321,1468],{"class":928},[915,6323,933],{"class":932},[915,6325,1473],{"class":928},[915,6327,6328,6330,6333,6335],{"class":917,"line":2125},[915,6329,2084],{"class":1464},[915,6331,6332],{"class":928},".username ",[915,6334,933],{"class":932},[915,6336,6337],{"class":928}," username;\n",[915,6339,6340,6342,6345,6347],{"class":917,"line":2130},[915,6341,2084],{"class":1464},[915,6343,6344],{"class":928},".password ",[915,6346,933],{"class":932},[915,6348,6349],{"class":928}," password;\n",[915,6351,6352,6354,6356,6358],{"class":917,"line":2135},[915,6353,2084],{"class":1464},[915,6355,1492],{"class":928},[915,6357,933],{"class":932},[915,6359,1497],{"class":928},[915,6361,6362],{"class":917,"line":2153},[915,6363,2053],{"class":928},[915,6365,6366],{"class":917,"line":2165},[915,6367,2003],{"emptyLinePlaceholder":2002},[915,6369,6370,6372,6374,6377],{"class":917,"line":2170},[915,6371,2031],{"class":932},[915,6373,2034],{"class":928},[915,6375,6376],{"class":939},"getId",[915,6378,2040],{"class":928},[915,6380,6381,6383],{"class":917,"line":2175},[915,6382,2045],{"class":932},[915,6384,1473],{"class":928},[915,6386,6387],{"class":917,"line":2184},[915,6388,2053],{"class":928},[915,6390,6391],{"class":917,"line":2196},[915,6392,2003],{"emptyLinePlaceholder":2002},[915,6394,6395,6397,6399,6402,6404,6406],{"class":917,"line":2207},[915,6396,2031],{"class":932},[915,6398,1349],{"class":932},[915,6400,6401],{"class":939}," setId",[915,6403,2071],{"class":928},[915,6405,6297],{"class":2074},[915,6407,2078],{"class":928},[915,6409,6410,6412,6414,6416,6419],{"class":917,"line":2221},[915,6411,6269],{"class":928},[915,6413,1017],{"class":939},[915,6415,943],{"class":928},[915,6417,6418],{"class":946},"\"生命周期：2、依赖注入\"",[915,6420,950],{"class":928},[915,6422,6423,6425,6427,6429],{"class":917,"line":2246},[915,6424,2084],{"class":1464},[915,6426,1468],{"class":928},[915,6428,933],{"class":932},[915,6430,1473],{"class":928},[915,6432,6433],{"class":917,"line":2255},[915,6434,2053],{"class":928},[915,6436,6437],{"class":917,"line":2260},[915,6438,2003],{"emptyLinePlaceholder":2002},[915,6440,6441,6443,6445,6448],{"class":917,"line":2265},[915,6442,2031],{"class":932},[915,6444,2109],{"class":928},[915,6446,6447],{"class":939},"getUsername",[915,6449,2040],{"class":928},[915,6451,6452,6454],{"class":917,"line":2274},[915,6453,2045],{"class":932},[915,6455,6337],{"class":928},[915,6457,6458],{"class":917,"line":2279},[915,6459,2053],{"class":928},[915,6461,6462],{"class":917,"line":2284},[915,6463,2003],{"emptyLinePlaceholder":2002},[915,6465,6466,6468,6470,6473,6475,6477],{"class":917,"line":2302},[915,6467,2031],{"class":932},[915,6469,1349],{"class":932},[915,6471,6472],{"class":939}," setUsername",[915,6474,2145],{"class":928},[915,6476,6302],{"class":2074},[915,6478,2078],{"class":928},[915,6480,6481,6483,6485,6487],{"class":917,"line":2313},[915,6482,2084],{"class":1464},[915,6484,6332],{"class":928},[915,6486,933],{"class":932},[915,6488,6337],{"class":928},[915,6490,6491],{"class":917,"line":2324},[915,6492,2053],{"class":928},[915,6494,6495],{"class":917,"line":2329},[915,6496,2003],{"emptyLinePlaceholder":2002},[915,6498,6499,6501,6503,6506],{"class":917,"line":3972},[915,6500,2031],{"class":932},[915,6502,2109],{"class":928},[915,6504,6505],{"class":939},"getPassword",[915,6507,2040],{"class":928},[915,6509,6510,6512],{"class":917,"line":4592},[915,6511,2045],{"class":932},[915,6513,6349],{"class":928},[915,6515,6516],{"class":917,"line":5111},[915,6517,2053],{"class":928},[915,6519,6520],{"class":917,"line":5132},[915,6521,2003],{"emptyLinePlaceholder":2002},[915,6523,6525,6527,6529,6532,6534,6536],{"class":917,"line":6524},43,[915,6526,2031],{"class":932},[915,6528,1349],{"class":932},[915,6530,6531],{"class":939}," setPassword",[915,6533,2145],{"class":928},[915,6535,6307],{"class":2074},[915,6537,2078],{"class":928},[915,6539,6541,6543,6545,6547],{"class":917,"line":6540},44,[915,6542,2084],{"class":1464},[915,6544,6344],{"class":928},[915,6546,933],{"class":932},[915,6548,6349],{"class":928},[915,6550,6552],{"class":917,"line":6551},45,[915,6553,2053],{"class":928},[915,6555,6557],{"class":917,"line":6556},46,[915,6558,2003],{"emptyLinePlaceholder":2002},[915,6560,6562,6564,6566,6569],{"class":917,"line":6561},47,[915,6563,2031],{"class":932},[915,6565,2034],{"class":928},[915,6567,6568],{"class":939},"getAge",[915,6570,2040],{"class":928},[915,6572,6574,6576],{"class":917,"line":6573},48,[915,6575,2045],{"class":932},[915,6577,1497],{"class":928},[915,6579,6581],{"class":917,"line":6580},49,[915,6582,2053],{"class":928},[915,6584,6586],{"class":917,"line":6585},50,[915,6587,2003],{"emptyLinePlaceholder":2002},[915,6589,6591,6593,6595,6598,6600,6602],{"class":917,"line":6590},51,[915,6592,2031],{"class":932},[915,6594,1349],{"class":932},[915,6596,6597],{"class":939}," setAge",[915,6599,2071],{"class":928},[915,6601,6313],{"class":2074},[915,6603,2078],{"class":928},[915,6605,6607,6609,6611,6613],{"class":917,"line":6606},52,[915,6608,2084],{"class":1464},[915,6610,1492],{"class":928},[915,6612,933],{"class":932},[915,6614,1497],{"class":928},[915,6616,6618],{"class":917,"line":6617},53,[915,6619,2053],{"class":928},[915,6621,6623],{"class":917,"line":6622},54,[915,6624,2003],{"emptyLinePlaceholder":2002},[915,6626,6628,6630,6632,6635],{"class":917,"line":6627},55,[915,6629,2031],{"class":932},[915,6631,1349],{"class":932},[915,6633,6634],{"class":939}," initMethod",[915,6636,1355],{"class":928},[915,6638,6640,6642,6644,6646,6649],{"class":917,"line":6639},56,[915,6641,6269],{"class":928},[915,6643,1017],{"class":939},[915,6645,943],{"class":928},[915,6647,6648],{"class":946},"\"生命周期：3、初始化\"",[915,6650,950],{"class":928},[915,6652,6654],{"class":917,"line":6653},57,[915,6655,2053],{"class":928},[915,6657,6659],{"class":917,"line":6658},58,[915,6660,2003],{"emptyLinePlaceholder":2002},[915,6662,6664,6666,6668,6671],{"class":917,"line":6663},59,[915,6665,2031],{"class":932},[915,6667,1349],{"class":932},[915,6669,6670],{"class":939}," destroyMethod",[915,6672,1355],{"class":928},[915,6674,6676,6678,6680,6682,6685],{"class":917,"line":6675},60,[915,6677,6269],{"class":928},[915,6679,1017],{"class":939},[915,6681,943],{"class":928},[915,6683,6684],{"class":946},"\"生命周期：5、销毁\"",[915,6686,950],{"class":928},[915,6688,6690],{"class":917,"line":6689},61,[915,6691,2053],{"class":928},[915,6693,6695],{"class":917,"line":6694},62,[915,6696,2003],{"emptyLinePlaceholder":2002},[915,6698,6700,6702],{"class":917,"line":6699},63,[915,6701,2178],{"class":928},[915,6703,2181],{"class":932},[915,6705,6707,6709,6711,6713],{"class":917,"line":6706},64,[915,6708,2031],{"class":932},[915,6710,2109],{"class":928},[915,6712,2191],{"class":939},[915,6714,2040],{"class":928},[915,6716,6718,6720,6723],{"class":917,"line":6717},65,[915,6719,2045],{"class":932},[915,6721,6722],{"class":946}," \"User{\"",[915,6724,2204],{"class":932},[915,6726,6728,6731,6733,6736],{"class":917,"line":6727},66,[915,6729,6730],{"class":946},"                \"id=\"",[915,6732,1025],{"class":932},[915,6734,6735],{"class":928}," id ",[915,6737,2218],{"class":932},[915,6739,6741,6744,6746,6749,6751,6753,6755,6757],{"class":917,"line":6740},67,[915,6742,6743],{"class":946},"                \", username='\"",[915,6745,1025],{"class":932},[915,6747,6748],{"class":928}," username ",[915,6750,2232],{"class":932},[915,6752,2235],{"class":946},[915,6754,2238],{"class":1464},[915,6756,2241],{"class":946},[915,6758,2204],{"class":932},[915,6760,6762,6765,6767,6770,6772,6774,6776,6778],{"class":917,"line":6761},68,[915,6763,6764],{"class":946},"                \", password='\"",[915,6766,1025],{"class":932},[915,6768,6769],{"class":928}," password ",[915,6771,2232],{"class":932},[915,6773,2235],{"class":946},[915,6775,2238],{"class":1464},[915,6777,2241],{"class":946},[915,6779,2204],{"class":932},[915,6781,6783,6786,6788,6791],{"class":917,"line":6782},69,[915,6784,6785],{"class":946},"                \", age=\"",[915,6787,1025],{"class":932},[915,6789,6790],{"class":928}," age ",[915,6792,2218],{"class":932},[915,6794,6796,6798],{"class":917,"line":6795},70,[915,6797,2249],{"class":946},[915,6799,2252],{"class":928},[915,6801,6803],{"class":917,"line":6802},71,[915,6804,2053],{"class":928},[915,6806,6808],{"class":917,"line":6807},72,[915,6809,2003],{"emptyLinePlaceholder":2002},[915,6811,6813,6815,6817,6820],{"class":917,"line":6812},73,[915,6814,2031],{"class":932},[915,6816,1349],{"class":932},[915,6818,6819],{"class":939}," run",[915,6821,1355],{"class":928},[915,6823,6825,6827,6829,6831,6834],{"class":917,"line":6824},74,[915,6826,6269],{"class":928},[915,6828,1017],{"class":939},[915,6830,943],{"class":928},[915,6832,6833],{"class":946},"\"run ......\"",[915,6835,950],{"class":928},[915,6837,6839],{"class":917,"line":6838},75,[915,6840,2053],{"class":928},[915,6842,6844],{"class":917,"line":6843},76,[915,6845,1427],{"class":928},[896,6847,2334],{},[896,6849,6850],{},"> 注意其中的initMethod()和destroyMethod()，可以通过配置bean指定为初始化和销毁的方法",[955,6852,6853],{"start":993},[958,6854,4079],{},[906,6856,6858],{"className":1156,"code":6857,"language":1158,"meta":11,"style":11},"\u003C!-- 使用init-method属性指定初始化方法 -->\n\u003C!-- 使用destroy-method属性指定销毁方法 -->\n\u003Cbean class=\"com.codermast.spring6.iocxml.bean.User\" scope=\"prototype\" init-method=\"initMethod\" destroy-method=\"destroyMethod\">\n    \u003Cproperty name=\"id\" value=\"1001\"\u002F>\n    \u003Cproperty name=\"username\" value=\"admin\"\u002F>\n    \u003Cproperty name=\"password\" value=\"123456\"\u002F>\n    \u003Cproperty name=\"age\" value=\"23\"\u002F>\n\u003C\u002Fbean>\n",[912,6859,6860,6865,6870,6909,6930,6951,6972,6993],{"__ignoreMap":11},[915,6861,6862],{"class":917,"line":918},[915,6863,6864],{"class":921},"\u003C!-- 使用init-method属性指定初始化方法 -->\n",[915,6866,6867],{"class":917,"line":925},[915,6868,6869],{"class":921},"\u003C!-- 使用destroy-method属性指定销毁方法 -->\n",[915,6871,6872,6874,6876,6878,6880,6883,6886,6888,6891,6894,6896,6899,6902,6904,6907],{"class":917,"line":993},[915,6873,1170],{"class":928},[915,6875,1174],{"class":1173},[915,6877,1184],{"class":939},[915,6879,933],{"class":928},[915,6881,6882],{"class":946},"\"com.codermast.spring6.iocxml.bean.User\"",[915,6884,6885],{"class":939}," scope",[915,6887,933],{"class":928},[915,6889,6890],{"class":946},"\"prototype\"",[915,6892,6893],{"class":939}," init-method",[915,6895,933],{"class":928},[915,6897,6898],{"class":946},"\"initMethod\"",[915,6900,6901],{"class":939}," destroy-method",[915,6903,933],{"class":928},[915,6905,6906],{"class":946},"\"destroyMethod\"",[915,6908,1551],{"class":928},[915,6910,6911,6913,6915,6917,6919,6921,6923,6925,6928],{"class":917,"line":999},[915,6912,1556],{"class":928},[915,6914,1757],{"class":1173},[915,6916,1760],{"class":939},[915,6918,933],{"class":928},[915,6920,2549],{"class":946},[915,6922,1562],{"class":939},[915,6924,933],{"class":928},[915,6926,6927],{"class":946},"\"1001\"",[915,6929,1192],{"class":928},[915,6931,6932,6934,6936,6938,6940,6942,6944,6946,6949],{"class":917,"line":1011},[915,6933,1556],{"class":928},[915,6935,1757],{"class":1173},[915,6937,1760],{"class":939},[915,6939,933],{"class":928},[915,6941,5819],{"class":946},[915,6943,1562],{"class":939},[915,6945,933],{"class":928},[915,6947,6948],{"class":946},"\"admin\"",[915,6950,1192],{"class":928},[915,6952,6953,6955,6957,6959,6961,6963,6965,6967,6970],{"class":917,"line":1386},[915,6954,1556],{"class":928},[915,6956,1757],{"class":1173},[915,6958,1760],{"class":939},[915,6960,933],{"class":928},[915,6962,5841],{"class":946},[915,6964,1562],{"class":939},[915,6966,933],{"class":928},[915,6968,6969],{"class":946},"\"123456\"",[915,6971,1192],{"class":928},[915,6973,6974,6976,6978,6980,6982,6984,6986,6988,6991],{"class":917,"line":1407},[915,6975,1556],{"class":928},[915,6977,1757],{"class":1173},[915,6979,1760],{"class":939},[915,6981,933],{"class":928},[915,6983,2592],{"class":946},[915,6985,1562],{"class":939},[915,6987,933],{"class":928},[915,6989,6990],{"class":946},"\"23\"",[915,6992,1192],{"class":928},[915,6994,6995,6997,6999],{"class":917,"line":1413},[915,6996,1619],{"class":928},[915,6998,1174],{"class":1173},[915,7000,1551],{"class":928},[955,7002,7003],{"start":999},[958,7004,1328],{},[906,7006,7008],{"className":908,"code":7007,"language":910,"meta":11,"style":11},"@Test\npublic void testLife(){\n    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(\"spring-lifecycle.xml\");\n    User bean = ac.getBean(User.class);\n    System.out.println(\"生命周期：4、通过IOC容器获取bean并使用\");\n    ac.close();\n}\n",[912,7009,7010,7016,7027,7045,7058,7071,7081],{"__ignoreMap":11},[915,7011,7012,7014],{"class":917,"line":918},[915,7013,1338],{"class":928},[915,7015,1341],{"class":932},[915,7017,7018,7020,7022,7025],{"class":917,"line":925},[915,7019,1346],{"class":932},[915,7021,1349],{"class":932},[915,7023,7024],{"class":939}," testLife",[915,7026,1355],{"class":928},[915,7028,7029,7032,7034,7036,7038,7040,7043],{"class":917,"line":993},[915,7030,7031],{"class":928},"    ClassPathXmlApplicationContext ac ",[915,7033,933],{"class":932},[915,7035,936],{"class":932},[915,7037,940],{"class":939},[915,7039,943],{"class":928},[915,7041,7042],{"class":946},"\"spring-lifecycle.xml\"",[915,7044,950],{"class":928},[915,7046,7047,7050,7052,7054,7056],{"class":917,"line":999},[915,7048,7049],{"class":928},"    User bean ",[915,7051,933],{"class":932},[915,7053,1394],{"class":928},[915,7055,983],{"class":939},[915,7057,1058],{"class":928},[915,7059,7060,7062,7064,7066,7069],{"class":917,"line":1011},[915,7061,1416],{"class":928},[915,7063,1017],{"class":939},[915,7065,943],{"class":928},[915,7067,7068],{"class":946},"\"生命周期：4、通过IOC容器获取bean并使用\"",[915,7070,950],{"class":928},[915,7072,7073,7076,7079],{"class":917,"line":1386},[915,7074,7075],{"class":928},"    ac.",[915,7077,7078],{"class":939},"close",[915,7080,1008],{"class":928},[915,7082,7083],{"class":917,"line":1407},[915,7084,1427],{"class":928},[896,7086,7087],{},[1145,7088],{"alt":7089,"src":7090},"单例模式-测试结果","\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-19-47-00.png",[896,7092,7093],{},[1145,7094],{"alt":7095,"src":7096},"多例模式-测试结果","\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-19-33-28.png",[896,7098,7099],{},"只有在单例模式下，执行 close 方法才会调用 destroyMethod 销毁方法。",[955,7101,7102],{"start":1011},[958,7103,7104],{},"bean的后置处理器",[896,7106,7107],{},"bean的后置处理器会在生命周期的初始化前后添加额外的操作，需要实现BeanPostProcessor接口，且配置到IOC容器中，需要注意的是，bean后置处理器不是单独针对某一个bean生效，而是针对IOC容器中所有bean都会执行",[896,7109,7110],{},"创建bean的后置处理器：",[906,7112,7114],{"className":908,"code":7113,"language":910,"meta":11,"style":11},"public class MyBeanProcessor implements BeanPostProcessor {\n    \u002F\u002F 初始化之前调用\n    @Override\n    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {\n        System.out.println(\"☆☆☆\" + beanName + \" = \" + bean);\n        return bean;\n    }\n\n    \u002F\u002F 初始化之后调用\n    @Override\n    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {\n        System.out.println(\"★★★\" + beanName + \" = \" + bean);\n        return bean;\n    }\n}\n",[912,7115,7116,7133,7138,7144,7173,7199,7206,7210,7214,7219,7225,7248,7271,7277,7281],{"__ignoreMap":11},[915,7117,7118,7120,7122,7125,7128,7131],{"class":917,"line":918},[915,7119,1346],{"class":932},[915,7121,1184],{"class":932},[915,7123,7124],{"class":939}," MyBeanProcessor",[915,7126,7127],{"class":932}," implements",[915,7129,7130],{"class":939}," BeanPostProcessor",[915,7132,1997],{"class":928},[915,7134,7135],{"class":917,"line":925},[915,7136,7137],{"class":921},"    \u002F\u002F 初始化之前调用\n",[915,7139,7140,7142],{"class":917,"line":993},[915,7141,2178],{"class":928},[915,7143,2181],{"class":932},[915,7145,7146,7148,7151,7154,7157,7159,7161,7164,7167,7170],{"class":917,"line":999},[915,7147,2031],{"class":932},[915,7149,7150],{"class":928}," Object ",[915,7152,7153],{"class":939},"postProcessBeforeInitialization",[915,7155,7156],{"class":928},"(Object ",[915,7158,1174],{"class":2074},[915,7160,2295],{"class":928},[915,7162,7163],{"class":2074},"beanName",[915,7165,7166],{"class":928},") ",[915,7168,7169],{"class":932},"throws",[915,7171,7172],{"class":928}," BeansException {\n",[915,7174,7175,7177,7179,7181,7184,7186,7189,7191,7194,7196],{"class":917,"line":1011},[915,7176,6269],{"class":928},[915,7178,1017],{"class":939},[915,7180,943],{"class":928},[915,7182,7183],{"class":946},"\"☆☆☆\"",[915,7185,1025],{"class":932},[915,7187,7188],{"class":928}," beanName ",[915,7190,2232],{"class":932},[915,7192,7193],{"class":946}," \" = \"",[915,7195,1025],{"class":932},[915,7197,7198],{"class":928}," bean);\n",[915,7200,7201,7203],{"class":917,"line":1386},[915,7202,2045],{"class":932},[915,7204,7205],{"class":928}," bean;\n",[915,7207,7208],{"class":917,"line":1407},[915,7209,2053],{"class":928},[915,7211,7212],{"class":917,"line":1413},[915,7213,2003],{"emptyLinePlaceholder":2002},[915,7215,7216],{"class":917,"line":1424},[915,7217,7218],{"class":921},"    \u002F\u002F 初始化之后调用\n",[915,7220,7221,7223],{"class":917,"line":2056},[915,7222,2178],{"class":928},[915,7224,2181],{"class":932},[915,7226,7227,7229,7231,7234,7236,7238,7240,7242,7244,7246],{"class":917,"line":2061},[915,7228,2031],{"class":932},[915,7230,7150],{"class":928},[915,7232,7233],{"class":939},"postProcessAfterInitialization",[915,7235,7156],{"class":928},[915,7237,1174],{"class":2074},[915,7239,2295],{"class":928},[915,7241,7163],{"class":2074},[915,7243,7166],{"class":928},[915,7245,7169],{"class":932},[915,7247,7172],{"class":928},[915,7249,7250,7252,7254,7256,7259,7261,7263,7265,7267,7269],{"class":917,"line":2081},[915,7251,6269],{"class":928},[915,7253,1017],{"class":939},[915,7255,943],{"class":928},[915,7257,7258],{"class":946},"\"★★★\"",[915,7260,1025],{"class":932},[915,7262,7188],{"class":928},[915,7264,2232],{"class":932},[915,7266,7193],{"class":946},[915,7268,1025],{"class":932},[915,7270,7198],{"class":928},[915,7272,7273,7275],{"class":917,"line":2094},[915,7274,2045],{"class":932},[915,7276,7205],{"class":928},[915,7278,7279],{"class":917,"line":2099},[915,7280,2053],{"class":928},[915,7282,7283],{"class":917,"line":2104},[915,7284,1427],{"class":928},[896,7286,7287],{},"在IOC容器中配置后置处理器：",[906,7289,7291],{"className":1156,"code":7290,"language":1158,"meta":11,"style":11},"\u003C!-- bean的后置处理器要放入IOC容器才能生效 -->\n\u003Cbean id=\"myBeanProcessor\" class=\"com.atguigu.spring6.process.MyBeanProcessor\"\u002F>\n",[912,7292,7293,7298],{"__ignoreMap":11},[915,7294,7295],{"class":917,"line":918},[915,7296,7297],{"class":921},"\u003C!-- bean的后置处理器要放入IOC容器才能生效 -->\n",[915,7299,7300,7302,7304,7306,7308,7311,7313,7315,7318],{"class":917,"line":925},[915,7301,1170],{"class":928},[915,7303,1174],{"class":1173},[915,7305,1177],{"class":939},[915,7307,933],{"class":928},[915,7309,7310],{"class":946},"\"myBeanProcessor\"",[915,7312,1184],{"class":939},[915,7314,933],{"class":928},[915,7316,7317],{"class":946},"\"com.atguigu.spring6.process.MyBeanProcessor\"",[915,7319,1192],{"class":928},[896,7321,7322],{},[1145,7323],{"alt":7324,"src":7325},"加入后置处理器的执行结果","\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-19-50-00.png",[892,7327,7329],{"id":7328},"factorybean","FactoryBean",[955,7331,7332],{},[958,7333,7334],{},"简介",[896,7336,7337],{},"FactoryBean是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同，配置一个FactoryBean类型的bean，在获取bean的时候得到的并不是class属性中配置的这个类的对象，而是getObject()方法的返回值。通过这种机制，Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来，只把最简洁的使用界面展示给我们。",[896,7339,7340],{},"将来我们整合Mybatis时，Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。",[896,7342,7343],{},":::: details FactoryBean接口源码",[906,7345,7347],{"className":908,"code":7346,"language":910,"meta":11,"style":11},"\u002F*\n * Copyright 2002-2020 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\u002F\npackage org.springframework.beans.factory;\n\nimport org.springframework.lang.Nullable;\n\n\u002F**\n * Interface to be implemented by objects used within a {@link BeanFactory} which\n * are themselves factories for individual objects. If a bean implements this\n * interface, it is used as a factory for an object to expose, not directly as a\n * bean instance that will be exposed itself.\n *\n * \u003Cp>\u003Cb>NB: A bean that implements this interface cannot be used as a normal bean.\u003C\u002Fb>\n * A FactoryBean is defined in a bean style, but the object exposed for bean\n * references ({@link #getObject()}) is always the object that it creates.\n *\n * \u003Cp>FactoryBeans can support singletons and prototypes, and can either create\n * objects lazily on demand or eagerly on startup. The {@link SmartFactoryBean}\n * interface allows for exposing more fine-grained behavioral metadata.\n *\n * \u003Cp>This interface is heavily used within the framework itself, for example for\n * the AOP {@link org.springframework.aop.framework.ProxyFactoryBean} or the\n * {@link org.springframework.jndi.JndiObjectFactoryBean}. It can be used for\n * custom components as well; however, this is only common for infrastructure code.\n *\n * \u003Cp>\u003Cb>{@code FactoryBean} is a programmatic contract. Implementations are not\n * supposed to rely on annotation-driven injection or other reflective facilities.\u003C\u002Fb>\n * {@link #getObjectType()} {@link #getObject()} invocations may arrive early in the\n * bootstrap process, even ahead of any post-processor setup. If you need access to\n * other beans, implement {@link BeanFactoryAware} and obtain them programmatically.\n *\n * \u003Cp>\u003Cb>The container is only responsible for managing the lifecycle of the FactoryBean\n * instance, not the lifecycle of the objects created by the FactoryBean.\u003C\u002Fb> Therefore,\n * a destroy method on an exposed bean object (such as {@link java.io.Closeable#close()}\n * will \u003Ci>not\u003C\u002Fi> be called automatically. Instead, a FactoryBean should implement\n * {@link DisposableBean} and delegate any such close call to the underlying object.\n *\n * \u003Cp>Finally, FactoryBean objects participate in the containing BeanFactory's\n * synchronization of bean creation. There is usually no need for internal\n * synchronization other than for purposes of lazy initialization within the\n * FactoryBean itself (or the like).\n *\n * @author Rod Johnson\n * @author Juergen Hoeller\n * @since 08.03.2003\n * @param \u003CT> the bean type\n * @see org.springframework.beans.factory.BeanFactory\n * @see org.springframework.aop.framework.ProxyFactoryBean\n * @see org.springframework.jndi.JndiObjectFactoryBean\n *\u002F\npublic interface FactoryBean\u003CT> {\n\n    \u002F**\n     * The name of an attribute that can be\n     * {@link org.springframework.core.AttributeAccessor#setAttribute set} on a\n     * {@link org.springframework.beans.factory.config.BeanDefinition} so that\n     * factory beans can signal their object type when it can't be deduced from\n     * the factory bean class.\n     * @since 5.2\n     *\u002F\n    String OBJECT_TYPE_ATTRIBUTE = \"factoryBeanObjectType\";\n\n    \u002F**\n     * Return an instance (possibly shared or independent) of the object\n     * managed by this factory.\n     * \u003Cp>As with a {@link BeanFactory}, this allows support for both the\n     * Singleton and Prototype design pattern.\n     * \u003Cp>If this FactoryBean is not fully initialized yet at the time of\n     * the call (for example because it is involved in a circular reference),\n     * throw a corresponding {@link FactoryBeanNotInitializedException}.\n     * \u003Cp>As of Spring 2.0, FactoryBeans are allowed to return {@code null}\n     * objects. The factory will consider this as normal value to be used; it\n     * will not throw a FactoryBeanNotInitializedException in this case anymore.\n     * FactoryBean implementations are encouraged to throw\n     * FactoryBeanNotInitializedException themselves now, as appropriate.\n     * @return an instance of the bean (can be {@code null})\n     * @throws Exception in case of creation errors\n     * @see FactoryBeanNotInitializedException\n     *\u002F\n    @Nullable\n    T getObject() throws Exception;\n\n    \u002F**\n     * Return the type of object that this FactoryBean creates,\n     * or {@code null} if not known in advance.\n     * \u003Cp>This allows one to check for specific types of beans without\n     * instantiating objects, for example on autowiring.\n     * \u003Cp>In the case of implementations that are creating a singleton object,\n     * this method should try to avoid singleton creation as far as possible;\n     * it should rather estimate the type in advance.\n     * For prototypes, returning a meaningful type here is advisable too.\n     * \u003Cp>This method can be called \u003Ci>before\u003C\u002Fi> this FactoryBean has\n     * been fully initialized. It must not rely on state created during\n     * initialization; of course, it can still use such state if available.\n     * \u003Cp>\u003Cb>NOTE:\u003C\u002Fb> Autowiring will simply ignore FactoryBeans that return\n     * {@code null} here. Therefore it is highly recommended to implement\n     * this method properly, using the current state of the FactoryBean.\n     * @return the type of object that this FactoryBean creates,\n     * or {@code null} if not known at the time of the call\n     * @see ListableBeanFactory#getBeansOfType\n     *\u002F\n    @Nullable\n    Class\u003C?> getObjectType();\n\n    \u002F**\n     * Is the object managed by this factory a singleton? That is,\n     * will {@link #getObject()} always return the same object\n     * (a reference that can be cached)?\n     * \u003Cp>\u003Cb>NOTE:\u003C\u002Fb> If a FactoryBean indicates to hold a singleton object,\n     * the object returned from {@code getObject()} might get cached\n     * by the owning BeanFactory. Hence, do not return {@code true}\n     * unless the FactoryBean always exposes the same reference.\n     * \u003Cp>The singleton status of the FactoryBean itself will generally\n     * be provided by the owning BeanFactory; usually, it has to be\n     * defined as singleton there.\n     * \u003Cp>\u003Cb>NOTE:\u003C\u002Fb> This method returning {@code false} does not\n     * necessarily indicate that returned objects are independent instances.\n     * An implementation of the extended {@link SmartFactoryBean} interface\n     * may explicitly indicate independent instances through its\n     * {@link SmartFactoryBean#isPrototype()} method. Plain {@link FactoryBean}\n     * implementations which do not implement this extended interface are\n     * simply assumed to always return independent instances if the\n     * {@code isSingleton()} implementation returns {@code false}.\n     * \u003Cp>The default implementation returns {@code true}, since a\n     * {@code FactoryBean} typically manages a singleton instance.\n     * @return whether the exposed object is a singleton\n     * @see #getObject()\n     * @see SmartFactoryBean#isPrototype()\n     *\u002F\n    default boolean isSingleton() {\n        return true;\n    }\n}\n",[912,7348,7349,7354,7359,7364,7369,7374,7379,7383,7388,7392,7397,7402,7407,7412,7417,7422,7430,7434,7442,7446,7451,7456,7461,7466,7471,7475,7480,7485,7502,7506,7511,7516,7521,7525,7530,7535,7540,7545,7549,7554,7559,7583,7588,7593,7597,7602,7607,7625,7630,7635,7639,7644,7649,7654,7659,7663,7674,7683,7693,7706,7716,7725,7734,7738,7756,7760,7765,7770,7775,7780,7785,7790,7800,7805,7817,7821,7825,7831,7837,7843,7849,7855,7861,7867,7873,7879,7885,7891,7897,7908,7922,7932,7937,7945,7962,7967,7972,7978,7984,7990,7996,8002,8008,8014,8020,8026,8032,8038,8044,8050,8056,8066,8072,8082,8087,8094,8111,8116,8121,8127,8142,8148,8154,8160,8166,8172,8178,8184,8190,8196,8202,8208,8214,8233,8239,8245,8251,8257,8263,8273,8283,8293,8298,8312,8322,8327],{"__ignoreMap":11},[915,7350,7351],{"class":917,"line":918},[915,7352,7353],{"class":921},"\u002F*\n",[915,7355,7356],{"class":917,"line":925},[915,7357,7358],{"class":921}," * Copyright 2002-2020 the original author or authors.\n",[915,7360,7361],{"class":917,"line":993},[915,7362,7363],{"class":921}," *\n",[915,7365,7366],{"class":917,"line":999},[915,7367,7368],{"class":921}," * Licensed under the Apache License, Version 2.0 (the \"License\");\n",[915,7370,7371],{"class":917,"line":1011},[915,7372,7373],{"class":921}," * you may not use this file except in compliance with the License.\n",[915,7375,7376],{"class":917,"line":1386},[915,7377,7378],{"class":921}," * You may obtain a copy of the License at\n",[915,7380,7381],{"class":917,"line":1407},[915,7382,7363],{"class":921},[915,7384,7385],{"class":917,"line":1413},[915,7386,7387],{"class":921}," *      https:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n",[915,7389,7390],{"class":917,"line":1424},[915,7391,7363],{"class":921},[915,7393,7394],{"class":917,"line":2056},[915,7395,7396],{"class":921}," * Unless required by applicable law or agreed to in writing, software\n",[915,7398,7399],{"class":917,"line":2061},[915,7400,7401],{"class":921}," * distributed under the License is distributed on an \"AS IS\" BASIS,\n",[915,7403,7404],{"class":917,"line":2081},[915,7405,7406],{"class":921}," * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",[915,7408,7409],{"class":917,"line":2094},[915,7410,7411],{"class":921}," * See the License for the specific language governing permissions and\n",[915,7413,7414],{"class":917,"line":2099},[915,7415,7416],{"class":921}," * limitations under the License.\n",[915,7418,7419],{"class":917,"line":2104},[915,7420,7421],{"class":921}," *\u002F\n",[915,7423,7424,7427],{"class":917,"line":2117},[915,7425,7426],{"class":932},"package",[915,7428,7429],{"class":928}," org.springframework.beans.factory;\n",[915,7431,7432],{"class":917,"line":2125},[915,7433,2003],{"emptyLinePlaceholder":2002},[915,7435,7436,7439],{"class":917,"line":2130},[915,7437,7438],{"class":932},"import",[915,7440,7441],{"class":928}," org.springframework.lang.Nullable;\n",[915,7443,7444],{"class":917,"line":2135},[915,7445,2003],{"emptyLinePlaceholder":2002},[915,7447,7448],{"class":917,"line":2153},[915,7449,7450],{"class":921},"\u002F**\n",[915,7452,7453],{"class":917,"line":2165},[915,7454,7455],{"class":921}," * Interface to be implemented by objects used within a {@link BeanFactory} which\n",[915,7457,7458],{"class":917,"line":2170},[915,7459,7460],{"class":921}," * are themselves factories for individual objects. If a bean implements this\n",[915,7462,7463],{"class":917,"line":2175},[915,7464,7465],{"class":921}," * interface, it is used as a factory for an object to expose, not directly as a\n",[915,7467,7468],{"class":917,"line":2184},[915,7469,7470],{"class":921}," * bean instance that will be exposed itself.\n",[915,7472,7473],{"class":917,"line":2196},[915,7474,7363],{"class":921},[915,7476,7477],{"class":917,"line":2207},[915,7478,7479],{"class":921}," * \u003Cp>\u003Cb>NB: A bean that implements this interface cannot be used as a normal bean.\u003C\u002Fb>\n",[915,7481,7482],{"class":917,"line":2221},[915,7483,7484],{"class":921}," * A FactoryBean is defined in a bean style, but the object exposed for bean\n",[915,7486,7487,7490,7493,7496,7499],{"class":917,"line":2246},[915,7488,7489],{"class":921}," * references ({",[915,7491,7492],{"class":932},"@link",[915,7494,7495],{"class":921}," #",[915,7497,7498],{"class":2074},"getObject()",[915,7500,7501],{"class":921},"}) is always the object that it creates.\n",[915,7503,7504],{"class":917,"line":2255},[915,7505,7363],{"class":921},[915,7507,7508],{"class":917,"line":2260},[915,7509,7510],{"class":921}," * \u003Cp>FactoryBeans can support singletons and prototypes, and can either create\n",[915,7512,7513],{"class":917,"line":2265},[915,7514,7515],{"class":921}," * objects lazily on demand or eagerly on startup. The {@link SmartFactoryBean}\n",[915,7517,7518],{"class":917,"line":2274},[915,7519,7520],{"class":921}," * interface allows for exposing more fine-grained behavioral metadata.\n",[915,7522,7523],{"class":917,"line":2279},[915,7524,7363],{"class":921},[915,7526,7527],{"class":917,"line":2284},[915,7528,7529],{"class":921}," * \u003Cp>This interface is heavily used within the framework itself, for example for\n",[915,7531,7532],{"class":917,"line":2302},[915,7533,7534],{"class":921}," * the AOP {@link org.springframework.aop.framework.ProxyFactoryBean} or the\n",[915,7536,7537],{"class":917,"line":2313},[915,7538,7539],{"class":921}," * {@link org.springframework.jndi.JndiObjectFactoryBean}. It can be used for\n",[915,7541,7542],{"class":917,"line":2324},[915,7543,7544],{"class":921}," * custom components as well; however, this is only common for infrastructure code.\n",[915,7546,7547],{"class":917,"line":2329},[915,7548,7363],{"class":921},[915,7550,7551],{"class":917,"line":3972},[915,7552,7553],{"class":921}," * \u003Cp>\u003Cb>{@code FactoryBean} is a programmatic contract. Implementations are not\n",[915,7555,7556],{"class":917,"line":4592},[915,7557,7558],{"class":921}," * supposed to rely on annotation-driven injection or other reflective facilities.\u003C\u002Fb>\n",[915,7560,7561,7564,7566,7568,7571,7574,7576,7578,7580],{"class":917,"line":5111},[915,7562,7563],{"class":921}," * {",[915,7565,7492],{"class":932},[915,7567,7495],{"class":921},[915,7569,7570],{"class":2074},"getObjectType()",[915,7572,7573],{"class":921},"} {",[915,7575,7492],{"class":932},[915,7577,7495],{"class":921},[915,7579,7498],{"class":2074},[915,7581,7582],{"class":921},"} invocations may arrive early in the\n",[915,7584,7585],{"class":917,"line":5132},[915,7586,7587],{"class":921}," * bootstrap process, even ahead of any post-processor setup. If you need access to\n",[915,7589,7590],{"class":917,"line":6524},[915,7591,7592],{"class":921}," * other beans, implement {@link BeanFactoryAware} and obtain them programmatically.\n",[915,7594,7595],{"class":917,"line":6540},[915,7596,7363],{"class":921},[915,7598,7599],{"class":917,"line":6551},[915,7600,7601],{"class":921}," * \u003Cp>\u003Cb>The container is only responsible for managing the lifecycle of the FactoryBean\n",[915,7603,7604],{"class":917,"line":6556},[915,7605,7606],{"class":921}," * instance, not the lifecycle of the objects created by the FactoryBean.\u003C\u002Fb> Therefore,\n",[915,7608,7609,7612,7614,7617,7620,7623],{"class":917,"line":6561},[915,7610,7611],{"class":921}," * a destroy method on an exposed bean object (such as {",[915,7613,7492],{"class":932},[915,7615,7616],{"class":939}," java.io.Closeable",[915,7618,7619],{"class":921},"#",[915,7621,7622],{"class":2074},"close()",[915,7624,1427],{"class":921},[915,7626,7627],{"class":917,"line":6573},[915,7628,7629],{"class":921}," * will \u003Ci>not\u003C\u002Fi> be called automatically. Instead, a FactoryBean should implement\n",[915,7631,7632],{"class":917,"line":6580},[915,7633,7634],{"class":921}," * {@link DisposableBean} and delegate any such close call to the underlying object.\n",[915,7636,7637],{"class":917,"line":6585},[915,7638,7363],{"class":921},[915,7640,7641],{"class":917,"line":6590},[915,7642,7643],{"class":921}," * \u003Cp>Finally, FactoryBean objects participate in the containing BeanFactory's\n",[915,7645,7646],{"class":917,"line":6606},[915,7647,7648],{"class":921}," * synchronization of bean creation. There is usually no need for internal\n",[915,7650,7651],{"class":917,"line":6617},[915,7652,7653],{"class":921}," * synchronization other than for purposes of lazy initialization within the\n",[915,7655,7656],{"class":917,"line":6622},[915,7657,7658],{"class":921}," * FactoryBean itself (or the like).\n",[915,7660,7661],{"class":917,"line":6627},[915,7662,7363],{"class":921},[915,7664,7665,7668,7671],{"class":917,"line":6639},[915,7666,7667],{"class":921}," * ",[915,7669,7670],{"class":932},"@author",[915,7672,7673],{"class":921}," Rod Johnson\n",[915,7675,7676,7678,7680],{"class":917,"line":6653},[915,7677,7667],{"class":921},[915,7679,7670],{"class":932},[915,7681,7682],{"class":921}," Juergen Hoeller\n",[915,7684,7685,7687,7690],{"class":917,"line":6658},[915,7686,7667],{"class":921},[915,7688,7689],{"class":932},"@since",[915,7691,7692],{"class":921}," 08.03.2003\n",[915,7694,7695,7697,7700,7703],{"class":917,"line":6663},[915,7696,7667],{"class":921},[915,7698,7699],{"class":932},"@param",[915,7701,7702],{"class":2074}," \u003CT>",[915,7704,7705],{"class":921}," the bean type\n",[915,7707,7708,7710,7713],{"class":917,"line":6675},[915,7709,7667],{"class":921},[915,7711,7712],{"class":932},"@see",[915,7714,7715],{"class":921}," org.springframework.beans.factory.BeanFactory\n",[915,7717,7718,7720,7722],{"class":917,"line":6689},[915,7719,7667],{"class":921},[915,7721,7712],{"class":932},[915,7723,7724],{"class":921}," org.springframework.aop.framework.ProxyFactoryBean\n",[915,7726,7727,7729,7731],{"class":917,"line":6694},[915,7728,7667],{"class":921},[915,7730,7712],{"class":932},[915,7732,7733],{"class":921}," org.springframework.jndi.JndiObjectFactoryBean\n",[915,7735,7736],{"class":917,"line":6699},[915,7737,7421],{"class":921},[915,7739,7740,7742,7745,7748,7750,7753],{"class":917,"line":6706},[915,7741,1346],{"class":932},[915,7743,7744],{"class":932}," interface",[915,7746,7747],{"class":939}," FactoryBean",[915,7749,1170],{"class":928},[915,7751,7752],{"class":932},"T",[915,7754,7755],{"class":928},"> {\n",[915,7757,7758],{"class":917,"line":6717},[915,7759,2003],{"emptyLinePlaceholder":2002},[915,7761,7762],{"class":917,"line":6727},[915,7763,7764],{"class":921},"    \u002F**\n",[915,7766,7767],{"class":917,"line":6740},[915,7768,7769],{"class":921},"     * The name of an attribute that can be\n",[915,7771,7772],{"class":917,"line":6761},[915,7773,7774],{"class":921},"     * {@link org.springframework.core.AttributeAccessor#setAttribute set} on a\n",[915,7776,7777],{"class":917,"line":6782},[915,7778,7779],{"class":921},"     * {@link org.springframework.beans.factory.config.BeanDefinition} so that\n",[915,7781,7782],{"class":917,"line":6795},[915,7783,7784],{"class":921},"     * factory beans can signal their object type when it can't be deduced from\n",[915,7786,7787],{"class":917,"line":6802},[915,7788,7789],{"class":921},"     * the factory bean class.\n",[915,7791,7792,7795,7797],{"class":917,"line":6807},[915,7793,7794],{"class":921},"     * ",[915,7796,7689],{"class":932},[915,7798,7799],{"class":921}," 5.2\n",[915,7801,7802],{"class":917,"line":6812},[915,7803,7804],{"class":921},"     *\u002F\n",[915,7806,7807,7810,7812,7815],{"class":917,"line":6824},[915,7808,7809],{"class":928},"    String OBJECT_TYPE_ATTRIBUTE ",[915,7811,933],{"class":932},[915,7813,7814],{"class":946}," \"factoryBeanObjectType\"",[915,7816,2252],{"class":928},[915,7818,7819],{"class":917,"line":6838},[915,7820,2003],{"emptyLinePlaceholder":2002},[915,7822,7823],{"class":917,"line":6843},[915,7824,7764],{"class":921},[915,7826,7828],{"class":917,"line":7827},77,[915,7829,7830],{"class":921},"     * Return an instance (possibly shared or independent) of the object\n",[915,7832,7834],{"class":917,"line":7833},78,[915,7835,7836],{"class":921},"     * managed by this factory.\n",[915,7838,7840],{"class":917,"line":7839},79,[915,7841,7842],{"class":921},"     * \u003Cp>As with a {@link BeanFactory}, this allows support for both the\n",[915,7844,7846],{"class":917,"line":7845},80,[915,7847,7848],{"class":921},"     * Singleton and Prototype design pattern.\n",[915,7850,7852],{"class":917,"line":7851},81,[915,7853,7854],{"class":921},"     * \u003Cp>If this FactoryBean is not fully initialized yet at the time of\n",[915,7856,7858],{"class":917,"line":7857},82,[915,7859,7860],{"class":921},"     * the call (for example because it is involved in a circular reference),\n",[915,7862,7864],{"class":917,"line":7863},83,[915,7865,7866],{"class":921},"     * throw a corresponding {@link FactoryBeanNotInitializedException}.\n",[915,7868,7870],{"class":917,"line":7869},84,[915,7871,7872],{"class":921},"     * \u003Cp>As of Spring 2.0, FactoryBeans are allowed to return {@code null}\n",[915,7874,7876],{"class":917,"line":7875},85,[915,7877,7878],{"class":921},"     * objects. The factory will consider this as normal value to be used; it\n",[915,7880,7882],{"class":917,"line":7881},86,[915,7883,7884],{"class":921},"     * will not throw a FactoryBeanNotInitializedException in this case anymore.\n",[915,7886,7888],{"class":917,"line":7887},87,[915,7889,7890],{"class":921},"     * FactoryBean implementations are encouraged to throw\n",[915,7892,7894],{"class":917,"line":7893},88,[915,7895,7896],{"class":921},"     * FactoryBeanNotInitializedException themselves now, as appropriate.\n",[915,7898,7900,7902,7905],{"class":917,"line":7899},89,[915,7901,7794],{"class":921},[915,7903,7904],{"class":932},"@return",[915,7906,7907],{"class":921}," an instance of the bean (can be {@code null})\n",[915,7909,7911,7913,7916,7919],{"class":917,"line":7910},90,[915,7912,7794],{"class":921},[915,7914,7915],{"class":932},"@throws",[915,7917,7918],{"class":939}," Exception",[915,7920,7921],{"class":921}," in case of creation errors\n",[915,7923,7925,7927,7929],{"class":917,"line":7924},91,[915,7926,7794],{"class":921},[915,7928,7712],{"class":932},[915,7930,7931],{"class":921}," FactoryBeanNotInitializedException\n",[915,7933,7935],{"class":917,"line":7934},92,[915,7936,7804],{"class":921},[915,7938,7940,7942],{"class":917,"line":7939},93,[915,7941,2178],{"class":928},[915,7943,7944],{"class":932},"Nullable\n",[915,7946,7948,7951,7954,7957,7959],{"class":917,"line":7947},94,[915,7949,7950],{"class":928},"    T ",[915,7952,7953],{"class":939},"getObject",[915,7955,7956],{"class":928},"() ",[915,7958,7169],{"class":932},[915,7960,7961],{"class":928}," Exception;\n",[915,7963,7965],{"class":917,"line":7964},95,[915,7966,2003],{"emptyLinePlaceholder":2002},[915,7968,7970],{"class":917,"line":7969},96,[915,7971,7764],{"class":921},[915,7973,7975],{"class":917,"line":7974},97,[915,7976,7977],{"class":921},"     * Return the type of object that this FactoryBean creates,\n",[915,7979,7981],{"class":917,"line":7980},98,[915,7982,7983],{"class":921},"     * or {@code null} if not known in advance.\n",[915,7985,7987],{"class":917,"line":7986},99,[915,7988,7989],{"class":921},"     * \u003Cp>This allows one to check for specific types of beans without\n",[915,7991,7993],{"class":917,"line":7992},100,[915,7994,7995],{"class":921},"     * instantiating objects, for example on autowiring.\n",[915,7997,7999],{"class":917,"line":7998},101,[915,8000,8001],{"class":921},"     * \u003Cp>In the case of implementations that are creating a singleton object,\n",[915,8003,8005],{"class":917,"line":8004},102,[915,8006,8007],{"class":921},"     * this method should try to avoid singleton creation as far as possible;\n",[915,8009,8011],{"class":917,"line":8010},103,[915,8012,8013],{"class":921},"     * it should rather estimate the type in advance.\n",[915,8015,8017],{"class":917,"line":8016},104,[915,8018,8019],{"class":921},"     * For prototypes, returning a meaningful type here is advisable too.\n",[915,8021,8023],{"class":917,"line":8022},105,[915,8024,8025],{"class":921},"     * \u003Cp>This method can be called \u003Ci>before\u003C\u002Fi> this FactoryBean has\n",[915,8027,8029],{"class":917,"line":8028},106,[915,8030,8031],{"class":921},"     * been fully initialized. It must not rely on state created during\n",[915,8033,8035],{"class":917,"line":8034},107,[915,8036,8037],{"class":921},"     * initialization; of course, it can still use such state if available.\n",[915,8039,8041],{"class":917,"line":8040},108,[915,8042,8043],{"class":921},"     * \u003Cp>\u003Cb>NOTE:\u003C\u002Fb> Autowiring will simply ignore FactoryBeans that return\n",[915,8045,8047],{"class":917,"line":8046},109,[915,8048,8049],{"class":921},"     * {@code null} here. Therefore it is highly recommended to implement\n",[915,8051,8053],{"class":917,"line":8052},110,[915,8054,8055],{"class":921},"     * this method properly, using the current state of the FactoryBean.\n",[915,8057,8059,8061,8063],{"class":917,"line":8058},111,[915,8060,7794],{"class":921},[915,8062,7904],{"class":932},[915,8064,8065],{"class":921}," the type of object that this FactoryBean creates,\n",[915,8067,8069],{"class":917,"line":8068},112,[915,8070,8071],{"class":921},"     * or {@code null} if not known at the time of the call\n",[915,8073,8075,8077,8079],{"class":917,"line":8074},113,[915,8076,7794],{"class":921},[915,8078,7712],{"class":932},[915,8080,8081],{"class":921}," ListableBeanFactory#getBeansOfType\n",[915,8083,8085],{"class":917,"line":8084},114,[915,8086,7804],{"class":921},[915,8088,8090,8092],{"class":917,"line":8089},115,[915,8091,2178],{"class":928},[915,8093,7944],{"class":932},[915,8095,8097,8100,8103,8106,8109],{"class":917,"line":8096},116,[915,8098,8099],{"class":928},"    Class\u003C",[915,8101,8102],{"class":932},"?",[915,8104,8105],{"class":928},"> ",[915,8107,8108],{"class":939},"getObjectType",[915,8110,1008],{"class":928},[915,8112,8114],{"class":917,"line":8113},117,[915,8115,2003],{"emptyLinePlaceholder":2002},[915,8117,8119],{"class":917,"line":8118},118,[915,8120,7764],{"class":921},[915,8122,8124],{"class":917,"line":8123},119,[915,8125,8126],{"class":921},"     * Is the object managed by this factory a singleton? That is,\n",[915,8128,8130,8133,8135,8137,8139],{"class":917,"line":8129},120,[915,8131,8132],{"class":921},"     * will {",[915,8134,7492],{"class":932},[915,8136,7495],{"class":921},[915,8138,7498],{"class":2074},[915,8140,8141],{"class":921},"} always return the same object\n",[915,8143,8145],{"class":917,"line":8144},121,[915,8146,8147],{"class":921},"     * (a reference that can be cached)?\n",[915,8149,8151],{"class":917,"line":8150},122,[915,8152,8153],{"class":921},"     * \u003Cp>\u003Cb>NOTE:\u003C\u002Fb> If a FactoryBean indicates to hold a singleton object,\n",[915,8155,8157],{"class":917,"line":8156},123,[915,8158,8159],{"class":921},"     * the object returned from {@code getObject()} might get cached\n",[915,8161,8163],{"class":917,"line":8162},124,[915,8164,8165],{"class":921},"     * by the owning BeanFactory. Hence, do not return {@code true}\n",[915,8167,8169],{"class":917,"line":8168},125,[915,8170,8171],{"class":921},"     * unless the FactoryBean always exposes the same reference.\n",[915,8173,8175],{"class":917,"line":8174},126,[915,8176,8177],{"class":921},"     * \u003Cp>The singleton status of the FactoryBean itself will generally\n",[915,8179,8181],{"class":917,"line":8180},127,[915,8182,8183],{"class":921},"     * be provided by the owning BeanFactory; usually, it has to be\n",[915,8185,8187],{"class":917,"line":8186},128,[915,8188,8189],{"class":921},"     * defined as singleton there.\n",[915,8191,8193],{"class":917,"line":8192},129,[915,8194,8195],{"class":921},"     * \u003Cp>\u003Cb>NOTE:\u003C\u002Fb> This method returning {@code false} does not\n",[915,8197,8199],{"class":917,"line":8198},130,[915,8200,8201],{"class":921},"     * necessarily indicate that returned objects are independent instances.\n",[915,8203,8205],{"class":917,"line":8204},131,[915,8206,8207],{"class":921},"     * An implementation of the extended {@link SmartFactoryBean} interface\n",[915,8209,8211],{"class":917,"line":8210},132,[915,8212,8213],{"class":921},"     * may explicitly indicate independent instances through its\n",[915,8215,8217,8220,8222,8225,8227,8230],{"class":917,"line":8216},133,[915,8218,8219],{"class":921},"     * {",[915,8221,7492],{"class":932},[915,8223,8224],{"class":939}," SmartFactoryBean",[915,8226,7619],{"class":921},[915,8228,8229],{"class":2074},"isPrototype()",[915,8231,8232],{"class":921},"} method. Plain {@link FactoryBean}\n",[915,8234,8236],{"class":917,"line":8235},134,[915,8237,8238],{"class":921},"     * implementations which do not implement this extended interface are\n",[915,8240,8242],{"class":917,"line":8241},135,[915,8243,8244],{"class":921},"     * simply assumed to always return independent instances if the\n",[915,8246,8248],{"class":917,"line":8247},136,[915,8249,8250],{"class":921},"     * {@code isSingleton()} implementation returns {@code false}.\n",[915,8252,8254],{"class":917,"line":8253},137,[915,8255,8256],{"class":921},"     * \u003Cp>The default implementation returns {@code true}, since a\n",[915,8258,8260],{"class":917,"line":8259},138,[915,8261,8262],{"class":921},"     * {@code FactoryBean} typically manages a singleton instance.\n",[915,8264,8266,8268,8270],{"class":917,"line":8265},139,[915,8267,7794],{"class":921},[915,8269,7904],{"class":932},[915,8271,8272],{"class":921}," whether the exposed object is a singleton\n",[915,8274,8276,8278,8280],{"class":917,"line":8275},140,[915,8277,7794],{"class":921},[915,8279,7712],{"class":932},[915,8281,8282],{"class":921}," #getObject()\n",[915,8284,8286,8288,8290],{"class":917,"line":8285},141,[915,8287,7794],{"class":921},[915,8289,7712],{"class":932},[915,8291,8292],{"class":921}," SmartFactoryBean#isPrototype()\n",[915,8294,8296],{"class":917,"line":8295},142,[915,8297,7804],{"class":921},[915,8299,8301,8304,8307,8310],{"class":917,"line":8300},143,[915,8302,8303],{"class":932},"    default",[915,8305,8306],{"class":932}," boolean",[915,8308,8309],{"class":939}," isSingleton",[915,8311,2040],{"class":928},[915,8313,8315,8317,8320],{"class":917,"line":8314},144,[915,8316,2045],{"class":932},[915,8318,8319],{"class":1464}," true",[915,8321,2252],{"class":928},[915,8323,8325],{"class":917,"line":8324},145,[915,8326,2053],{"class":928},[915,8328,8330],{"class":917,"line":8329},146,[915,8331,1427],{"class":928},[896,8333,2334],{},[955,8335,8336],{"start":925},[958,8337,8338],{},"创建类UserFactoryBean",[906,8340,8342],{"className":908,"code":8341,"language":910,"meta":11,"style":11},"public class UserFactoryBean implements FactoryBean\u003CUser> {\n    @Override\n    public User getObject() throws Exception {\n        return new User();\n    }\n\n    @Override\n    public Class\u003C?> getObjectType() {\n        return User.class;\n    }\n}\n",[912,8343,8344,8364,8370,8386,8396,8400,8404,8410,8425,8432,8436],{"__ignoreMap":11},[915,8345,8346,8348,8350,8353,8355,8357,8359,8362],{"class":917,"line":918},[915,8347,1346],{"class":932},[915,8349,1184],{"class":932},[915,8351,8352],{"class":939}," UserFactoryBean",[915,8354,7127],{"class":932},[915,8356,7747],{"class":939},[915,8358,1170],{"class":928},[915,8360,8361],{"class":932},"User",[915,8363,7755],{"class":928},[915,8365,8366,8368],{"class":917,"line":925},[915,8367,2178],{"class":928},[915,8369,2181],{"class":932},[915,8371,8372,8374,8377,8379,8381,8383],{"class":917,"line":993},[915,8373,2031],{"class":932},[915,8375,8376],{"class":928}," User ",[915,8378,7953],{"class":939},[915,8380,7956],{"class":928},[915,8382,7169],{"class":932},[915,8384,8385],{"class":928}," Exception {\n",[915,8387,8388,8390,8392,8394],{"class":917,"line":999},[915,8389,2045],{"class":932},[915,8391,936],{"class":932},[915,8393,6206],{"class":939},[915,8395,1008],{"class":928},[915,8397,8398],{"class":917,"line":1011},[915,8399,2053],{"class":928},[915,8401,8402],{"class":917,"line":1386},[915,8403,2003],{"emptyLinePlaceholder":2002},[915,8405,8406,8408],{"class":917,"line":1407},[915,8407,2178],{"class":928},[915,8409,2181],{"class":932},[915,8411,8412,8414,8417,8419,8421,8423],{"class":917,"line":1413},[915,8413,2031],{"class":932},[915,8415,8416],{"class":928}," Class\u003C",[915,8418,8102],{"class":932},[915,8420,8105],{"class":928},[915,8422,8108],{"class":939},[915,8424,2040],{"class":928},[915,8426,8427,8429],{"class":917,"line":1424},[915,8428,2045],{"class":932},[915,8430,8431],{"class":928}," User.class;\n",[915,8433,8434],{"class":917,"line":2056},[915,8435,2053],{"class":928},[915,8437,8438],{"class":917,"line":2061},[915,8439,1427],{"class":928},[955,8441,8442],{"start":993},[958,8443,4079],{},[906,8445,8447],{"className":1156,"code":8446,"language":1158,"meta":11,"style":11},"\u003Cbean id=\"user\" class=\"com.codermast.spring6.iocxml.bean.UserFactoryBean\"\u002F>\n",[912,8448,8449],{"__ignoreMap":11},[915,8450,8451,8453,8455,8457,8459,8461,8463,8465,8468],{"class":917,"line":918},[915,8452,1170],{"class":928},[915,8454,1174],{"class":1173},[915,8456,1177],{"class":939},[915,8458,933],{"class":928},[915,8460,988],{"class":946},[915,8462,1184],{"class":939},[915,8464,933],{"class":928},[915,8466,8467],{"class":946},"\"com.codermast.spring6.iocxml.bean.UserFactoryBean\"",[915,8469,1192],{"class":928},[955,8471,8472],{"start":999},[958,8473,1328],{},[906,8475,8477],{"className":908,"code":8476,"language":910,"meta":11,"style":11},"@Test\npublic void testUserFactoryBean(){\n    \u002F\u002F获取IOC容器\n    ApplicationContext ac = new ClassPathXmlApplicationContext(\"bean-factorybean.xml\");\n    User user = (User) ac.getBean(\"user\");\n    System.out.println(user);\n    System.out.println(user.getClass());\n}\n",[912,8478,8479,8485,8496,8501,8518,8536,8545,8560],{"__ignoreMap":11},[915,8480,8481,8483],{"class":917,"line":918},[915,8482,1338],{"class":928},[915,8484,1341],{"class":932},[915,8486,8487,8489,8491,8494],{"class":917,"line":925},[915,8488,1346],{"class":932},[915,8490,1349],{"class":932},[915,8492,8493],{"class":939}," testUserFactoryBean",[915,8495,1355],{"class":928},[915,8497,8498],{"class":917,"line":993},[915,8499,8500],{"class":921},"    \u002F\u002F获取IOC容器\n",[915,8502,8503,8505,8507,8509,8511,8513,8516],{"class":917,"line":999},[915,8504,1365],{"class":928},[915,8506,933],{"class":932},[915,8508,936],{"class":932},[915,8510,940],{"class":939},[915,8512,943],{"class":928},[915,8514,8515],{"class":946},"\"bean-factorybean.xml\"",[915,8517,950],{"class":928},[915,8519,8520,8523,8525,8528,8530,8532,8534],{"class":917,"line":1011},[915,8521,8522],{"class":928},"    User user ",[915,8524,933],{"class":932},[915,8526,8527],{"class":928}," (User) ac.",[915,8529,983],{"class":939},[915,8531,943],{"class":928},[915,8533,988],{"class":946},[915,8535,950],{"class":928},[915,8537,8538,8540,8542],{"class":917,"line":1386},[915,8539,1416],{"class":928},[915,8541,1017],{"class":939},[915,8543,8544],{"class":928},"(user);\n",[915,8546,8547,8549,8551,8554,8557],{"class":917,"line":1407},[915,8548,1416],{"class":928},[915,8550,1017],{"class":939},[915,8552,8553],{"class":928},"(user.",[915,8555,8556],{"class":939},"getClass",[915,8558,8559],{"class":928},"());\n",[915,8561,8562],{"class":917,"line":1413},[915,8563,1427],{"class":928},[896,8565,8566],{},[1145,8567],{"alt":1432,"src":8568},"\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-20-00-32.png",[892,8570,8571],{"id":8571},"基于xml自动装配",[896,8573,8574],{},"自动装配：根据指定的策略，在IOC容器中匹配某一个bean，自动为指定的bean中所依赖的类类型或接口类型属性赋值",[955,8576,8577],{},[958,8578,8579],{},"场景模拟",[896,8581,8582],{},"创建类UserController",[906,8584,8586],{"className":908,"code":8585,"language":910,"meta":11,"style":11},"public class UserController {\n\n    private UserService userService;\n\n    public void setUserService(UserService userService) {\n        this.userService = userService;\n    }\n\n    public void saveUser(){\n        userService.saveUser();\n    }\n}\n",[912,8587,8588,8599,8603,8610,8614,8631,8643,8647,8651,8662,8672,8676],{"__ignoreMap":11},[915,8589,8590,8592,8594,8597],{"class":917,"line":918},[915,8591,1346],{"class":932},[915,8593,1184],{"class":932},[915,8595,8596],{"class":939}," UserController",[915,8598,1997],{"class":928},[915,8600,8601],{"class":917,"line":925},[915,8602,2003],{"emptyLinePlaceholder":2002},[915,8604,8605,8607],{"class":917,"line":993},[915,8606,2008],{"class":932},[915,8608,8609],{"class":928}," UserService userService;\n",[915,8611,8612],{"class":917,"line":999},[915,8613,2003],{"emptyLinePlaceholder":2002},[915,8615,8616,8618,8620,8623,8626,8629],{"class":917,"line":1011},[915,8617,2031],{"class":932},[915,8619,1349],{"class":932},[915,8621,8622],{"class":939}," setUserService",[915,8624,8625],{"class":928},"(UserService ",[915,8627,8628],{"class":2074},"userService",[915,8630,2078],{"class":928},[915,8632,8633,8635,8638,8640],{"class":917,"line":1386},[915,8634,2084],{"class":1464},[915,8636,8637],{"class":928},".userService ",[915,8639,933],{"class":932},[915,8641,8642],{"class":928}," userService;\n",[915,8644,8645],{"class":917,"line":1407},[915,8646,2053],{"class":928},[915,8648,8649],{"class":917,"line":1413},[915,8650,2003],{"emptyLinePlaceholder":2002},[915,8652,8653,8655,8657,8660],{"class":917,"line":1424},[915,8654,2031],{"class":932},[915,8656,1349],{"class":932},[915,8658,8659],{"class":939}," saveUser",[915,8661,1355],{"class":928},[915,8663,8664,8667,8670],{"class":917,"line":2056},[915,8665,8666],{"class":928},"        userService.",[915,8668,8669],{"class":939},"saveUser",[915,8671,1008],{"class":928},[915,8673,8674],{"class":917,"line":2061},[915,8675,2053],{"class":928},[915,8677,8678],{"class":917,"line":2081},[915,8679,1427],{"class":928},[896,8681,8682],{},"创建接口UserService",[906,8684,8686],{"className":908,"code":8685,"language":910,"meta":11,"style":11},"public interface UserService {\n\n    void saveUser();\n\n}\n",[912,8687,8688,8699,8703,8712,8716],{"__ignoreMap":11},[915,8689,8690,8692,8694,8697],{"class":917,"line":918},[915,8691,1346],{"class":932},[915,8693,7744],{"class":932},[915,8695,8696],{"class":939}," UserService",[915,8698,1997],{"class":928},[915,8700,8701],{"class":917,"line":925},[915,8702,2003],{"emptyLinePlaceholder":2002},[915,8704,8705,8708,8710],{"class":917,"line":993},[915,8706,8707],{"class":932},"    void",[915,8709,8659],{"class":939},[915,8711,1008],{"class":928},[915,8713,8714],{"class":917,"line":999},[915,8715,2003],{"emptyLinePlaceholder":2002},[915,8717,8718],{"class":917,"line":1011},[915,8719,1427],{"class":928},[896,8721,8722],{},"创建类UserServiceImpl实现接口UserService",[906,8724,8726],{"className":908,"code":8725,"language":910,"meta":11,"style":11},"public class UserServiceImpl implements UserService {\n\n    private UserDao userDao;\n\n    public void setUserDao(UserDao userDao) {\n        this.userDao = userDao;\n    }\n\n    @Override\n    public void saveUser() {\n        userDao.saveUser();\n    }\n}\n",[912,8727,8728,8743,8747,8754,8758,8775,8787,8791,8795,8801,8811,8820,8824],{"__ignoreMap":11},[915,8729,8730,8732,8734,8737,8739,8741],{"class":917,"line":918},[915,8731,1346],{"class":932},[915,8733,1184],{"class":932},[915,8735,8736],{"class":939}," UserServiceImpl",[915,8738,7127],{"class":932},[915,8740,8696],{"class":939},[915,8742,1997],{"class":928},[915,8744,8745],{"class":917,"line":925},[915,8746,2003],{"emptyLinePlaceholder":2002},[915,8748,8749,8751],{"class":917,"line":993},[915,8750,2008],{"class":932},[915,8752,8753],{"class":928}," UserDao userDao;\n",[915,8755,8756],{"class":917,"line":999},[915,8757,2003],{"emptyLinePlaceholder":2002},[915,8759,8760,8762,8764,8767,8770,8773],{"class":917,"line":1011},[915,8761,2031],{"class":932},[915,8763,1349],{"class":932},[915,8765,8766],{"class":939}," setUserDao",[915,8768,8769],{"class":928},"(UserDao ",[915,8771,8772],{"class":2074},"userDao",[915,8774,2078],{"class":928},[915,8776,8777,8779,8782,8784],{"class":917,"line":1386},[915,8778,2084],{"class":1464},[915,8780,8781],{"class":928},".userDao ",[915,8783,933],{"class":932},[915,8785,8786],{"class":928}," userDao;\n",[915,8788,8789],{"class":917,"line":1407},[915,8790,2053],{"class":928},[915,8792,8793],{"class":917,"line":1413},[915,8794,2003],{"emptyLinePlaceholder":2002},[915,8796,8797,8799],{"class":917,"line":1424},[915,8798,2178],{"class":928},[915,8800,2181],{"class":932},[915,8802,8803,8805,8807,8809],{"class":917,"line":2056},[915,8804,2031],{"class":932},[915,8806,1349],{"class":932},[915,8808,8659],{"class":939},[915,8810,2040],{"class":928},[915,8812,8813,8816,8818],{"class":917,"line":2061},[915,8814,8815],{"class":928},"        userDao.",[915,8817,8669],{"class":939},[915,8819,1008],{"class":928},[915,8821,8822],{"class":917,"line":2081},[915,8823,2053],{"class":928},[915,8825,8826],{"class":917,"line":2094},[915,8827,1427],{"class":928},[896,8829,8830],{},"创建接口UserDao",[906,8832,8834],{"className":908,"code":8833,"language":910,"meta":11,"style":11},"public interface UserDao {\n\n    void saveUser();\n\n}\n",[912,8835,8836,8847,8851,8859,8863],{"__ignoreMap":11},[915,8837,8838,8840,8842,8845],{"class":917,"line":918},[915,8839,1346],{"class":932},[915,8841,7744],{"class":932},[915,8843,8844],{"class":939}," UserDao",[915,8846,1997],{"class":928},[915,8848,8849],{"class":917,"line":925},[915,8850,2003],{"emptyLinePlaceholder":2002},[915,8852,8853,8855,8857],{"class":917,"line":993},[915,8854,8707],{"class":932},[915,8856,8659],{"class":939},[915,8858,1008],{"class":928},[915,8860,8861],{"class":917,"line":999},[915,8862,2003],{"emptyLinePlaceholder":2002},[915,8864,8865],{"class":917,"line":1011},[915,8866,1427],{"class":928},[896,8868,8869],{},"创建类UserDaoImpl实现接口UserDao",[906,8871,8873],{"className":908,"code":8872,"language":910,"meta":11,"style":11},"public class UserDaoImpl implements UserDao{\n    @Override\n    public void saveUser() {\n        System.out.println(\"保存成功\");\n    }\n}\n",[912,8874,8875,8891,8897,8907,8920,8924],{"__ignoreMap":11},[915,8876,8877,8879,8881,8884,8886,8888],{"class":917,"line":918},[915,8878,1346],{"class":932},[915,8880,1184],{"class":932},[915,8882,8883],{"class":939}," UserDaoImpl",[915,8885,7127],{"class":932},[915,8887,8844],{"class":939},[915,8889,8890],{"class":928},"{\n",[915,8892,8893,8895],{"class":917,"line":925},[915,8894,2178],{"class":928},[915,8896,2181],{"class":932},[915,8898,8899,8901,8903,8905],{"class":917,"line":993},[915,8900,2031],{"class":932},[915,8902,1349],{"class":932},[915,8904,8659],{"class":939},[915,8906,2040],{"class":928},[915,8908,8909,8911,8913,8915,8918],{"class":917,"line":999},[915,8910,6269],{"class":928},[915,8912,1017],{"class":939},[915,8914,943],{"class":928},[915,8916,8917],{"class":946},"\"保存成功\"",[915,8919,950],{"class":928},[915,8921,8922],{"class":917,"line":1011},[915,8923,2053],{"class":928},[915,8925,8926],{"class":917,"line":1386},[915,8927,1427],{"class":928},[896,8929,8930],{},"2.配置bean",[896,8932,8933],{},"使用bean标签的autowire属性设置自动装配效果",[1237,8935,8936],{},[958,8937,8938],{},"自动装配方式：byType",[896,8940,8941],{},"byType：根据类型匹配IOC容器中的某个兼容类型的bean，为属性自动赋值",[896,8943,8944],{},"> 若在IOC中，没有任何一个兼容类型的bean能够为属性赋值，则该属性不装配，即值为默认值null",[896,8946,8947],{},"> 若在IOC中，有多个兼容类型的bean能够为属性赋值，则抛出异常NoUniqueBeanDefinitionException",[896,8949,8950],{},[912,8951,8952],{},"autowire-byType.xml",[906,8954,8956],{"className":1156,"code":8955,"language":1158,"meta":11,"style":11},"\u003C!--自动装配 ：byType 方式-->\n\u003Cbean id=\"userController\" class=\"com.codermast.spring6.iocxml.bean.autowire.controller.UserController\"\n    autowire=\"byType\"\u002F>\n\n\u003Cbean id=\"userService\" class=\"com.codermast.spring6.iocxml.bean.autowire.service.UserServiceImpl\"\n    autowire=\"byType\"\u002F>\n\n\u003Cbean id=\"userDao\" class=\"com.codermast.spring6.iocxml.bean.autowire.dao.UserDaoImpl\"\u002F>\n",[912,8957,8958,8963,8983,8995,8999,9019,9029,9033],{"__ignoreMap":11},[915,8959,8960],{"class":917,"line":918},[915,8961,8962],{"class":921},"\u003C!--自动装配 ：byType 方式-->\n",[915,8964,8965,8967,8969,8971,8973,8976,8978,8980],{"class":917,"line":925},[915,8966,1170],{"class":928},[915,8968,1174],{"class":1173},[915,8970,1177],{"class":939},[915,8972,933],{"class":928},[915,8974,8975],{"class":946},"\"userController\"",[915,8977,1184],{"class":939},[915,8979,933],{"class":928},[915,8981,8982],{"class":946},"\"com.codermast.spring6.iocxml.bean.autowire.controller.UserController\"\n",[915,8984,8985,8988,8990,8993],{"class":917,"line":993},[915,8986,8987],{"class":939},"    autowire",[915,8989,933],{"class":928},[915,8991,8992],{"class":946},"\"byType\"",[915,8994,1192],{"class":928},[915,8996,8997],{"class":917,"line":999},[915,8998,2003],{"emptyLinePlaceholder":2002},[915,9000,9001,9003,9005,9007,9009,9012,9014,9016],{"class":917,"line":1011},[915,9002,1170],{"class":928},[915,9004,1174],{"class":1173},[915,9006,1177],{"class":939},[915,9008,933],{"class":928},[915,9010,9011],{"class":946},"\"userService\"",[915,9013,1184],{"class":939},[915,9015,933],{"class":928},[915,9017,9018],{"class":946},"\"com.codermast.spring6.iocxml.bean.autowire.service.UserServiceImpl\"\n",[915,9020,9021,9023,9025,9027],{"class":917,"line":1386},[915,9022,8987],{"class":939},[915,9024,933],{"class":928},[915,9026,8992],{"class":946},[915,9028,1192],{"class":928},[915,9030,9031],{"class":917,"line":1407},[915,9032,2003],{"emptyLinePlaceholder":2002},[915,9034,9035,9037,9039,9041,9043,9046,9048,9050,9053],{"class":917,"line":1413},[915,9036,1170],{"class":928},[915,9038,1174],{"class":1173},[915,9040,1177],{"class":939},[915,9042,933],{"class":928},[915,9044,9045],{"class":946},"\"userDao\"",[915,9047,1184],{"class":939},[915,9049,933],{"class":928},[915,9051,9052],{"class":946},"\"com.codermast.spring6.iocxml.bean.autowire.dao.UserDaoImpl\"",[915,9054,1192],{"class":928},[1237,9056,9057],{},[958,9058,9059],{},"自动装配方式：byName",[896,9061,9062],{},"byName：将自动装配的属性的属性名，作为bean的id在IOC容器中匹配相对应的bean进行赋值",[896,9064,9065],{},[912,9066,9067],{},"autowire-byName.xml",[906,9069,9071],{"className":1156,"code":9070,"language":1158,"meta":11,"style":11},"\u003C!--自动装配：byName 方式-->\n\u003Cbean id=\"userController\" class=\"com.codermast.spring6.iocxml.bean.autowire.controller.UserController\"\n    autowire=\"byName\"\u002F>\n\n\u003Cbean id=\"userService\" class=\"com.codermast.spring6.iocxml.bean.autowire.service.UserServiceImpl\"\n    autowire=\"byName\"\u002F>\n\u003Cbean id=\"userServiceImpl\" class=\"com.codermast.spring6.iocxml.bean.autowire.service.UserServiceImpl\"\n    autowire=\"byName\"\u002F>\n\n\u003Cbean id=\"userDao\" class=\"com.codermast.spring6.iocxml.bean.autowire.dao.UserDaoImpl\"\u002F>\n\u003Cbean id=\"userDaoImpl\" class=\"com.codermast.spring6.iocxml.bean.autowire.dao.UserDaoImpl\"\u002F>\n",[912,9072,9073,9078,9096,9107,9111,9129,9139,9158,9168,9172,9192],{"__ignoreMap":11},[915,9074,9075],{"class":917,"line":918},[915,9076,9077],{"class":921},"\u003C!--自动装配：byName 方式-->\n",[915,9079,9080,9082,9084,9086,9088,9090,9092,9094],{"class":917,"line":925},[915,9081,1170],{"class":928},[915,9083,1174],{"class":1173},[915,9085,1177],{"class":939},[915,9087,933],{"class":928},[915,9089,8975],{"class":946},[915,9091,1184],{"class":939},[915,9093,933],{"class":928},[915,9095,8982],{"class":946},[915,9097,9098,9100,9102,9105],{"class":917,"line":993},[915,9099,8987],{"class":939},[915,9101,933],{"class":928},[915,9103,9104],{"class":946},"\"byName\"",[915,9106,1192],{"class":928},[915,9108,9109],{"class":917,"line":999},[915,9110,2003],{"emptyLinePlaceholder":2002},[915,9112,9113,9115,9117,9119,9121,9123,9125,9127],{"class":917,"line":1011},[915,9114,1170],{"class":928},[915,9116,1174],{"class":1173},[915,9118,1177],{"class":939},[915,9120,933],{"class":928},[915,9122,9011],{"class":946},[915,9124,1184],{"class":939},[915,9126,933],{"class":928},[915,9128,9018],{"class":946},[915,9130,9131,9133,9135,9137],{"class":917,"line":1386},[915,9132,8987],{"class":939},[915,9134,933],{"class":928},[915,9136,9104],{"class":946},[915,9138,1192],{"class":928},[915,9140,9141,9143,9145,9147,9149,9152,9154,9156],{"class":917,"line":1407},[915,9142,1170],{"class":928},[915,9144,1174],{"class":1173},[915,9146,1177],{"class":939},[915,9148,933],{"class":928},[915,9150,9151],{"class":946},"\"userServiceImpl\"",[915,9153,1184],{"class":939},[915,9155,933],{"class":928},[915,9157,9018],{"class":946},[915,9159,9160,9162,9164,9166],{"class":917,"line":1413},[915,9161,8987],{"class":939},[915,9163,933],{"class":928},[915,9165,9104],{"class":946},[915,9167,1192],{"class":928},[915,9169,9170],{"class":917,"line":1424},[915,9171,2003],{"emptyLinePlaceholder":2002},[915,9173,9174,9176,9178,9180,9182,9184,9186,9188,9190],{"class":917,"line":2056},[915,9175,1170],{"class":928},[915,9177,1174],{"class":1173},[915,9179,1177],{"class":939},[915,9181,933],{"class":928},[915,9183,9045],{"class":946},[915,9185,1184],{"class":939},[915,9187,933],{"class":928},[915,9189,9052],{"class":946},[915,9191,1192],{"class":928},[915,9193,9194,9196,9198,9200,9202,9205,9207,9209,9211],{"class":917,"line":2061},[915,9195,1170],{"class":928},[915,9197,1174],{"class":1173},[915,9199,1177],{"class":939},[915,9201,933],{"class":928},[915,9203,9204],{"class":946},"\"userDaoImpl\"",[915,9206,1184],{"class":939},[915,9208,933],{"class":928},[915,9210,9052],{"class":946},[915,9212,1192],{"class":928},[955,9214,9215],{"start":993},[958,9216,1328],{},[906,9218,9220],{"className":908,"code":9219,"language":910,"meta":11,"style":11},"@Test\npublic void testAutoWireByXML() {\n    ApplicationContext acByName = new ClassPathXmlApplicationContext(\"autowire-byName.xml\");\n    UserController userControllerByName = acByName.getBean(UserController.class);\n    userControllerByName.saveUser();\n    ApplicationContext acByType = new ClassPathXmlApplicationContext(\"autowire-byType.xml\");\n    UserController userControllerByType = acByType.getBean(UserController.class);\n    userControllerByType.saveUser();\n}\n",[912,9221,9222,9228,9239,9257,9272,9281,9299,9313,9322],{"__ignoreMap":11},[915,9223,9224,9226],{"class":917,"line":918},[915,9225,1338],{"class":928},[915,9227,1341],{"class":932},[915,9229,9230,9232,9234,9237],{"class":917,"line":925},[915,9231,1346],{"class":932},[915,9233,1349],{"class":932},[915,9235,9236],{"class":939}," testAutoWireByXML",[915,9238,2040],{"class":928},[915,9240,9241,9244,9246,9248,9250,9252,9255],{"class":917,"line":993},[915,9242,9243],{"class":928},"    ApplicationContext acByName ",[915,9245,933],{"class":932},[915,9247,936],{"class":932},[915,9249,940],{"class":939},[915,9251,943],{"class":928},[915,9253,9254],{"class":946},"\"autowire-byName.xml\"",[915,9256,950],{"class":928},[915,9258,9259,9262,9264,9267,9269],{"class":917,"line":999},[915,9260,9261],{"class":928},"    UserController userControllerByName ",[915,9263,933],{"class":932},[915,9265,9266],{"class":928}," acByName.",[915,9268,983],{"class":939},[915,9270,9271],{"class":928},"(UserController.class);\n",[915,9273,9274,9277,9279],{"class":917,"line":1011},[915,9275,9276],{"class":928},"    userControllerByName.",[915,9278,8669],{"class":939},[915,9280,1008],{"class":928},[915,9282,9283,9286,9288,9290,9292,9294,9297],{"class":917,"line":1386},[915,9284,9285],{"class":928},"    ApplicationContext acByType ",[915,9287,933],{"class":932},[915,9289,936],{"class":932},[915,9291,940],{"class":939},[915,9293,943],{"class":928},[915,9295,9296],{"class":946},"\"autowire-byType.xml\"",[915,9298,950],{"class":928},[915,9300,9301,9304,9306,9309,9311],{"class":917,"line":1407},[915,9302,9303],{"class":928},"    UserController userControllerByType ",[915,9305,933],{"class":932},[915,9307,9308],{"class":928}," acByType.",[915,9310,983],{"class":939},[915,9312,9271],{"class":928},[915,9314,9315,9318,9320],{"class":917,"line":1413},[915,9316,9317],{"class":928},"    userControllerByType.",[915,9319,8669],{"class":939},[915,9321,1008],{"class":928},[915,9323,9324],{"class":917,"line":1424},[915,9325,1427],{"class":928},[896,9327,9328],{},[1145,9329],{"alt":1432,"src":9330},"\u002Fassets\u002Fjava\u002Fspring\u002Fxml-beans\u002F2023-12-30-20-25-19.png",[9332,9333,9334],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sovSZ, html code.shiki .sovSZ{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":11,"searchDepth":925,"depth":925,"links":9336},[9337,9338,9339,9342,9343,9344],{"id":894,"depth":925,"text":894},{"id":901,"depth":925,"text":901},{"id":1267,"depth":925,"text":1267,"children":9340},[9341],{"id":1295,"depth":993,"text":1296},{"id":5237,"depth":925,"text":5238},{"id":5404,"depth":925,"text":5404},{"id":5952,"depth":925,"text":5953},"md",{},{"title":526,"description":11},"other\u002Fspring-series\u002Fspring\u002Fxml-beans","GZSyMR-q7-4qRn7YDQmxjWTEwhGTiU7WezKI97ooA5k",1775496430121]