[{"data":1,"prerenderedAt":56799},["ShallowReactive",2],{"all-articles":3},[4,1806,4984,6774,10262,11117,12319,13709,13870,14323,14537,14857,15084,15197,15750,37185,38812,55440,55905,56452],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"date":11,"tags":12,"body":16,"_type":1800,"_id":1801,"_source":1802,"_file":1803,"_stem":1804,"_extension":1805},"\u002Farticles\u002Fbackend\u002Ffastapi","backend",false,"","FastAPI 入门：7 个核心概念快速上手 Python Web API","从最小程序到完整示例，系统梳理 FastAPI 的 7 个基础概念：路由、路径与查询参数、Pydantic 请求体、JSON 响应、HTTPException 错误处理与 async\u002Fdef 选择，帮助快速搭建可用于 AI 药物发现项目的接口。","2026-05-25",[13,14,15],"人工智能","软件工程","Agent开发",{"type":17,"children":18,"toc":1790},"root",[19,27,38,43,78,111,120,125,134,147,229,234,264,269,316,321,345,355,364,369,524,529,584,593,598,629,633,647,676,689,720,724,738,758,873,878,944,953,974,1029,1038,1058,1134,1139,1219,1228,1233,1302,1307,1332,1351,1359,1716,1721,1784],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":26},"text","明白。FastAPI 基础可以按 7 个概念学，不要一开始就陷进项目结构。",{"type":20,"tag":28,"props":29,"children":31},"h3",{"id":30},"_1-fastapi-是什么",[32],{"type":20,"tag":33,"props":34,"children":35},"strong",{},[36],{"type":25,"value":37},"1. FastAPI 是什么",{"type":20,"tag":21,"props":39,"children":40},{},[41],{"type":25,"value":42},"FastAPI 是 Python 的 Web API 框架。你写普通 Python 函数，它帮你处理：",{"type":20,"tag":44,"props":45,"children":46},"ul",{},[47,53,58,63,68,73],{"type":20,"tag":48,"props":49,"children":50},"li",{},[51],{"type":25,"value":52},"HTTP 路由",{"type":20,"tag":48,"props":54,"children":55},{},[56],{"type":25,"value":57},"JSON 请求和响应",{"type":20,"tag":48,"props":59,"children":60},{},[61],{"type":25,"value":62},"参数校验",{"type":20,"tag":48,"props":64,"children":65},{},[66],{"type":25,"value":67},"自动 API 文档",{"type":20,"tag":48,"props":69,"children":70},{},[71],{"type":25,"value":72},"错误返回",{"type":20,"tag":48,"props":74,"children":75},{},[76],{"type":25,"value":77},"异步接口",{"type":20,"tag":21,"props":79,"children":80},{},[81,83,90,92,98,100,109],{"type":25,"value":82},"官方基础示例也是从 ",{"type":20,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":25,"value":89},"FastAPI()",{"type":25,"value":91},"、路由装饰器、启动服务、访问 ",{"type":20,"tag":84,"props":93,"children":95},{"className":94},[],[96],{"type":25,"value":97},"\u002Fdocs",{"type":25,"value":99}," 开始。参考：",{"type":20,"tag":101,"props":102,"children":106},"a",{"href":103,"rel":104},"https:\u002F\u002Ffastapi.tiangolo.com\u002Ftutorial\u002Ffirst-steps\u002F",[105],"nofollow",[107],{"type":25,"value":108},"FastAPI First Steps",{"type":25,"value":110},"。",{"type":20,"tag":28,"props":112,"children":114},{"id":113},"_2-最小程序",[115],{"type":20,"tag":33,"props":116,"children":117},{},[118],{"type":25,"value":119},"2. 最小程序",{"type":20,"tag":21,"props":121,"children":122},{},[123],{"type":25,"value":124},"下载依赖：\nuvicorn：服务器",{"type":20,"tag":126,"props":127,"children":129},"pre",{"code":128},"uv install python 3.11\nuv add 'fastapi[standard]@latest'\nuv add 'uvicorn[standard]'\n",[130],{"type":20,"tag":84,"props":131,"children":132},{"__ignoreMap":8},[133],{"type":25,"value":128},{"type":20,"tag":21,"props":135,"children":136},{},[137,139,145],{"type":25,"value":138},"新建 ",{"type":20,"tag":84,"props":140,"children":142},{"className":141},[],[143],{"type":25,"value":144},"main.py",{"type":25,"value":146},"：",{"type":20,"tag":126,"props":148,"children":152},{"code":149,"language":150,"meta":8,"className":151,"style":8},"from fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"\u002F\")\ndef read_root():\n    return {\"message\": \"Hello FastAPI\"}\n","python","language-python shiki shiki-themes github-dark",[153],{"type":20,"tag":84,"props":154,"children":155},{"__ignoreMap":8},[156,167,177,186,194,202,211,220],{"type":20,"tag":157,"props":158,"children":161},"span",{"class":159,"line":160},"line",1,[162],{"type":20,"tag":157,"props":163,"children":164},{},[165],{"type":25,"value":166},"from fastapi import FastAPI\n",{"type":20,"tag":157,"props":168,"children":170},{"class":159,"line":169},2,[171],{"type":20,"tag":157,"props":172,"children":174},{"emptyLinePlaceholder":173},true,[175],{"type":25,"value":176},"\n",{"type":20,"tag":157,"props":178,"children":180},{"class":159,"line":179},3,[181],{"type":20,"tag":157,"props":182,"children":183},{},[184],{"type":25,"value":185},"app = FastAPI()\n",{"type":20,"tag":157,"props":187,"children":189},{"class":159,"line":188},4,[190],{"type":20,"tag":157,"props":191,"children":192},{"emptyLinePlaceholder":173},[193],{"type":25,"value":176},{"type":20,"tag":157,"props":195,"children":197},{"class":159,"line":196},5,[198],{"type":20,"tag":157,"props":199,"children":200},{"emptyLinePlaceholder":173},[201],{"type":25,"value":176},{"type":20,"tag":157,"props":203,"children":205},{"class":159,"line":204},6,[206],{"type":20,"tag":157,"props":207,"children":208},{},[209],{"type":25,"value":210},"@app.get(\"\u002F\")\n",{"type":20,"tag":157,"props":212,"children":214},{"class":159,"line":213},7,[215],{"type":20,"tag":157,"props":216,"children":217},{},[218],{"type":25,"value":219},"def read_root():\n",{"type":20,"tag":157,"props":221,"children":223},{"class":159,"line":222},8,[224],{"type":20,"tag":157,"props":225,"children":226},{},[227],{"type":25,"value":228},"    return {\"message\": \"Hello FastAPI\"}\n",{"type":20,"tag":21,"props":230,"children":231},{},[232],{"type":25,"value":233},"启动：",{"type":20,"tag":126,"props":235,"children":239},{"code":236,"language":237,"meta":8,"className":238,"style":8},"uvicorn main:app --reload\n","bash","language-bash shiki shiki-themes github-dark",[240],{"type":20,"tag":84,"props":241,"children":242},{"__ignoreMap":8},[243],{"type":20,"tag":157,"props":244,"children":245},{"class":159,"line":160},[246,252,258],{"type":20,"tag":157,"props":247,"children":249},{"style":248},"--shiki-default:#B392F0",[250],{"type":25,"value":251},"uvicorn",{"type":20,"tag":157,"props":253,"children":255},{"style":254},"--shiki-default:#9ECBFF",[256],{"type":25,"value":257}," main:app",{"type":20,"tag":157,"props":259,"children":261},{"style":260},"--shiki-default:#79B8FF",[262],{"type":25,"value":263}," --reload\n",{"type":20,"tag":21,"props":265,"children":266},{},[267],{"type":25,"value":268},"含义：",{"type":20,"tag":44,"props":270,"children":271},{},[272,288,305],{"type":20,"tag":48,"props":273,"children":274},{},[275,281,283],{"type":20,"tag":84,"props":276,"children":278},{"className":277},[],[279],{"type":25,"value":280},"main",{"type":25,"value":282},"：文件名 ",{"type":20,"tag":84,"props":284,"children":286},{"className":285},[],[287],{"type":25,"value":144},{"type":20,"tag":48,"props":289,"children":290},{},[291,297,299],{"type":20,"tag":84,"props":292,"children":294},{"className":293},[],[295],{"type":25,"value":296},"app",{"type":25,"value":298},"：代码里的 ",{"type":20,"tag":84,"props":300,"children":302},{"className":301},[],[303],{"type":25,"value":304},"app = FastAPI()",{"type":20,"tag":48,"props":306,"children":307},{},[308,314],{"type":20,"tag":84,"props":309,"children":311},{"className":310},[],[312],{"type":25,"value":313},"--reload",{"type":25,"value":315},"：开发模式，代码变化自动重启",{"type":20,"tag":21,"props":317,"children":318},{},[319],{"type":25,"value":320},"访问：",{"type":20,"tag":126,"props":322,"children":325},{"code":323,"language":25,"meta":8,"className":324,"style":8},"http:\u002F\u002F127.0.0.1:8000\u002F\nhttp:\u002F\u002F127.0.0.1:8000\u002Fdocs\n","language-text shiki shiki-themes github-dark",[326],{"type":20,"tag":84,"props":327,"children":328},{"__ignoreMap":8},[329,337],{"type":20,"tag":157,"props":330,"children":331},{"class":159,"line":160},[332],{"type":20,"tag":157,"props":333,"children":334},{},[335],{"type":25,"value":336},"http:\u002F\u002F127.0.0.1:8000\u002F\n",{"type":20,"tag":157,"props":338,"children":339},{"class":159,"line":169},[340],{"type":20,"tag":157,"props":341,"children":342},{},[343],{"type":25,"value":344},"http:\u002F\u002F127.0.0.1:8000\u002Fdocs\n",{"type":20,"tag":21,"props":346,"children":347},{},[348,353],{"type":20,"tag":84,"props":349,"children":351},{"className":350},[],[352],{"type":25,"value":97},{"type":25,"value":354}," 是自动生成的接口调试页面。",{"type":20,"tag":28,"props":356,"children":358},{"id":357},"_3-路由get-post-put-delete",[359],{"type":20,"tag":33,"props":360,"children":361},{},[362],{"type":25,"value":363},"3. 路由：GET \u002F POST \u002F PUT \u002F DELETE",{"type":20,"tag":21,"props":365,"children":366},{},[367],{"type":25,"value":368},"路由就是“URL + HTTP 方法”。",{"type":20,"tag":126,"props":370,"children":372},{"code":371,"language":150,"meta":8,"className":151,"style":8},"@app.get(\"\u002Fhealth\")\ndef health():\n    return {\"status\": \"ok\"}\n\n\n@app.post(\"\u002Fitems\")\ndef create_item():\n    return {\"message\": \"created\"}\n\n\n@app.put(\"\u002Fitems\u002F{item_id}\")\ndef update_item(item_id: int):\n    return {\"item_id\": item_id, \"message\": \"updated\"}\n\n\n@app.delete(\"\u002Fitems\u002F{item_id}\")\ndef delete_item(item_id: int):\n    return {\"item_id\": item_id, \"message\": \"deleted\"}\n",[373],{"type":20,"tag":84,"props":374,"children":375},{"__ignoreMap":8},[376,384,392,400,407,414,422,430,438,446,454,463,472,481,489,497,506,515],{"type":20,"tag":157,"props":377,"children":378},{"class":159,"line":160},[379],{"type":20,"tag":157,"props":380,"children":381},{},[382],{"type":25,"value":383},"@app.get(\"\u002Fhealth\")\n",{"type":20,"tag":157,"props":385,"children":386},{"class":159,"line":169},[387],{"type":20,"tag":157,"props":388,"children":389},{},[390],{"type":25,"value":391},"def health():\n",{"type":20,"tag":157,"props":393,"children":394},{"class":159,"line":179},[395],{"type":20,"tag":157,"props":396,"children":397},{},[398],{"type":25,"value":399},"    return {\"status\": \"ok\"}\n",{"type":20,"tag":157,"props":401,"children":402},{"class":159,"line":188},[403],{"type":20,"tag":157,"props":404,"children":405},{"emptyLinePlaceholder":173},[406],{"type":25,"value":176},{"type":20,"tag":157,"props":408,"children":409},{"class":159,"line":196},[410],{"type":20,"tag":157,"props":411,"children":412},{"emptyLinePlaceholder":173},[413],{"type":25,"value":176},{"type":20,"tag":157,"props":415,"children":416},{"class":159,"line":204},[417],{"type":20,"tag":157,"props":418,"children":419},{},[420],{"type":25,"value":421},"@app.post(\"\u002Fitems\")\n",{"type":20,"tag":157,"props":423,"children":424},{"class":159,"line":213},[425],{"type":20,"tag":157,"props":426,"children":427},{},[428],{"type":25,"value":429},"def create_item():\n",{"type":20,"tag":157,"props":431,"children":432},{"class":159,"line":222},[433],{"type":20,"tag":157,"props":434,"children":435},{},[436],{"type":25,"value":437},"    return {\"message\": \"created\"}\n",{"type":20,"tag":157,"props":439,"children":441},{"class":159,"line":440},9,[442],{"type":20,"tag":157,"props":443,"children":444},{"emptyLinePlaceholder":173},[445],{"type":25,"value":176},{"type":20,"tag":157,"props":447,"children":449},{"class":159,"line":448},10,[450],{"type":20,"tag":157,"props":451,"children":452},{"emptyLinePlaceholder":173},[453],{"type":25,"value":176},{"type":20,"tag":157,"props":455,"children":457},{"class":159,"line":456},11,[458],{"type":20,"tag":157,"props":459,"children":460},{},[461],{"type":25,"value":462},"@app.put(\"\u002Fitems\u002F{item_id}\")\n",{"type":20,"tag":157,"props":464,"children":466},{"class":159,"line":465},12,[467],{"type":20,"tag":157,"props":468,"children":469},{},[470],{"type":25,"value":471},"def update_item(item_id: int):\n",{"type":20,"tag":157,"props":473,"children":475},{"class":159,"line":474},13,[476],{"type":20,"tag":157,"props":477,"children":478},{},[479],{"type":25,"value":480},"    return {\"item_id\": item_id, \"message\": \"updated\"}\n",{"type":20,"tag":157,"props":482,"children":484},{"class":159,"line":483},14,[485],{"type":20,"tag":157,"props":486,"children":487},{"emptyLinePlaceholder":173},[488],{"type":25,"value":176},{"type":20,"tag":157,"props":490,"children":492},{"class":159,"line":491},15,[493],{"type":20,"tag":157,"props":494,"children":495},{"emptyLinePlaceholder":173},[496],{"type":25,"value":176},{"type":20,"tag":157,"props":498,"children":500},{"class":159,"line":499},16,[501],{"type":20,"tag":157,"props":502,"children":503},{},[504],{"type":25,"value":505},"@app.delete(\"\u002Fitems\u002F{item_id}\")\n",{"type":20,"tag":157,"props":507,"children":509},{"class":159,"line":508},17,[510],{"type":20,"tag":157,"props":511,"children":512},{},[513],{"type":25,"value":514},"def delete_item(item_id: int):\n",{"type":20,"tag":157,"props":516,"children":518},{"class":159,"line":517},18,[519],{"type":20,"tag":157,"props":520,"children":521},{},[522],{"type":25,"value":523},"    return {\"item_id\": item_id, \"message\": \"deleted\"}\n",{"type":20,"tag":21,"props":525,"children":526},{},[527],{"type":25,"value":528},"常见习惯：",{"type":20,"tag":44,"props":530,"children":531},{},[532,543,554,573],{"type":20,"tag":48,"props":533,"children":534},{},[535,541],{"type":20,"tag":84,"props":536,"children":538},{"className":537},[],[539],{"type":25,"value":540},"GET",{"type":25,"value":542},"：查询",{"type":20,"tag":48,"props":544,"children":545},{},[546,552],{"type":20,"tag":84,"props":547,"children":549},{"className":548},[],[550],{"type":25,"value":551},"POST",{"type":25,"value":553},"：创建或执行动作",{"type":20,"tag":48,"props":555,"children":556},{},[557,563,565,571],{"type":20,"tag":84,"props":558,"children":560},{"className":559},[],[561],{"type":25,"value":562},"PUT",{"type":25,"value":564}," \u002F ",{"type":20,"tag":84,"props":566,"children":568},{"className":567},[],[569],{"type":25,"value":570},"PATCH",{"type":25,"value":572},"：更新",{"type":20,"tag":48,"props":574,"children":575},{},[576,582],{"type":20,"tag":84,"props":577,"children":579},{"className":578},[],[580],{"type":25,"value":581},"DELETE",{"type":25,"value":583},"：删除",{"type":20,"tag":28,"props":585,"children":587},{"id":586},"_4-参数路径参数查询参数请求体",[588],{"type":20,"tag":33,"props":589,"children":590},{},[591],{"type":25,"value":592},"4. 参数：路径参数、查询参数、请求体",{"type":20,"tag":21,"props":594,"children":595},{},[596],{"type":25,"value":597},"路径参数来自 URL 中间(常用于查询单个 item)：",{"type":20,"tag":126,"props":599,"children":601},{"code":600,"language":150,"meta":8,"className":151,"style":8},"@app.get(\"\u002Fitems\u002F{item_id}\")\ndef get_item(item_id: int):\n    return {\"item_id\": item_id}\n",[602],{"type":20,"tag":84,"props":603,"children":604},{"__ignoreMap":8},[605,613,621],{"type":20,"tag":157,"props":606,"children":607},{"class":159,"line":160},[608],{"type":20,"tag":157,"props":609,"children":610},{},[611],{"type":25,"value":612},"@app.get(\"\u002Fitems\u002F{item_id}\")\n",{"type":20,"tag":157,"props":614,"children":615},{"class":159,"line":169},[616],{"type":20,"tag":157,"props":617,"children":618},{},[619],{"type":25,"value":620},"def get_item(item_id: int):\n",{"type":20,"tag":157,"props":622,"children":623},{"class":159,"line":179},[624],{"type":20,"tag":157,"props":625,"children":626},{},[627],{"type":25,"value":628},"    return {\"item_id\": item_id}\n",{"type":20,"tag":21,"props":630,"children":631},{},[632],{"type":25,"value":320},{"type":20,"tag":126,"props":634,"children":636},{"code":635,"language":25,"meta":8,"className":324,"style":8},"\u002Fitems\u002F123\n",[637],{"type":20,"tag":84,"props":638,"children":639},{"__ignoreMap":8},[640],{"type":20,"tag":157,"props":641,"children":642},{"class":159,"line":160},[643],{"type":20,"tag":157,"props":644,"children":645},{},[646],{"type":25,"value":635},{"type":20,"tag":21,"props":648,"children":649},{},[650,652,658,660,666,668,674],{"type":25,"value":651},"FastAPI 会自动把 ",{"type":20,"tag":84,"props":653,"children":655},{"className":654},[],[656],{"type":25,"value":657},"\"123\"",{"type":25,"value":659}," 转成 ",{"type":20,"tag":84,"props":661,"children":663},{"className":662},[],[664],{"type":25,"value":665},"int",{"type":25,"value":667},"。如果传 ",{"type":20,"tag":84,"props":669,"children":671},{"className":670},[],[672],{"type":25,"value":673},"\u002Fitems\u002Fabc",{"type":25,"value":675},"，会自动报参数错误。",{"type":20,"tag":21,"props":677,"children":678},{},[679,681,687],{"type":25,"value":680},"查询参数来自 ",{"type":20,"tag":84,"props":682,"children":684},{"className":683},[],[685],{"type":25,"value":686},"?",{"type":25,"value":688}," 后面(常用于查询 item 列表)：",{"type":20,"tag":126,"props":690,"children":692},{"code":691,"language":150,"meta":8,"className":151,"style":8},"@app.get(\"\u002Fsearch\")\ndef search(q: str, limit: int = 10):\n    return {\"q\": q, \"limit\": limit}\n",[693],{"type":20,"tag":84,"props":694,"children":695},{"__ignoreMap":8},[696,704,712],{"type":20,"tag":157,"props":697,"children":698},{"class":159,"line":160},[699],{"type":20,"tag":157,"props":700,"children":701},{},[702],{"type":25,"value":703},"@app.get(\"\u002Fsearch\")\n",{"type":20,"tag":157,"props":705,"children":706},{"class":159,"line":169},[707],{"type":20,"tag":157,"props":708,"children":709},{},[710],{"type":25,"value":711},"def search(q: str, limit: int = 10):\n",{"type":20,"tag":157,"props":713,"children":714},{"class":159,"line":179},[715],{"type":20,"tag":157,"props":716,"children":717},{},[718],{"type":25,"value":719},"    return {\"q\": q, \"limit\": limit}\n",{"type":20,"tag":21,"props":721,"children":722},{},[723],{"type":25,"value":320},{"type":20,"tag":126,"props":725,"children":727},{"code":726,"language":25,"meta":8,"className":324,"style":8},"\u002Fsearch?q=aspirin&limit=5\n",[728],{"type":20,"tag":84,"props":729,"children":730},{"__ignoreMap":8},[731],{"type":20,"tag":157,"props":732,"children":733},{"class":159,"line":160},[734],{"type":20,"tag":157,"props":735,"children":736},{},[737],{"type":25,"value":726},{"type":20,"tag":21,"props":739,"children":740},{},[741,743,748,750,757],{"type":25,"value":742},"请求体一般用于 ",{"type":20,"tag":84,"props":744,"children":746},{"className":745},[],[747],{"type":25,"value":551},{"type":25,"value":749},"，用 Pydantic 模型声明。官方文档也强调，Pydantic 模型会被 FastAPI 识别为 request body。参考：",{"type":20,"tag":101,"props":751,"children":754},{"href":752,"rel":753},"https:\u002F\u002Ffastapi.tiangolo.com\u002Ftutorial\u002Fbody\u002F",[105],[755],{"type":25,"value":756},"FastAPI Request Body",{"type":25,"value":110},{"type":20,"tag":126,"props":759,"children":761},{"code":760,"language":150,"meta":8,"className":151,"style":8},"from pydantic import BaseModel\n\n\nclass MoleculeRequest(BaseModel):\n    smiles: str\n    name: str | None = None\n\n\n@app.post(\"\u002Fmolecules\")\ndef create_molecule(data: MoleculeRequest):\n    return {\n        \"smiles\": data.smiles,\n        \"name\": data.name,\n    }\n",[762],{"type":20,"tag":84,"props":763,"children":764},{"__ignoreMap":8},[765,773,780,787,795,803,811,818,825,833,841,849,857,865],{"type":20,"tag":157,"props":766,"children":767},{"class":159,"line":160},[768],{"type":20,"tag":157,"props":769,"children":770},{},[771],{"type":25,"value":772},"from pydantic import BaseModel\n",{"type":20,"tag":157,"props":774,"children":775},{"class":159,"line":169},[776],{"type":20,"tag":157,"props":777,"children":778},{"emptyLinePlaceholder":173},[779],{"type":25,"value":176},{"type":20,"tag":157,"props":781,"children":782},{"class":159,"line":179},[783],{"type":20,"tag":157,"props":784,"children":785},{"emptyLinePlaceholder":173},[786],{"type":25,"value":176},{"type":20,"tag":157,"props":788,"children":789},{"class":159,"line":188},[790],{"type":20,"tag":157,"props":791,"children":792},{},[793],{"type":25,"value":794},"class MoleculeRequest(BaseModel):\n",{"type":20,"tag":157,"props":796,"children":797},{"class":159,"line":196},[798],{"type":20,"tag":157,"props":799,"children":800},{},[801],{"type":25,"value":802},"    smiles: str\n",{"type":20,"tag":157,"props":804,"children":805},{"class":159,"line":204},[806],{"type":20,"tag":157,"props":807,"children":808},{},[809],{"type":25,"value":810},"    name: str | None = None\n",{"type":20,"tag":157,"props":812,"children":813},{"class":159,"line":213},[814],{"type":20,"tag":157,"props":815,"children":816},{"emptyLinePlaceholder":173},[817],{"type":25,"value":176},{"type":20,"tag":157,"props":819,"children":820},{"class":159,"line":222},[821],{"type":20,"tag":157,"props":822,"children":823},{"emptyLinePlaceholder":173},[824],{"type":25,"value":176},{"type":20,"tag":157,"props":826,"children":827},{"class":159,"line":440},[828],{"type":20,"tag":157,"props":829,"children":830},{},[831],{"type":25,"value":832},"@app.post(\"\u002Fmolecules\")\n",{"type":20,"tag":157,"props":834,"children":835},{"class":159,"line":448},[836],{"type":20,"tag":157,"props":837,"children":838},{},[839],{"type":25,"value":840},"def create_molecule(data: MoleculeRequest):\n",{"type":20,"tag":157,"props":842,"children":843},{"class":159,"line":456},[844],{"type":20,"tag":157,"props":845,"children":846},{},[847],{"type":25,"value":848},"    return {\n",{"type":20,"tag":157,"props":850,"children":851},{"class":159,"line":465},[852],{"type":20,"tag":157,"props":853,"children":854},{},[855],{"type":25,"value":856},"        \"smiles\": data.smiles,\n",{"type":20,"tag":157,"props":858,"children":859},{"class":159,"line":474},[860],{"type":20,"tag":157,"props":861,"children":862},{},[863],{"type":25,"value":864},"        \"name\": data.name,\n",{"type":20,"tag":157,"props":866,"children":867},{"class":159,"line":483},[868],{"type":20,"tag":157,"props":869,"children":870},{},[871],{"type":25,"value":872},"    }\n",{"type":20,"tag":21,"props":874,"children":875},{},[876],{"type":25,"value":877},"请求 JSON：",{"type":20,"tag":126,"props":879,"children":883},{"code":880,"language":881,"meta":8,"className":882,"style":8},"{\n  \"smiles\": \"CCO\",\n  \"name\": \"ethanol\"\n}\n","json","language-json shiki shiki-themes github-dark",[884],{"type":20,"tag":84,"props":885,"children":886},{"__ignoreMap":8},[887,896,919,936],{"type":20,"tag":157,"props":888,"children":889},{"class":159,"line":160},[890],{"type":20,"tag":157,"props":891,"children":893},{"style":892},"--shiki-default:#E1E4E8",[894],{"type":25,"value":895},"{\n",{"type":20,"tag":157,"props":897,"children":898},{"class":159,"line":169},[899,904,909,914],{"type":20,"tag":157,"props":900,"children":901},{"style":260},[902],{"type":25,"value":903},"  \"smiles\"",{"type":20,"tag":157,"props":905,"children":906},{"style":892},[907],{"type":25,"value":908},": ",{"type":20,"tag":157,"props":910,"children":911},{"style":254},[912],{"type":25,"value":913},"\"CCO\"",{"type":20,"tag":157,"props":915,"children":916},{"style":892},[917],{"type":25,"value":918},",\n",{"type":20,"tag":157,"props":920,"children":921},{"class":159,"line":179},[922,927,931],{"type":20,"tag":157,"props":923,"children":924},{"style":260},[925],{"type":25,"value":926},"  \"name\"",{"type":20,"tag":157,"props":928,"children":929},{"style":892},[930],{"type":25,"value":908},{"type":20,"tag":157,"props":932,"children":933},{"style":254},[934],{"type":25,"value":935},"\"ethanol\"\n",{"type":20,"tag":157,"props":937,"children":938},{"class":159,"line":188},[939],{"type":20,"tag":157,"props":940,"children":941},{"style":892},[942],{"type":25,"value":943},"}\n",{"type":20,"tag":28,"props":945,"children":947},{"id":946},"_5-返回-json",[948],{"type":20,"tag":33,"props":949,"children":950},{},[951],{"type":25,"value":952},"5. 返回 JSON",{"type":20,"tag":21,"props":954,"children":955},{},[956,958,964,966,972],{"type":25,"value":957},"你直接返回 ",{"type":20,"tag":84,"props":959,"children":961},{"className":960},[],[962],{"type":25,"value":963},"dict",{"type":25,"value":965},"、",{"type":20,"tag":84,"props":967,"children":969},{"className":968},[],[970],{"type":25,"value":971},"list",{"type":25,"value":973},"、Pydantic model，FastAPI 会自动转成 JSON：",{"type":20,"tag":126,"props":975,"children":977},{"code":976,"language":150,"meta":8,"className":151,"style":8},"@app.get(\"\u002Fmolecules\")\ndef list_molecules():\n    return [\n        {\"name\": \"ethanol\", \"smiles\": \"CCO\"},\n        {\"name\": \"aspirin\", \"smiles\": \"CC(=O)Oc1ccccc1C(=O)O\"},\n    ]\n",[978],{"type":20,"tag":84,"props":979,"children":980},{"__ignoreMap":8},[981,989,997,1005,1013,1021],{"type":20,"tag":157,"props":982,"children":983},{"class":159,"line":160},[984],{"type":20,"tag":157,"props":985,"children":986},{},[987],{"type":25,"value":988},"@app.get(\"\u002Fmolecules\")\n",{"type":20,"tag":157,"props":990,"children":991},{"class":159,"line":169},[992],{"type":20,"tag":157,"props":993,"children":994},{},[995],{"type":25,"value":996},"def list_molecules():\n",{"type":20,"tag":157,"props":998,"children":999},{"class":159,"line":179},[1000],{"type":20,"tag":157,"props":1001,"children":1002},{},[1003],{"type":25,"value":1004},"    return [\n",{"type":20,"tag":157,"props":1006,"children":1007},{"class":159,"line":188},[1008],{"type":20,"tag":157,"props":1009,"children":1010},{},[1011],{"type":25,"value":1012},"        {\"name\": \"ethanol\", \"smiles\": \"CCO\"},\n",{"type":20,"tag":157,"props":1014,"children":1015},{"class":159,"line":196},[1016],{"type":20,"tag":157,"props":1017,"children":1018},{},[1019],{"type":25,"value":1020},"        {\"name\": \"aspirin\", \"smiles\": \"CC(=O)Oc1ccccc1C(=O)O\"},\n",{"type":20,"tag":157,"props":1022,"children":1023},{"class":159,"line":204},[1024],{"type":20,"tag":157,"props":1025,"children":1026},{},[1027],{"type":25,"value":1028},"    ]\n",{"type":20,"tag":28,"props":1030,"children":1032},{"id":1031},"_6-主动返回错误",[1033],{"type":20,"tag":33,"props":1034,"children":1035},{},[1036],{"type":25,"value":1037},"6. 主动返回错误",{"type":20,"tag":21,"props":1039,"children":1040},{},[1041,1043,1049,1051,1057],{"type":25,"value":1042},"接口里不要用普通 ",{"type":20,"tag":84,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":25,"value":1048},"return {\"error\": ...}",{"type":25,"value":1050}," 混过去，应该用 ",{"type":20,"tag":84,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":25,"value":1056},"HTTPException",{"type":25,"value":146},{"type":20,"tag":126,"props":1059,"children":1061},{"code":1060,"language":150,"meta":8,"className":151,"style":8},"from fastapi import HTTPException\n\n\n@app.get(\"\u002Fmolecules\u002F{molecule_id}\")\ndef get_molecule(molecule_id: int):\n    if molecule_id \u003C= 0:\n        raise HTTPException(status_code=400, detail=\"molecule_id must be positive\")\n\n    return {\"id\": molecule_id}\n",[1062],{"type":20,"tag":84,"props":1063,"children":1064},{"__ignoreMap":8},[1065,1073,1080,1087,1095,1103,1111,1119,1126],{"type":20,"tag":157,"props":1066,"children":1067},{"class":159,"line":160},[1068],{"type":20,"tag":157,"props":1069,"children":1070},{},[1071],{"type":25,"value":1072},"from fastapi import HTTPException\n",{"type":20,"tag":157,"props":1074,"children":1075},{"class":159,"line":169},[1076],{"type":20,"tag":157,"props":1077,"children":1078},{"emptyLinePlaceholder":173},[1079],{"type":25,"value":176},{"type":20,"tag":157,"props":1081,"children":1082},{"class":159,"line":179},[1083],{"type":20,"tag":157,"props":1084,"children":1085},{"emptyLinePlaceholder":173},[1086],{"type":25,"value":176},{"type":20,"tag":157,"props":1088,"children":1089},{"class":159,"line":188},[1090],{"type":20,"tag":157,"props":1091,"children":1092},{},[1093],{"type":25,"value":1094},"@app.get(\"\u002Fmolecules\u002F{molecule_id}\")\n",{"type":20,"tag":157,"props":1096,"children":1097},{"class":159,"line":196},[1098],{"type":20,"tag":157,"props":1099,"children":1100},{},[1101],{"type":25,"value":1102},"def get_molecule(molecule_id: int):\n",{"type":20,"tag":157,"props":1104,"children":1105},{"class":159,"line":204},[1106],{"type":20,"tag":157,"props":1107,"children":1108},{},[1109],{"type":25,"value":1110},"    if molecule_id \u003C= 0:\n",{"type":20,"tag":157,"props":1112,"children":1113},{"class":159,"line":213},[1114],{"type":20,"tag":157,"props":1115,"children":1116},{},[1117],{"type":25,"value":1118},"        raise HTTPException(status_code=400, detail=\"molecule_id must be positive\")\n",{"type":20,"tag":157,"props":1120,"children":1121},{"class":159,"line":222},[1122],{"type":20,"tag":157,"props":1123,"children":1124},{"emptyLinePlaceholder":173},[1125],{"type":25,"value":176},{"type":20,"tag":157,"props":1127,"children":1128},{"class":159,"line":440},[1129],{"type":20,"tag":157,"props":1130,"children":1131},{},[1132],{"type":25,"value":1133},"    return {\"id\": molecule_id}\n",{"type":20,"tag":21,"props":1135,"children":1136},{},[1137],{"type":25,"value":1138},"常见状态码：",{"type":20,"tag":44,"props":1140,"children":1141},{},[1142,1153,1164,1175,1186,1197,1208],{"type":20,"tag":48,"props":1143,"children":1144},{},[1145,1151],{"type":20,"tag":84,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":25,"value":1150},"200",{"type":25,"value":1152},"：成功",{"type":20,"tag":48,"props":1154,"children":1155},{},[1156,1162],{"type":20,"tag":84,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":25,"value":1161},"201",{"type":25,"value":1163},"：创建成功",{"type":20,"tag":48,"props":1165,"children":1166},{},[1167,1173],{"type":20,"tag":84,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":25,"value":1172},"400",{"type":25,"value":1174},"：请求参数不合法",{"type":20,"tag":48,"props":1176,"children":1177},{},[1178,1184],{"type":20,"tag":84,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":25,"value":1183},"401",{"type":25,"value":1185},"：未登录",{"type":20,"tag":48,"props":1187,"children":1188},{},[1189,1195],{"type":20,"tag":84,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":25,"value":1194},"403",{"type":25,"value":1196},"：无权限",{"type":20,"tag":48,"props":1198,"children":1199},{},[1200,1206],{"type":20,"tag":84,"props":1201,"children":1203},{"className":1202},[],[1204],{"type":25,"value":1205},"404",{"type":25,"value":1207},"：资源不存在",{"type":20,"tag":48,"props":1209,"children":1210},{},[1211,1217],{"type":20,"tag":84,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":25,"value":1216},"500",{"type":25,"value":1218},"：服务端错误",{"type":20,"tag":28,"props":1220,"children":1222},{"id":1221},"_7-async-和普通-def",[1223],{"type":20,"tag":33,"props":1224,"children":1225},{},[1226],{"type":25,"value":1227},"7. async 和普通 def",{"type":20,"tag":21,"props":1229,"children":1230},{},[1231],{"type":25,"value":1232},"两种都能写：",{"type":20,"tag":126,"props":1234,"children":1236},{"code":1235,"language":150,"meta":8,"className":151,"style":8},"@app.get(\"\u002Fsync\")\ndef sync_api():\n    return {\"mode\": \"sync\"}\n\n\n@app.get(\"\u002Fasync\")\nasync def async_api():\n    return {\"mode\": \"async\"}\n",[1237],{"type":20,"tag":84,"props":1238,"children":1239},{"__ignoreMap":8},[1240,1248,1256,1264,1271,1278,1286,1294],{"type":20,"tag":157,"props":1241,"children":1242},{"class":159,"line":160},[1243],{"type":20,"tag":157,"props":1244,"children":1245},{},[1246],{"type":25,"value":1247},"@app.get(\"\u002Fsync\")\n",{"type":20,"tag":157,"props":1249,"children":1250},{"class":159,"line":169},[1251],{"type":20,"tag":157,"props":1252,"children":1253},{},[1254],{"type":25,"value":1255},"def sync_api():\n",{"type":20,"tag":157,"props":1257,"children":1258},{"class":159,"line":179},[1259],{"type":20,"tag":157,"props":1260,"children":1261},{},[1262],{"type":25,"value":1263},"    return {\"mode\": \"sync\"}\n",{"type":20,"tag":157,"props":1265,"children":1266},{"class":159,"line":188},[1267],{"type":20,"tag":157,"props":1268,"children":1269},{"emptyLinePlaceholder":173},[1270],{"type":25,"value":176},{"type":20,"tag":157,"props":1272,"children":1273},{"class":159,"line":196},[1274],{"type":20,"tag":157,"props":1275,"children":1276},{"emptyLinePlaceholder":173},[1277],{"type":25,"value":176},{"type":20,"tag":157,"props":1279,"children":1280},{"class":159,"line":204},[1281],{"type":20,"tag":157,"props":1282,"children":1283},{},[1284],{"type":25,"value":1285},"@app.get(\"\u002Fasync\")\n",{"type":20,"tag":157,"props":1287,"children":1288},{"class":159,"line":213},[1289],{"type":20,"tag":157,"props":1290,"children":1291},{},[1292],{"type":25,"value":1293},"async def async_api():\n",{"type":20,"tag":157,"props":1295,"children":1296},{"class":159,"line":222},[1297],{"type":20,"tag":157,"props":1298,"children":1299},{},[1300],{"type":25,"value":1301},"    return {\"mode\": \"async\"}\n",{"type":20,"tag":21,"props":1303,"children":1304},{},[1305],{"type":25,"value":1306},"简单理解：",{"type":20,"tag":44,"props":1308,"children":1309},{},[1310,1321],{"type":20,"tag":48,"props":1311,"children":1312},{},[1313,1315],{"type":25,"value":1314},"普通计算、调用同步库：用 ",{"type":20,"tag":84,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":25,"value":1320},"def",{"type":20,"tag":48,"props":1322,"children":1323},{},[1324,1326],{"type":25,"value":1325},"调数据库、HTTP 请求、文件 IO，并且库支持 async：用 ",{"type":20,"tag":84,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":25,"value":1331},"async def",{"type":20,"tag":21,"props":1333,"children":1334},{},[1335,1337,1342,1344,1350],{"type":25,"value":1336},"初学阶段先用 ",{"type":20,"tag":84,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":25,"value":1320},{"type":25,"value":1343}," 就够了，别为了“看起来高级”乱用 ",{"type":20,"tag":84,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":25,"value":1349},"async",{"type":25,"value":110},{"type":20,"tag":28,"props":1352,"children":1354},{"id":1353},"一个完整基础例子",[1355],{"type":20,"tag":33,"props":1356,"children":1357},{},[1358],{"type":25,"value":1353},{"type":20,"tag":126,"props":1360,"children":1362},{"code":1361,"language":150,"meta":8,"className":151,"style":8},"from fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel, Field\n\napp = FastAPI(title=\"Drug Discovery API\")\n\n\nclass SmilesRequest(BaseModel):\n    smiles: str = Field(min_length=1)\n\n\n@app.get(\"\u002Fhealth\")\ndef health():\n    return {\"status\": \"ok\"}\n\n\n@app.get(\"\u002Fmolecules\u002F{molecule_id}\")\ndef get_molecule(molecule_id: int):\n    if molecule_id \u003C= 0:\n        raise HTTPException(status_code=400, detail=\"molecule_id must be positive\")\n\n    return {\n        \"id\": molecule_id,\n        \"name\": \"ethanol\",\n        \"smiles\": \"CCO\",\n    }\n\n\n@app.get(\"\u002Fsearch\")\ndef search_molecules(q: str, limit: int = 10):\n    return {\n        \"query\": q,\n        \"limit\": limit,\n        \"results\": [],\n    }\n\n\n@app.post(\"\u002Fsmiles\u002Fvalidate\")\ndef validate_smiles(data: SmilesRequest):\n    is_valid = data.smiles.strip() != \"\"\n\n    return {\n        \"smiles\": data.smiles,\n        \"is_valid\": is_valid,\n    }\n",[1363],{"type":20,"tag":84,"props":1364,"children":1365},{"__ignoreMap":8},[1366,1374,1382,1389,1397,1404,1411,1419,1427,1434,1441,1448,1455,1462,1469,1476,1483,1490,1497,1505,1513,1521,1530,1539,1548,1556,1564,1572,1580,1589,1597,1606,1615,1624,1632,1640,1648,1657,1666,1675,1683,1691,1699,1708],{"type":20,"tag":157,"props":1367,"children":1368},{"class":159,"line":160},[1369],{"type":20,"tag":157,"props":1370,"children":1371},{},[1372],{"type":25,"value":1373},"from fastapi import FastAPI, HTTPException\n",{"type":20,"tag":157,"props":1375,"children":1376},{"class":159,"line":169},[1377],{"type":20,"tag":157,"props":1378,"children":1379},{},[1380],{"type":25,"value":1381},"from pydantic import BaseModel, Field\n",{"type":20,"tag":157,"props":1383,"children":1384},{"class":159,"line":179},[1385],{"type":20,"tag":157,"props":1386,"children":1387},{"emptyLinePlaceholder":173},[1388],{"type":25,"value":176},{"type":20,"tag":157,"props":1390,"children":1391},{"class":159,"line":188},[1392],{"type":20,"tag":157,"props":1393,"children":1394},{},[1395],{"type":25,"value":1396},"app = FastAPI(title=\"Drug Discovery API\")\n",{"type":20,"tag":157,"props":1398,"children":1399},{"class":159,"line":196},[1400],{"type":20,"tag":157,"props":1401,"children":1402},{"emptyLinePlaceholder":173},[1403],{"type":25,"value":176},{"type":20,"tag":157,"props":1405,"children":1406},{"class":159,"line":204},[1407],{"type":20,"tag":157,"props":1408,"children":1409},{"emptyLinePlaceholder":173},[1410],{"type":25,"value":176},{"type":20,"tag":157,"props":1412,"children":1413},{"class":159,"line":213},[1414],{"type":20,"tag":157,"props":1415,"children":1416},{},[1417],{"type":25,"value":1418},"class SmilesRequest(BaseModel):\n",{"type":20,"tag":157,"props":1420,"children":1421},{"class":159,"line":222},[1422],{"type":20,"tag":157,"props":1423,"children":1424},{},[1425],{"type":25,"value":1426},"    smiles: str = Field(min_length=1)\n",{"type":20,"tag":157,"props":1428,"children":1429},{"class":159,"line":440},[1430],{"type":20,"tag":157,"props":1431,"children":1432},{"emptyLinePlaceholder":173},[1433],{"type":25,"value":176},{"type":20,"tag":157,"props":1435,"children":1436},{"class":159,"line":448},[1437],{"type":20,"tag":157,"props":1438,"children":1439},{"emptyLinePlaceholder":173},[1440],{"type":25,"value":176},{"type":20,"tag":157,"props":1442,"children":1443},{"class":159,"line":456},[1444],{"type":20,"tag":157,"props":1445,"children":1446},{},[1447],{"type":25,"value":383},{"type":20,"tag":157,"props":1449,"children":1450},{"class":159,"line":465},[1451],{"type":20,"tag":157,"props":1452,"children":1453},{},[1454],{"type":25,"value":391},{"type":20,"tag":157,"props":1456,"children":1457},{"class":159,"line":474},[1458],{"type":20,"tag":157,"props":1459,"children":1460},{},[1461],{"type":25,"value":399},{"type":20,"tag":157,"props":1463,"children":1464},{"class":159,"line":483},[1465],{"type":20,"tag":157,"props":1466,"children":1467},{"emptyLinePlaceholder":173},[1468],{"type":25,"value":176},{"type":20,"tag":157,"props":1470,"children":1471},{"class":159,"line":491},[1472],{"type":20,"tag":157,"props":1473,"children":1474},{"emptyLinePlaceholder":173},[1475],{"type":25,"value":176},{"type":20,"tag":157,"props":1477,"children":1478},{"class":159,"line":499},[1479],{"type":20,"tag":157,"props":1480,"children":1481},{},[1482],{"type":25,"value":1094},{"type":20,"tag":157,"props":1484,"children":1485},{"class":159,"line":508},[1486],{"type":20,"tag":157,"props":1487,"children":1488},{},[1489],{"type":25,"value":1102},{"type":20,"tag":157,"props":1491,"children":1492},{"class":159,"line":517},[1493],{"type":20,"tag":157,"props":1494,"children":1495},{},[1496],{"type":25,"value":1110},{"type":20,"tag":157,"props":1498,"children":1500},{"class":159,"line":1499},19,[1501],{"type":20,"tag":157,"props":1502,"children":1503},{},[1504],{"type":25,"value":1118},{"type":20,"tag":157,"props":1506,"children":1508},{"class":159,"line":1507},20,[1509],{"type":20,"tag":157,"props":1510,"children":1511},{"emptyLinePlaceholder":173},[1512],{"type":25,"value":176},{"type":20,"tag":157,"props":1514,"children":1516},{"class":159,"line":1515},21,[1517],{"type":20,"tag":157,"props":1518,"children":1519},{},[1520],{"type":25,"value":848},{"type":20,"tag":157,"props":1522,"children":1524},{"class":159,"line":1523},22,[1525],{"type":20,"tag":157,"props":1526,"children":1527},{},[1528],{"type":25,"value":1529},"        \"id\": molecule_id,\n",{"type":20,"tag":157,"props":1531,"children":1533},{"class":159,"line":1532},23,[1534],{"type":20,"tag":157,"props":1535,"children":1536},{},[1537],{"type":25,"value":1538},"        \"name\": \"ethanol\",\n",{"type":20,"tag":157,"props":1540,"children":1542},{"class":159,"line":1541},24,[1543],{"type":20,"tag":157,"props":1544,"children":1545},{},[1546],{"type":25,"value":1547},"        \"smiles\": \"CCO\",\n",{"type":20,"tag":157,"props":1549,"children":1551},{"class":159,"line":1550},25,[1552],{"type":20,"tag":157,"props":1553,"children":1554},{},[1555],{"type":25,"value":872},{"type":20,"tag":157,"props":1557,"children":1559},{"class":159,"line":1558},26,[1560],{"type":20,"tag":157,"props":1561,"children":1562},{"emptyLinePlaceholder":173},[1563],{"type":25,"value":176},{"type":20,"tag":157,"props":1565,"children":1567},{"class":159,"line":1566},27,[1568],{"type":20,"tag":157,"props":1569,"children":1570},{"emptyLinePlaceholder":173},[1571],{"type":25,"value":176},{"type":20,"tag":157,"props":1573,"children":1575},{"class":159,"line":1574},28,[1576],{"type":20,"tag":157,"props":1577,"children":1578},{},[1579],{"type":25,"value":703},{"type":20,"tag":157,"props":1581,"children":1583},{"class":159,"line":1582},29,[1584],{"type":20,"tag":157,"props":1585,"children":1586},{},[1587],{"type":25,"value":1588},"def search_molecules(q: str, limit: int = 10):\n",{"type":20,"tag":157,"props":1590,"children":1592},{"class":159,"line":1591},30,[1593],{"type":20,"tag":157,"props":1594,"children":1595},{},[1596],{"type":25,"value":848},{"type":20,"tag":157,"props":1598,"children":1600},{"class":159,"line":1599},31,[1601],{"type":20,"tag":157,"props":1602,"children":1603},{},[1604],{"type":25,"value":1605},"        \"query\": q,\n",{"type":20,"tag":157,"props":1607,"children":1609},{"class":159,"line":1608},32,[1610],{"type":20,"tag":157,"props":1611,"children":1612},{},[1613],{"type":25,"value":1614},"        \"limit\": limit,\n",{"type":20,"tag":157,"props":1616,"children":1618},{"class":159,"line":1617},33,[1619],{"type":20,"tag":157,"props":1620,"children":1621},{},[1622],{"type":25,"value":1623},"        \"results\": [],\n",{"type":20,"tag":157,"props":1625,"children":1627},{"class":159,"line":1626},34,[1628],{"type":20,"tag":157,"props":1629,"children":1630},{},[1631],{"type":25,"value":872},{"type":20,"tag":157,"props":1633,"children":1635},{"class":159,"line":1634},35,[1636],{"type":20,"tag":157,"props":1637,"children":1638},{"emptyLinePlaceholder":173},[1639],{"type":25,"value":176},{"type":20,"tag":157,"props":1641,"children":1643},{"class":159,"line":1642},36,[1644],{"type":20,"tag":157,"props":1645,"children":1646},{"emptyLinePlaceholder":173},[1647],{"type":25,"value":176},{"type":20,"tag":157,"props":1649,"children":1651},{"class":159,"line":1650},37,[1652],{"type":20,"tag":157,"props":1653,"children":1654},{},[1655],{"type":25,"value":1656},"@app.post(\"\u002Fsmiles\u002Fvalidate\")\n",{"type":20,"tag":157,"props":1658,"children":1660},{"class":159,"line":1659},38,[1661],{"type":20,"tag":157,"props":1662,"children":1663},{},[1664],{"type":25,"value":1665},"def validate_smiles(data: SmilesRequest):\n",{"type":20,"tag":157,"props":1667,"children":1669},{"class":159,"line":1668},39,[1670],{"type":20,"tag":157,"props":1671,"children":1672},{},[1673],{"type":25,"value":1674},"    is_valid = data.smiles.strip() != \"\"\n",{"type":20,"tag":157,"props":1676,"children":1678},{"class":159,"line":1677},40,[1679],{"type":20,"tag":157,"props":1680,"children":1681},{"emptyLinePlaceholder":173},[1682],{"type":25,"value":176},{"type":20,"tag":157,"props":1684,"children":1686},{"class":159,"line":1685},41,[1687],{"type":20,"tag":157,"props":1688,"children":1689},{},[1690],{"type":25,"value":848},{"type":20,"tag":157,"props":1692,"children":1694},{"class":159,"line":1693},42,[1695],{"type":20,"tag":157,"props":1696,"children":1697},{},[1698],{"type":25,"value":856},{"type":20,"tag":157,"props":1700,"children":1702},{"class":159,"line":1701},43,[1703],{"type":20,"tag":157,"props":1704,"children":1705},{},[1706],{"type":25,"value":1707},"        \"is_valid\": is_valid,\n",{"type":20,"tag":157,"props":1709,"children":1711},{"class":159,"line":1710},44,[1712],{"type":20,"tag":157,"props":1713,"children":1714},{},[1715],{"type":25,"value":872},{"type":20,"tag":21,"props":1717,"children":1718},{},[1719],{"type":25,"value":1720},"你现在只需要掌握这条主线：",{"type":20,"tag":126,"props":1722,"children":1724},{"code":1723,"language":25,"meta":8,"className":324,"style":8},"定义 app\n-> 写路由\n-> 声明参数\n-> 用 Pydantic 接 JSON\n-> 返回 dict\n-> 用 HTTPException 报错\n-> 去 \u002Fdocs 测试\n",[1725],{"type":20,"tag":84,"props":1726,"children":1727},{"__ignoreMap":8},[1728,1736,1744,1752,1760,1768,1776],{"type":20,"tag":157,"props":1729,"children":1730},{"class":159,"line":160},[1731],{"type":20,"tag":157,"props":1732,"children":1733},{},[1734],{"type":25,"value":1735},"定义 app\n",{"type":20,"tag":157,"props":1737,"children":1738},{"class":159,"line":169},[1739],{"type":20,"tag":157,"props":1740,"children":1741},{},[1742],{"type":25,"value":1743},"-> 写路由\n",{"type":20,"tag":157,"props":1745,"children":1746},{"class":159,"line":179},[1747],{"type":20,"tag":157,"props":1748,"children":1749},{},[1750],{"type":25,"value":1751},"-> 声明参数\n",{"type":20,"tag":157,"props":1753,"children":1754},{"class":159,"line":188},[1755],{"type":20,"tag":157,"props":1756,"children":1757},{},[1758],{"type":25,"value":1759},"-> 用 Pydantic 接 JSON\n",{"type":20,"tag":157,"props":1761,"children":1762},{"class":159,"line":196},[1763],{"type":20,"tag":157,"props":1764,"children":1765},{},[1766],{"type":25,"value":1767},"-> 返回 dict\n",{"type":20,"tag":157,"props":1769,"children":1770},{"class":159,"line":204},[1771],{"type":20,"tag":157,"props":1772,"children":1773},{},[1774],{"type":25,"value":1775},"-> 用 HTTPException 报错\n",{"type":20,"tag":157,"props":1777,"children":1778},{"class":159,"line":213},[1779],{"type":20,"tag":157,"props":1780,"children":1781},{},[1782],{"type":25,"value":1783},"-> 去 \u002Fdocs 测试\n",{"type":20,"tag":1785,"props":1786,"children":1787},"style",{},[1788],{"type":25,"value":1789},"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);}",{"title":8,"searchDepth":169,"depth":169,"links":1791},[1792,1793,1794,1795,1796,1797,1798,1799],{"id":30,"depth":179,"text":37},{"id":113,"depth":179,"text":119},{"id":357,"depth":179,"text":363},{"id":586,"depth":179,"text":592},{"id":946,"depth":179,"text":952},{"id":1031,"depth":179,"text":1037},{"id":1221,"depth":179,"text":1227},{"id":1353,"depth":179,"text":1353},"markdown","content:articles:backend:FastAPI.md","content","articles\u002Fbackend\u002FFastAPI.md","articles\u002Fbackend\u002FFastAPI","md",{"_path":1807,"_dir":1808,"_draft":7,"_partial":7,"_locale":8,"title":1809,"description":1810,"date":1811,"tags":1812,"body":1815,"_type":1800,"_id":4981,"_source":1802,"_file":4982,"_stem":4983,"_extension":1805},"\u002Farticles\u002Fai\u002Frdkit-smiles-descriptors-fingerprints","ai","从 SMILES 到分子指纹：用 RDKit 把分子变成机器学习能读懂的向量","以 AI 制药平台项目为背景，梳理 SMILES、Mol 对象、Canonical SMILES、分子描述符、Morgan 指纹和 Tanimoto 相似度，理解 RDKit 如何把化学结构转成可用于检索、建模和预测的数字特征。","2026-05-21",[13,1813,1814],"生物信息学","AI制药",{"type":17,"children":1816,"toc":4966},[1817,1822,1827,1838,1843,1857,1862,1869,1874,1901,2031,2055,2060,2089,2101,2137,2142,2148,2153,2158,2172,2177,2333,2338,2343,2357,2362,2368,2373,2378,2425,2430,2435,2441,2454,2523,2533,2554,2559,2627,2632,2637,2695,2700,2779,2790,2796,2801,2805,2827,2832,2837,2924,2929,2943,2948,2954,2959,2971,3315,3320,3325,3331,3336,3341,3404,3409,3423,3428,3433,3628,3633,3797,3802,3807,3812,3817,3823,3828,3833,3872,3877,3882,3913,3918,3924,3929,3934,3939,3944,3967,3972,3977,4135,4148,4153,4252,4257,4263,4268,4273,4287,4292,4297,4444,4449,4454,4501,4506,4518,4523,4528,4782,4787,4826,4831,4836,4841,4846,4909,4914,4919,4924,4929,4962],{"type":20,"tag":21,"props":1818,"children":1819},{},[1820],{"type":25,"value":1821},"做 AI 制药项目时，第一道门槛不是模型，而是表示。",{"type":20,"tag":21,"props":1823,"children":1824},{},[1825],{"type":25,"value":1826},"模型不能直接理解“阿司匹林”“乙醇”或者课本上的二维结构图。它需要的是数字，是向量，是可以进入表格模型、神经网络或者相似性搜索系统的数据结构。",{"type":20,"tag":21,"props":1828,"children":1829},{},[1830,1832,1837],{"type":25,"value":1831},"这篇文章整理的是我做制药平台项目时前两周的核心笔记：",{"type":20,"tag":33,"props":1833,"children":1834},{},[1835],{"type":25,"value":1836},"SMILES、RDKit、Mol 对象、分子描述符、Morgan 指纹和 Tanimoto 相似度",{"type":25,"value":110},{"type":20,"tag":21,"props":1839,"children":1840},{},[1841],{"type":25,"value":1842},"如果用一句话概括，就是：",{"type":20,"tag":126,"props":1844,"children":1846},{"className":324,"code":1845,"language":25,"meta":8,"style":8},"SMILES 字符串 -> RDKit 解析 -> Mol 对象 -> 描述符 \u002F 指纹 -> 相似性搜索 \u002F 机器学习模型\n",[1847],{"type":20,"tag":84,"props":1848,"children":1849},{"__ignoreMap":8},[1850],{"type":20,"tag":157,"props":1851,"children":1852},{"class":159,"line":160},[1853],{"type":20,"tag":157,"props":1854,"children":1855},{},[1856],{"type":25,"value":1845},{"type":20,"tag":21,"props":1858,"children":1859},{},[1860],{"type":25,"value":1861},"这条链路看起来不长，但它是很多 AI 制药工程系统的起点。",{"type":20,"tag":1863,"props":1864,"children":1866},"h2",{"id":1865},"先把-python-环境管好",[1867],{"type":25,"value":1868},"先把 Python 环境管好",{"type":20,"tag":21,"props":1870,"children":1871},{},[1872],{"type":25,"value":1873},"在写 RDKit 代码之前，先处理一个很现实的问题：项目依赖怎么管理。",{"type":20,"tag":21,"props":1875,"children":1876},{},[1877,1879,1885,1887,1893,1894,1900],{"type":25,"value":1878},"我现在更习惯用 ",{"type":20,"tag":84,"props":1880,"children":1882},{"className":1881},[],[1883],{"type":25,"value":1884},"uv",{"type":25,"value":1886}," 管 Python 项目。可以把它类比成前端里的 ",{"type":20,"tag":84,"props":1888,"children":1890},{"className":1889},[],[1891],{"type":25,"value":1892},"npm",{"type":25,"value":564},{"type":20,"tag":84,"props":1895,"children":1897},{"className":1896},[],[1898],{"type":25,"value":1899},"pnpm",{"type":25,"value":146},{"type":20,"tag":1902,"props":1903,"children":1904},"table",{},[1905,1929],{"type":20,"tag":1906,"props":1907,"children":1908},"thead",{},[1909],{"type":20,"tag":1910,"props":1911,"children":1912},"tr",{},[1913,1919,1924],{"type":20,"tag":1914,"props":1915,"children":1916},"th",{},[1917],{"type":25,"value":1918},"Python 项目",{"type":20,"tag":1914,"props":1920,"children":1921},{},[1922],{"type":25,"value":1923},"前端项目",{"type":20,"tag":1914,"props":1925,"children":1926},{},[1927],{"type":25,"value":1928},"作用",{"type":20,"tag":1930,"props":1931,"children":1932},"tbody",{},[1933,1960,1993,2019],{"type":20,"tag":1910,"props":1934,"children":1935},{},[1936,1946,1955],{"type":20,"tag":1937,"props":1938,"children":1939},"td",{},[1940],{"type":20,"tag":84,"props":1941,"children":1943},{"className":1942},[],[1944],{"type":25,"value":1945},"pyproject.toml",{"type":20,"tag":1937,"props":1947,"children":1948},{},[1949],{"type":20,"tag":84,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":25,"value":1954},"package.json",{"type":20,"tag":1937,"props":1956,"children":1957},{},[1958],{"type":25,"value":1959},"声明项目需要什么依赖，以及大致版本范围",{"type":20,"tag":1910,"props":1961,"children":1962},{},[1963,1972,1988],{"type":20,"tag":1937,"props":1964,"children":1965},{},[1966],{"type":20,"tag":84,"props":1967,"children":1969},{"className":1968},[],[1970],{"type":25,"value":1971},"uv.lock",{"type":20,"tag":1937,"props":1973,"children":1974},{},[1975,1981,1982],{"type":20,"tag":84,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":25,"value":1980},"package-lock.json",{"type":25,"value":564},{"type":20,"tag":84,"props":1983,"children":1985},{"className":1984},[],[1986],{"type":25,"value":1987},"pnpm-lock.yaml",{"type":20,"tag":1937,"props":1989,"children":1990},{},[1991],{"type":25,"value":1992},"记录这次解析出的精确版本",{"type":20,"tag":1910,"props":1994,"children":1995},{},[1996,2005,2014],{"type":20,"tag":1937,"props":1997,"children":1998},{},[1999],{"type":20,"tag":84,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":25,"value":2004},".venv",{"type":20,"tag":1937,"props":2006,"children":2007},{},[2008],{"type":20,"tag":84,"props":2009,"children":2011},{"className":2010},[],[2012],{"type":25,"value":2013},"node_modules",{"type":20,"tag":1937,"props":2015,"children":2016},{},[2017],{"type":25,"value":2018},"当前项目真实可运行的依赖环境",{"type":20,"tag":1910,"props":2020,"children":2021},{},[2022,2025,2028],{"type":20,"tag":1937,"props":2023,"children":2024},{},[],{"type":20,"tag":1937,"props":2026,"children":2027},{},[],{"type":20,"tag":1937,"props":2029,"children":2030},{},[],{"type":20,"tag":21,"props":2032,"children":2033},{},[2034,2039,2041,2046,2048,2053],{"type":20,"tag":84,"props":2035,"children":2037},{"className":2036},[],[2038],{"type":25,"value":1945},{"type":25,"value":2040}," 负责说“我需要 RDKit、Pillow、NumPy 这些包，并且版本要在某个范围内”。",{"type":20,"tag":84,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":25,"value":1971},{"type":25,"value":2047}," 负责记录“这一次具体解析出了哪些版本”。",{"type":20,"tag":84,"props":2049,"children":2051},{"className":2050},[],[2052],{"type":25,"value":2004},{"type":25,"value":2054}," 里放的是当前项目实际运行时会用到的 Python 解释器和依赖包。",{"type":20,"tag":21,"props":2056,"children":2057},{},[2058],{"type":25,"value":2059},"所以运行脚本时，不要直接用系统 Python：",{"type":20,"tag":126,"props":2061,"children":2063},{"className":238,"code":2062,"language":237,"meta":8,"style":8},"python scripts\u002Fvalidate_smiles.py --smiles \"CCO\"\n",[2064],{"type":20,"tag":84,"props":2065,"children":2066},{"__ignoreMap":8},[2067],{"type":20,"tag":157,"props":2068,"children":2069},{"class":159,"line":160},[2070,2074,2079,2084],{"type":20,"tag":157,"props":2071,"children":2072},{"style":248},[2073],{"type":25,"value":150},{"type":20,"tag":157,"props":2075,"children":2076},{"style":254},[2077],{"type":25,"value":2078}," scripts\u002Fvalidate_smiles.py",{"type":20,"tag":157,"props":2080,"children":2081},{"style":260},[2082],{"type":25,"value":2083}," --smiles",{"type":20,"tag":157,"props":2085,"children":2086},{"style":254},[2087],{"type":25,"value":2088}," \"CCO\"\n",{"type":20,"tag":21,"props":2090,"children":2091},{},[2092,2094,2099],{"type":25,"value":2093},"更推荐让 ",{"type":20,"tag":84,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":25,"value":1884},{"type":25,"value":2100}," 使用项目自己的环境：",{"type":20,"tag":126,"props":2102,"children":2104},{"className":238,"code":2103,"language":237,"meta":8,"style":8},"uv run python scripts\u002Fvalidate_smiles.py --smiles \"CCO\"\n",[2105],{"type":20,"tag":84,"props":2106,"children":2107},{"__ignoreMap":8},[2108],{"type":20,"tag":157,"props":2109,"children":2110},{"class":159,"line":160},[2111,2115,2120,2125,2129,2133],{"type":20,"tag":157,"props":2112,"children":2113},{"style":248},[2114],{"type":25,"value":1884},{"type":20,"tag":157,"props":2116,"children":2117},{"style":254},[2118],{"type":25,"value":2119}," run",{"type":20,"tag":157,"props":2121,"children":2122},{"style":254},[2123],{"type":25,"value":2124}," python",{"type":20,"tag":157,"props":2126,"children":2127},{"style":254},[2128],{"type":25,"value":2078},{"type":20,"tag":157,"props":2130,"children":2131},{"style":260},[2132],{"type":25,"value":2083},{"type":20,"tag":157,"props":2134,"children":2135},{"style":254},[2136],{"type":25,"value":2088},{"type":20,"tag":21,"props":2138,"children":2139},{},[2140],{"type":25,"value":2141},"这件事看起来和化学没关系，但它决定了别人拉下项目之后能不能复现你的结果。做 AI 制药平台时，依赖版本、运行环境和数据处理链路本来就是系统的一部分。",{"type":20,"tag":1863,"props":2143,"children":2145},{"id":2144},"smiles把分子写成字符串",[2146],{"type":25,"value":2147},"SMILES：把分子写成字符串",{"type":20,"tag":21,"props":2149,"children":2150},{},[2151],{"type":25,"value":2152},"SMILES 可以理解成“分子的字符串表示”。",{"type":20,"tag":21,"props":2154,"children":2155},{},[2156],{"type":25,"value":2157},"比如乙醇可以写成：",{"type":20,"tag":126,"props":2159,"children":2161},{"className":324,"code":2160,"language":25,"meta":8,"style":8},"CCO\n",[2162],{"type":20,"tag":84,"props":2163,"children":2164},{"__ignoreMap":8},[2165],{"type":20,"tag":157,"props":2166,"children":2167},{"class":159,"line":160},[2168],{"type":20,"tag":157,"props":2169,"children":2170},{},[2171],{"type":25,"value":2160},{"type":20,"tag":21,"props":2173,"children":2174},{},[2175],{"type":25,"value":2176},"这串字符里，每个符号都有化学含义：",{"type":20,"tag":1902,"props":2178,"children":2179},{},[2180,2196],{"type":20,"tag":1906,"props":2181,"children":2182},{},[2183],{"type":20,"tag":1910,"props":2184,"children":2185},{},[2186,2191],{"type":20,"tag":1914,"props":2187,"children":2188},{},[2189],{"type":25,"value":2190},"符号",{"type":20,"tag":1914,"props":2192,"children":2193},{},[2194],{"type":25,"value":2195},"含义",{"type":20,"tag":1930,"props":2197,"children":2198},{},[2199,2216,2233,2250,2267,2284,2301,2314],{"type":20,"tag":1910,"props":2200,"children":2201},{},[2202,2211],{"type":20,"tag":1937,"props":2203,"children":2204},{},[2205],{"type":20,"tag":84,"props":2206,"children":2208},{"className":2207},[],[2209],{"type":25,"value":2210},"C",{"type":20,"tag":1937,"props":2212,"children":2213},{},[2214],{"type":25,"value":2215},"碳原子",{"type":20,"tag":1910,"props":2217,"children":2218},{},[2219,2228],{"type":20,"tag":1937,"props":2220,"children":2221},{},[2222],{"type":20,"tag":84,"props":2223,"children":2225},{"className":2224},[],[2226],{"type":25,"value":2227},"O",{"type":20,"tag":1937,"props":2229,"children":2230},{},[2231],{"type":25,"value":2232},"氧原子",{"type":20,"tag":1910,"props":2234,"children":2235},{},[2236,2245],{"type":20,"tag":1937,"props":2237,"children":2238},{},[2239],{"type":20,"tag":84,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":25,"value":2244},"N",{"type":20,"tag":1937,"props":2246,"children":2247},{},[2248],{"type":25,"value":2249},"氮原子",{"type":20,"tag":1910,"props":2251,"children":2252},{},[2253,2262],{"type":20,"tag":1937,"props":2254,"children":2255},{},[2256],{"type":20,"tag":84,"props":2257,"children":2259},{"className":2258},[],[2260],{"type":25,"value":2261},"=",{"type":20,"tag":1937,"props":2263,"children":2264},{},[2265],{"type":25,"value":2266},"双键",{"type":20,"tag":1910,"props":2268,"children":2269},{},[2270,2279],{"type":20,"tag":1937,"props":2271,"children":2272},{},[2273],{"type":20,"tag":84,"props":2274,"children":2276},{"className":2275},[],[2277],{"type":25,"value":2278},"#",{"type":20,"tag":1937,"props":2280,"children":2281},{},[2282],{"type":25,"value":2283},"三键",{"type":20,"tag":1910,"props":2285,"children":2286},{},[2287,2296],{"type":20,"tag":1937,"props":2288,"children":2289},{},[2290],{"type":20,"tag":84,"props":2291,"children":2293},{"className":2292},[],[2294],{"type":25,"value":2295},"()",{"type":20,"tag":1937,"props":2297,"children":2298},{},[2299],{"type":25,"value":2300},"分支",{"type":20,"tag":1910,"props":2302,"children":2303},{},[2304,2309],{"type":20,"tag":1937,"props":2305,"children":2306},{},[2307],{"type":25,"value":2308},"数字",{"type":20,"tag":1937,"props":2310,"children":2311},{},[2312],{"type":25,"value":2313},"环结构闭合",{"type":20,"tag":1910,"props":2315,"children":2316},{},[2317,2328],{"type":20,"tag":1937,"props":2318,"children":2319},{},[2320,2322],{"type":25,"value":2321},"小写 ",{"type":20,"tag":84,"props":2323,"children":2325},{"className":2324},[],[2326],{"type":25,"value":2327},"c",{"type":20,"tag":1937,"props":2329,"children":2330},{},[2331],{"type":25,"value":2332},"芳香碳，比如苯环",{"type":20,"tag":21,"props":2334,"children":2335},{},[2336],{"type":25,"value":2337},"如果把前端作为类比，SMILES 有点像 HTML：HTML 用文本描述页面结构，SMILES 用文本描述分子结构。",{"type":20,"tag":21,"props":2339,"children":2340},{},[2341],{"type":25,"value":2342},"例如阿司匹林可以写成：",{"type":20,"tag":126,"props":2344,"children":2346},{"className":324,"code":2345,"language":25,"meta":8,"style":8},"CC(=O)Oc1ccccc1C(=O)O\n",[2347],{"type":20,"tag":84,"props":2348,"children":2349},{"__ignoreMap":8},[2350],{"type":20,"tag":157,"props":2351,"children":2352},{"class":159,"line":160},[2353],{"type":20,"tag":157,"props":2354,"children":2355},{},[2356],{"type":25,"value":2345},{"type":20,"tag":21,"props":2358,"children":2359},{},[2360],{"type":25,"value":2361},"这不是给人看的“化学名称”，而是给程序解析的结构描述。RDKit 就是负责把这种字符串变成可计算对象的工具。",{"type":20,"tag":1863,"props":2363,"children":2365},{"id":2364},"rdkit-负责什么",[2366],{"type":25,"value":2367},"RDKit 负责什么",{"type":20,"tag":21,"props":2369,"children":2370},{},[2371],{"type":25,"value":2372},"RDKit 不是模型，也不是分类器。",{"type":20,"tag":21,"props":2374,"children":2375},{},[2376],{"type":25,"value":2377},"它更像一个化学信息学工具箱，可以做这些事情：",{"type":20,"tag":126,"props":2379,"children":2381},{"className":324,"code":2380,"language":25,"meta":8,"style":8},"SMILES -> Mol 对象\nMol 对象 -> 分子图片\nMol 对象 -> 分子描述符\nMol 对象 -> 分子指纹\nMol 对象 -> 标准化 SMILES\n",[2382],{"type":20,"tag":84,"props":2383,"children":2384},{"__ignoreMap":8},[2385,2393,2401,2409,2417],{"type":20,"tag":157,"props":2386,"children":2387},{"class":159,"line":160},[2388],{"type":20,"tag":157,"props":2389,"children":2390},{},[2391],{"type":25,"value":2392},"SMILES -> Mol 对象\n",{"type":20,"tag":157,"props":2394,"children":2395},{"class":159,"line":169},[2396],{"type":20,"tag":157,"props":2397,"children":2398},{},[2399],{"type":25,"value":2400},"Mol 对象 -> 分子图片\n",{"type":20,"tag":157,"props":2402,"children":2403},{"class":159,"line":179},[2404],{"type":20,"tag":157,"props":2405,"children":2406},{},[2407],{"type":25,"value":2408},"Mol 对象 -> 分子描述符\n",{"type":20,"tag":157,"props":2410,"children":2411},{"class":159,"line":188},[2412],{"type":20,"tag":157,"props":2413,"children":2414},{},[2415],{"type":25,"value":2416},"Mol 对象 -> 分子指纹\n",{"type":20,"tag":157,"props":2418,"children":2419},{"class":159,"line":196},[2420],{"type":20,"tag":157,"props":2421,"children":2422},{},[2423],{"type":25,"value":2424},"Mol 对象 -> 标准化 SMILES\n",{"type":20,"tag":21,"props":2426,"children":2427},{},[2428],{"type":25,"value":2429},"在工程链路里，RDKit 通常位于“原始输入”和“机器学习特征”之间。",{"type":20,"tag":21,"props":2431,"children":2432},{},[2433],{"type":25,"value":2434},"用户输入的是 SMILES，模型需要的是向量。RDKit 负责把中间这段路铺出来。",{"type":20,"tag":1863,"props":2436,"children":2438},{"id":2437},"mol-对象rdkit-眼里的分子",[2439],{"type":25,"value":2440},"Mol 对象：RDKit 眼里的分子",{"type":20,"tag":21,"props":2442,"children":2443},{},[2444,2446,2452],{"type":25,"value":2445},"RDKit 解析 SMILES 之后，会得到一个 ",{"type":20,"tag":84,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":25,"value":2451},"Mol",{"type":25,"value":2453}," 对象。",{"type":20,"tag":126,"props":2455,"children":2457},{"className":151,"code":2456,"language":150,"meta":8,"style":8},"from rdkit import Chem\n\nmol = Chem.MolFromSmiles(\"CCO\")\n\nif mol is None:\n    print(\"不合法 SMILES\")\nelse:\n    print(\"合法分子\")\n",[2458],{"type":20,"tag":84,"props":2459,"children":2460},{"__ignoreMap":8},[2461,2469,2476,2484,2491,2499,2507,2515],{"type":20,"tag":157,"props":2462,"children":2463},{"class":159,"line":160},[2464],{"type":20,"tag":157,"props":2465,"children":2466},{},[2467],{"type":25,"value":2468},"from rdkit import Chem\n",{"type":20,"tag":157,"props":2470,"children":2471},{"class":159,"line":169},[2472],{"type":20,"tag":157,"props":2473,"children":2474},{"emptyLinePlaceholder":173},[2475],{"type":25,"value":176},{"type":20,"tag":157,"props":2477,"children":2478},{"class":159,"line":179},[2479],{"type":20,"tag":157,"props":2480,"children":2481},{},[2482],{"type":25,"value":2483},"mol = Chem.MolFromSmiles(\"CCO\")\n",{"type":20,"tag":157,"props":2485,"children":2486},{"class":159,"line":188},[2487],{"type":20,"tag":157,"props":2488,"children":2489},{"emptyLinePlaceholder":173},[2490],{"type":25,"value":176},{"type":20,"tag":157,"props":2492,"children":2493},{"class":159,"line":196},[2494],{"type":20,"tag":157,"props":2495,"children":2496},{},[2497],{"type":25,"value":2498},"if mol is None:\n",{"type":20,"tag":157,"props":2500,"children":2501},{"class":159,"line":204},[2502],{"type":20,"tag":157,"props":2503,"children":2504},{},[2505],{"type":25,"value":2506},"    print(\"不合法 SMILES\")\n",{"type":20,"tag":157,"props":2508,"children":2509},{"class":159,"line":213},[2510],{"type":20,"tag":157,"props":2511,"children":2512},{},[2513],{"type":25,"value":2514},"else:\n",{"type":20,"tag":157,"props":2516,"children":2517},{"class":159,"line":222},[2518],{"type":20,"tag":157,"props":2519,"children":2520},{},[2521],{"type":25,"value":2522},"    print(\"合法分子\")\n",{"type":20,"tag":21,"props":2524,"children":2525},{},[2526,2531],{"type":20,"tag":84,"props":2527,"children":2529},{"className":2528},[],[2530],{"type":25,"value":2451},{"type":25,"value":2532}," 对象可以理解成 RDKit 内部的分子结构图。它不只是保存一串文本，而是保存了原子、化学键、芳香性、价态等信息。",{"type":20,"tag":21,"props":2534,"children":2535},{},[2536,2538,2544,2546,2552],{"type":25,"value":2537},"如果 ",{"type":20,"tag":84,"props":2539,"children":2541},{"className":2540},[],[2542],{"type":25,"value":2543},"Chem.MolFromSmiles()",{"type":25,"value":2545}," 解析失败，会返回 ",{"type":20,"tag":84,"props":2547,"children":2549},{"className":2548},[],[2550],{"type":25,"value":2551},"None",{"type":25,"value":2553},"。所以只要系统入口允许用户输入 SMILES，就应该先做合法性检查。",{"type":20,"tag":21,"props":2555,"children":2556},{},[2557],{"type":25,"value":2558},"在工具库里，可以直接抛异常：",{"type":20,"tag":126,"props":2560,"children":2562},{"className":151,"code":2561,"language":150,"meta":8,"style":8},"from rdkit import Chem\n\n\ndef parse_smiles(smiles: str):\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n    return mol\n",[2563],{"type":20,"tag":84,"props":2564,"children":2565},{"__ignoreMap":8},[2566,2573,2580,2587,2595,2603,2611,2619],{"type":20,"tag":157,"props":2567,"children":2568},{"class":159,"line":160},[2569],{"type":20,"tag":157,"props":2570,"children":2571},{},[2572],{"type":25,"value":2468},{"type":20,"tag":157,"props":2574,"children":2575},{"class":159,"line":169},[2576],{"type":20,"tag":157,"props":2577,"children":2578},{"emptyLinePlaceholder":173},[2579],{"type":25,"value":176},{"type":20,"tag":157,"props":2581,"children":2582},{"class":159,"line":179},[2583],{"type":20,"tag":157,"props":2584,"children":2585},{"emptyLinePlaceholder":173},[2586],{"type":25,"value":176},{"type":20,"tag":157,"props":2588,"children":2589},{"class":159,"line":188},[2590],{"type":20,"tag":157,"props":2591,"children":2592},{},[2593],{"type":25,"value":2594},"def parse_smiles(smiles: str):\n",{"type":20,"tag":157,"props":2596,"children":2597},{"class":159,"line":196},[2598],{"type":20,"tag":157,"props":2599,"children":2600},{},[2601],{"type":25,"value":2602},"    mol = Chem.MolFromSmiles(smiles)\n",{"type":20,"tag":157,"props":2604,"children":2605},{"class":159,"line":204},[2606],{"type":20,"tag":157,"props":2607,"children":2608},{},[2609],{"type":25,"value":2610},"    if mol is None:\n",{"type":20,"tag":157,"props":2612,"children":2613},{"class":159,"line":213},[2614],{"type":20,"tag":157,"props":2615,"children":2616},{},[2617],{"type":25,"value":2618},"        raise ValueError(f\"无效的 SMILES: {smiles}\")\n",{"type":20,"tag":157,"props":2620,"children":2621},{"class":159,"line":222},[2622],{"type":20,"tag":157,"props":2623,"children":2624},{},[2625],{"type":25,"value":2626},"    return mol\n",{"type":20,"tag":21,"props":2628,"children":2629},{},[2630],{"type":25,"value":2631},"如果放到 Web API 里，就不应该把 Python 异常原样甩给前端，而是要转成稳定的业务错误。",{"type":20,"tag":21,"props":2633,"children":2634},{},[2635],{"type":25,"value":2636},"FastAPI 里可能是：",{"type":20,"tag":126,"props":2638,"children":2640},{"className":882,"code":2639,"language":881,"meta":8,"style":8},"{\n  \"code\": 400,\n  \"detail\": \"无效的 SMILES\"\n}\n",[2641],{"type":20,"tag":84,"props":2642,"children":2643},{"__ignoreMap":8},[2644,2651,2671,2688],{"type":20,"tag":157,"props":2645,"children":2646},{"class":159,"line":160},[2647],{"type":20,"tag":157,"props":2648,"children":2649},{"style":892},[2650],{"type":25,"value":895},{"type":20,"tag":157,"props":2652,"children":2653},{"class":159,"line":169},[2654,2659,2663,2667],{"type":20,"tag":157,"props":2655,"children":2656},{"style":260},[2657],{"type":25,"value":2658},"  \"code\"",{"type":20,"tag":157,"props":2660,"children":2661},{"style":892},[2662],{"type":25,"value":908},{"type":20,"tag":157,"props":2664,"children":2665},{"style":260},[2666],{"type":25,"value":1172},{"type":20,"tag":157,"props":2668,"children":2669},{"style":892},[2670],{"type":25,"value":918},{"type":20,"tag":157,"props":2672,"children":2673},{"class":159,"line":179},[2674,2679,2683],{"type":20,"tag":157,"props":2675,"children":2676},{"style":260},[2677],{"type":25,"value":2678},"  \"detail\"",{"type":20,"tag":157,"props":2680,"children":2681},{"style":892},[2682],{"type":25,"value":908},{"type":20,"tag":157,"props":2684,"children":2685},{"style":254},[2686],{"type":25,"value":2687},"\"无效的 SMILES\"\n",{"type":20,"tag":157,"props":2689,"children":2690},{"class":159,"line":188},[2691],{"type":20,"tag":157,"props":2692,"children":2693},{"style":892},[2694],{"type":25,"value":943},{"type":20,"tag":21,"props":2696,"children":2697},{},[2698],{"type":25,"value":2699},"如果后端是 Spring Boot，也可以设计成更明确的错误结构：",{"type":20,"tag":126,"props":2701,"children":2703},{"className":882,"code":2702,"language":881,"meta":8,"style":8},"{\n  \"code\": \"INVALID_SMILES\",\n  \"message\": \"您输入的分子式格式不正确\",\n  \"timestamp\": \"2026-05-18T10:00:00\"\n}\n",[2704],{"type":20,"tag":84,"props":2705,"children":2706},{"__ignoreMap":8},[2707,2714,2734,2755,2772],{"type":20,"tag":157,"props":2708,"children":2709},{"class":159,"line":160},[2710],{"type":20,"tag":157,"props":2711,"children":2712},{"style":892},[2713],{"type":25,"value":895},{"type":20,"tag":157,"props":2715,"children":2716},{"class":159,"line":169},[2717,2721,2725,2730],{"type":20,"tag":157,"props":2718,"children":2719},{"style":260},[2720],{"type":25,"value":2658},{"type":20,"tag":157,"props":2722,"children":2723},{"style":892},[2724],{"type":25,"value":908},{"type":20,"tag":157,"props":2726,"children":2727},{"style":254},[2728],{"type":25,"value":2729},"\"INVALID_SMILES\"",{"type":20,"tag":157,"props":2731,"children":2732},{"style":892},[2733],{"type":25,"value":918},{"type":20,"tag":157,"props":2735,"children":2736},{"class":159,"line":179},[2737,2742,2746,2751],{"type":20,"tag":157,"props":2738,"children":2739},{"style":260},[2740],{"type":25,"value":2741},"  \"message\"",{"type":20,"tag":157,"props":2743,"children":2744},{"style":892},[2745],{"type":25,"value":908},{"type":20,"tag":157,"props":2747,"children":2748},{"style":254},[2749],{"type":25,"value":2750},"\"您输入的分子式格式不正确\"",{"type":20,"tag":157,"props":2752,"children":2753},{"style":892},[2754],{"type":25,"value":918},{"type":20,"tag":157,"props":2756,"children":2757},{"class":159,"line":188},[2758,2763,2767],{"type":20,"tag":157,"props":2759,"children":2760},{"style":260},[2761],{"type":25,"value":2762},"  \"timestamp\"",{"type":20,"tag":157,"props":2764,"children":2765},{"style":892},[2766],{"type":25,"value":908},{"type":20,"tag":157,"props":2768,"children":2769},{"style":254},[2770],{"type":25,"value":2771},"\"2026-05-18T10:00:00\"\n",{"type":20,"tag":157,"props":2773,"children":2774},{"class":159,"line":196},[2775],{"type":20,"tag":157,"props":2776,"children":2777},{"style":892},[2778],{"type":25,"value":943},{"type":20,"tag":21,"props":2780,"children":2781},{},[2782,2784,2789],{"type":25,"value":2783},"这就是从“写脚本”走向“做平台”时必须补上的一层：",{"type":20,"tag":33,"props":2785,"children":2786},{},[2787],{"type":25,"value":2788},"底层库负责发现错误，业务接口负责表达错误",{"type":25,"value":110},{"type":20,"tag":1863,"props":2791,"children":2793},{"id":2792},"canonical-smiles统一同一个分子的不同写法",[2794],{"type":25,"value":2795},"Canonical SMILES：统一同一个分子的不同写法",{"type":20,"tag":21,"props":2797,"children":2798},{},[2799],{"type":25,"value":2800},"同一个分子可能有多种 SMILES 写法。",{"type":20,"tag":21,"props":2802,"children":2803},{},[2804],{"type":25,"value":2157},{"type":20,"tag":126,"props":2806,"children":2808},{"className":324,"code":2807,"language":25,"meta":8,"style":8},"CCO\nOCC\n",[2809],{"type":20,"tag":84,"props":2810,"children":2811},{"__ignoreMap":8},[2812,2819],{"type":20,"tag":157,"props":2813,"children":2814},{"class":159,"line":160},[2815],{"type":20,"tag":157,"props":2816,"children":2817},{},[2818],{"type":25,"value":2160},{"type":20,"tag":157,"props":2820,"children":2821},{"class":159,"line":169},[2822],{"type":20,"tag":157,"props":2823,"children":2824},{},[2825],{"type":25,"value":2826},"OCC\n",{"type":20,"tag":21,"props":2828,"children":2829},{},[2830],{"type":25,"value":2831},"对人来说都能看懂，但对系统来说，如果不做标准化，它们就是两条不同的字符串。这会影响去重、缓存、数据库索引和相似性搜索。",{"type":20,"tag":21,"props":2833,"children":2834},{},[2835],{"type":25,"value":2836},"RDKit 可以把不同写法统一成标准形式：",{"type":20,"tag":126,"props":2838,"children":2840},{"className":151,"code":2839,"language":150,"meta":8,"style":8},"from rdkit import Chem\n\n\ndef canonicalize_smiles(smiles: str) -> str:\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n    return Chem.MolToSmiles(mol, canonical=True)\n\n\nprint(canonicalize_smiles(\"OCC\"))\n",[2841],{"type":20,"tag":84,"props":2842,"children":2843},{"__ignoreMap":8},[2844,2851,2858,2865,2873,2880,2887,2894,2902,2909,2916],{"type":20,"tag":157,"props":2845,"children":2846},{"class":159,"line":160},[2847],{"type":20,"tag":157,"props":2848,"children":2849},{},[2850],{"type":25,"value":2468},{"type":20,"tag":157,"props":2852,"children":2853},{"class":159,"line":169},[2854],{"type":20,"tag":157,"props":2855,"children":2856},{"emptyLinePlaceholder":173},[2857],{"type":25,"value":176},{"type":20,"tag":157,"props":2859,"children":2860},{"class":159,"line":179},[2861],{"type":20,"tag":157,"props":2862,"children":2863},{"emptyLinePlaceholder":173},[2864],{"type":25,"value":176},{"type":20,"tag":157,"props":2866,"children":2867},{"class":159,"line":188},[2868],{"type":20,"tag":157,"props":2869,"children":2870},{},[2871],{"type":25,"value":2872},"def canonicalize_smiles(smiles: str) -> str:\n",{"type":20,"tag":157,"props":2874,"children":2875},{"class":159,"line":196},[2876],{"type":20,"tag":157,"props":2877,"children":2878},{},[2879],{"type":25,"value":2602},{"type":20,"tag":157,"props":2881,"children":2882},{"class":159,"line":204},[2883],{"type":20,"tag":157,"props":2884,"children":2885},{},[2886],{"type":25,"value":2610},{"type":20,"tag":157,"props":2888,"children":2889},{"class":159,"line":213},[2890],{"type":20,"tag":157,"props":2891,"children":2892},{},[2893],{"type":25,"value":2618},{"type":20,"tag":157,"props":2895,"children":2896},{"class":159,"line":222},[2897],{"type":20,"tag":157,"props":2898,"children":2899},{},[2900],{"type":25,"value":2901},"    return Chem.MolToSmiles(mol, canonical=True)\n",{"type":20,"tag":157,"props":2903,"children":2904},{"class":159,"line":440},[2905],{"type":20,"tag":157,"props":2906,"children":2907},{"emptyLinePlaceholder":173},[2908],{"type":25,"value":176},{"type":20,"tag":157,"props":2910,"children":2911},{"class":159,"line":448},[2912],{"type":20,"tag":157,"props":2913,"children":2914},{"emptyLinePlaceholder":173},[2915],{"type":25,"value":176},{"type":20,"tag":157,"props":2917,"children":2918},{"class":159,"line":456},[2919],{"type":20,"tag":157,"props":2920,"children":2921},{},[2922],{"type":25,"value":2923},"print(canonicalize_smiles(\"OCC\"))\n",{"type":20,"tag":21,"props":2925,"children":2926},{},[2927],{"type":25,"value":2928},"在平台里，一个常见策略是：",{"type":20,"tag":126,"props":2930,"children":2932},{"className":324,"code":2931,"language":25,"meta":8,"style":8},"用户输入 SMILES -> RDKit 解析 -> Canonical SMILES -> 入库 \u002F 检索 \u002F 建模\n",[2933],{"type":20,"tag":84,"props":2934,"children":2935},{"__ignoreMap":8},[2936],{"type":20,"tag":157,"props":2937,"children":2938},{"class":159,"line":160},[2939],{"type":20,"tag":157,"props":2940,"children":2941},{},[2942],{"type":25,"value":2931},{"type":20,"tag":21,"props":2944,"children":2945},{},[2946],{"type":25,"value":2947},"这样用户输入的格式可以灵活，但系统内部使用统一表示。",{"type":20,"tag":1863,"props":2949,"children":2951},{"id":2950},"生成分子图片让结构可视化",[2952],{"type":25,"value":2953},"生成分子图片：让结构可视化",{"type":20,"tag":21,"props":2955,"children":2956},{},[2957],{"type":25,"value":2958},"分子进入系统后，除了用于计算，也常常需要展示给用户。",{"type":20,"tag":21,"props":2960,"children":2961},{},[2962,2964,2969],{"type":25,"value":2963},"RDKit 可以直接把 ",{"type":20,"tag":84,"props":2965,"children":2967},{"className":2966},[],[2968],{"type":25,"value":2451},{"type":25,"value":2970}," 对象画成图片：",{"type":20,"tag":126,"props":2972,"children":2974},{"className":151,"code":2973,"language":150,"meta":8,"style":8},"from pathlib import Path\n\nfrom PIL.Image import Image\nfrom rdkit import Chem, RDLogger\nfrom rdkit.Chem import Draw\n\nRDLogger.DisableLog(\"rdApp.*\")\n\nDEFAULT_SIZE = (300, 300)\n\n\ndef smiles_to_image(smiles: str, size: tuple[int, int] = DEFAULT_SIZE) -> Image:\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n\n    return Draw.MolToImage(mol, size=size)\n\n\ndef save_smiles_image(\n    smiles: str,\n    output_path: str | Path,\n    name: str = \"分子图片\",\n    size: tuple[int, int] = DEFAULT_SIZE,\n) -> Path:\n    path = Path(output_path)\n\n    if path.suffix == \"\":\n        path.mkdir(parents=True, exist_ok=True)\n        path = path \u002F f\"{name}.png\"\n    else:\n        path.parent.mkdir(parents=True, exist_ok=True)\n\n    image = smiles_to_image(smiles, size=size)\n    image.save(path)\n    return path\n\n\nif __name__ == \"__main__\":\n    save_smiles_image(\n        \"CC(=O)Oc1ccccc1C(=O)O\",\n        \"..\u002Foutputs\u002Fimages\u002F\",\n        name=\"阿司匹林\",\n    )\n",[2975],{"type":20,"tag":84,"props":2976,"children":2977},{"__ignoreMap":8},[2978,2986,2993,3001,3009,3017,3024,3032,3039,3047,3054,3061,3069,3076,3083,3090,3097,3105,3112,3119,3127,3135,3143,3151,3159,3167,3175,3182,3190,3198,3206,3214,3222,3229,3237,3245,3253,3260,3267,3275,3283,3291,3299,3307],{"type":20,"tag":157,"props":2979,"children":2980},{"class":159,"line":160},[2981],{"type":20,"tag":157,"props":2982,"children":2983},{},[2984],{"type":25,"value":2985},"from pathlib import Path\n",{"type":20,"tag":157,"props":2987,"children":2988},{"class":159,"line":169},[2989],{"type":20,"tag":157,"props":2990,"children":2991},{"emptyLinePlaceholder":173},[2992],{"type":25,"value":176},{"type":20,"tag":157,"props":2994,"children":2995},{"class":159,"line":179},[2996],{"type":20,"tag":157,"props":2997,"children":2998},{},[2999],{"type":25,"value":3000},"from PIL.Image import Image\n",{"type":20,"tag":157,"props":3002,"children":3003},{"class":159,"line":188},[3004],{"type":20,"tag":157,"props":3005,"children":3006},{},[3007],{"type":25,"value":3008},"from rdkit import Chem, RDLogger\n",{"type":20,"tag":157,"props":3010,"children":3011},{"class":159,"line":196},[3012],{"type":20,"tag":157,"props":3013,"children":3014},{},[3015],{"type":25,"value":3016},"from rdkit.Chem import Draw\n",{"type":20,"tag":157,"props":3018,"children":3019},{"class":159,"line":204},[3020],{"type":20,"tag":157,"props":3021,"children":3022},{"emptyLinePlaceholder":173},[3023],{"type":25,"value":176},{"type":20,"tag":157,"props":3025,"children":3026},{"class":159,"line":213},[3027],{"type":20,"tag":157,"props":3028,"children":3029},{},[3030],{"type":25,"value":3031},"RDLogger.DisableLog(\"rdApp.*\")\n",{"type":20,"tag":157,"props":3033,"children":3034},{"class":159,"line":222},[3035],{"type":20,"tag":157,"props":3036,"children":3037},{"emptyLinePlaceholder":173},[3038],{"type":25,"value":176},{"type":20,"tag":157,"props":3040,"children":3041},{"class":159,"line":440},[3042],{"type":20,"tag":157,"props":3043,"children":3044},{},[3045],{"type":25,"value":3046},"DEFAULT_SIZE = (300, 300)\n",{"type":20,"tag":157,"props":3048,"children":3049},{"class":159,"line":448},[3050],{"type":20,"tag":157,"props":3051,"children":3052},{"emptyLinePlaceholder":173},[3053],{"type":25,"value":176},{"type":20,"tag":157,"props":3055,"children":3056},{"class":159,"line":456},[3057],{"type":20,"tag":157,"props":3058,"children":3059},{"emptyLinePlaceholder":173},[3060],{"type":25,"value":176},{"type":20,"tag":157,"props":3062,"children":3063},{"class":159,"line":465},[3064],{"type":20,"tag":157,"props":3065,"children":3066},{},[3067],{"type":25,"value":3068},"def smiles_to_image(smiles: str, size: tuple[int, int] = DEFAULT_SIZE) -> Image:\n",{"type":20,"tag":157,"props":3070,"children":3071},{"class":159,"line":474},[3072],{"type":20,"tag":157,"props":3073,"children":3074},{},[3075],{"type":25,"value":2602},{"type":20,"tag":157,"props":3077,"children":3078},{"class":159,"line":483},[3079],{"type":20,"tag":157,"props":3080,"children":3081},{},[3082],{"type":25,"value":2610},{"type":20,"tag":157,"props":3084,"children":3085},{"class":159,"line":491},[3086],{"type":20,"tag":157,"props":3087,"children":3088},{},[3089],{"type":25,"value":2618},{"type":20,"tag":157,"props":3091,"children":3092},{"class":159,"line":499},[3093],{"type":20,"tag":157,"props":3094,"children":3095},{"emptyLinePlaceholder":173},[3096],{"type":25,"value":176},{"type":20,"tag":157,"props":3098,"children":3099},{"class":159,"line":508},[3100],{"type":20,"tag":157,"props":3101,"children":3102},{},[3103],{"type":25,"value":3104},"    return Draw.MolToImage(mol, size=size)\n",{"type":20,"tag":157,"props":3106,"children":3107},{"class":159,"line":517},[3108],{"type":20,"tag":157,"props":3109,"children":3110},{"emptyLinePlaceholder":173},[3111],{"type":25,"value":176},{"type":20,"tag":157,"props":3113,"children":3114},{"class":159,"line":1499},[3115],{"type":20,"tag":157,"props":3116,"children":3117},{"emptyLinePlaceholder":173},[3118],{"type":25,"value":176},{"type":20,"tag":157,"props":3120,"children":3121},{"class":159,"line":1507},[3122],{"type":20,"tag":157,"props":3123,"children":3124},{},[3125],{"type":25,"value":3126},"def save_smiles_image(\n",{"type":20,"tag":157,"props":3128,"children":3129},{"class":159,"line":1515},[3130],{"type":20,"tag":157,"props":3131,"children":3132},{},[3133],{"type":25,"value":3134},"    smiles: str,\n",{"type":20,"tag":157,"props":3136,"children":3137},{"class":159,"line":1523},[3138],{"type":20,"tag":157,"props":3139,"children":3140},{},[3141],{"type":25,"value":3142},"    output_path: str | Path,\n",{"type":20,"tag":157,"props":3144,"children":3145},{"class":159,"line":1532},[3146],{"type":20,"tag":157,"props":3147,"children":3148},{},[3149],{"type":25,"value":3150},"    name: str = \"分子图片\",\n",{"type":20,"tag":157,"props":3152,"children":3153},{"class":159,"line":1541},[3154],{"type":20,"tag":157,"props":3155,"children":3156},{},[3157],{"type":25,"value":3158},"    size: tuple[int, int] = DEFAULT_SIZE,\n",{"type":20,"tag":157,"props":3160,"children":3161},{"class":159,"line":1550},[3162],{"type":20,"tag":157,"props":3163,"children":3164},{},[3165],{"type":25,"value":3166},") -> Path:\n",{"type":20,"tag":157,"props":3168,"children":3169},{"class":159,"line":1558},[3170],{"type":20,"tag":157,"props":3171,"children":3172},{},[3173],{"type":25,"value":3174},"    path = Path(output_path)\n",{"type":20,"tag":157,"props":3176,"children":3177},{"class":159,"line":1566},[3178],{"type":20,"tag":157,"props":3179,"children":3180},{"emptyLinePlaceholder":173},[3181],{"type":25,"value":176},{"type":20,"tag":157,"props":3183,"children":3184},{"class":159,"line":1574},[3185],{"type":20,"tag":157,"props":3186,"children":3187},{},[3188],{"type":25,"value":3189},"    if path.suffix == \"\":\n",{"type":20,"tag":157,"props":3191,"children":3192},{"class":159,"line":1582},[3193],{"type":20,"tag":157,"props":3194,"children":3195},{},[3196],{"type":25,"value":3197},"        path.mkdir(parents=True, exist_ok=True)\n",{"type":20,"tag":157,"props":3199,"children":3200},{"class":159,"line":1591},[3201],{"type":20,"tag":157,"props":3202,"children":3203},{},[3204],{"type":25,"value":3205},"        path = path \u002F f\"{name}.png\"\n",{"type":20,"tag":157,"props":3207,"children":3208},{"class":159,"line":1599},[3209],{"type":20,"tag":157,"props":3210,"children":3211},{},[3212],{"type":25,"value":3213},"    else:\n",{"type":20,"tag":157,"props":3215,"children":3216},{"class":159,"line":1608},[3217],{"type":20,"tag":157,"props":3218,"children":3219},{},[3220],{"type":25,"value":3221},"        path.parent.mkdir(parents=True, exist_ok=True)\n",{"type":20,"tag":157,"props":3223,"children":3224},{"class":159,"line":1617},[3225],{"type":20,"tag":157,"props":3226,"children":3227},{"emptyLinePlaceholder":173},[3228],{"type":25,"value":176},{"type":20,"tag":157,"props":3230,"children":3231},{"class":159,"line":1626},[3232],{"type":20,"tag":157,"props":3233,"children":3234},{},[3235],{"type":25,"value":3236},"    image = smiles_to_image(smiles, size=size)\n",{"type":20,"tag":157,"props":3238,"children":3239},{"class":159,"line":1634},[3240],{"type":20,"tag":157,"props":3241,"children":3242},{},[3243],{"type":25,"value":3244},"    image.save(path)\n",{"type":20,"tag":157,"props":3246,"children":3247},{"class":159,"line":1642},[3248],{"type":20,"tag":157,"props":3249,"children":3250},{},[3251],{"type":25,"value":3252},"    return path\n",{"type":20,"tag":157,"props":3254,"children":3255},{"class":159,"line":1650},[3256],{"type":20,"tag":157,"props":3257,"children":3258},{"emptyLinePlaceholder":173},[3259],{"type":25,"value":176},{"type":20,"tag":157,"props":3261,"children":3262},{"class":159,"line":1659},[3263],{"type":20,"tag":157,"props":3264,"children":3265},{"emptyLinePlaceholder":173},[3266],{"type":25,"value":176},{"type":20,"tag":157,"props":3268,"children":3269},{"class":159,"line":1668},[3270],{"type":20,"tag":157,"props":3271,"children":3272},{},[3273],{"type":25,"value":3274},"if __name__ == \"__main__\":\n",{"type":20,"tag":157,"props":3276,"children":3277},{"class":159,"line":1677},[3278],{"type":20,"tag":157,"props":3279,"children":3280},{},[3281],{"type":25,"value":3282},"    save_smiles_image(\n",{"type":20,"tag":157,"props":3284,"children":3285},{"class":159,"line":1685},[3286],{"type":20,"tag":157,"props":3287,"children":3288},{},[3289],{"type":25,"value":3290},"        \"CC(=O)Oc1ccccc1C(=O)O\",\n",{"type":20,"tag":157,"props":3292,"children":3293},{"class":159,"line":1693},[3294],{"type":20,"tag":157,"props":3295,"children":3296},{},[3297],{"type":25,"value":3298},"        \"..\u002Foutputs\u002Fimages\u002F\",\n",{"type":20,"tag":157,"props":3300,"children":3301},{"class":159,"line":1701},[3302],{"type":20,"tag":157,"props":3303,"children":3304},{},[3305],{"type":25,"value":3306},"        name=\"阿司匹林\",\n",{"type":20,"tag":157,"props":3308,"children":3309},{"class":159,"line":1710},[3310],{"type":20,"tag":157,"props":3311,"children":3312},{},[3313],{"type":25,"value":3314},"    )\n",{"type":20,"tag":21,"props":3316,"children":3317},{},[3318],{"type":25,"value":3319},"到这里，SMILES 已经不只是字符串了。它可以被验证、标准化，也可以被画出来。",{"type":20,"tag":21,"props":3321,"children":3322},{},[3323],{"type":25,"value":3324},"下一步是把它变成模型能用的数字。",{"type":20,"tag":1863,"props":3326,"children":3328},{"id":3327},"分子描述符可解释的低维特征",[3329],{"type":25,"value":3330},"分子描述符：可解释的低维特征",{"type":20,"tag":21,"props":3332,"children":3333},{},[3334],{"type":25,"value":3335},"分子描述符是对一个分子的数值化描述。",{"type":20,"tag":21,"props":3337,"children":3338},{},[3339],{"type":25,"value":3340},"比如阿司匹林可以被描述成一组性质：",{"type":20,"tag":126,"props":3342,"children":3344},{"className":324,"code":3343,"language":25,"meta":8,"style":8},"分子量：180.16\nLogP：1.31\nTPSA：63.60\n氢键供体数量：1\n氢键受体数量：4\n可旋转键数量：2\n芳香环数量：1\n",[3345],{"type":20,"tag":84,"props":3346,"children":3347},{"__ignoreMap":8},[3348,3356,3364,3372,3380,3388,3396],{"type":20,"tag":157,"props":3349,"children":3350},{"class":159,"line":160},[3351],{"type":20,"tag":157,"props":3352,"children":3353},{},[3354],{"type":25,"value":3355},"分子量：180.16\n",{"type":20,"tag":157,"props":3357,"children":3358},{"class":159,"line":169},[3359],{"type":20,"tag":157,"props":3360,"children":3361},{},[3362],{"type":25,"value":3363},"LogP：1.31\n",{"type":20,"tag":157,"props":3365,"children":3366},{"class":159,"line":179},[3367],{"type":20,"tag":157,"props":3368,"children":3369},{},[3370],{"type":25,"value":3371},"TPSA：63.60\n",{"type":20,"tag":157,"props":3373,"children":3374},{"class":159,"line":188},[3375],{"type":20,"tag":157,"props":3376,"children":3377},{},[3378],{"type":25,"value":3379},"氢键供体数量：1\n",{"type":20,"tag":157,"props":3381,"children":3382},{"class":159,"line":196},[3383],{"type":20,"tag":157,"props":3384,"children":3385},{},[3386],{"type":25,"value":3387},"氢键受体数量：4\n",{"type":20,"tag":157,"props":3389,"children":3390},{"class":159,"line":204},[3391],{"type":20,"tag":157,"props":3392,"children":3393},{},[3394],{"type":25,"value":3395},"可旋转键数量：2\n",{"type":20,"tag":157,"props":3397,"children":3398},{"class":159,"line":213},[3399],{"type":20,"tag":157,"props":3400,"children":3401},{},[3402],{"type":25,"value":3403},"芳香环数量：1\n",{"type":20,"tag":21,"props":3405,"children":3406},{},[3407],{"type":25,"value":3408},"这些数值可以组成一个向量：",{"type":20,"tag":126,"props":3410,"children":3412},{"className":324,"code":3411,"language":25,"meta":8,"style":8},"[180.16, 1.31, 63.60, 1, 4, 2, 1]\n",[3413],{"type":20,"tag":84,"props":3414,"children":3415},{"__ignoreMap":8},[3416],{"type":20,"tag":157,"props":3417,"children":3418},{"class":159,"line":160},[3419],{"type":20,"tag":157,"props":3420,"children":3421},{},[3422],{"type":25,"value":3411},{"type":20,"tag":21,"props":3424,"children":3425},{},[3426],{"type":25,"value":3427},"模型并不理解“阿司匹林”这个名字，但它可以处理这样的数字向量。",{"type":20,"tag":21,"props":3429,"children":3430},{},[3431],{"type":25,"value":3432},"常见描述符包括：",{"type":20,"tag":1902,"props":3434,"children":3435},{},[3436,3456],{"type":20,"tag":1906,"props":3437,"children":3438},{},[3439],{"type":20,"tag":1910,"props":3440,"children":3441},{},[3442,3447,3451],{"type":20,"tag":1914,"props":3443,"children":3444},{},[3445],{"type":25,"value":3446},"描述符",{"type":20,"tag":1914,"props":3448,"children":3449},{},[3450],{"type":25,"value":2195},{"type":20,"tag":1914,"props":3452,"children":3453},{},[3454],{"type":25,"value":3455},"直觉",{"type":20,"tag":1930,"props":3457,"children":3458},{},[3459,3481,3503,3525,3562,3584,3606],{"type":20,"tag":1910,"props":3460,"children":3461},{},[3462,3471,3476],{"type":20,"tag":1937,"props":3463,"children":3464},{},[3465],{"type":20,"tag":84,"props":3466,"children":3468},{"className":3467},[],[3469],{"type":25,"value":3470},"MolWt",{"type":20,"tag":1937,"props":3472,"children":3473},{},[3474],{"type":25,"value":3475},"分子量",{"type":20,"tag":1937,"props":3477,"children":3478},{},[3479],{"type":25,"value":3480},"分子越大，吸收、代谢、穿膜等性质通常会受影响",{"type":20,"tag":1910,"props":3482,"children":3483},{},[3484,3493,3498],{"type":20,"tag":1937,"props":3485,"children":3486},{},[3487],{"type":20,"tag":84,"props":3488,"children":3490},{"className":3489},[],[3491],{"type":25,"value":3492},"LogP",{"type":20,"tag":1937,"props":3494,"children":3495},{},[3496],{"type":25,"value":3497},"脂水分配系数",{"type":20,"tag":1937,"props":3499,"children":3500},{},[3501],{"type":25,"value":3502},"越高越偏亲脂，越低越偏亲水",{"type":20,"tag":1910,"props":3504,"children":3505},{},[3506,3515,3520],{"type":20,"tag":1937,"props":3507,"children":3508},{},[3509],{"type":20,"tag":84,"props":3510,"children":3512},{"className":3511},[],[3513],{"type":25,"value":3514},"TPSA",{"type":20,"tag":1937,"props":3516,"children":3517},{},[3518],{"type":25,"value":3519},"拓扑极性表面积",{"type":20,"tag":1937,"props":3521,"children":3522},{},[3523],{"type":25,"value":3524},"越大通常越不容易穿过脂质膜或血脑屏障",{"type":20,"tag":1910,"props":3526,"children":3527},{},[3528,3537,3542],{"type":20,"tag":1937,"props":3529,"children":3530},{},[3531],{"type":20,"tag":84,"props":3532,"children":3534},{"className":3533},[],[3535],{"type":25,"value":3536},"HBD",{"type":20,"tag":1937,"props":3538,"children":3539},{},[3540],{"type":25,"value":3541},"氢键供体数量",{"type":20,"tag":1937,"props":3543,"children":3544},{},[3545,3547,3553,3554,3560],{"type":25,"value":3546},"比如 ",{"type":20,"tag":84,"props":3548,"children":3550},{"className":3549},[],[3551],{"type":25,"value":3552},"-OH",{"type":25,"value":965},{"type":20,"tag":84,"props":3555,"children":3557},{"className":3556},[],[3558],{"type":25,"value":3559},"-NH",{"type":25,"value":3561}," 这类能给出氢键的结构",{"type":20,"tag":1910,"props":3563,"children":3564},{},[3565,3574,3579],{"type":20,"tag":1937,"props":3566,"children":3567},{},[3568],{"type":20,"tag":84,"props":3569,"children":3571},{"className":3570},[],[3572],{"type":25,"value":3573},"HBA",{"type":20,"tag":1937,"props":3575,"children":3576},{},[3577],{"type":25,"value":3578},"氢键受体数量",{"type":20,"tag":1937,"props":3580,"children":3581},{},[3582],{"type":25,"value":3583},"比如 O、N 这类能接受氢键的原子",{"type":20,"tag":1910,"props":3585,"children":3586},{},[3587,3596,3601],{"type":20,"tag":1937,"props":3588,"children":3589},{},[3590],{"type":20,"tag":84,"props":3591,"children":3593},{"className":3592},[],[3594],{"type":25,"value":3595},"Rotatable Bonds",{"type":20,"tag":1937,"props":3597,"children":3598},{},[3599],{"type":25,"value":3600},"可旋转键数量",{"type":20,"tag":1937,"props":3602,"children":3603},{},[3604],{"type":25,"value":3605},"越多，分子越柔软，构象空间越大",{"type":20,"tag":1910,"props":3607,"children":3608},{},[3609,3618,3623],{"type":20,"tag":1937,"props":3610,"children":3611},{},[3612],{"type":20,"tag":84,"props":3613,"children":3615},{"className":3614},[],[3616],{"type":25,"value":3617},"Ring Count",{"type":20,"tag":1937,"props":3619,"children":3620},{},[3621],{"type":25,"value":3622},"环数量",{"type":20,"tag":1937,"props":3624,"children":3625},{},[3626],{"type":25,"value":3627},"环结构影响分子的刚性和结合方式",{"type":20,"tag":21,"props":3629,"children":3630},{},[3631],{"type":25,"value":3632},"用 RDKit 计算这些描述符：",{"type":20,"tag":126,"props":3634,"children":3636},{"className":151,"code":3635,"language":150,"meta":8,"style":8},"from rdkit import Chem\nfrom rdkit.Chem import Descriptors, Lipinski, rdMolDescriptors\n\n\ndef calc_basic_descriptors(smiles: str) -> dict[str, float | int]:\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n\n    return {\n        \"mol_wt\": round(Descriptors.MolWt(mol), 2),\n        \"logp\": round(Descriptors.MolLogP(mol), 2),\n        \"tpsa\": round(Descriptors.TPSA(mol), 2),\n        \"hbd\": Lipinski.NumHDonors(mol),\n        \"hba\": Lipinski.NumHAcceptors(mol),\n        \"rotatable_bonds\": Lipinski.NumRotatableBonds(mol),\n        \"ring_count\": rdMolDescriptors.CalcNumRings(mol),\n    }\n\n\nprint(calc_basic_descriptors(\"CC(=O)Oc1ccccc1C(=O)O\"))\n",[3637],{"type":20,"tag":84,"props":3638,"children":3639},{"__ignoreMap":8},[3640,3647,3655,3662,3669,3677,3684,3691,3698,3705,3712,3720,3728,3736,3744,3752,3760,3768,3775,3782,3789],{"type":20,"tag":157,"props":3641,"children":3642},{"class":159,"line":160},[3643],{"type":20,"tag":157,"props":3644,"children":3645},{},[3646],{"type":25,"value":2468},{"type":20,"tag":157,"props":3648,"children":3649},{"class":159,"line":169},[3650],{"type":20,"tag":157,"props":3651,"children":3652},{},[3653],{"type":25,"value":3654},"from rdkit.Chem import Descriptors, Lipinski, rdMolDescriptors\n",{"type":20,"tag":157,"props":3656,"children":3657},{"class":159,"line":179},[3658],{"type":20,"tag":157,"props":3659,"children":3660},{"emptyLinePlaceholder":173},[3661],{"type":25,"value":176},{"type":20,"tag":157,"props":3663,"children":3664},{"class":159,"line":188},[3665],{"type":20,"tag":157,"props":3666,"children":3667},{"emptyLinePlaceholder":173},[3668],{"type":25,"value":176},{"type":20,"tag":157,"props":3670,"children":3671},{"class":159,"line":196},[3672],{"type":20,"tag":157,"props":3673,"children":3674},{},[3675],{"type":25,"value":3676},"def calc_basic_descriptors(smiles: str) -> dict[str, float | int]:\n",{"type":20,"tag":157,"props":3678,"children":3679},{"class":159,"line":204},[3680],{"type":20,"tag":157,"props":3681,"children":3682},{},[3683],{"type":25,"value":2602},{"type":20,"tag":157,"props":3685,"children":3686},{"class":159,"line":213},[3687],{"type":20,"tag":157,"props":3688,"children":3689},{},[3690],{"type":25,"value":2610},{"type":20,"tag":157,"props":3692,"children":3693},{"class":159,"line":222},[3694],{"type":20,"tag":157,"props":3695,"children":3696},{},[3697],{"type":25,"value":2618},{"type":20,"tag":157,"props":3699,"children":3700},{"class":159,"line":440},[3701],{"type":20,"tag":157,"props":3702,"children":3703},{"emptyLinePlaceholder":173},[3704],{"type":25,"value":176},{"type":20,"tag":157,"props":3706,"children":3707},{"class":159,"line":448},[3708],{"type":20,"tag":157,"props":3709,"children":3710},{},[3711],{"type":25,"value":848},{"type":20,"tag":157,"props":3713,"children":3714},{"class":159,"line":456},[3715],{"type":20,"tag":157,"props":3716,"children":3717},{},[3718],{"type":25,"value":3719},"        \"mol_wt\": round(Descriptors.MolWt(mol), 2),\n",{"type":20,"tag":157,"props":3721,"children":3722},{"class":159,"line":465},[3723],{"type":20,"tag":157,"props":3724,"children":3725},{},[3726],{"type":25,"value":3727},"        \"logp\": round(Descriptors.MolLogP(mol), 2),\n",{"type":20,"tag":157,"props":3729,"children":3730},{"class":159,"line":474},[3731],{"type":20,"tag":157,"props":3732,"children":3733},{},[3734],{"type":25,"value":3735},"        \"tpsa\": round(Descriptors.TPSA(mol), 2),\n",{"type":20,"tag":157,"props":3737,"children":3738},{"class":159,"line":483},[3739],{"type":20,"tag":157,"props":3740,"children":3741},{},[3742],{"type":25,"value":3743},"        \"hbd\": Lipinski.NumHDonors(mol),\n",{"type":20,"tag":157,"props":3745,"children":3746},{"class":159,"line":491},[3747],{"type":20,"tag":157,"props":3748,"children":3749},{},[3750],{"type":25,"value":3751},"        \"hba\": Lipinski.NumHAcceptors(mol),\n",{"type":20,"tag":157,"props":3753,"children":3754},{"class":159,"line":499},[3755],{"type":20,"tag":157,"props":3756,"children":3757},{},[3758],{"type":25,"value":3759},"        \"rotatable_bonds\": Lipinski.NumRotatableBonds(mol),\n",{"type":20,"tag":157,"props":3761,"children":3762},{"class":159,"line":508},[3763],{"type":20,"tag":157,"props":3764,"children":3765},{},[3766],{"type":25,"value":3767},"        \"ring_count\": rdMolDescriptors.CalcNumRings(mol),\n",{"type":20,"tag":157,"props":3769,"children":3770},{"class":159,"line":517},[3771],{"type":20,"tag":157,"props":3772,"children":3773},{},[3774],{"type":25,"value":872},{"type":20,"tag":157,"props":3776,"children":3777},{"class":159,"line":1499},[3778],{"type":20,"tag":157,"props":3779,"children":3780},{"emptyLinePlaceholder":173},[3781],{"type":25,"value":176},{"type":20,"tag":157,"props":3783,"children":3784},{"class":159,"line":1507},[3785],{"type":20,"tag":157,"props":3786,"children":3787},{"emptyLinePlaceholder":173},[3788],{"type":25,"value":176},{"type":20,"tag":157,"props":3790,"children":3791},{"class":159,"line":1515},[3792],{"type":20,"tag":157,"props":3793,"children":3794},{},[3795],{"type":25,"value":3796},"print(calc_basic_descriptors(\"CC(=O)Oc1ccccc1C(=O)O\"))\n",{"type":20,"tag":21,"props":3798,"children":3799},{},[3800],{"type":25,"value":3801},"描述符最大的优点是可解释。",{"type":20,"tag":21,"props":3803,"children":3804},{},[3805],{"type":25,"value":3806},"当模型预测一个分子溶解性不好时，我们至少可以回头看：是不是 LogP 太高？是不是 TPSA 太大？是不是氢键供受体数量异常？这些特征和化学直觉之间有对应关系。",{"type":20,"tag":21,"props":3808,"children":3809},{},[3810],{"type":25,"value":3811},"它的缺点也很明显：描述符是人工设计的汇总特征，表达能力有限。两个分子的分子量、LogP、TPSA 可能很接近，但局部结构完全不同。",{"type":20,"tag":21,"props":3813,"children":3814},{},[3815],{"type":25,"value":3816},"这就需要分子指纹。",{"type":20,"tag":1863,"props":3818,"children":3820},{"id":3819},"lipinski-五规则一个经典但不能迷信的经验规则",[3821],{"type":25,"value":3822},"Lipinski 五规则：一个经典但不能迷信的经验规则",{"type":20,"tag":21,"props":3824,"children":3825},{},[3826],{"type":25,"value":3827},"在小分子药物里，经常会看到 Lipinski 五规则。它用于粗略判断一个分子是否可能具备较好的口服成药性。",{"type":20,"tag":21,"props":3829,"children":3830},{},[3831],{"type":25,"value":3832},"常见阈值是：",{"type":20,"tag":126,"props":3834,"children":3836},{"className":324,"code":3835,"language":25,"meta":8,"style":8},"分子量 \u003C= 500\nLogP \u003C= 5\n氢键供体 HBD \u003C= 5\n氢键受体 HBA \u003C= 10\n",[3837],{"type":20,"tag":84,"props":3838,"children":3839},{"__ignoreMap":8},[3840,3848,3856,3864],{"type":20,"tag":157,"props":3841,"children":3842},{"class":159,"line":160},[3843],{"type":20,"tag":157,"props":3844,"children":3845},{},[3846],{"type":25,"value":3847},"分子量 \u003C= 500\n",{"type":20,"tag":157,"props":3849,"children":3850},{"class":159,"line":169},[3851],{"type":20,"tag":157,"props":3852,"children":3853},{},[3854],{"type":25,"value":3855},"LogP \u003C= 5\n",{"type":20,"tag":157,"props":3857,"children":3858},{"class":159,"line":179},[3859],{"type":20,"tag":157,"props":3860,"children":3861},{},[3862],{"type":25,"value":3863},"氢键供体 HBD \u003C= 5\n",{"type":20,"tag":157,"props":3865,"children":3866},{"class":159,"line":188},[3867],{"type":20,"tag":157,"props":3868,"children":3869},{},[3870],{"type":25,"value":3871},"氢键受体 HBA \u003C= 10\n",{"type":20,"tag":21,"props":3873,"children":3874},{},[3875],{"type":25,"value":3876},"虽然叫“五规则”，但它不是一个模型，也不是药物能否成功的判决书。它更像早期过滤条件：如果一个分子严重违反这些规则，后续 ADMET 风险可能更高。",{"type":20,"tag":21,"props":3878,"children":3879},{},[3880],{"type":25,"value":3881},"在工程系统里，我更倾向于把它当成一个解释性指标，而不是硬性真理：",{"type":20,"tag":126,"props":3883,"children":3885},{"className":324,"code":3884,"language":25,"meta":8,"style":8},"这个分子违反了几条规则？\n违反的是分子量、LogP，还是氢键供受体？\n是否需要结合具体靶点、给药方式和实验数据重新判断？\n",[3886],{"type":20,"tag":84,"props":3887,"children":3888},{"__ignoreMap":8},[3889,3897,3905],{"type":20,"tag":157,"props":3890,"children":3891},{"class":159,"line":160},[3892],{"type":20,"tag":157,"props":3893,"children":3894},{},[3895],{"type":25,"value":3896},"这个分子违反了几条规则？\n",{"type":20,"tag":157,"props":3898,"children":3899},{"class":159,"line":169},[3900],{"type":20,"tag":157,"props":3901,"children":3902},{},[3903],{"type":25,"value":3904},"违反的是分子量、LogP，还是氢键供受体？\n",{"type":20,"tag":157,"props":3906,"children":3907},{"class":159,"line":179},[3908],{"type":20,"tag":157,"props":3909,"children":3910},{},[3911],{"type":25,"value":3912},"是否需要结合具体靶点、给药方式和实验数据重新判断？\n",{"type":20,"tag":21,"props":3914,"children":3915},{},[3916],{"type":25,"value":3917},"AI 制药里很容易把计算结果说得太满。但描述符和经验规则只能提供线索，不能替代实验验证。",{"type":20,"tag":1863,"props":3919,"children":3921},{"id":3920},"morgan-指纹把局部结构编码成高维向量",[3922],{"type":25,"value":3923},"Morgan 指纹：把局部结构编码成高维向量",{"type":20,"tag":21,"props":3925,"children":3926},{},[3927],{"type":25,"value":3928},"分子描述符像是在回答：“这个分子总体上是什么性质？”",{"type":20,"tag":21,"props":3930,"children":3931},{},[3932],{"type":25,"value":3933},"Morgan 指纹更像是在回答：“这个分子里出现过哪些局部结构？”",{"type":20,"tag":21,"props":3935,"children":3936},{},[3937],{"type":25,"value":3938},"RDKit 里的 Morgan 指纹属于 circular fingerprints。它会围绕每个原子，在一定半径内观察局部化学环境，然后把这些局部环境编码到固定长度的向量里。",{"type":20,"tag":21,"props":3940,"children":3941},{},[3942],{"type":25,"value":3943},"一个常见设置是：",{"type":20,"tag":126,"props":3945,"children":3947},{"className":324,"code":3946,"language":25,"meta":8,"style":8},"radius = 2\nfpSize = 2048\n",[3948],{"type":20,"tag":84,"props":3949,"children":3950},{"__ignoreMap":8},[3951,3959],{"type":20,"tag":157,"props":3952,"children":3953},{"class":159,"line":160},[3954],{"type":20,"tag":157,"props":3955,"children":3956},{},[3957],{"type":25,"value":3958},"radius = 2\n",{"type":20,"tag":157,"props":3960,"children":3961},{"class":159,"line":169},[3962],{"type":20,"tag":157,"props":3963,"children":3964},{},[3965],{"type":25,"value":3966},"fpSize = 2048\n",{"type":20,"tag":21,"props":3968,"children":3969},{},[3970],{"type":25,"value":3971},"也就是生成一个 2048 位的 bit vector。每一位可以粗略理解为某种结构模式是否出现过。",{"type":20,"tag":21,"props":3973,"children":3974},{},[3975],{"type":25,"value":3976},"新版 RDKit 文档中，更推荐用 fingerprint generator 的方式生成 Morgan 指纹：",{"type":20,"tag":126,"props":3978,"children":3980},{"className":151,"code":3979,"language":150,"meta":8,"style":8},"import numpy as np\nfrom rdkit import Chem, DataStructs\nfrom rdkit.Chem import AllChem\n\n\ndef morgan_fingerprint(smiles: str, radius: int = 2, fp_size: int = 2048):\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n\n    fpgen = AllChem.GetMorganGenerator(radius=radius, fpSize=fp_size)\n    fingerprint = fpgen.GetFingerprint(mol)\n\n    array = np.zeros((fp_size,), dtype=np.int8)\n    DataStructs.ConvertToNumpyArray(fingerprint, array)\n    return array\n\n\nfp = morgan_fingerprint(\"CC(=O)Oc1ccccc1C(=O)O\")\nprint(fp.shape)\n",[3981],{"type":20,"tag":84,"props":3982,"children":3983},{"__ignoreMap":8},[3984,3992,4000,4008,4015,4022,4030,4037,4044,4051,4058,4066,4074,4081,4089,4097,4105,4112,4119,4127],{"type":20,"tag":157,"props":3985,"children":3986},{"class":159,"line":160},[3987],{"type":20,"tag":157,"props":3988,"children":3989},{},[3990],{"type":25,"value":3991},"import numpy as np\n",{"type":20,"tag":157,"props":3993,"children":3994},{"class":159,"line":169},[3995],{"type":20,"tag":157,"props":3996,"children":3997},{},[3998],{"type":25,"value":3999},"from rdkit import Chem, DataStructs\n",{"type":20,"tag":157,"props":4001,"children":4002},{"class":159,"line":179},[4003],{"type":20,"tag":157,"props":4004,"children":4005},{},[4006],{"type":25,"value":4007},"from rdkit.Chem import AllChem\n",{"type":20,"tag":157,"props":4009,"children":4010},{"class":159,"line":188},[4011],{"type":20,"tag":157,"props":4012,"children":4013},{"emptyLinePlaceholder":173},[4014],{"type":25,"value":176},{"type":20,"tag":157,"props":4016,"children":4017},{"class":159,"line":196},[4018],{"type":20,"tag":157,"props":4019,"children":4020},{"emptyLinePlaceholder":173},[4021],{"type":25,"value":176},{"type":20,"tag":157,"props":4023,"children":4024},{"class":159,"line":204},[4025],{"type":20,"tag":157,"props":4026,"children":4027},{},[4028],{"type":25,"value":4029},"def morgan_fingerprint(smiles: str, radius: int = 2, fp_size: int = 2048):\n",{"type":20,"tag":157,"props":4031,"children":4032},{"class":159,"line":213},[4033],{"type":20,"tag":157,"props":4034,"children":4035},{},[4036],{"type":25,"value":2602},{"type":20,"tag":157,"props":4038,"children":4039},{"class":159,"line":222},[4040],{"type":20,"tag":157,"props":4041,"children":4042},{},[4043],{"type":25,"value":2610},{"type":20,"tag":157,"props":4045,"children":4046},{"class":159,"line":440},[4047],{"type":20,"tag":157,"props":4048,"children":4049},{},[4050],{"type":25,"value":2618},{"type":20,"tag":157,"props":4052,"children":4053},{"class":159,"line":448},[4054],{"type":20,"tag":157,"props":4055,"children":4056},{"emptyLinePlaceholder":173},[4057],{"type":25,"value":176},{"type":20,"tag":157,"props":4059,"children":4060},{"class":159,"line":456},[4061],{"type":20,"tag":157,"props":4062,"children":4063},{},[4064],{"type":25,"value":4065},"    fpgen = AllChem.GetMorganGenerator(radius=radius, fpSize=fp_size)\n",{"type":20,"tag":157,"props":4067,"children":4068},{"class":159,"line":465},[4069],{"type":20,"tag":157,"props":4070,"children":4071},{},[4072],{"type":25,"value":4073},"    fingerprint = fpgen.GetFingerprint(mol)\n",{"type":20,"tag":157,"props":4075,"children":4076},{"class":159,"line":474},[4077],{"type":20,"tag":157,"props":4078,"children":4079},{"emptyLinePlaceholder":173},[4080],{"type":25,"value":176},{"type":20,"tag":157,"props":4082,"children":4083},{"class":159,"line":483},[4084],{"type":20,"tag":157,"props":4085,"children":4086},{},[4087],{"type":25,"value":4088},"    array = np.zeros((fp_size,), dtype=np.int8)\n",{"type":20,"tag":157,"props":4090,"children":4091},{"class":159,"line":491},[4092],{"type":20,"tag":157,"props":4093,"children":4094},{},[4095],{"type":25,"value":4096},"    DataStructs.ConvertToNumpyArray(fingerprint, array)\n",{"type":20,"tag":157,"props":4098,"children":4099},{"class":159,"line":499},[4100],{"type":20,"tag":157,"props":4101,"children":4102},{},[4103],{"type":25,"value":4104},"    return array\n",{"type":20,"tag":157,"props":4106,"children":4107},{"class":159,"line":508},[4108],{"type":20,"tag":157,"props":4109,"children":4110},{"emptyLinePlaceholder":173},[4111],{"type":25,"value":176},{"type":20,"tag":157,"props":4113,"children":4114},{"class":159,"line":517},[4115],{"type":20,"tag":157,"props":4116,"children":4117},{"emptyLinePlaceholder":173},[4118],{"type":25,"value":176},{"type":20,"tag":157,"props":4120,"children":4121},{"class":159,"line":1499},[4122],{"type":20,"tag":157,"props":4123,"children":4124},{},[4125],{"type":25,"value":4126},"fp = morgan_fingerprint(\"CC(=O)Oc1ccccc1C(=O)O\")\n",{"type":20,"tag":157,"props":4128,"children":4129},{"class":159,"line":1507},[4130],{"type":20,"tag":157,"props":4131,"children":4132},{},[4133],{"type":25,"value":4134},"print(fp.shape)\n",{"type":20,"tag":21,"props":4136,"children":4137},{},[4138,4140,4146],{"type":25,"value":4139},"输出的 ",{"type":20,"tag":84,"props":4141,"children":4143},{"className":4142},[],[4144],{"type":25,"value":4145},"fp",{"type":25,"value":4147}," 就可以作为机器学习模型的输入特征。",{"type":20,"tag":21,"props":4149,"children":4150},{},[4151],{"type":25,"value":4152},"和描述符相比，Morgan 指纹的特点是：",{"type":20,"tag":1902,"props":4154,"children":4155},{},[4156,4177],{"type":20,"tag":1906,"props":4157,"children":4158},{},[4159],{"type":20,"tag":1910,"props":4160,"children":4161},{},[4162,4167,4172],{"type":20,"tag":1914,"props":4163,"children":4164},{},[4165],{"type":25,"value":4166},"特征",{"type":20,"tag":1914,"props":4168,"children":4169},{},[4170],{"type":25,"value":4171},"分子描述符",{"type":20,"tag":1914,"props":4173,"children":4174},{},[4175],{"type":25,"value":4176},"Morgan 指纹",{"type":20,"tag":1930,"props":4178,"children":4179},{},[4180,4198,4216,4234],{"type":20,"tag":1910,"props":4181,"children":4182},{},[4183,4188,4193],{"type":20,"tag":1937,"props":4184,"children":4185},{},[4186],{"type":25,"value":4187},"维度",{"type":20,"tag":1937,"props":4189,"children":4190},{},[4191],{"type":25,"value":4192},"通常较少",{"type":20,"tag":1937,"props":4194,"children":4195},{},[4196],{"type":25,"value":4197},"通常较高，比如 2048 位",{"type":20,"tag":1910,"props":4199,"children":4200},{},[4201,4206,4211],{"type":20,"tag":1937,"props":4202,"children":4203},{},[4204],{"type":25,"value":4205},"可解释性",{"type":20,"tag":1937,"props":4207,"children":4208},{},[4209],{"type":25,"value":4210},"强",{"type":20,"tag":1937,"props":4212,"children":4213},{},[4214],{"type":25,"value":4215},"弱一些",{"type":20,"tag":1910,"props":4217,"children":4218},{},[4219,4224,4229],{"type":20,"tag":1937,"props":4220,"children":4221},{},[4222],{"type":25,"value":4223},"表达重点",{"type":20,"tag":1937,"props":4225,"children":4226},{},[4227],{"type":25,"value":4228},"整体物化性质",{"type":20,"tag":1937,"props":4230,"children":4231},{},[4232],{"type":25,"value":4233},"局部结构模式",{"type":20,"tag":1910,"props":4235,"children":4236},{},[4237,4242,4247],{"type":20,"tag":1937,"props":4238,"children":4239},{},[4240],{"type":25,"value":4241},"适合场景",{"type":20,"tag":1937,"props":4243,"children":4244},{},[4245],{"type":25,"value":4246},"表格模型、baseline、解释分析",{"type":20,"tag":1937,"props":4248,"children":4249},{},[4250],{"type":25,"value":4251},"相似性搜索、QSAR、机器学习输入",{"type":20,"tag":21,"props":4253,"children":4254},{},[4255],{"type":25,"value":4256},"真实项目里，两者不一定二选一。很多 baseline 会把描述符和指纹都算出来，再比较不同特征组合的效果。",{"type":20,"tag":1863,"props":4258,"children":4260},{"id":4259},"tanimoto-相似度用指纹做分子相似性搜索",[4261],{"type":25,"value":4262},"Tanimoto 相似度：用指纹做分子相似性搜索",{"type":20,"tag":21,"props":4264,"children":4265},{},[4266],{"type":25,"value":4267},"有了分子指纹之后，就可以比较两个分子有多像。",{"type":20,"tag":21,"props":4269,"children":4270},{},[4271],{"type":25,"value":4272},"化学信息学里常用的指标之一是 Tanimoto similarity。对于 bit vector 来说，它可以粗略理解成：",{"type":20,"tag":126,"props":4274,"children":4276},{"className":324,"code":4275,"language":25,"meta":8,"style":8},"两个分子共同打开的 bit 数量 \u002F 两个分子总共打开的 bit 数量\n",[4277],{"type":20,"tag":84,"props":4278,"children":4279},{"__ignoreMap":8},[4280],{"type":20,"tag":157,"props":4281,"children":4282},{"class":159,"line":160},[4283],{"type":20,"tag":157,"props":4284,"children":4285},{},[4286],{"type":25,"value":4275},{"type":20,"tag":21,"props":4288,"children":4289},{},[4290],{"type":25,"value":4291},"值越接近 1，说明两个指纹越相似；越接近 0，说明差异越大。",{"type":20,"tag":21,"props":4293,"children":4294},{},[4295],{"type":25,"value":4296},"用 RDKit 计算两个分子的 Tanimoto 相似度：",{"type":20,"tag":126,"props":4298,"children":4300},{"className":151,"code":4299,"language":150,"meta":8,"style":8},"from rdkit import Chem, DataStructs\nfrom rdkit.Chem import AllChem\n\n\nfpgen = AllChem.GetMorganGenerator(radius=2, fpSize=2048)\n\n\ndef get_fp(smiles: str):\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n    return fpgen.GetFingerprint(mol)\n\n\naspirin = get_fp(\"CC(=O)Oc1ccccc1C(=O)O\")\nbenzoic_acid = get_fp(\"O=C(O)c1ccccc1\")\n\nsimilarity = DataStructs.TanimotoSimilarity(aspirin, benzoic_acid)\nprint(similarity)\n",[4301],{"type":20,"tag":84,"props":4302,"children":4303},{"__ignoreMap":8},[4304,4311,4318,4325,4332,4340,4347,4354,4362,4369,4376,4383,4391,4398,4405,4413,4421,4428,4436],{"type":20,"tag":157,"props":4305,"children":4306},{"class":159,"line":160},[4307],{"type":20,"tag":157,"props":4308,"children":4309},{},[4310],{"type":25,"value":3999},{"type":20,"tag":157,"props":4312,"children":4313},{"class":159,"line":169},[4314],{"type":20,"tag":157,"props":4315,"children":4316},{},[4317],{"type":25,"value":4007},{"type":20,"tag":157,"props":4319,"children":4320},{"class":159,"line":179},[4321],{"type":20,"tag":157,"props":4322,"children":4323},{"emptyLinePlaceholder":173},[4324],{"type":25,"value":176},{"type":20,"tag":157,"props":4326,"children":4327},{"class":159,"line":188},[4328],{"type":20,"tag":157,"props":4329,"children":4330},{"emptyLinePlaceholder":173},[4331],{"type":25,"value":176},{"type":20,"tag":157,"props":4333,"children":4334},{"class":159,"line":196},[4335],{"type":20,"tag":157,"props":4336,"children":4337},{},[4338],{"type":25,"value":4339},"fpgen = AllChem.GetMorganGenerator(radius=2, fpSize=2048)\n",{"type":20,"tag":157,"props":4341,"children":4342},{"class":159,"line":204},[4343],{"type":20,"tag":157,"props":4344,"children":4345},{"emptyLinePlaceholder":173},[4346],{"type":25,"value":176},{"type":20,"tag":157,"props":4348,"children":4349},{"class":159,"line":213},[4350],{"type":20,"tag":157,"props":4351,"children":4352},{"emptyLinePlaceholder":173},[4353],{"type":25,"value":176},{"type":20,"tag":157,"props":4355,"children":4356},{"class":159,"line":222},[4357],{"type":20,"tag":157,"props":4358,"children":4359},{},[4360],{"type":25,"value":4361},"def get_fp(smiles: str):\n",{"type":20,"tag":157,"props":4363,"children":4364},{"class":159,"line":440},[4365],{"type":20,"tag":157,"props":4366,"children":4367},{},[4368],{"type":25,"value":2602},{"type":20,"tag":157,"props":4370,"children":4371},{"class":159,"line":448},[4372],{"type":20,"tag":157,"props":4373,"children":4374},{},[4375],{"type":25,"value":2610},{"type":20,"tag":157,"props":4377,"children":4378},{"class":159,"line":456},[4379],{"type":20,"tag":157,"props":4380,"children":4381},{},[4382],{"type":25,"value":2618},{"type":20,"tag":157,"props":4384,"children":4385},{"class":159,"line":465},[4386],{"type":20,"tag":157,"props":4387,"children":4388},{},[4389],{"type":25,"value":4390},"    return fpgen.GetFingerprint(mol)\n",{"type":20,"tag":157,"props":4392,"children":4393},{"class":159,"line":474},[4394],{"type":20,"tag":157,"props":4395,"children":4396},{"emptyLinePlaceholder":173},[4397],{"type":25,"value":176},{"type":20,"tag":157,"props":4399,"children":4400},{"class":159,"line":483},[4401],{"type":20,"tag":157,"props":4402,"children":4403},{"emptyLinePlaceholder":173},[4404],{"type":25,"value":176},{"type":20,"tag":157,"props":4406,"children":4407},{"class":159,"line":491},[4408],{"type":20,"tag":157,"props":4409,"children":4410},{},[4411],{"type":25,"value":4412},"aspirin = get_fp(\"CC(=O)Oc1ccccc1C(=O)O\")\n",{"type":20,"tag":157,"props":4414,"children":4415},{"class":159,"line":499},[4416],{"type":20,"tag":157,"props":4417,"children":4418},{},[4419],{"type":25,"value":4420},"benzoic_acid = get_fp(\"O=C(O)c1ccccc1\")\n",{"type":20,"tag":157,"props":4422,"children":4423},{"class":159,"line":508},[4424],{"type":20,"tag":157,"props":4425,"children":4426},{"emptyLinePlaceholder":173},[4427],{"type":25,"value":176},{"type":20,"tag":157,"props":4429,"children":4430},{"class":159,"line":517},[4431],{"type":20,"tag":157,"props":4432,"children":4433},{},[4434],{"type":25,"value":4435},"similarity = DataStructs.TanimotoSimilarity(aspirin, benzoic_acid)\n",{"type":20,"tag":157,"props":4437,"children":4438},{"class":159,"line":1499},[4439],{"type":20,"tag":157,"props":4440,"children":4441},{},[4442],{"type":25,"value":4443},"print(similarity)\n",{"type":20,"tag":21,"props":4445,"children":4446},{},[4447],{"type":25,"value":4448},"这就是分子相似性搜索的基础。",{"type":20,"tag":21,"props":4450,"children":4451},{},[4452],{"type":25,"value":4453},"一个简单的检索系统可以这样设计：",{"type":20,"tag":126,"props":4455,"children":4457},{"className":324,"code":4456,"language":25,"meta":8,"style":8},"1. 用户输入一个 SMILES\n2. RDKit 解析成 Mol\n3. 生成 Morgan 指纹\n4. 和数据库里已有分子的指纹逐个计算 Tanimoto similarity\n5. 返回相似度最高的 Top K 分子\n",[4458],{"type":20,"tag":84,"props":4459,"children":4460},{"__ignoreMap":8},[4461,4469,4477,4485,4493],{"type":20,"tag":157,"props":4462,"children":4463},{"class":159,"line":160},[4464],{"type":20,"tag":157,"props":4465,"children":4466},{},[4467],{"type":25,"value":4468},"1. 用户输入一个 SMILES\n",{"type":20,"tag":157,"props":4470,"children":4471},{"class":159,"line":169},[4472],{"type":20,"tag":157,"props":4473,"children":4474},{},[4475],{"type":25,"value":4476},"2. RDKit 解析成 Mol\n",{"type":20,"tag":157,"props":4478,"children":4479},{"class":159,"line":179},[4480],{"type":20,"tag":157,"props":4481,"children":4482},{},[4483],{"type":25,"value":4484},"3. 生成 Morgan 指纹\n",{"type":20,"tag":157,"props":4486,"children":4487},{"class":159,"line":188},[4488],{"type":20,"tag":157,"props":4489,"children":4490},{},[4491],{"type":25,"value":4492},"4. 和数据库里已有分子的指纹逐个计算 Tanimoto similarity\n",{"type":20,"tag":157,"props":4494,"children":4495},{"class":159,"line":196},[4496],{"type":20,"tag":157,"props":4497,"children":4498},{},[4499],{"type":25,"value":4500},"5. 返回相似度最高的 Top K 分子\n",{"type":20,"tag":21,"props":4502,"children":4503},{},[4504],{"type":25,"value":4505},"这类能力在药物发现里很常见。比如你已经知道一个 hit 分子，希望找到结构相似的候选分子；或者你想在分子库里快速找出一批和目标结构接近的化合物。",{"type":20,"tag":21,"props":4507,"children":4508},{},[4509,4511,4516],{"type":25,"value":4510},"但还是要加一句限制：",{"type":20,"tag":33,"props":4512,"children":4513},{},[4514],{"type":25,"value":4515},"结构相似不等于药效相同",{"type":25,"value":4517},"。相似性搜索只能提供候选方向，不能证明活性、毒性、选择性或成药性。",{"type":20,"tag":1863,"props":4519,"children":4521},{"id":4520},"一条最小可用的分子特征流水线",[4522],{"type":25,"value":4520},{"type":20,"tag":21,"props":4524,"children":4525},{},[4526],{"type":25,"value":4527},"把前面的内容合起来，可以写出一条最小可用的分子特征流水线：",{"type":20,"tag":126,"props":4529,"children":4531},{"className":151,"code":4530,"language":150,"meta":8,"style":8},"import numpy as np\nfrom rdkit import Chem, DataStructs\nfrom rdkit.Chem import AllChem, Descriptors, Lipinski, rdMolDescriptors\n\n\nfpgen = AllChem.GetMorganGenerator(radius=2, fpSize=2048)\n\n\ndef featurize_smiles(smiles: str) -> dict[str, object]:\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"无效的 SMILES: {smiles}\")\n\n    canonical_smiles = Chem.MolToSmiles(mol, canonical=True)\n\n    descriptors = {\n        \"mol_wt\": round(Descriptors.MolWt(mol), 2),\n        \"logp\": round(Descriptors.MolLogP(mol), 2),\n        \"tpsa\": round(Descriptors.TPSA(mol), 2),\n        \"hbd\": Lipinski.NumHDonors(mol),\n        \"hba\": Lipinski.NumHAcceptors(mol),\n        \"rotatable_bonds\": Lipinski.NumRotatableBonds(mol),\n        \"ring_count\": rdMolDescriptors.CalcNumRings(mol),\n    }\n\n    fingerprint = fpgen.GetFingerprint(mol)\n    fp_array = np.zeros((2048,), dtype=np.int8)\n    DataStructs.ConvertToNumpyArray(fingerprint, fp_array)\n\n    return {\n        \"canonical_smiles\": canonical_smiles,\n        \"descriptors\": descriptors,\n        \"morgan_fingerprint\": fp_array,\n    }\n",[4532],{"type":20,"tag":84,"props":4533,"children":4534},{"__ignoreMap":8},[4535,4542,4549,4557,4564,4571,4578,4585,4592,4600,4607,4614,4621,4628,4636,4643,4651,4658,4665,4672,4679,4686,4693,4700,4707,4714,4721,4729,4737,4744,4751,4759,4767,4775],{"type":20,"tag":157,"props":4536,"children":4537},{"class":159,"line":160},[4538],{"type":20,"tag":157,"props":4539,"children":4540},{},[4541],{"type":25,"value":3991},{"type":20,"tag":157,"props":4543,"children":4544},{"class":159,"line":169},[4545],{"type":20,"tag":157,"props":4546,"children":4547},{},[4548],{"type":25,"value":3999},{"type":20,"tag":157,"props":4550,"children":4551},{"class":159,"line":179},[4552],{"type":20,"tag":157,"props":4553,"children":4554},{},[4555],{"type":25,"value":4556},"from rdkit.Chem import AllChem, Descriptors, Lipinski, rdMolDescriptors\n",{"type":20,"tag":157,"props":4558,"children":4559},{"class":159,"line":188},[4560],{"type":20,"tag":157,"props":4561,"children":4562},{"emptyLinePlaceholder":173},[4563],{"type":25,"value":176},{"type":20,"tag":157,"props":4565,"children":4566},{"class":159,"line":196},[4567],{"type":20,"tag":157,"props":4568,"children":4569},{"emptyLinePlaceholder":173},[4570],{"type":25,"value":176},{"type":20,"tag":157,"props":4572,"children":4573},{"class":159,"line":204},[4574],{"type":20,"tag":157,"props":4575,"children":4576},{},[4577],{"type":25,"value":4339},{"type":20,"tag":157,"props":4579,"children":4580},{"class":159,"line":213},[4581],{"type":20,"tag":157,"props":4582,"children":4583},{"emptyLinePlaceholder":173},[4584],{"type":25,"value":176},{"type":20,"tag":157,"props":4586,"children":4587},{"class":159,"line":222},[4588],{"type":20,"tag":157,"props":4589,"children":4590},{"emptyLinePlaceholder":173},[4591],{"type":25,"value":176},{"type":20,"tag":157,"props":4593,"children":4594},{"class":159,"line":440},[4595],{"type":20,"tag":157,"props":4596,"children":4597},{},[4598],{"type":25,"value":4599},"def featurize_smiles(smiles: str) -> dict[str, object]:\n",{"type":20,"tag":157,"props":4601,"children":4602},{"class":159,"line":448},[4603],{"type":20,"tag":157,"props":4604,"children":4605},{},[4606],{"type":25,"value":2602},{"type":20,"tag":157,"props":4608,"children":4609},{"class":159,"line":456},[4610],{"type":20,"tag":157,"props":4611,"children":4612},{},[4613],{"type":25,"value":2610},{"type":20,"tag":157,"props":4615,"children":4616},{"class":159,"line":465},[4617],{"type":20,"tag":157,"props":4618,"children":4619},{},[4620],{"type":25,"value":2618},{"type":20,"tag":157,"props":4622,"children":4623},{"class":159,"line":474},[4624],{"type":20,"tag":157,"props":4625,"children":4626},{"emptyLinePlaceholder":173},[4627],{"type":25,"value":176},{"type":20,"tag":157,"props":4629,"children":4630},{"class":159,"line":483},[4631],{"type":20,"tag":157,"props":4632,"children":4633},{},[4634],{"type":25,"value":4635},"    canonical_smiles = Chem.MolToSmiles(mol, canonical=True)\n",{"type":20,"tag":157,"props":4637,"children":4638},{"class":159,"line":491},[4639],{"type":20,"tag":157,"props":4640,"children":4641},{"emptyLinePlaceholder":173},[4642],{"type":25,"value":176},{"type":20,"tag":157,"props":4644,"children":4645},{"class":159,"line":499},[4646],{"type":20,"tag":157,"props":4647,"children":4648},{},[4649],{"type":25,"value":4650},"    descriptors = {\n",{"type":20,"tag":157,"props":4652,"children":4653},{"class":159,"line":508},[4654],{"type":20,"tag":157,"props":4655,"children":4656},{},[4657],{"type":25,"value":3719},{"type":20,"tag":157,"props":4659,"children":4660},{"class":159,"line":517},[4661],{"type":20,"tag":157,"props":4662,"children":4663},{},[4664],{"type":25,"value":3727},{"type":20,"tag":157,"props":4666,"children":4667},{"class":159,"line":1499},[4668],{"type":20,"tag":157,"props":4669,"children":4670},{},[4671],{"type":25,"value":3735},{"type":20,"tag":157,"props":4673,"children":4674},{"class":159,"line":1507},[4675],{"type":20,"tag":157,"props":4676,"children":4677},{},[4678],{"type":25,"value":3743},{"type":20,"tag":157,"props":4680,"children":4681},{"class":159,"line":1515},[4682],{"type":20,"tag":157,"props":4683,"children":4684},{},[4685],{"type":25,"value":3751},{"type":20,"tag":157,"props":4687,"children":4688},{"class":159,"line":1523},[4689],{"type":20,"tag":157,"props":4690,"children":4691},{},[4692],{"type":25,"value":3759},{"type":20,"tag":157,"props":4694,"children":4695},{"class":159,"line":1532},[4696],{"type":20,"tag":157,"props":4697,"children":4698},{},[4699],{"type":25,"value":3767},{"type":20,"tag":157,"props":4701,"children":4702},{"class":159,"line":1541},[4703],{"type":20,"tag":157,"props":4704,"children":4705},{},[4706],{"type":25,"value":872},{"type":20,"tag":157,"props":4708,"children":4709},{"class":159,"line":1550},[4710],{"type":20,"tag":157,"props":4711,"children":4712},{"emptyLinePlaceholder":173},[4713],{"type":25,"value":176},{"type":20,"tag":157,"props":4715,"children":4716},{"class":159,"line":1558},[4717],{"type":20,"tag":157,"props":4718,"children":4719},{},[4720],{"type":25,"value":4073},{"type":20,"tag":157,"props":4722,"children":4723},{"class":159,"line":1566},[4724],{"type":20,"tag":157,"props":4725,"children":4726},{},[4727],{"type":25,"value":4728},"    fp_array = np.zeros((2048,), dtype=np.int8)\n",{"type":20,"tag":157,"props":4730,"children":4731},{"class":159,"line":1574},[4732],{"type":20,"tag":157,"props":4733,"children":4734},{},[4735],{"type":25,"value":4736},"    DataStructs.ConvertToNumpyArray(fingerprint, fp_array)\n",{"type":20,"tag":157,"props":4738,"children":4739},{"class":159,"line":1582},[4740],{"type":20,"tag":157,"props":4741,"children":4742},{"emptyLinePlaceholder":173},[4743],{"type":25,"value":176},{"type":20,"tag":157,"props":4745,"children":4746},{"class":159,"line":1591},[4747],{"type":20,"tag":157,"props":4748,"children":4749},{},[4750],{"type":25,"value":848},{"type":20,"tag":157,"props":4752,"children":4753},{"class":159,"line":1599},[4754],{"type":20,"tag":157,"props":4755,"children":4756},{},[4757],{"type":25,"value":4758},"        \"canonical_smiles\": canonical_smiles,\n",{"type":20,"tag":157,"props":4760,"children":4761},{"class":159,"line":1608},[4762],{"type":20,"tag":157,"props":4763,"children":4764},{},[4765],{"type":25,"value":4766},"        \"descriptors\": descriptors,\n",{"type":20,"tag":157,"props":4768,"children":4769},{"class":159,"line":1617},[4770],{"type":20,"tag":157,"props":4771,"children":4772},{},[4773],{"type":25,"value":4774},"        \"morgan_fingerprint\": fp_array,\n",{"type":20,"tag":157,"props":4776,"children":4777},{"class":159,"line":1626},[4778],{"type":20,"tag":157,"props":4779,"children":4780},{},[4781],{"type":25,"value":872},{"type":20,"tag":21,"props":4783,"children":4784},{},[4785],{"type":25,"value":4786},"这段代码已经覆盖了一个小型 AI 制药平台的基础能力：",{"type":20,"tag":126,"props":4788,"children":4790},{"className":324,"code":4789,"language":25,"meta":8,"style":8},"输入校验\n标准化\n特征提取\n向量生成\n",[4791],{"type":20,"tag":84,"props":4792,"children":4793},{"__ignoreMap":8},[4794,4802,4810,4818],{"type":20,"tag":157,"props":4795,"children":4796},{"class":159,"line":160},[4797],{"type":20,"tag":157,"props":4798,"children":4799},{},[4800],{"type":25,"value":4801},"输入校验\n",{"type":20,"tag":157,"props":4803,"children":4804},{"class":159,"line":169},[4805],{"type":20,"tag":157,"props":4806,"children":4807},{},[4808],{"type":25,"value":4809},"标准化\n",{"type":20,"tag":157,"props":4811,"children":4812},{"class":159,"line":179},[4813],{"type":20,"tag":157,"props":4814,"children":4815},{},[4816],{"type":25,"value":4817},"特征提取\n",{"type":20,"tag":157,"props":4819,"children":4820},{"class":159,"line":188},[4821],{"type":20,"tag":157,"props":4822,"children":4823},{},[4824],{"type":25,"value":4825},"向量生成\n",{"type":20,"tag":21,"props":4827,"children":4828},{},[4829],{"type":25,"value":4830},"后面无论是做分子相似性搜索、性质预测、分类模型，还是接入更复杂的深度学习模型，这条链路都可以继续扩展。",{"type":20,"tag":1863,"props":4832,"children":4834},{"id":4833},"我对这两周内容的理解",[4835],{"type":25,"value":4833},{"type":20,"tag":21,"props":4837,"children":4838},{},[4839],{"type":25,"value":4840},"学 RDKit 和 SMILES 时，很容易陷入 API 细节：这个函数怎么调，那个参数怎么写。",{"type":20,"tag":21,"props":4842,"children":4843},{},[4844],{"type":25,"value":4845},"但真正重要的是建立一张工程地图：",{"type":20,"tag":126,"props":4847,"children":4849},{"className":324,"code":4848,"language":25,"meta":8,"style":8},"SMILES 是输入格式\nMol 是 RDKit 的内部分子对象\nCanonical SMILES 用来统一表示\n分子图片用于展示\n分子描述符提供可解释特征\nMorgan 指纹提供高维结构特征\nTanimoto 相似度用于分子相似性搜索\n",[4850],{"type":20,"tag":84,"props":4851,"children":4852},{"__ignoreMap":8},[4853,4861,4869,4877,4885,4893,4901],{"type":20,"tag":157,"props":4854,"children":4855},{"class":159,"line":160},[4856],{"type":20,"tag":157,"props":4857,"children":4858},{},[4859],{"type":25,"value":4860},"SMILES 是输入格式\n",{"type":20,"tag":157,"props":4862,"children":4863},{"class":159,"line":169},[4864],{"type":20,"tag":157,"props":4865,"children":4866},{},[4867],{"type":25,"value":4868},"Mol 是 RDKit 的内部分子对象\n",{"type":20,"tag":157,"props":4870,"children":4871},{"class":159,"line":179},[4872],{"type":20,"tag":157,"props":4873,"children":4874},{},[4875],{"type":25,"value":4876},"Canonical SMILES 用来统一表示\n",{"type":20,"tag":157,"props":4878,"children":4879},{"class":159,"line":188},[4880],{"type":20,"tag":157,"props":4881,"children":4882},{},[4883],{"type":25,"value":4884},"分子图片用于展示\n",{"type":20,"tag":157,"props":4886,"children":4887},{"class":159,"line":196},[4888],{"type":20,"tag":157,"props":4889,"children":4890},{},[4891],{"type":25,"value":4892},"分子描述符提供可解释特征\n",{"type":20,"tag":157,"props":4894,"children":4895},{"class":159,"line":204},[4896],{"type":20,"tag":157,"props":4897,"children":4898},{},[4899],{"type":25,"value":4900},"Morgan 指纹提供高维结构特征\n",{"type":20,"tag":157,"props":4902,"children":4903},{"class":159,"line":213},[4904],{"type":20,"tag":157,"props":4905,"children":4906},{},[4907],{"type":25,"value":4908},"Tanimoto 相似度用于分子相似性搜索\n",{"type":20,"tag":21,"props":4910,"children":4911},{},[4912],{"type":25,"value":4913},"这张地图一旦建立起来，后面的机器学习部分会顺很多。",{"type":20,"tag":21,"props":4915,"children":4916},{},[4917],{"type":25,"value":4918},"因为你会知道：模型不是凭空预测的。它吃进去的每一个数字，都来自前面某一步对分子结构的编码。",{"type":20,"tag":21,"props":4920,"children":4921},{},[4922],{"type":25,"value":4923},"对 AI 制药项目来说，这也是一个很好的提醒：不要一上来就追复杂模型。先把分子表示、数据清洗、特征提取和错误处理做好，系统才有继续长大的基础。",{"type":20,"tag":1863,"props":4925,"children":4927},{"id":4926},"参考资料",[4928],{"type":25,"value":4926},{"type":20,"tag":44,"props":4930,"children":4931},{},[4932,4942,4952],{"type":20,"tag":48,"props":4933,"children":4934},{},[4935],{"type":20,"tag":101,"props":4936,"children":4939},{"href":4937,"rel":4938},"https:\u002F\u002Fwww.rdkit.org\u002Fdocs\u002Findex.html",[105],[4940],{"type":25,"value":4941},"RDKit 2026.03.2 Documentation",{"type":20,"tag":48,"props":4943,"children":4944},{},[4945],{"type":20,"tag":101,"props":4946,"children":4949},{"href":4947,"rel":4948},"https:\u002F\u002Fwww.rdkit.org\u002Fdocs\u002FGettingStartedInPython.html",[105],[4950],{"type":25,"value":4951},"Getting Started with the RDKit in Python",{"type":20,"tag":48,"props":4953,"children":4954},{},[4955],{"type":20,"tag":101,"props":4956,"children":4959},{"href":4957,"rel":4958},"https:\u002F\u002Fwww.rdkit.org\u002Fdocs\u002Fsource\u002Frdkit.Chem.Descriptors.html",[105],[4960],{"type":25,"value":4961},"RDKit Descriptors 文档",{"type":20,"tag":1785,"props":4963,"children":4964},{},[4965],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":4967},[4968,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978,4979,4980],{"id":1865,"depth":169,"text":1868},{"id":2144,"depth":169,"text":2147},{"id":2364,"depth":169,"text":2367},{"id":2437,"depth":169,"text":2440},{"id":2792,"depth":169,"text":2795},{"id":2950,"depth":169,"text":2953},{"id":3327,"depth":169,"text":3330},{"id":3819,"depth":169,"text":3822},{"id":3920,"depth":169,"text":3923},{"id":4259,"depth":169,"text":4262},{"id":4520,"depth":169,"text":4520},{"id":4833,"depth":169,"text":4833},{"id":4926,"depth":169,"text":4926},"content:articles:AI制药理论:rdkit-smiles-descriptors-fingerprints.md","articles\u002FAI制药理论\u002Frdkit-smiles-descriptors-fingerprints.md","articles\u002FAI制药理论\u002Frdkit-smiles-descriptors-fingerprints",{"_path":4985,"_dir":1808,"_draft":7,"_partial":7,"_locale":8,"title":4986,"description":4987,"date":4988,"tags":4989,"body":4991,"_type":1800,"_id":6771,"_source":1802,"_file":6772,"_stem":6773,"_extension":1805},"\u002Farticles\u002Fai\u002Feverything-claude-codecodex","everything-claude-code 在 Codex 的应用：不要照搬全家桶，而是做一套更聪明的增强层","从 Codex 原生能力出发，拆解 everything-claude-code 中哪些规则、skills 和工作流值得迁移，哪些配置不应该原样照搬。","2026-05-18",[4990,14],"AI工具",{"type":17,"children":4992,"toc":6758},[4993,4998,5003,5016,5021,5032,5045,5055,5059,5065,5070,5224,5236,5246,5251,5254,5259,5264,5307,5312,5317,5329,5341,5353,5358,5361,5366,5371,5506,5511,5556,5561,5579,5591,5594,5599,5604,5643,5648,5653,5713,5718,5737,5749,5752,5758,5763,5768,5862,5867,6127,6132,6137,6151,6156,6178,6183,6197,6202,6216,6221,6252,6257,6260,6265,6270,6301,6306,6318,6443,6461,6466,6469,6475,6480,6490,6507,6517,6527,6530,6536,6541,6564,6569,6616,6621,6631,6634,6639,6644,6649,6654,6659,6664,6673,6676,6681,6686,6695,6698,6702,6754],{"type":20,"tag":21,"props":4994,"children":4995},{},[4996],{"type":25,"value":4997},"一个典型场景是这样。",{"type":20,"tag":21,"props":4999,"children":5000},{},[5001],{"type":25,"value":5002},"你让 Codex 修复 CI 里的 typecheck 报错。没有额外规则时，它可能会找到报错文件，改掉类型定义，然后停在“看起来已经修了”的状态。CI 再跑一次，还是红的，因为它没有在本地复现，也没有重新跑 typecheck 验证。",{"type":20,"tag":21,"props":5004,"children":5005},{},[5006,5008,5014],{"type":25,"value":5007},"同一个任务，如果项目里放了一套精简过的工程规则，行为会更稳定：先用 ",{"type":20,"tag":84,"props":5009,"children":5011},{"className":5010},[],[5012],{"type":25,"value":5013},"npx tsc --noEmit",{"type":25,"value":5015}," 复现错误，定位第一个有意义的失败，改根因，再跑一次验证，通过后才收工。",{"type":20,"tag":21,"props":5017,"children":5018},{},[5019],{"type":25,"value":5020},"多了一步，但少了返工。",{"type":20,"tag":21,"props":5022,"children":5023},{},[5024,5026,5031],{"type":25,"value":5025},"区别不在于 Codex 突然“变聪明”了，而是它被明确提醒了一件工程里很普通、但 AI 编程助手经常漏掉的事：",{"type":20,"tag":33,"props":5027,"children":5028},{},[5029],{"type":25,"value":5030},"改完要验证",{"type":25,"value":110},{"type":20,"tag":21,"props":5033,"children":5034},{},[5035,5037,5043],{"type":25,"value":5036},"这就是 ",{"type":20,"tag":84,"props":5038,"children":5040},{"className":5039},[],[5041],{"type":25,"value":5042},"everything-claude-code",{"type":25,"value":5044},"（下面简称 ECC）对 Codex 的真正价值。它不是一个应该被完整复制进项目的全家桶，而是一套可以被提炼的工程习惯：规则怎么写、任务怎么拆、什么时候验证、什么时候做安全检查。",{"type":20,"tag":21,"props":5046,"children":5047},{},[5048,5050],{"type":25,"value":5049},"这篇文章想讲清楚一件事：",{"type":20,"tag":33,"props":5051,"children":5052},{},[5053],{"type":25,"value":5054},"在 Codex 里用 ECC，重点不是搬运，而是翻译。",{"type":20,"tag":5056,"props":5057,"children":5058},"hr",{},[],{"type":20,"tag":1863,"props":5060,"children":5062},{"id":5061},"codex-本来就能做什么",[5063],{"type":25,"value":5064},"Codex 本来就能做什么",{"type":20,"tag":21,"props":5066,"children":5067},{},[5068],{"type":25,"value":5069},"先把底座说清楚。Codex 原生已经有一套项目级能力，不需要 ECC 也能工作：",{"type":20,"tag":1902,"props":5071,"children":5072},{},[5073,5094],{"type":20,"tag":1906,"props":5074,"children":5075},{},[5076],{"type":20,"tag":1910,"props":5077,"children":5078},{},[5079,5084,5089],{"type":20,"tag":1914,"props":5080,"children":5081},{},[5082],{"type":25,"value":5083},"能力",{"type":20,"tag":1914,"props":5085,"children":5086},{},[5087],{"type":25,"value":5088},"Codex 原生入口",{"type":20,"tag":1914,"props":5090,"children":5091},{},[5092],{"type":25,"value":5093},"适合承载什么",{"type":20,"tag":1930,"props":5095,"children":5096},{},[5097,5119,5141,5165,5183,5206],{"type":20,"tag":1910,"props":5098,"children":5099},{},[5100,5105,5114],{"type":20,"tag":1937,"props":5101,"children":5102},{},[5103],{"type":25,"value":5104},"项目规则",{"type":20,"tag":1937,"props":5106,"children":5107},{},[5108],{"type":20,"tag":84,"props":5109,"children":5111},{"className":5110},[],[5112],{"type":25,"value":5113},"AGENTS.md",{"type":20,"tag":1937,"props":5115,"children":5116},{},[5117],{"type":25,"value":5118},"项目规范、测试命令、协作方式、禁止事项",{"type":20,"tag":1910,"props":5120,"children":5121},{},[5122,5127,5136],{"type":20,"tag":1937,"props":5123,"children":5124},{},[5125],{"type":25,"value":5126},"项目配置",{"type":20,"tag":1937,"props":5128,"children":5129},{},[5130],{"type":20,"tag":84,"props":5131,"children":5133},{"className":5132},[],[5134],{"type":25,"value":5135},".codex\u002Fconfig.toml",{"type":20,"tag":1937,"props":5137,"children":5138},{},[5139],{"type":25,"value":5140},"sandbox、approval、MCP、profile 等配置",{"type":20,"tag":1910,"props":5142,"children":5143},{},[5144,5149,5160],{"type":20,"tag":1937,"props":5145,"children":5146},{},[5147],{"type":25,"value":5148},"Skills",{"type":20,"tag":1937,"props":5150,"children":5151},{},[5152,5158],{"type":20,"tag":84,"props":5153,"children":5155},{"className":5154},[],[5156],{"type":25,"value":5157},".agents\u002Fskills\u002F*\u002FSKILL.md",{"type":25,"value":5159}," 或已安装 skills",{"type":20,"tag":1937,"props":5161,"children":5162},{},[5163],{"type":25,"value":5164},"可复用的任务工作流",{"type":20,"tag":1910,"props":5166,"children":5167},{},[5168,5173,5178],{"type":20,"tag":1937,"props":5169,"children":5170},{},[5171],{"type":25,"value":5172},"Subagents",{"type":20,"tag":1937,"props":5174,"children":5175},{},[5176],{"type":25,"value":5177},"Codex 内置或项目配置",{"type":20,"tag":1937,"props":5179,"children":5180},{},[5181],{"type":25,"value":5182},"并行探索、实现、审查",{"type":20,"tag":1910,"props":5184,"children":5185},{},[5186,5191,5201],{"type":20,"tag":1937,"props":5187,"children":5188},{},[5189],{"type":25,"value":5190},"MCP",{"type":20,"tag":1937,"props":5192,"children":5193},{},[5194,5199],{"type":20,"tag":84,"props":5195,"children":5197},{"className":5196},[],[5198],{"type":25,"value":5135},{"type":25,"value":5200}," 或全局配置",{"type":20,"tag":1937,"props":5202,"children":5203},{},[5204],{"type":25,"value":5205},"接入 GitHub、Playwright、文档检索等工具",{"type":20,"tag":1910,"props":5207,"children":5208},{},[5209,5214,5219],{"type":20,"tag":1937,"props":5210,"children":5211},{},[5212],{"type":25,"value":5213},"Hooks \u002F Commands",{"type":20,"tag":1937,"props":5215,"children":5216},{},[5217],{"type":25,"value":5218},"Codex 原生配置或命令机制",{"type":20,"tag":1937,"props":5220,"children":5221},{},[5222],{"type":25,"value":5223},"做流程自动化、权限检查、命令入口",{"type":20,"tag":21,"props":5225,"children":5226},{},[5227,5229,5234],{"type":25,"value":5228},"OpenAI 官方文档里，",{"type":20,"tag":84,"props":5230,"children":5232},{"className":5231},[],[5233],{"type":25,"value":5113},{"type":25,"value":5235}," 是 Codex 的项目级说明入口；Skills 是 Codex 可发现、可调用的任务能力；Hooks 也已经有 Codex 自己的配置方式。",{"type":20,"tag":21,"props":5237,"children":5238},{},[5239,5241],{"type":25,"value":5240},"所以问题不是“Codex 有没有这些能力”。真正的问题是：",{"type":20,"tag":33,"props":5242,"children":5243},{},[5244],{"type":25,"value":5245},"ECC 里的 Claude Code 配置，不能默认等价于 Codex 配置。",{"type":20,"tag":21,"props":5247,"children":5248},{},[5249],{"type":25,"value":5250},"Codex 是引擎，ECC 更像一套驾驶习惯。把驾驶习惯移植过来有价值，但你不能把另一辆车的按钮面板直接粘到方向盘上。",{"type":20,"tag":5056,"props":5252,"children":5253},{},[],{"type":20,"tag":1863,"props":5255,"children":5257},{"id":5256},"为什么不能全量搬",[5258],{"type":25,"value":5256},{"type":20,"tag":21,"props":5260,"children":5261},{},[5262],{"type":25,"value":5263},"ECC 最早的语境更偏 Claude Code。社区项目里常见的内容包括：",{"type":20,"tag":44,"props":5265,"children":5266},{},[5267,5272,5277,5282,5287,5292,5297,5302],{"type":20,"tag":48,"props":5268,"children":5269},{},[5270],{"type":25,"value":5271},"agents",{"type":20,"tag":48,"props":5273,"children":5274},{},[5275],{"type":25,"value":5276},"skills",{"type":20,"tag":48,"props":5278,"children":5279},{},[5280],{"type":25,"value":5281},"rules",{"type":20,"tag":48,"props":5283,"children":5284},{},[5285],{"type":25,"value":5286},"hooks",{"type":20,"tag":48,"props":5288,"children":5289},{},[5290],{"type":25,"value":5291},"slash commands",{"type":20,"tag":48,"props":5293,"children":5294},{},[5295],{"type":25,"value":5296},"MCP 配置",{"type":20,"tag":48,"props":5298,"children":5299},{},[5300],{"type":25,"value":5301},"installer \u002F sync 脚本",{"type":20,"tag":48,"props":5303,"children":5304},{},[5305],{"type":25,"value":5306},"安全扫描或 dashboard 辅助工具",{"type":20,"tag":21,"props":5308,"children":5309},{},[5310],{"type":25,"value":5311},"这些东西有些能直接变成 Codex 规则，有些需要改写，有些则不应该进普通项目。",{"type":20,"tag":21,"props":5313,"children":5314},{},[5315],{"type":25,"value":5316},"直接把整个 ECC 仓库复制进 Codex 项目，通常会遇到三个问题。",{"type":20,"tag":21,"props":5318,"children":5319},{},[5320,5322,5327],{"type":25,"value":5321},"第一是 ",{"type":20,"tag":33,"props":5323,"children":5324},{},[5325],{"type":25,"value":5326},"上下文膨胀",{"type":25,"value":5328},"。规则越多，不代表 Codex 越稳定。几十个规则文件一起塞进去，很容易让真正关键的指令被噪声淹没。你想要的是“每次任务都能读到关键规则”，不是“仓库里有很多漂亮的规则”。",{"type":20,"tag":21,"props":5330,"children":5331},{},[5332,5334,5339],{"type":25,"value":5333},"第二是 ",{"type":20,"tag":33,"props":5335,"children":5336},{},[5337],{"type":25,"value":5338},"语义错位",{"type":25,"value":5340},"。Codex 有自己的 Hooks、Commands、Slash commands 和 Skills，但 Claude Code 里的 hooks 或 slash commands 不会因为文件名一样就自动变成 Codex 原生能力。能复用的是思想和流程，不是所有配置格式。",{"type":20,"tag":21,"props":5342,"children":5343},{},[5344,5346,5351],{"type":25,"value":5345},"第三是 ",{"type":20,"tag":33,"props":5347,"children":5348},{},[5349],{"type":25,"value":5350},"配置污染",{"type":25,"value":5352},"。全局 MCP、权限规则、安装脚本、安全扫描工具一旦混进项目，后面很难判断哪些是当前项目真正需要的，哪些只是跟着全家桶一起进来的。",{"type":20,"tag":21,"props":5354,"children":5355},{},[5356],{"type":25,"value":5357},"所以不是“搬家”，是“提炼”。",{"type":20,"tag":5056,"props":5359,"children":5360},{},[],{"type":20,"tag":1863,"props":5362,"children":5364},{"id":5363},"先提炼四样东西",[5365],{"type":25,"value":5363},{"type":20,"tag":21,"props":5367,"children":5368},{},[5369],{"type":25,"value":5370},"对个人项目和中小型团队来说，最值得先落地的是这四类：",{"type":20,"tag":126,"props":5372,"children":5374},{"className":324,"code":5373,"language":25,"meta":8,"style":8},"your-project\u002F\n  AGENTS.md\n  .codex\u002F\n    config.toml\n    ecc\u002F\n      rules.md\n      workflow.md\n      security.md\n  .agents\u002F\n    skills\u002F\n      search-first\u002F\n      tdd-workflow\u002F\n      verification-loop\u002F\n      security-review\u002F\n      code-review\u002F\n      ...（按需增加）\n",[5375],{"type":20,"tag":84,"props":5376,"children":5377},{"__ignoreMap":8},[5378,5386,5394,5402,5410,5418,5426,5434,5442,5450,5458,5466,5474,5482,5490,5498],{"type":20,"tag":157,"props":5379,"children":5380},{"class":159,"line":160},[5381],{"type":20,"tag":157,"props":5382,"children":5383},{},[5384],{"type":25,"value":5385},"your-project\u002F\n",{"type":20,"tag":157,"props":5387,"children":5388},{"class":159,"line":169},[5389],{"type":20,"tag":157,"props":5390,"children":5391},{},[5392],{"type":25,"value":5393},"  AGENTS.md\n",{"type":20,"tag":157,"props":5395,"children":5396},{"class":159,"line":179},[5397],{"type":20,"tag":157,"props":5398,"children":5399},{},[5400],{"type":25,"value":5401},"  .codex\u002F\n",{"type":20,"tag":157,"props":5403,"children":5404},{"class":159,"line":188},[5405],{"type":20,"tag":157,"props":5406,"children":5407},{},[5408],{"type":25,"value":5409},"    config.toml\n",{"type":20,"tag":157,"props":5411,"children":5412},{"class":159,"line":196},[5413],{"type":20,"tag":157,"props":5414,"children":5415},{},[5416],{"type":25,"value":5417},"    ecc\u002F\n",{"type":20,"tag":157,"props":5419,"children":5420},{"class":159,"line":204},[5421],{"type":20,"tag":157,"props":5422,"children":5423},{},[5424],{"type":25,"value":5425},"      rules.md\n",{"type":20,"tag":157,"props":5427,"children":5428},{"class":159,"line":213},[5429],{"type":20,"tag":157,"props":5430,"children":5431},{},[5432],{"type":25,"value":5433},"      workflow.md\n",{"type":20,"tag":157,"props":5435,"children":5436},{"class":159,"line":222},[5437],{"type":20,"tag":157,"props":5438,"children":5439},{},[5440],{"type":25,"value":5441},"      security.md\n",{"type":20,"tag":157,"props":5443,"children":5444},{"class":159,"line":440},[5445],{"type":20,"tag":157,"props":5446,"children":5447},{},[5448],{"type":25,"value":5449},"  .agents\u002F\n",{"type":20,"tag":157,"props":5451,"children":5452},{"class":159,"line":448},[5453],{"type":20,"tag":157,"props":5454,"children":5455},{},[5456],{"type":25,"value":5457},"    skills\u002F\n",{"type":20,"tag":157,"props":5459,"children":5460},{"class":159,"line":456},[5461],{"type":20,"tag":157,"props":5462,"children":5463},{},[5464],{"type":25,"value":5465},"      search-first\u002F\n",{"type":20,"tag":157,"props":5467,"children":5468},{"class":159,"line":465},[5469],{"type":20,"tag":157,"props":5470,"children":5471},{},[5472],{"type":25,"value":5473},"      tdd-workflow\u002F\n",{"type":20,"tag":157,"props":5475,"children":5476},{"class":159,"line":474},[5477],{"type":20,"tag":157,"props":5478,"children":5479},{},[5480],{"type":25,"value":5481},"      verification-loop\u002F\n",{"type":20,"tag":157,"props":5483,"children":5484},{"class":159,"line":483},[5485],{"type":20,"tag":157,"props":5486,"children":5487},{},[5488],{"type":25,"value":5489},"      security-review\u002F\n",{"type":20,"tag":157,"props":5491,"children":5492},{"class":159,"line":491},[5493],{"type":20,"tag":157,"props":5494,"children":5495},{},[5496],{"type":25,"value":5497},"      code-review\u002F\n",{"type":20,"tag":157,"props":5499,"children":5500},{"class":159,"line":499},[5501],{"type":20,"tag":157,"props":5502,"children":5503},{},[5504],{"type":25,"value":5505},"      ...（按需增加）\n",{"type":20,"tag":21,"props":5507,"children":5508},{},[5509],{"type":25,"value":5510},"它们分别解决四个问题：",{"type":20,"tag":44,"props":5512,"children":5513},{},[5514,5524,5534,5545],{"type":20,"tag":48,"props":5515,"children":5516},{},[5517,5522],{"type":20,"tag":84,"props":5518,"children":5520},{"className":5519},[],[5521],{"type":25,"value":5113},{"type":25,"value":5523},"：项目入口。只放最短、最稳定、每次任务都值得看的规则。",{"type":20,"tag":48,"props":5525,"children":5526},{},[5527,5532],{"type":20,"tag":84,"props":5528,"children":5530},{"className":5529},[],[5531],{"type":25,"value":5135},{"type":25,"value":5533},"：项目配置。把 sandbox、approval、MCP 等配置和全局配置区分开。",{"type":20,"tag":48,"props":5535,"children":5536},{},[5537,5543],{"type":20,"tag":84,"props":5538,"children":5540},{"className":5539},[],[5541],{"type":25,"value":5542},".codex\u002Fecc\u002F*.md",{"type":25,"value":5544},"：长期工程规则。比如工作流、安全边界、协作约定。",{"type":20,"tag":48,"props":5546,"children":5547},{},[5548,5554],{"type":20,"tag":84,"props":5549,"children":5551},{"className":5550},[],[5552],{"type":25,"value":5553},".agents\u002Fskills\u002F",{"type":25,"value":5555},"：可复用任务流程。比如修构建、做代码审查、写测试、更新文档。",{"type":20,"tag":21,"props":5557,"children":5558},{},[5559],{"type":25,"value":5560},"这里的关键是分层。",{"type":20,"tag":21,"props":5562,"children":5563},{},[5564,5569,5571,5577],{"type":20,"tag":84,"props":5565,"children":5567},{"className":5566},[],[5568],{"type":25,"value":5113},{"type":25,"value":5570}," 不应该变成一本小册子。它更适合做入口：告诉 Codex 这个项目有什么规则，以及复杂任务需要去哪里读更详细的流程。真正的大段规则放到 ",{"type":20,"tag":84,"props":5572,"children":5574},{"className":5573},[],[5575],{"type":25,"value":5576},".codex\u002Fecc\u002F",{"type":25,"value":5578},"，可复用任务步骤放到 skills。",{"type":20,"tag":21,"props":5580,"children":5581},{},[5582,5584,5589],{"type":25,"value":5583},"这样做有一个实际好处：规则能被维护。一个 500 行的 ",{"type":20,"tag":84,"props":5585,"children":5587},{"className":5586},[],[5588],{"type":25,"value":5113},{"type":25,"value":5590},"，最后往往没人敢改；三个职责清楚的规则文件，后续增删都更容易。",{"type":20,"tag":5056,"props":5592,"children":5593},{},[],{"type":20,"tag":1863,"props":5595,"children":5597},{"id":5596},"为什么要做中文友好版本",[5598],{"type":25,"value":5596},{"type":20,"tag":21,"props":5600,"children":5601},{},[5602],{"type":25,"value":5603},"Codex 能理解中文，也能读英文配置。但如果你的日常指令是中文：",{"type":20,"tag":126,"props":5605,"children":5607},{"className":324,"code":5606,"language":25,"meta":8,"style":8},"帮我做一个登录页\n帮我修复这个构建错误\n帮我审查这个 PR 有没有安全问题\n帮我把 README 更新一下\n",[5608],{"type":20,"tag":84,"props":5609,"children":5610},{"__ignoreMap":8},[5611,5619,5627,5635],{"type":20,"tag":157,"props":5612,"children":5613},{"class":159,"line":160},[5614],{"type":20,"tag":157,"props":5615,"children":5616},{},[5617],{"type":25,"value":5618},"帮我做一个登录页\n",{"type":20,"tag":157,"props":5620,"children":5621},{"class":159,"line":169},[5622],{"type":20,"tag":157,"props":5623,"children":5624},{},[5625],{"type":25,"value":5626},"帮我修复这个构建错误\n",{"type":20,"tag":157,"props":5628,"children":5629},{"class":159,"line":179},[5630],{"type":20,"tag":157,"props":5631,"children":5632},{},[5633],{"type":25,"value":5634},"帮我审查这个 PR 有没有安全问题\n",{"type":20,"tag":157,"props":5636,"children":5637},{"class":159,"line":188},[5638],{"type":20,"tag":157,"props":5639,"children":5640},{},[5641],{"type":25,"value":5642},"帮我把 README 更新一下\n",{"type":20,"tag":21,"props":5644,"children":5645},{},[5646],{"type":25,"value":5647},"那么 skills 的触发描述最好也对中文友好。",{"type":20,"tag":21,"props":5649,"children":5650},{},[5651],{"type":25,"value":5652},"我更推荐这种写法：英文 skill name 保持不变，英文关键词保留，同时补中文触发描述。",{"type":20,"tag":126,"props":5654,"children":5658},{"className":5655,"code":5656,"language":5657,"meta":8,"style":8},"language-yaml shiki shiki-themes github-dark","name: build-fix\ndescription: Use when fixing CI, build, typecheck, compile, or test failures.\n  当用户用中文要求修复 CI 失败、构建错误、typecheck 报错、\n  编译失败或测试失败时使用。\n","yaml",[5659],{"type":20,"tag":84,"props":5660,"children":5661},{"__ignoreMap":8},[5662,5680,5697,5705],{"type":20,"tag":157,"props":5663,"children":5664},{"class":159,"line":160},[5665,5671,5675],{"type":20,"tag":157,"props":5666,"children":5668},{"style":5667},"--shiki-default:#85E89D",[5669],{"type":25,"value":5670},"name",{"type":20,"tag":157,"props":5672,"children":5673},{"style":892},[5674],{"type":25,"value":908},{"type":20,"tag":157,"props":5676,"children":5677},{"style":254},[5678],{"type":25,"value":5679},"build-fix\n",{"type":20,"tag":157,"props":5681,"children":5682},{"class":159,"line":169},[5683,5688,5692],{"type":20,"tag":157,"props":5684,"children":5685},{"style":5667},[5686],{"type":25,"value":5687},"description",{"type":20,"tag":157,"props":5689,"children":5690},{"style":892},[5691],{"type":25,"value":908},{"type":20,"tag":157,"props":5693,"children":5694},{"style":254},[5695],{"type":25,"value":5696},"Use when fixing CI, build, typecheck, compile, or test failures.\n",{"type":20,"tag":157,"props":5698,"children":5699},{"class":159,"line":179},[5700],{"type":20,"tag":157,"props":5701,"children":5702},{"style":254},[5703],{"type":25,"value":5704},"  当用户用中文要求修复 CI 失败、构建错误、typecheck 报错、\n",{"type":20,"tag":157,"props":5706,"children":5707},{"class":159,"line":188},[5708],{"type":20,"tag":157,"props":5709,"children":5710},{"style":254},[5711],{"type":25,"value":5712},"  编译失败或测试失败时使用。\n",{"type":20,"tag":21,"props":5714,"children":5715},{},[5716],{"type":25,"value":5717},"这样有三个好处：",{"type":20,"tag":5719,"props":5720,"children":5721},"ol",{},[5722,5727,5732],{"type":20,"tag":48,"props":5723,"children":5724},{},[5725],{"type":25,"value":5726},"兼容英文生态，后续迁移和分享成本低。",{"type":20,"tag":48,"props":5728,"children":5729},{},[5730],{"type":25,"value":5731},"中文任务更容易命中合适的 skill。",{"type":20,"tag":48,"props":5733,"children":5734},{},[5735],{"type":25,"value":5736},"人自己打开文件维护时，不需要在英文抽象描述里来回猜。",{"type":20,"tag":21,"props":5738,"children":5739},{},[5740,5742,5747],{"type":25,"value":5741},"skill 的名字可以短，描述必须准。因为 Codex 是否自动选择一个 skill，很大程度上取决于 ",{"type":20,"tag":84,"props":5743,"children":5745},{"className":5744},[],[5746],{"type":25,"value":5687},{"type":25,"value":5748}," 是否把触发场景写清楚。",{"type":20,"tag":5056,"props":5750,"children":5751},{},[],{"type":20,"tag":1863,"props":5753,"children":5755},{"id":5754},"level-2日常开发够用的中间层",[5756],{"type":25,"value":5757},"Level 2：日常开发够用的中间层",{"type":20,"tag":21,"props":5759,"children":5760},{},[5761],{"type":25,"value":5762},"我更倾向于把这套模板做成 Clean ECC for Codex Level 2。",{"type":20,"tag":21,"props":5764,"children":5765},{},[5766],{"type":25,"value":5767},"它不是最小版，也不是全家桶，而是一个适合真实项目长期使用的中间层：",{"type":20,"tag":1902,"props":5769,"children":5770},{},[5771,5792],{"type":20,"tag":1906,"props":5772,"children":5773},{},[5774],{"type":20,"tag":1910,"props":5775,"children":5776},{},[5777,5782,5787],{"type":20,"tag":1914,"props":5778,"children":5779},{},[5780],{"type":25,"value":5781},"层级",{"type":20,"tag":1914,"props":5783,"children":5784},{},[5785],{"type":25,"value":5786},"内容",{"type":20,"tag":1914,"props":5788,"children":5789},{},[5790],{"type":25,"value":5791},"适合谁",{"type":20,"tag":1930,"props":5793,"children":5794},{},[5795,5818,5844],{"type":20,"tag":1910,"props":5796,"children":5797},{},[5798,5803,5813],{"type":20,"tag":1937,"props":5799,"children":5800},{},[5801],{"type":25,"value":5802},"Level 1",{"type":20,"tag":1937,"props":5804,"children":5805},{},[5806,5811],{"type":20,"tag":84,"props":5807,"children":5809},{"className":5808},[],[5810],{"type":25,"value":5113},{"type":25,"value":5812}," + 少量基础 skills",{"type":20,"tag":1937,"props":5814,"children":5815},{},[5816],{"type":25,"value":5817},"想试试，不想改太多项目结构",{"type":20,"tag":1910,"props":5819,"children":5820},{},[5821,5826,5839],{"type":20,"tag":1937,"props":5822,"children":5823},{},[5824],{"type":25,"value":5825},"Level 2",{"type":20,"tag":1937,"props":5827,"children":5828},{},[5829,5831,5837],{"type":25,"value":5830},"14 个工程工作流 skills + ",{"type":20,"tag":84,"props":5832,"children":5834},{"className":5833},[],[5835],{"type":25,"value":5836},".codex\u002Fecc",{"type":25,"value":5838}," 规则",{"type":20,"tag":1937,"props":5840,"children":5841},{},[5842],{"type":25,"value":5843},"日常用 Codex 做真实开发",{"type":20,"tag":1910,"props":5845,"children":5846},{},[5847,5852,5857],{"type":20,"tag":1937,"props":5848,"children":5849},{},[5850],{"type":25,"value":5851},"Full-ish",{"type":20,"tag":1937,"props":5853,"children":5854},{},[5855],{"type":25,"value":5856},"MCP、subagents、hooks、安全扫描等更重能力",{"type":20,"tag":1937,"props":5858,"children":5859},{},[5860],{"type":25,"value":5861},"团队级、重度自动化用户",{"type":20,"tag":21,"props":5863,"children":5864},{},[5865],{"type":25,"value":5866},"Level 2 重点不是“装得多”，而是覆盖日常开发里最容易出问题的环节：",{"type":20,"tag":1902,"props":5868,"children":5869},{},[5870,5886],{"type":20,"tag":1906,"props":5871,"children":5872},{},[5873],{"type":20,"tag":1910,"props":5874,"children":5875},{},[5876,5881],{"type":20,"tag":1914,"props":5877,"children":5878},{},[5879],{"type":25,"value":5880},"skill",{"type":20,"tag":1914,"props":5882,"children":5883},{},[5884],{"type":25,"value":5885},"解决的问题",{"type":20,"tag":1930,"props":5887,"children":5888},{},[5889,5906,5923,5940,5957,5974,5991,6008,6025,6042,6059,6076,6093,6110],{"type":20,"tag":1910,"props":5890,"children":5891},{},[5892,5901],{"type":20,"tag":1937,"props":5893,"children":5894},{},[5895],{"type":20,"tag":84,"props":5896,"children":5898},{"className":5897},[],[5899],{"type":25,"value":5900},"search-first",{"type":20,"tag":1937,"props":5902,"children":5903},{},[5904],{"type":25,"value":5905},"先查项目和文档，再动手写",{"type":20,"tag":1910,"props":5907,"children":5908},{},[5909,5918],{"type":20,"tag":1937,"props":5910,"children":5911},{},[5912],{"type":20,"tag":84,"props":5913,"children":5915},{"className":5914},[],[5916],{"type":25,"value":5917},"tdd-workflow",{"type":20,"tag":1937,"props":5919,"children":5920},{},[5921],{"type":25,"value":5922},"适合有明确行为边界的功能改动",{"type":20,"tag":1910,"props":5924,"children":5925},{},[5926,5935],{"type":20,"tag":1937,"props":5927,"children":5928},{},[5929],{"type":20,"tag":84,"props":5930,"children":5932},{"className":5931},[],[5933],{"type":25,"value":5934},"verification-loop",{"type":20,"tag":1937,"props":5936,"children":5937},{},[5938],{"type":25,"value":5939},"改完跑测试、typecheck、lint 或构建",{"type":20,"tag":1910,"props":5941,"children":5942},{},[5943,5952],{"type":20,"tag":1937,"props":5944,"children":5945},{},[5946],{"type":20,"tag":84,"props":5947,"children":5949},{"className":5948},[],[5950],{"type":25,"value":5951},"security-review",{"type":20,"tag":1937,"props":5953,"children":5954},{},[5955],{"type":25,"value":5956},"权限、凭证、输入校验、危险操作检查",{"type":20,"tag":1910,"props":5958,"children":5959},{},[5960,5969],{"type":20,"tag":1937,"props":5961,"children":5962},{},[5963],{"type":20,"tag":84,"props":5964,"children":5966},{"className":5965},[],[5967],{"type":25,"value":5968},"code-review",{"type":20,"tag":1937,"props":5970,"children":5971},{},[5972],{"type":25,"value":5973},"站在 reviewer 角度找 bug 和回归",{"type":20,"tag":1910,"props":5975,"children":5976},{},[5977,5986],{"type":20,"tag":1937,"props":5978,"children":5979},{},[5980],{"type":20,"tag":84,"props":5981,"children":5983},{"className":5982},[],[5984],{"type":25,"value":5985},"frontend-patterns",{"type":20,"tag":1937,"props":5987,"children":5988},{},[5989],{"type":25,"value":5990},"前端组件、交互、响应式和可访问性",{"type":20,"tag":1910,"props":5992,"children":5993},{},[5994,6003],{"type":20,"tag":1937,"props":5995,"children":5996},{},[5997],{"type":20,"tag":84,"props":5998,"children":6000},{"className":5999},[],[6001],{"type":25,"value":6002},"backend-patterns",{"type":20,"tag":1937,"props":6004,"children":6005},{},[6006],{"type":25,"value":6007},"后端边界、错误处理、数据一致性",{"type":20,"tag":1910,"props":6009,"children":6010},{},[6011,6020],{"type":20,"tag":1937,"props":6012,"children":6013},{},[6014],{"type":20,"tag":84,"props":6015,"children":6017},{"className":6016},[],[6018],{"type":25,"value":6019},"api-design",{"type":20,"tag":1937,"props":6021,"children":6022},{},[6023],{"type":25,"value":6024},"请求响应结构、错误码、分页、幂等性",{"type":20,"tag":1910,"props":6026,"children":6027},{},[6028,6037],{"type":20,"tag":1937,"props":6029,"children":6030},{},[6031],{"type":20,"tag":84,"props":6032,"children":6034},{"className":6033},[],[6035],{"type":25,"value":6036},"docker-patterns",{"type":20,"tag":1937,"props":6038,"children":6039},{},[6040],{"type":25,"value":6041},"Dockerfile、镜像构建、端口、体积和安全",{"type":20,"tag":1910,"props":6043,"children":6044},{},[6045,6054],{"type":20,"tag":1937,"props":6046,"children":6047},{},[6048],{"type":20,"tag":84,"props":6049,"children":6051},{"className":6050},[],[6052],{"type":25,"value":6053},"deployment-patterns",{"type":20,"tag":1937,"props":6055,"children":6056},{},[6057],{"type":25,"value":6058},"部署、回滚、环境变量、日志和健康检查",{"type":20,"tag":1910,"props":6060,"children":6061},{},[6062,6071],{"type":20,"tag":1937,"props":6063,"children":6064},{},[6065],{"type":20,"tag":84,"props":6066,"children":6068},{"className":6067},[],[6069],{"type":25,"value":6070},"deep-research",{"type":20,"tag":1937,"props":6072,"children":6073},{},[6074],{"type":25,"value":6075},"需要多轮查证和材料整理的任务",{"type":20,"tag":1910,"props":6077,"children":6078},{},[6079,6088],{"type":20,"tag":1937,"props":6080,"children":6081},{},[6082],{"type":20,"tag":84,"props":6083,"children":6085},{"className":6084},[],[6086],{"type":25,"value":6087},"docs-update",{"type":20,"tag":1937,"props":6089,"children":6090},{},[6091],{"type":25,"value":6092},"代码变更后同步 README、注释或文档",{"type":20,"tag":1910,"props":6094,"children":6095},{},[6096,6105],{"type":20,"tag":1937,"props":6097,"children":6098},{},[6099],{"type":20,"tag":84,"props":6100,"children":6102},{"className":6101},[],[6103],{"type":25,"value":6104},"build-fix",{"type":20,"tag":1937,"props":6106,"children":6107},{},[6108],{"type":25,"value":6109},"CI、编译、typecheck、测试失败修复",{"type":20,"tag":1910,"props":6111,"children":6112},{},[6113,6122],{"type":20,"tag":1937,"props":6114,"children":6115},{},[6116],{"type":20,"tag":84,"props":6117,"children":6119},{"className":6118},[],[6120],{"type":25,"value":6121},"refactor-clean",{"type":20,"tag":1937,"props":6123,"children":6124},{},[6125],{"type":25,"value":6126},"小步重构，保持行为不变",{"type":20,"tag":21,"props":6128,"children":6129},{},[6130],{"type":25,"value":6131},"这些 skills 的价值不是让 Codex 多背几句口号，而是把任务流程固定下来。",{"type":20,"tag":21,"props":6133,"children":6134},{},[6135],{"type":25,"value":6136},"比如用户说：",{"type":20,"tag":126,"props":6138,"children":6140},{"className":324,"code":6139,"language":25,"meta":8,"style":8},"帮我修复 CI 里的 typecheck 报错\n",[6141],{"type":20,"tag":84,"props":6142,"children":6143},{"__ignoreMap":8},[6144],{"type":20,"tag":157,"props":6145,"children":6146},{"class":159,"line":160},[6147],{"type":20,"tag":157,"props":6148,"children":6149},{},[6150],{"type":25,"value":6139},{"type":20,"tag":21,"props":6152,"children":6153},{},[6154],{"type":25,"value":6155},"Codex 更容易匹配到：",{"type":20,"tag":126,"props":6157,"children":6159},{"className":324,"code":6158,"language":25,"meta":8,"style":8},"build-fix\nverification-loop\n",[6160],{"type":20,"tag":84,"props":6161,"children":6162},{"__ignoreMap":8},[6163,6170],{"type":20,"tag":157,"props":6164,"children":6165},{"class":159,"line":160},[6166],{"type":20,"tag":157,"props":6167,"children":6168},{},[6169],{"type":25,"value":5679},{"type":20,"tag":157,"props":6171,"children":6172},{"class":159,"line":169},[6173],{"type":20,"tag":157,"props":6174,"children":6175},{},[6176],{"type":25,"value":6177},"verification-loop\n",{"type":20,"tag":21,"props":6179,"children":6180},{},[6181],{"type":25,"value":6182},"于是任务流程会变成：",{"type":20,"tag":126,"props":6184,"children":6186},{"className":324,"code":6185,"language":25,"meta":8,"style":8},"复现失败 -> 找第一个有意义的错误 -> 修根因 -> 重新验证 -> 汇报结果\n",[6187],{"type":20,"tag":84,"props":6188,"children":6189},{"__ignoreMap":8},[6190],{"type":20,"tag":157,"props":6191,"children":6192},{"class":159,"line":160},[6193],{"type":20,"tag":157,"props":6194,"children":6195},{},[6196],{"type":25,"value":6185},{"type":20,"tag":21,"props":6198,"children":6199},{},[6200],{"type":25,"value":6201},"再比如用户说：",{"type":20,"tag":126,"props":6203,"children":6205},{"className":324,"code":6204,"language":25,"meta":8,"style":8},"帮我设计一个订单 API\n",[6206],{"type":20,"tag":84,"props":6207,"children":6208},{"__ignoreMap":8},[6209],{"type":20,"tag":157,"props":6210,"children":6211},{"class":159,"line":160},[6212],{"type":20,"tag":157,"props":6213,"children":6214},{},[6215],{"type":25,"value":6204},{"type":20,"tag":21,"props":6217,"children":6218},{},[6219],{"type":25,"value":6220},"Codex 可以匹配：",{"type":20,"tag":126,"props":6222,"children":6224},{"className":324,"code":6223,"language":25,"meta":8,"style":8},"api-design\nbackend-patterns\nsecurity-review\n",[6225],{"type":20,"tag":84,"props":6226,"children":6227},{"__ignoreMap":8},[6228,6236,6244],{"type":20,"tag":157,"props":6229,"children":6230},{"class":159,"line":160},[6231],{"type":20,"tag":157,"props":6232,"children":6233},{},[6234],{"type":25,"value":6235},"api-design\n",{"type":20,"tag":157,"props":6237,"children":6238},{"class":159,"line":169},[6239],{"type":20,"tag":157,"props":6240,"children":6241},{},[6242],{"type":25,"value":6243},"backend-patterns\n",{"type":20,"tag":157,"props":6245,"children":6246},{"class":159,"line":179},[6247],{"type":20,"tag":157,"props":6248,"children":6249},{},[6250],{"type":25,"value":6251},"security-review\n",{"type":20,"tag":21,"props":6253,"children":6254},{},[6255],{"type":25,"value":6256},"这样它更可能同时考虑请求响应结构、错误码、分页、权限、幂等性和兼容性，而不是只写一个看起来能跑的 endpoint。",{"type":20,"tag":5056,"props":6258,"children":6259},{},[],{"type":20,"tag":1863,"props":6261,"children":6263},{"id":6262},"怎么用",[6264],{"type":25,"value":6262},{"type":20,"tag":21,"props":6266,"children":6267},{},[6268],{"type":25,"value":6269},"最小使用方式很简单：把三样东西放到项目根目录。",{"type":20,"tag":126,"props":6271,"children":6273},{"className":324,"code":6272,"language":25,"meta":8,"style":8},"AGENTS.md\n.codex\u002F\n.agents\u002F\n",[6274],{"type":20,"tag":84,"props":6275,"children":6276},{"__ignoreMap":8},[6277,6285,6293],{"type":20,"tag":157,"props":6278,"children":6279},{"class":159,"line":160},[6280],{"type":20,"tag":157,"props":6281,"children":6282},{},[6283],{"type":25,"value":6284},"AGENTS.md\n",{"type":20,"tag":157,"props":6286,"children":6287},{"class":159,"line":169},[6288],{"type":20,"tag":157,"props":6289,"children":6290},{},[6291],{"type":25,"value":6292},".codex\u002F\n",{"type":20,"tag":157,"props":6294,"children":6295},{"class":159,"line":179},[6296],{"type":20,"tag":157,"props":6297,"children":6298},{},[6299],{"type":25,"value":6300},".agents\u002F\n",{"type":20,"tag":21,"props":6302,"children":6303},{},[6304],{"type":25,"value":6305},"然后用 Codex 打开这个项目。",{"type":20,"tag":21,"props":6307,"children":6308},{},[6309,6311,6316],{"type":25,"value":6310},"推荐的 ",{"type":20,"tag":84,"props":6312,"children":6314},{"className":6313},[],[6315],{"type":25,"value":5113},{"type":25,"value":6317}," 不需要很长：",{"type":20,"tag":126,"props":6319,"children":6322},{"className":6320,"code":6321,"language":1805,"meta":8,"style":8},"language-md shiki shiki-themes github-dark","# Project Agent Instructions\n\n本项目使用 Clean ECC for Codex Level 2 模板。\n\n详细规则：`.codex\u002Fecc\u002F`\n可复用工作流：`.agents\u002Fskills\u002F`\n\n处理非简单任务前，按需阅读：\n\n- `.codex\u002Fecc\u002Fworkflow.md`\n- `.codex\u002Fecc\u002Frules.md`\n- `.codex\u002Fecc\u002Fsecurity.md`\n",[6323],{"type":20,"tag":84,"props":6324,"children":6325},{"__ignoreMap":8},[6326,6335,6342,6350,6357,6370,6383,6390,6398,6405,6419,6431],{"type":20,"tag":157,"props":6327,"children":6328},{"class":159,"line":160},[6329],{"type":20,"tag":157,"props":6330,"children":6332},{"style":6331},"--shiki-default:#79B8FF;--shiki-default-font-weight:bold",[6333],{"type":25,"value":6334},"# Project Agent Instructions\n",{"type":20,"tag":157,"props":6336,"children":6337},{"class":159,"line":169},[6338],{"type":20,"tag":157,"props":6339,"children":6340},{"emptyLinePlaceholder":173},[6341],{"type":25,"value":176},{"type":20,"tag":157,"props":6343,"children":6344},{"class":159,"line":179},[6345],{"type":20,"tag":157,"props":6346,"children":6347},{"style":892},[6348],{"type":25,"value":6349},"本项目使用 Clean ECC for Codex Level 2 模板。\n",{"type":20,"tag":157,"props":6351,"children":6352},{"class":159,"line":188},[6353],{"type":20,"tag":157,"props":6354,"children":6355},{"emptyLinePlaceholder":173},[6356],{"type":25,"value":176},{"type":20,"tag":157,"props":6358,"children":6359},{"class":159,"line":196},[6360,6365],{"type":20,"tag":157,"props":6361,"children":6362},{"style":892},[6363],{"type":25,"value":6364},"详细规则：",{"type":20,"tag":157,"props":6366,"children":6367},{"style":260},[6368],{"type":25,"value":6369},"`.codex\u002Fecc\u002F`\n",{"type":20,"tag":157,"props":6371,"children":6372},{"class":159,"line":204},[6373,6378],{"type":20,"tag":157,"props":6374,"children":6375},{"style":892},[6376],{"type":25,"value":6377},"可复用工作流：",{"type":20,"tag":157,"props":6379,"children":6380},{"style":260},[6381],{"type":25,"value":6382},"`.agents\u002Fskills\u002F`\n",{"type":20,"tag":157,"props":6384,"children":6385},{"class":159,"line":213},[6386],{"type":20,"tag":157,"props":6387,"children":6388},{"emptyLinePlaceholder":173},[6389],{"type":25,"value":176},{"type":20,"tag":157,"props":6391,"children":6392},{"class":159,"line":222},[6393],{"type":20,"tag":157,"props":6394,"children":6395},{"style":892},[6396],{"type":25,"value":6397},"处理非简单任务前，按需阅读：\n",{"type":20,"tag":157,"props":6399,"children":6400},{"class":159,"line":440},[6401],{"type":20,"tag":157,"props":6402,"children":6403},{"emptyLinePlaceholder":173},[6404],{"type":25,"value":176},{"type":20,"tag":157,"props":6406,"children":6407},{"class":159,"line":448},[6408,6414],{"type":20,"tag":157,"props":6409,"children":6411},{"style":6410},"--shiki-default:#FFAB70",[6412],{"type":25,"value":6413},"-",{"type":20,"tag":157,"props":6415,"children":6416},{"style":260},[6417],{"type":25,"value":6418}," `.codex\u002Fecc\u002Fworkflow.md`\n",{"type":20,"tag":157,"props":6420,"children":6421},{"class":159,"line":456},[6422,6426],{"type":20,"tag":157,"props":6423,"children":6424},{"style":6410},[6425],{"type":25,"value":6413},{"type":20,"tag":157,"props":6427,"children":6428},{"style":260},[6429],{"type":25,"value":6430}," `.codex\u002Fecc\u002Frules.md`\n",{"type":20,"tag":157,"props":6432,"children":6433},{"class":159,"line":465},[6434,6438],{"type":20,"tag":157,"props":6435,"children":6436},{"style":6410},[6437],{"type":25,"value":6413},{"type":20,"tag":157,"props":6439,"children":6440},{"style":260},[6441],{"type":25,"value":6442}," `.codex\u002Fecc\u002Fsecurity.md`\n",{"type":20,"tag":21,"props":6444,"children":6445},{},[6446,6448,6453,6455,6460],{"type":25,"value":6447},"这个文件只做入口，不负责承载所有细节。长期规则放 ",{"type":20,"tag":84,"props":6449,"children":6451},{"className":6450},[],[6452],{"type":25,"value":5576},{"type":25,"value":6454},"，任务工作流放 ",{"type":20,"tag":84,"props":6456,"children":6458},{"className":6457},[],[6459],{"type":25,"value":5553},{"type":25,"value":110},{"type":20,"tag":21,"props":6462,"children":6463},{},[6464],{"type":25,"value":6465},"如果后面确实需要更强的自动化，再逐步加 MCP、subagents 或 Codex 原生 hooks。不要第一天就把所有东西打开。",{"type":20,"tag":5056,"props":6467,"children":6468},{},[],{"type":20,"tag":1863,"props":6470,"children":6472},{"id":6471},"什么时候用什么时候不用",[6473],{"type":25,"value":6474},"什么时候用，什么时候不用",{"type":20,"tag":21,"props":6476,"children":6477},{},[6478],{"type":25,"value":6479},"不是所有项目都需要这套东西。",{"type":20,"tag":21,"props":6481,"children":6482},{},[6483,6488],{"type":20,"tag":33,"props":6484,"children":6485},{},[6486],{"type":25,"value":6487},"不需要",{"type":25,"value":6489},"：改一个小脚本、写一次性 demo、生成一段 SQL。原生 Codex 足够，额外规则反而会增加负担。",{"type":20,"tag":21,"props":6491,"children":6492},{},[6493,6498,6500,6505],{"type":20,"tag":33,"props":6494,"children":6495},{},[6496],{"type":25,"value":6497},"可以试试 Level 1",{"type":25,"value":6499},"：项目很小，但你希望 Codex 每次都记住测试命令、代码风格和不要覆盖用户改动。一个短 ",{"type":20,"tag":84,"props":6501,"children":6503},{"className":6502},[],[6504],{"type":25,"value":5113},{"type":25,"value":6506}," 加两三个 skills 就够了。",{"type":20,"tag":21,"props":6508,"children":6509},{},[6510,6515],{"type":20,"tag":33,"props":6511,"children":6512},{},[6513],{"type":25,"value":6514},"适合上 Level 2",{"type":25,"value":6516},"：长期维护的项目，有测试、构建、部署流程；或者项目里同时有前端、后端、API、Docker、CI\u002FCD。这个阶段，Codex 的问题通常不是“不会写代码”，而是“收尾不稳定”。",{"type":20,"tag":21,"props":6518,"children":6519},{},[6520,6525],{"type":20,"tag":33,"props":6521,"children":6522},{},[6523],{"type":25,"value":6524},"再考虑 Full-ish",{"type":25,"value":6526},"：团队协作、多仓库、多工具集成、需要权限控制或审计。这个阶段再上 MCP、subagents、hooks 和安全扫描更合理。",{"type":20,"tag":5056,"props":6528,"children":6529},{},[],{"type":20,"tag":1863,"props":6531,"children":6533},{"id":6532},"一条建议不要贪多",[6534],{"type":25,"value":6535},"一条建议：不要贪多",{"type":20,"tag":21,"props":6537,"children":6538},{},[6539],{"type":25,"value":6540},"真正有效的不是规则数量，而是四件事：",{"type":20,"tag":44,"props":6542,"children":6543},{},[6544,6549,6554,6559],{"type":20,"tag":48,"props":6545,"children":6546},{},[6547],{"type":25,"value":6548},"规则是否会被读到",{"type":20,"tag":48,"props":6550,"children":6551},{},[6552],{"type":25,"value":6553},"skill 是否能被正确触发",{"type":20,"tag":48,"props":6555,"children":6556},{},[6557],{"type":25,"value":6558},"上下文是否干净",{"type":20,"tag":48,"props":6560,"children":6561},{},[6562],{"type":25,"value":6563},"验证动作是否真的发生",{"type":20,"tag":21,"props":6565,"children":6566},{},[6567],{"type":25,"value":6568},"我更推荐这条路线：",{"type":20,"tag":126,"props":6570,"children":6572},{"className":324,"code":6571,"language":25,"meta":8,"style":8},"Codex 原生能力\n  + 精简 AGENTS.md\n  + 项目本地 .codex\u002Fecc 规则\n  + 少量高价值 skills\n  + 需要时再加 MCP \u002F subagents \u002F hooks\n",[6573],{"type":20,"tag":84,"props":6574,"children":6575},{"__ignoreMap":8},[6576,6584,6592,6600,6608],{"type":20,"tag":157,"props":6577,"children":6578},{"class":159,"line":160},[6579],{"type":20,"tag":157,"props":6580,"children":6581},{},[6582],{"type":25,"value":6583},"Codex 原生能力\n",{"type":20,"tag":157,"props":6585,"children":6586},{"class":159,"line":169},[6587],{"type":20,"tag":157,"props":6588,"children":6589},{},[6590],{"type":25,"value":6591},"  + 精简 AGENTS.md\n",{"type":20,"tag":157,"props":6593,"children":6594},{"class":159,"line":179},[6595],{"type":20,"tag":157,"props":6596,"children":6597},{},[6598],{"type":25,"value":6599},"  + 项目本地 .codex\u002Fecc 规则\n",{"type":20,"tag":157,"props":6601,"children":6602},{"class":159,"line":188},[6603],{"type":20,"tag":157,"props":6604,"children":6605},{},[6606],{"type":25,"value":6607},"  + 少量高价值 skills\n",{"type":20,"tag":157,"props":6609,"children":6610},{"class":159,"line":196},[6611],{"type":20,"tag":157,"props":6612,"children":6613},{},[6614],{"type":25,"value":6615},"  + 需要时再加 MCP \u002F subagents \u002F hooks\n",{"type":20,"tag":21,"props":6617,"children":6618},{},[6619],{"type":25,"value":6620},"先让 Codex 在日常开发中变稳定。等你真的遇到“需要接入外部工具”“需要并行审查”“需要强制执行命令策略”的问题，再把更重的能力加进来。",{"type":20,"tag":21,"props":6622,"children":6623},{},[6624,6626],{"type":25,"value":6625},"这也是 Clean ECC for Codex 的核心取舍：",{"type":20,"tag":33,"props":6627,"children":6628},{},[6629],{"type":25,"value":6630},"先可靠，再复杂。",{"type":20,"tag":5056,"props":6632,"children":6633},{},[],{"type":20,"tag":1863,"props":6635,"children":6637},{"id":6636},"从聪明到可靠",[6638],{"type":25,"value":6636},{"type":20,"tag":21,"props":6640,"children":6641},{},[6642],{"type":25,"value":6643},"AI 编程工具写代码快，这是最容易让人兴奋的地方。",{"type":20,"tag":21,"props":6645,"children":6646},{},[6647],{"type":25,"value":6648},"但真正让人愿意长期用的，是可靠：知道什么时候先查资料，什么时候该写测试，改完要验证，安全敏感改动要小心，不要覆盖已有工作，任务结束时要汇报做了什么、验证了什么、还剩什么风险。",{"type":20,"tag":21,"props":6650,"children":6651},{},[6652],{"type":25,"value":6653},"ECC 对 Codex 的价值就在这里。",{"type":20,"tag":21,"props":6655,"children":6656},{},[6657],{"type":25,"value":6658},"不是把 Claude Code 全家桶塞给 Codex，而是把其中最有价值的工程习惯，重新组织成 Codex 原生能理解的形式。",{"type":20,"tag":21,"props":6660,"children":6661},{},[6662],{"type":25,"value":6663},"最终得到的不是一个更重的项目模板，而是一套更稳的工作方式：",{"type":20,"tag":6665,"props":6666,"children":6667},"blockquote",{},[6668],{"type":20,"tag":21,"props":6669,"children":6670},{},[6671],{"type":25,"value":6672},"用 Codex 的原生能力做底座，用 ECC 的工程化思想做增强。",{"type":20,"tag":5056,"props":6674,"children":6675},{},[],{"type":20,"tag":1863,"props":6677,"children":6679},{"id":6678},"项目地址",[6680],{"type":25,"value":6678},{"type":20,"tag":21,"props":6682,"children":6683},{},[6684],{"type":25,"value":6685},"我整理的 Level 1、Level 2、Level 3 模板放在这里，可以直接使用：",{"type":20,"tag":21,"props":6687,"children":6688},{},[6689],{"type":20,"tag":101,"props":6690,"children":6693},{"href":6691,"rel":6692},"https:\u002F\u002Fgitee.com\u002Fo_insist\u002Fecc-work-in-codex",[105],[6694],{"type":25,"value":6691},{"type":20,"tag":5056,"props":6696,"children":6697},{},[],{"type":20,"tag":1863,"props":6699,"children":6700},{"id":4926},[6701],{"type":25,"value":4926},{"type":20,"tag":44,"props":6703,"children":6704},{},[6705,6715,6725,6735,6745],{"type":20,"tag":48,"props":6706,"children":6707},{},[6708],{"type":20,"tag":101,"props":6709,"children":6712},{"href":6710,"rel":6711},"https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fguides\u002Fagents-md",[105],[6713],{"type":25,"value":6714},"OpenAI Codex：AGENTS.md",{"type":20,"tag":48,"props":6716,"children":6717},{},[6718],{"type":20,"tag":101,"props":6719,"children":6722},{"href":6720,"rel":6721},"https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fskills",[105],[6723],{"type":25,"value":6724},"OpenAI Codex：Agent Skills",{"type":20,"tag":48,"props":6726,"children":6727},{},[6728],{"type":20,"tag":101,"props":6729,"children":6732},{"href":6730,"rel":6731},"https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fhooks",[105],[6733],{"type":25,"value":6734},"OpenAI Codex：Hooks",{"type":20,"tag":48,"props":6736,"children":6737},{},[6738],{"type":20,"tag":101,"props":6739,"children":6742},{"href":6740,"rel":6741},"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills",[105],[6743],{"type":25,"value":6744},"openai\u002Fskills",{"type":20,"tag":48,"props":6746,"children":6747},{},[6748],{"type":20,"tag":101,"props":6749,"children":6752},{"href":6750,"rel":6751},"https:\u002F\u002Fgithub.com\u002Faffaan-m\u002Feverything-claude-code",[105],[6753],{"type":25,"value":5042},{"type":20,"tag":1785,"props":6755,"children":6756},{},[6757],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":6759},[6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770],{"id":5061,"depth":169,"text":5064},{"id":5256,"depth":169,"text":5256},{"id":5363,"depth":169,"text":5363},{"id":5596,"depth":169,"text":5596},{"id":5754,"depth":169,"text":5757},{"id":6262,"depth":169,"text":6262},{"id":6471,"depth":169,"text":6474},{"id":6532,"depth":169,"text":6535},{"id":6636,"depth":169,"text":6636},{"id":6678,"depth":169,"text":6678},{"id":4926,"depth":169,"text":4926},"content:articles:ai:everything-claude-code在codex的应用.md","articles\u002Fai\u002Feverything-claude-code在codex的应用.md","articles\u002Fai\u002Feverything-claude-code在codex的应用",{"_path":6775,"_dir":6776,"_draft":7,"_partial":7,"_locale":8,"title":6777,"description":6778,"date":6779,"tags":6780,"body":6782,"_type":1800,"_id":10259,"_source":1802,"_file":10260,"_stem":10261,"_extension":1805},"\u002Farticles\u002Fdevops\u002Fdocker","devops","Docker 入门：从镜像、容器到项目部署","面向第一次接触 Docker 的学习笔记，梳理镜像、容器、Dockerfile、常用命令、Nginx 反向代理和服务器部署流程。","2026-05-15",[14,6781],"DevOps",{"type":17,"children":6783,"toc":10236},[6784,6789,6795,6800,6823,6833,6838,6843,6851,6857,6862,6867,6898,6903,6908,6919,6956,6961,6972,7008,7021,7026,7031,7051,7062,7073,7078,7106,7127,7133,7144,7149,7249,7254,7358,7363,7388,7408,7473,7478,7483,7595,7600,7612,7647,7667,7672,7741,7746,7818,7844,7849,7895,7900,7964,7969,7974,8002,8087,8099,8104,8385,8405,8411,8416,8421,8478,8497,8502,8555,8574,8579,8696,8701,8784,8832,8837,8927,8932,8937,9030,9050,9055,9157,9182,9187,9225,9250,9256,9277,9282,9305,9310,9351,9364,9437,9442,9448,9453,9466,9497,9502,9521,9552,9562,9582,9587,9592,9597,9611,9616,9855,9860,9865,9879,9884,9889,10042,10047,10052,10160,10165,10169,10232],{"type":20,"tag":21,"props":6785,"children":6786},{},[6787],{"type":25,"value":6788},"最近想弄个人博客，记录自己学习的过程，这就需要掌握一些部署的技能，如Docker、Nginx，这篇文章就是",{"type":20,"tag":1863,"props":6790,"children":6792},{"id":6791},"为什么需要-docker",[6793],{"type":25,"value":6794},"为什么需要 Docker",{"type":20,"tag":21,"props":6796,"children":6797},{},[6798],{"type":25,"value":6799},"很多人第一次部署项目时，遇到的不是代码问题，而是环境问题：",{"type":20,"tag":44,"props":6801,"children":6802},{},[6803,6808,6813,6818],{"type":20,"tag":48,"props":6804,"children":6805},{},[6806],{"type":25,"value":6807},"本地能跑，服务器跑不起来。",{"type":20,"tag":48,"props":6809,"children":6810},{},[6811],{"type":25,"value":6812},"A 项目需要 Node.js 18，B 项目需要 Node.js 20。",{"type":20,"tag":48,"props":6814,"children":6815},{},[6816],{"type":25,"value":6817},"换一台机器，又要重新安装运行环境、配置环境变量、调整启动脚本。",{"type":20,"tag":48,"props":6819,"children":6820},{},[6821],{"type":25,"value":6822},"项目越多，服务器上的依赖、日志、进程和端口越难管理。",{"type":20,"tag":21,"props":6824,"children":6825},{},[6826,6828],{"type":25,"value":6827},"Docker 要解决的核心问题是：",{"type":20,"tag":33,"props":6829,"children":6830},{},[6831],{"type":25,"value":6832},"把应用和它依赖的运行环境一起打包，让它在不同机器上用尽量一致的方式运行。",{"type":20,"tag":21,"props":6834,"children":6835},{},[6836],{"type":25,"value":6837},"可以把 Docker 理解成一种轻量的应用交付方式。它不会像传统虚拟机那样完整模拟一台操作系统，而是基于宿主机内核，把不同应用隔离在不同容器中。这样既能减少环境差异，又不会像虚拟机那样笨重。",{"type":20,"tag":21,"props":6839,"children":6840},{},[6841],{"type":25,"value":6842},"先记住一句话：",{"type":20,"tag":6665,"props":6844,"children":6845},{},[6846],{"type":20,"tag":21,"props":6847,"children":6848},{},[6849],{"type":25,"value":6850},"Docker 不是为了让代码变得神奇，而是为了让代码运行环境变得可复制、可迁移、可管理。",{"type":20,"tag":1863,"props":6852,"children":6854},{"id":6853},"没有-docker-和有-docker-的部署区别",[6855],{"type":25,"value":6856},"没有 Docker 和有 Docker 的部署区别",{"type":20,"tag":21,"props":6858,"children":6859},{},[6860],{"type":25,"value":6861},"假设服务器上要部署一个 Nuxt 应用，并且使用 Nginx 接收外部请求。",{"type":20,"tag":21,"props":6863,"children":6864},{},[6865],{"type":25,"value":6866},"没有 Docker 时，常见结构是：",{"type":20,"tag":126,"props":6868,"children":6870},{"className":324,"code":6869,"language":25,"meta":8,"style":8},"Linux 宿主机\n├─ Nginx（直接安装在宿主机）\n└─ Nuxt 应用（直接运行在宿主机）\n",[6871],{"type":20,"tag":84,"props":6872,"children":6873},{"__ignoreMap":8},[6874,6882,6890],{"type":20,"tag":157,"props":6875,"children":6876},{"class":159,"line":160},[6877],{"type":20,"tag":157,"props":6878,"children":6879},{},[6880],{"type":25,"value":6881},"Linux 宿主机\n",{"type":20,"tag":157,"props":6883,"children":6884},{"class":159,"line":169},[6885],{"type":20,"tag":157,"props":6886,"children":6887},{},[6888],{"type":25,"value":6889},"├─ Nginx（直接安装在宿主机）\n",{"type":20,"tag":157,"props":6891,"children":6892},{"class":159,"line":179},[6893],{"type":20,"tag":157,"props":6894,"children":6895},{},[6896],{"type":25,"value":6897},"└─ Nuxt 应用（直接运行在宿主机）\n",{"type":20,"tag":21,"props":6899,"children":6900},{},[6901],{"type":25,"value":6902},"这种方式当然能用，但服务器会逐渐变成一个\"手工配置现场\"：Node 版本、项目依赖、进程管理、日志目录、环境变量都散落在宿主机上。后续迁移、排查问题或部署新项目时，很容易出现环境不一致。",{"type":20,"tag":21,"props":6904,"children":6905},{},[6906],{"type":25,"value":6907},"使用 Docker 后，可以有两种常见做法。",{"type":20,"tag":21,"props":6909,"children":6910},{},[6911,6913,6918],{"type":25,"value":6912},"第一种是 ",{"type":20,"tag":33,"props":6914,"children":6915},{},[6916],{"type":25,"value":6917},"Nginx 不容器化，只把应用容器化",{"type":25,"value":146},{"type":20,"tag":126,"props":6920,"children":6922},{"className":324,"code":6921,"language":25,"meta":8,"style":8},"Linux 宿主机\n├─ Nginx（直接安装在宿主机）\n└─ Docker\n   └─ Nuxt 容器\n",[6923],{"type":20,"tag":84,"props":6924,"children":6925},{"__ignoreMap":8},[6926,6933,6940,6948],{"type":20,"tag":157,"props":6927,"children":6928},{"class":159,"line":160},[6929],{"type":20,"tag":157,"props":6930,"children":6931},{},[6932],{"type":25,"value":6881},{"type":20,"tag":157,"props":6934,"children":6935},{"class":159,"line":169},[6936],{"type":20,"tag":157,"props":6937,"children":6938},{},[6939],{"type":25,"value":6889},{"type":20,"tag":157,"props":6941,"children":6942},{"class":159,"line":179},[6943],{"type":20,"tag":157,"props":6944,"children":6945},{},[6946],{"type":25,"value":6947},"└─ Docker\n",{"type":20,"tag":157,"props":6949,"children":6950},{"class":159,"line":188},[6951],{"type":20,"tag":157,"props":6952,"children":6953},{},[6954],{"type":25,"value":6955},"   └─ Nuxt 容器\n",{"type":20,"tag":21,"props":6957,"children":6958},{},[6959],{"type":25,"value":6960},"这种方式适合刚开始使用 Docker 的阶段。Nginx 仍然由服务器直接管理，Docker 只负责应用本身，理解成本比较低。",{"type":20,"tag":21,"props":6962,"children":6963},{},[6964,6966,6971],{"type":25,"value":6965},"第二种是 ",{"type":20,"tag":33,"props":6967,"children":6968},{},[6969],{"type":25,"value":6970},"Nginx 和应用都容器化",{"type":25,"value":146},{"type":20,"tag":126,"props":6973,"children":6975},{"className":324,"code":6974,"language":25,"meta":8,"style":8},"Linux 宿主机\n└─ Docker\n   ├─ Nginx 容器\n   └─ Nuxt 容器\n",[6976],{"type":20,"tag":84,"props":6977,"children":6978},{"__ignoreMap":8},[6979,6986,6993,7001],{"type":20,"tag":157,"props":6980,"children":6981},{"class":159,"line":160},[6982],{"type":20,"tag":157,"props":6983,"children":6984},{},[6985],{"type":25,"value":6881},{"type":20,"tag":157,"props":6987,"children":6988},{"class":159,"line":169},[6989],{"type":20,"tag":157,"props":6990,"children":6991},{},[6992],{"type":25,"value":6947},{"type":20,"tag":157,"props":6994,"children":6995},{"class":159,"line":179},[6996],{"type":20,"tag":157,"props":6997,"children":6998},{},[6999],{"type":25,"value":7000},"   ├─ Nginx 容器\n",{"type":20,"tag":157,"props":7002,"children":7003},{"class":159,"line":188},[7004],{"type":20,"tag":157,"props":7005,"children":7006},{},[7007],{"type":25,"value":6955},{"type":20,"tag":21,"props":7009,"children":7010},{},[7011,7013,7019],{"type":25,"value":7012},"这种方式更统一，所有服务都由 Docker 管理，通常会配合 ",{"type":20,"tag":84,"props":7014,"children":7016},{"className":7015},[],[7017],{"type":25,"value":7018},"docker compose",{"type":25,"value":7020}," 使用。正式项目中，如果后面还要加入数据库、Redis、后端服务、AI 服务等，多容器编排会更方便。",{"type":20,"tag":21,"props":7022,"children":7023},{},[7024],{"type":25,"value":7025},"这两种方式没有绝对优劣。刚入门时，可以先让应用容器化；当项目服务变多、部署流程变复杂时，再把 Nginx、数据库、缓存等服务逐步纳入 Compose 管理。",{"type":20,"tag":1863,"props":7027,"children":7029},{"id":7028},"镜像和容器",[7030],{"type":25,"value":7028},{"type":20,"tag":21,"props":7032,"children":7033},{},[7034,7036,7042,7044,7050],{"type":25,"value":7035},"Docker 里最重要的两个概念是：",{"type":20,"tag":84,"props":7037,"children":7039},{"className":7038},[],[7040],{"type":25,"value":7041},"镜像",{"type":25,"value":7043}," 和 ",{"type":20,"tag":84,"props":7045,"children":7047},{"className":7046},[],[7048],{"type":25,"value":7049},"容器",{"type":25,"value":110},{"type":20,"tag":21,"props":7052,"children":7053},{},[7054,7060],{"type":20,"tag":84,"props":7055,"children":7057},{"className":7056},[],[7058],{"type":25,"value":7059},"镜像 Image",{"type":25,"value":7061}," 是静态的构建产物。它描述了应用运行需要的文件、依赖、环境和默认启动方式。可以把镜像类比成\"软件安装包\"，也可以类比成面向对象里的\"类\"。",{"type":20,"tag":21,"props":7063,"children":7064},{},[7065,7071],{"type":20,"tag":84,"props":7066,"children":7068},{"className":7067},[],[7069],{"type":25,"value":7070},"容器 Container",{"type":25,"value":7072}," 是镜像运行后的实例。它是动态的，是一个被隔离起来的运行环境。可以把容器类比成\"安装并启动后的软件\"，也可以类比成面向对象里的\"对象实例\"。",{"type":20,"tag":21,"props":7074,"children":7075},{},[7076],{"type":25,"value":7077},"简单说：",{"type":20,"tag":44,"props":7079,"children":7080},{},[7081,7086,7091,7096,7101],{"type":20,"tag":48,"props":7082,"children":7083},{},[7084],{"type":25,"value":7085},"镜像是构建结果。",{"type":20,"tag":48,"props":7087,"children":7088},{},[7089],{"type":25,"value":7090},"容器是镜像运行后的实例。",{"type":20,"tag":48,"props":7092,"children":7093},{},[7094],{"type":25,"value":7095},"一个镜像可以启动多个容器。",{"type":20,"tag":48,"props":7097,"children":7098},{},[7099],{"type":25,"value":7100},"删除容器不会自动删除镜像。",{"type":20,"tag":48,"props":7102,"children":7103},{},[7104],{"type":25,"value":7105},"删除镜像前，一般要先停止并删除依赖它的容器。",{"type":20,"tag":21,"props":7107,"children":7108},{},[7109,7111,7117,7119,7125],{"type":25,"value":7110},"比如你构建出一个 ",{"type":20,"tag":84,"props":7112,"children":7114},{"className":7113},[],[7115],{"type":25,"value":7116},"my-blog:v1",{"type":25,"value":7118}," 镜像，就可以用它启动一个博客容器。将来升级版本时，可以重新构建 ",{"type":20,"tag":84,"props":7120,"children":7122},{"className":7121},[],[7123],{"type":25,"value":7124},"my-blog:v2",{"type":25,"value":7126},"，再用新镜像启动新容器。",{"type":20,"tag":1863,"props":7128,"children":7130},{"id":7129},"dockerfile-是什么",[7131],{"type":25,"value":7132},"Dockerfile 是什么",{"type":20,"tag":21,"props":7134,"children":7135},{},[7136,7142],{"type":20,"tag":84,"props":7137,"children":7139},{"className":7138},[],[7140],{"type":25,"value":7141},"Dockerfile",{"type":25,"value":7143}," 是写给 Docker 的构建说明书。它告诉 Docker 如何一步一步生成镜像：使用哪个基础镜像、进入哪个工作目录、复制哪些文件、安装哪些依赖，以及容器启动时执行什么命令。",{"type":20,"tag":21,"props":7145,"children":7146},{},[7147],{"type":25,"value":7148},"下面是一个入门版 Node.js 项目 Dockerfile：",{"type":20,"tag":126,"props":7150,"children":7154},{"className":7151,"code":7152,"language":7153,"meta":8,"style":8},"language-dockerfile shiki shiki-themes github-dark","FROM node:20-alpine\n\nWORKDIR \u002Fapp\n\nCOPY package*.json .\u002F\nRUN npm ci --omit=dev\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD [\"npm\", \"start\"]\n","dockerfile",[7155],{"type":20,"tag":84,"props":7156,"children":7157},{"__ignoreMap":8},[7158,7166,7173,7181,7188,7196,7204,7211,7219,7226,7234,7241],{"type":20,"tag":157,"props":7159,"children":7160},{"class":159,"line":160},[7161],{"type":20,"tag":157,"props":7162,"children":7163},{},[7164],{"type":25,"value":7165},"FROM node:20-alpine\n",{"type":20,"tag":157,"props":7167,"children":7168},{"class":159,"line":169},[7169],{"type":20,"tag":157,"props":7170,"children":7171},{"emptyLinePlaceholder":173},[7172],{"type":25,"value":176},{"type":20,"tag":157,"props":7174,"children":7175},{"class":159,"line":179},[7176],{"type":20,"tag":157,"props":7177,"children":7178},{},[7179],{"type":25,"value":7180},"WORKDIR \u002Fapp\n",{"type":20,"tag":157,"props":7182,"children":7183},{"class":159,"line":188},[7184],{"type":20,"tag":157,"props":7185,"children":7186},{"emptyLinePlaceholder":173},[7187],{"type":25,"value":176},{"type":20,"tag":157,"props":7189,"children":7190},{"class":159,"line":196},[7191],{"type":20,"tag":157,"props":7192,"children":7193},{},[7194],{"type":25,"value":7195},"COPY package*.json .\u002F\n",{"type":20,"tag":157,"props":7197,"children":7198},{"class":159,"line":204},[7199],{"type":20,"tag":157,"props":7200,"children":7201},{},[7202],{"type":25,"value":7203},"RUN npm ci --omit=dev\n",{"type":20,"tag":157,"props":7205,"children":7206},{"class":159,"line":213},[7207],{"type":20,"tag":157,"props":7208,"children":7209},{"emptyLinePlaceholder":173},[7210],{"type":25,"value":176},{"type":20,"tag":157,"props":7212,"children":7213},{"class":159,"line":222},[7214],{"type":20,"tag":157,"props":7215,"children":7216},{},[7217],{"type":25,"value":7218},"COPY . .\n",{"type":20,"tag":157,"props":7220,"children":7221},{"class":159,"line":440},[7222],{"type":20,"tag":157,"props":7223,"children":7224},{"emptyLinePlaceholder":173},[7225],{"type":25,"value":176},{"type":20,"tag":157,"props":7227,"children":7228},{"class":159,"line":448},[7229],{"type":20,"tag":157,"props":7230,"children":7231},{},[7232],{"type":25,"value":7233},"EXPOSE 3000\n",{"type":20,"tag":157,"props":7235,"children":7236},{"class":159,"line":456},[7237],{"type":20,"tag":157,"props":7238,"children":7239},{"emptyLinePlaceholder":173},[7240],{"type":25,"value":176},{"type":20,"tag":157,"props":7242,"children":7243},{"class":159,"line":465},[7244],{"type":20,"tag":157,"props":7245,"children":7246},{},[7247],{"type":25,"value":7248},"CMD [\"npm\", \"start\"]\n",{"type":20,"tag":21,"props":7250,"children":7251},{},[7252],{"type":25,"value":7253},"这里每一行都对应一个构建或运行阶段的动作：",{"type":20,"tag":44,"props":7255,"children":7256},{},[7257,7268,7279,7290,7317,7328,7347],{"type":20,"tag":48,"props":7258,"children":7259},{},[7260,7266],{"type":20,"tag":84,"props":7261,"children":7263},{"className":7262},[],[7264],{"type":25,"value":7265},"FROM node:20-alpine",{"type":25,"value":7267},"：选择一个已有的基础镜像，里面已经包含 Node.js 运行环境。",{"type":20,"tag":48,"props":7269,"children":7270},{},[7271,7277],{"type":20,"tag":84,"props":7272,"children":7274},{"className":7273},[],[7275],{"type":25,"value":7276},"WORKDIR \u002Fapp",{"type":25,"value":7278},"：指定容器内部的工作目录，后续命令默认都在这里执行。",{"type":20,"tag":48,"props":7280,"children":7281},{},[7282,7288],{"type":20,"tag":84,"props":7283,"children":7285},{"className":7284},[],[7286],{"type":25,"value":7287},"COPY package*.json .\u002F",{"type":25,"value":7289},"：先复制依赖描述文件，方便 Docker 利用构建缓存。",{"type":20,"tag":48,"props":7291,"children":7292},{},[7293,7299,7301,7307,7309,7315],{"type":20,"tag":84,"props":7294,"children":7296},{"className":7295},[],[7297],{"type":25,"value":7298},"RUN npm ci --omit=dev",{"type":25,"value":7300},"：在构建镜像时安装生产依赖。相比 ",{"type":20,"tag":84,"props":7302,"children":7304},{"className":7303},[],[7305],{"type":25,"value":7306},"npm install",{"type":25,"value":7308},"，",{"type":20,"tag":84,"props":7310,"children":7312},{"className":7311},[],[7313],{"type":25,"value":7314},"npm ci",{"type":25,"value":7316}," 更适合根据锁文件做可重复安装。",{"type":20,"tag":48,"props":7318,"children":7319},{},[7320,7326],{"type":20,"tag":84,"props":7321,"children":7323},{"className":7322},[],[7324],{"type":25,"value":7325},"COPY . .",{"type":25,"value":7327},"：把项目其他文件复制到镜像中。",{"type":20,"tag":48,"props":7329,"children":7330},{},[7331,7337,7339,7345],{"type":20,"tag":84,"props":7332,"children":7334},{"className":7333},[],[7335],{"type":25,"value":7336},"EXPOSE 3000",{"type":25,"value":7338},"：声明应用在容器内监听 ",{"type":20,"tag":84,"props":7340,"children":7342},{"className":7341},[],[7343],{"type":25,"value":7344},"3000",{"type":25,"value":7346}," 端口。注意它只是元信息，不会自动把端口暴露到宿主机。",{"type":20,"tag":48,"props":7348,"children":7349},{},[7350,7356],{"type":20,"tag":84,"props":7351,"children":7353},{"className":7352},[],[7354],{"type":25,"value":7355},"CMD [\"npm\", \"start\"]",{"type":25,"value":7357},"：容器启动后默认执行的命令。",{"type":20,"tag":21,"props":7359,"children":7360},{},[7361],{"type":25,"value":7362},"这里有两个时间点很容易混淆：",{"type":20,"tag":44,"props":7364,"children":7365},{},[7366,7377],{"type":20,"tag":48,"props":7367,"children":7368},{},[7369,7375],{"type":20,"tag":84,"props":7370,"children":7372},{"className":7371},[],[7373],{"type":25,"value":7374},"RUN",{"type":25,"value":7376}," 发生在构建镜像时，比如安装依赖、编译项目。",{"type":20,"tag":48,"props":7378,"children":7379},{},[7380,7386],{"type":20,"tag":84,"props":7381,"children":7383},{"className":7382},[],[7384],{"type":25,"value":7385},"CMD",{"type":25,"value":7387}," 发生在容器启动时，比如启动 Web 服务。",{"type":20,"tag":21,"props":7389,"children":7390},{},[7391,7393,7399,7401,7406],{"type":25,"value":7392},"真实项目中，还应该配合 ",{"type":20,"tag":84,"props":7394,"children":7396},{"className":7395},[],[7397],{"type":25,"value":7398},".dockerignore",{"type":25,"value":7400}," 使用，避免把 ",{"type":20,"tag":84,"props":7402,"children":7404},{"className":7403},[],[7405],{"type":25,"value":2013},{"type":25,"value":7407},"、构建产物、日志、环境变量文件等内容复制进镜像：",{"type":20,"tag":126,"props":7409,"children":7413},{"className":7410,"code":7411,"language":7412,"meta":8,"style":8},"language-gitignore shiki shiki-themes github-dark","node_modules\ndist\n.nuxt\n.output\n.env\n*.log\ncoverage\n","gitignore",[7414],{"type":20,"tag":84,"props":7415,"children":7416},{"__ignoreMap":8},[7417,7425,7433,7441,7449,7457,7465],{"type":20,"tag":157,"props":7418,"children":7419},{"class":159,"line":160},[7420],{"type":20,"tag":157,"props":7421,"children":7422},{},[7423],{"type":25,"value":7424},"node_modules\n",{"type":20,"tag":157,"props":7426,"children":7427},{"class":159,"line":169},[7428],{"type":20,"tag":157,"props":7429,"children":7430},{},[7431],{"type":25,"value":7432},"dist\n",{"type":20,"tag":157,"props":7434,"children":7435},{"class":159,"line":179},[7436],{"type":20,"tag":157,"props":7437,"children":7438},{},[7439],{"type":25,"value":7440},".nuxt\n",{"type":20,"tag":157,"props":7442,"children":7443},{"class":159,"line":188},[7444],{"type":20,"tag":157,"props":7445,"children":7446},{},[7447],{"type":25,"value":7448},".output\n",{"type":20,"tag":157,"props":7450,"children":7451},{"class":159,"line":196},[7452],{"type":20,"tag":157,"props":7453,"children":7454},{},[7455],{"type":25,"value":7456},".env\n",{"type":20,"tag":157,"props":7458,"children":7459},{"class":159,"line":204},[7460],{"type":20,"tag":157,"props":7461,"children":7462},{},[7463],{"type":25,"value":7464},"*.log\n",{"type":20,"tag":157,"props":7466,"children":7467},{"class":159,"line":213},[7468],{"type":20,"tag":157,"props":7469,"children":7470},{},[7471],{"type":25,"value":7472},"coverage\n",{"type":20,"tag":21,"props":7474,"children":7475},{},[7476],{"type":25,"value":7477},"如果项目需要先构建再运行，例如 Nuxt、Next.js、Vue、React 等前端项目，通常还会使用多阶段构建：第一阶段负责安装依赖和打包，第二阶段只保留运行所需文件。这样可以减少最终镜像体积，也能让镜像更干净。",{"type":20,"tag":21,"props":7479,"children":7480},{},[7481],{"type":25,"value":7482},"下面是一个多阶段构建的例子：",{"type":20,"tag":126,"props":7484,"children":7486},{"className":7151,"code":7485,"language":7153,"meta":8,"style":8},"# 阶段一：构建\nFROM node:20-alpine AS builder\nWORKDIR \u002Fapp\nCOPY package*.json .\u002F\nRUN npm ci\nCOPY . .\nRUN npm run build\n\n# 阶段二：运行\nFROM node:20-alpine\nWORKDIR \u002Fapp\nCOPY --from=builder \u002Fapp\u002F.output .\u002F\nEXPOSE 3000\nCMD [\"node\", \".output\u002Fserver\u002Findex.mjs\"]\n",[7487],{"type":20,"tag":84,"props":7488,"children":7489},{"__ignoreMap":8},[7490,7498,7506,7513,7520,7528,7535,7543,7550,7558,7565,7572,7580,7587],{"type":20,"tag":157,"props":7491,"children":7492},{"class":159,"line":160},[7493],{"type":20,"tag":157,"props":7494,"children":7495},{},[7496],{"type":25,"value":7497},"# 阶段一：构建\n",{"type":20,"tag":157,"props":7499,"children":7500},{"class":159,"line":169},[7501],{"type":20,"tag":157,"props":7502,"children":7503},{},[7504],{"type":25,"value":7505},"FROM node:20-alpine AS builder\n",{"type":20,"tag":157,"props":7507,"children":7508},{"class":159,"line":179},[7509],{"type":20,"tag":157,"props":7510,"children":7511},{},[7512],{"type":25,"value":7180},{"type":20,"tag":157,"props":7514,"children":7515},{"class":159,"line":188},[7516],{"type":20,"tag":157,"props":7517,"children":7518},{},[7519],{"type":25,"value":7195},{"type":20,"tag":157,"props":7521,"children":7522},{"class":159,"line":196},[7523],{"type":20,"tag":157,"props":7524,"children":7525},{},[7526],{"type":25,"value":7527},"RUN npm ci\n",{"type":20,"tag":157,"props":7529,"children":7530},{"class":159,"line":204},[7531],{"type":20,"tag":157,"props":7532,"children":7533},{},[7534],{"type":25,"value":7218},{"type":20,"tag":157,"props":7536,"children":7537},{"class":159,"line":213},[7538],{"type":20,"tag":157,"props":7539,"children":7540},{},[7541],{"type":25,"value":7542},"RUN npm run build\n",{"type":20,"tag":157,"props":7544,"children":7545},{"class":159,"line":222},[7546],{"type":20,"tag":157,"props":7547,"children":7548},{"emptyLinePlaceholder":173},[7549],{"type":25,"value":176},{"type":20,"tag":157,"props":7551,"children":7552},{"class":159,"line":440},[7553],{"type":20,"tag":157,"props":7554,"children":7555},{},[7556],{"type":25,"value":7557},"# 阶段二：运行\n",{"type":20,"tag":157,"props":7559,"children":7560},{"class":159,"line":448},[7561],{"type":20,"tag":157,"props":7562,"children":7563},{},[7564],{"type":25,"value":7165},{"type":20,"tag":157,"props":7566,"children":7567},{"class":159,"line":456},[7568],{"type":20,"tag":157,"props":7569,"children":7570},{},[7571],{"type":25,"value":7180},{"type":20,"tag":157,"props":7573,"children":7574},{"class":159,"line":465},[7575],{"type":20,"tag":157,"props":7576,"children":7577},{},[7578],{"type":25,"value":7579},"COPY --from=builder \u002Fapp\u002F.output .\u002F\n",{"type":20,"tag":157,"props":7581,"children":7582},{"class":159,"line":474},[7583],{"type":20,"tag":157,"props":7584,"children":7585},{},[7586],{"type":25,"value":7233},{"type":20,"tag":157,"props":7588,"children":7589},{"class":159,"line":483},[7590],{"type":20,"tag":157,"props":7591,"children":7592},{},[7593],{"type":25,"value":7594},"CMD [\"node\", \".output\u002Fserver\u002Findex.mjs\"]\n",{"type":20,"tag":1863,"props":7596,"children":7598},{"id":7597},"构建和运行一个镜像",[7599],{"type":25,"value":7597},{"type":20,"tag":21,"props":7601,"children":7602},{},[7603,7605,7610],{"type":25,"value":7604},"假设当前目录下已经有 ",{"type":20,"tag":84,"props":7606,"children":7608},{"className":7607},[],[7609],{"type":25,"value":7141},{"type":25,"value":7611},"，可以执行：",{"type":20,"tag":126,"props":7613,"children":7615},{"className":238,"code":7614,"language":237,"meta":8,"style":8},"docker build -t test-docker .\n",[7616],{"type":20,"tag":84,"props":7617,"children":7618},{"__ignoreMap":8},[7619],{"type":20,"tag":157,"props":7620,"children":7621},{"class":159,"line":160},[7622,7627,7632,7637,7642],{"type":20,"tag":157,"props":7623,"children":7624},{"style":248},[7625],{"type":25,"value":7626},"docker",{"type":20,"tag":157,"props":7628,"children":7629},{"style":254},[7630],{"type":25,"value":7631}," build",{"type":20,"tag":157,"props":7633,"children":7634},{"style":260},[7635],{"type":25,"value":7636}," -t",{"type":20,"tag":157,"props":7638,"children":7639},{"style":254},[7640],{"type":25,"value":7641}," test-docker",{"type":20,"tag":157,"props":7643,"children":7644},{"style":254},[7645],{"type":25,"value":7646}," .\n",{"type":20,"tag":21,"props":7648,"children":7649},{},[7650,7652,7657,7659,7665],{"type":25,"value":7651},"这条命令表示：使用当前目录的 ",{"type":20,"tag":84,"props":7653,"children":7655},{"className":7654},[],[7656],{"type":25,"value":7141},{"type":25,"value":7658}," 和项目文件构建一个名为 ",{"type":20,"tag":84,"props":7660,"children":7662},{"className":7661},[],[7663],{"type":25,"value":7664},"test-docker",{"type":25,"value":7666}," 的镜像。",{"type":20,"tag":21,"props":7668,"children":7669},{},[7670],{"type":25,"value":7671},"构建完成后，可以启动容器：",{"type":20,"tag":126,"props":7673,"children":7675},{"className":238,"code":7674,"language":237,"meta":8,"style":8},"docker run -d \\\n  --name test-docker \\\n  -p 80:3000 \\\n  test-docker\n",[7676],{"type":20,"tag":84,"props":7677,"children":7678},{"__ignoreMap":8},[7679,7700,7716,7733],{"type":20,"tag":157,"props":7680,"children":7681},{"class":159,"line":160},[7682,7686,7690,7695],{"type":20,"tag":157,"props":7683,"children":7684},{"style":248},[7685],{"type":25,"value":7626},{"type":20,"tag":157,"props":7687,"children":7688},{"style":254},[7689],{"type":25,"value":2119},{"type":20,"tag":157,"props":7691,"children":7692},{"style":260},[7693],{"type":25,"value":7694}," -d",{"type":20,"tag":157,"props":7696,"children":7697},{"style":260},[7698],{"type":25,"value":7699}," \\\n",{"type":20,"tag":157,"props":7701,"children":7702},{"class":159,"line":169},[7703,7708,7712],{"type":20,"tag":157,"props":7704,"children":7705},{"style":260},[7706],{"type":25,"value":7707},"  --name",{"type":20,"tag":157,"props":7709,"children":7710},{"style":254},[7711],{"type":25,"value":7641},{"type":20,"tag":157,"props":7713,"children":7714},{"style":260},[7715],{"type":25,"value":7699},{"type":20,"tag":157,"props":7717,"children":7718},{"class":159,"line":179},[7719,7724,7729],{"type":20,"tag":157,"props":7720,"children":7721},{"style":260},[7722],{"type":25,"value":7723},"  -p",{"type":20,"tag":157,"props":7725,"children":7726},{"style":254},[7727],{"type":25,"value":7728}," 80:3000",{"type":20,"tag":157,"props":7730,"children":7731},{"style":260},[7732],{"type":25,"value":7699},{"type":20,"tag":157,"props":7734,"children":7735},{"class":159,"line":188},[7736],{"type":20,"tag":157,"props":7737,"children":7738},{"style":254},[7739],{"type":25,"value":7740},"  test-docker\n",{"type":20,"tag":21,"props":7742,"children":7743},{},[7744],{"type":25,"value":7745},"这条命令的含义是：",{"type":20,"tag":44,"props":7747,"children":7748},{},[7749,7760,7771,7782,7808],{"type":20,"tag":48,"props":7750,"children":7751},{},[7752,7758],{"type":20,"tag":84,"props":7753,"children":7755},{"className":7754},[],[7756],{"type":25,"value":7757},"docker run",{"type":25,"value":7759},"：根据镜像创建并启动一个容器。",{"type":20,"tag":48,"props":7761,"children":7762},{},[7763,7769],{"type":20,"tag":84,"props":7764,"children":7766},{"className":7765},[],[7767],{"type":25,"value":7768},"-d",{"type":25,"value":7770},"：让容器在后台运行。",{"type":20,"tag":48,"props":7772,"children":7773},{},[7774,7780],{"type":20,"tag":84,"props":7775,"children":7777},{"className":7776},[],[7778],{"type":25,"value":7779},"--name test-docker",{"type":25,"value":7781},"：给容器起一个明确的名字，后续可以直接用名字操作。",{"type":20,"tag":48,"props":7783,"children":7784},{},[7785,7791,7793,7799,7801,7806],{"type":20,"tag":84,"props":7786,"children":7788},{"className":7787},[],[7789],{"type":25,"value":7790},"-p 80:3000",{"type":25,"value":7792},"：把宿主机的 ",{"type":20,"tag":84,"props":7794,"children":7796},{"className":7795},[],[7797],{"type":25,"value":7798},"80",{"type":25,"value":7800}," 端口映射到容器内部的 ",{"type":20,"tag":84,"props":7802,"children":7804},{"className":7803},[],[7805],{"type":25,"value":7344},{"type":25,"value":7807}," 端口。",{"type":20,"tag":48,"props":7809,"children":7810},{},[7811,7816],{"type":20,"tag":84,"props":7812,"children":7814},{"className":7813},[],[7815],{"type":25,"value":7664},{"type":25,"value":7817},"：要运行的镜像名。",{"type":20,"tag":21,"props":7819,"children":7820},{},[7821,7823,7829,7831,7836,7838,7843],{"type":25,"value":7822},"端口映射是初学 Docker 时最容易混淆的地方。",{"type":20,"tag":84,"props":7824,"children":7826},{"className":7825},[],[7827],{"type":25,"value":7828},"80:3000",{"type":25,"value":7830}," 的左边是宿主机端口，右边是容器端口。访问服务器的 ",{"type":20,"tag":84,"props":7832,"children":7834},{"className":7833},[],[7835],{"type":25,"value":7798},{"type":25,"value":7837}," 端口时，流量会被转发到容器内部的 ",{"type":20,"tag":84,"props":7839,"children":7841},{"className":7840},[],[7842],{"type":25,"value":7344},{"type":25,"value":7807},{"type":20,"tag":21,"props":7845,"children":7846},{},[7847],{"type":25,"value":7848},"也可以这样理解：",{"type":20,"tag":126,"props":7850,"children":7852},{"className":324,"code":7851,"language":25,"meta":8,"style":8},"浏览器访问服务器 80 端口\n        ↓\nDocker 转发到容器 3000 端口\n        ↓\n容器里的应用处理请求\n",[7853],{"type":20,"tag":84,"props":7854,"children":7855},{"__ignoreMap":8},[7856,7864,7872,7880,7887],{"type":20,"tag":157,"props":7857,"children":7858},{"class":159,"line":160},[7859],{"type":20,"tag":157,"props":7860,"children":7861},{},[7862],{"type":25,"value":7863},"浏览器访问服务器 80 端口\n",{"type":20,"tag":157,"props":7865,"children":7866},{"class":159,"line":169},[7867],{"type":20,"tag":157,"props":7868,"children":7869},{},[7870],{"type":25,"value":7871},"        ↓\n",{"type":20,"tag":157,"props":7873,"children":7874},{"class":159,"line":179},[7875],{"type":20,"tag":157,"props":7876,"children":7877},{},[7878],{"type":25,"value":7879},"Docker 转发到容器 3000 端口\n",{"type":20,"tag":157,"props":7881,"children":7882},{"class":159,"line":188},[7883],{"type":20,"tag":157,"props":7884,"children":7885},{},[7886],{"type":25,"value":7871},{"type":20,"tag":157,"props":7888,"children":7889},{"class":159,"line":196},[7890],{"type":20,"tag":157,"props":7891,"children":7892},{},[7893],{"type":25,"value":7894},"容器里的应用处理请求\n",{"type":20,"tag":21,"props":7896,"children":7897},{},[7898],{"type":25,"value":7899},"需要注意：默认情况下，发布端口可能会让外部网络访问到该服务。生产环境里，不要随手把数据库、Redis、内部管理服务直接映射到公网端口。如果只是想让本机 Nginx 反向代理访问应用，可以绑定到本地地址：",{"type":20,"tag":126,"props":7901,"children":7903},{"className":238,"code":7902,"language":237,"meta":8,"style":8},"docker run -d \\\n  --name test-docker \\\n  -p 127.0.0.1:3000:3000 \\\n  test-docker\n",[7904],{"type":20,"tag":84,"props":7905,"children":7906},{"__ignoreMap":8},[7907,7926,7941,7957],{"type":20,"tag":157,"props":7908,"children":7909},{"class":159,"line":160},[7910,7914,7918,7922],{"type":20,"tag":157,"props":7911,"children":7912},{"style":248},[7913],{"type":25,"value":7626},{"type":20,"tag":157,"props":7915,"children":7916},{"style":254},[7917],{"type":25,"value":2119},{"type":20,"tag":157,"props":7919,"children":7920},{"style":260},[7921],{"type":25,"value":7694},{"type":20,"tag":157,"props":7923,"children":7924},{"style":260},[7925],{"type":25,"value":7699},{"type":20,"tag":157,"props":7927,"children":7928},{"class":159,"line":169},[7929,7933,7937],{"type":20,"tag":157,"props":7930,"children":7931},{"style":260},[7932],{"type":25,"value":7707},{"type":20,"tag":157,"props":7934,"children":7935},{"style":254},[7936],{"type":25,"value":7641},{"type":20,"tag":157,"props":7938,"children":7939},{"style":260},[7940],{"type":25,"value":7699},{"type":20,"tag":157,"props":7942,"children":7943},{"class":159,"line":179},[7944,7948,7953],{"type":20,"tag":157,"props":7945,"children":7946},{"style":260},[7947],{"type":25,"value":7723},{"type":20,"tag":157,"props":7949,"children":7950},{"style":254},[7951],{"type":25,"value":7952}," 127.0.0.1:3000:3000",{"type":20,"tag":157,"props":7954,"children":7955},{"style":260},[7956],{"type":25,"value":7699},{"type":20,"tag":157,"props":7958,"children":7959},{"class":159,"line":188},[7960],{"type":20,"tag":157,"props":7961,"children":7962},{"style":254},[7963],{"type":25,"value":7740},{"type":20,"tag":21,"props":7965,"children":7966},{},[7967],{"type":25,"value":7968},"这样外部用户不能直接访问容器端口，而是由宿主机上的 Nginx 统一接收请求后再转发。",{"type":20,"tag":1863,"props":7970,"children":7972},{"id":7971},"一个更完整的项目结构",[7973],{"type":25,"value":7971},{"type":20,"tag":21,"props":7975,"children":7976},{},[7977,7979,7984,7986,7992,7994,8000],{"type":25,"value":7978},"如果项目里有前端、后端、AI 服务，就可以给每个服务写自己的 ",{"type":20,"tag":84,"props":7980,"children":7982},{"className":7981},[],[7983],{"type":25,"value":7141},{"type":25,"value":7985},"，再用 ",{"type":20,"tag":84,"props":7987,"children":7989},{"className":7988},[],[7990],{"type":25,"value":7991},"compose.yaml",{"type":25,"value":7993}," 或 ",{"type":20,"tag":84,"props":7995,"children":7997},{"className":7996},[],[7998],{"type":25,"value":7999},"docker-compose.yml",{"type":25,"value":8001}," 统一管理。",{"type":20,"tag":126,"props":8003,"children":8005},{"className":324,"code":8004,"language":25,"meta":8,"style":8},"ai-drug-discovery-workbench\u002F\n├─ compose.yaml\n├─ backend\u002F\n│  └─ Dockerfile\n├─ ai-service\u002F\n│  └─ Dockerfile\n├─ frontend\u002F\n│  └─ Dockerfile\n└─ nginx\u002F\n   └─ default.conf\n",[8006],{"type":20,"tag":84,"props":8007,"children":8008},{"__ignoreMap":8},[8009,8017,8025,8033,8041,8049,8056,8064,8071,8079],{"type":20,"tag":157,"props":8010,"children":8011},{"class":159,"line":160},[8012],{"type":20,"tag":157,"props":8013,"children":8014},{},[8015],{"type":25,"value":8016},"ai-drug-discovery-workbench\u002F\n",{"type":20,"tag":157,"props":8018,"children":8019},{"class":159,"line":169},[8020],{"type":20,"tag":157,"props":8021,"children":8022},{},[8023],{"type":25,"value":8024},"├─ compose.yaml\n",{"type":20,"tag":157,"props":8026,"children":8027},{"class":159,"line":179},[8028],{"type":20,"tag":157,"props":8029,"children":8030},{},[8031],{"type":25,"value":8032},"├─ backend\u002F\n",{"type":20,"tag":157,"props":8034,"children":8035},{"class":159,"line":188},[8036],{"type":20,"tag":157,"props":8037,"children":8038},{},[8039],{"type":25,"value":8040},"│  └─ Dockerfile\n",{"type":20,"tag":157,"props":8042,"children":8043},{"class":159,"line":196},[8044],{"type":20,"tag":157,"props":8045,"children":8046},{},[8047],{"type":25,"value":8048},"├─ ai-service\u002F\n",{"type":20,"tag":157,"props":8050,"children":8051},{"class":159,"line":204},[8052],{"type":20,"tag":157,"props":8053,"children":8054},{},[8055],{"type":25,"value":8040},{"type":20,"tag":157,"props":8057,"children":8058},{"class":159,"line":213},[8059],{"type":20,"tag":157,"props":8060,"children":8061},{},[8062],{"type":25,"value":8063},"├─ frontend\u002F\n",{"type":20,"tag":157,"props":8065,"children":8066},{"class":159,"line":222},[8067],{"type":20,"tag":157,"props":8068,"children":8069},{},[8070],{"type":25,"value":8040},{"type":20,"tag":157,"props":8072,"children":8073},{"class":159,"line":440},[8074],{"type":20,"tag":157,"props":8075,"children":8076},{},[8077],{"type":25,"value":8078},"└─ nginx\u002F\n",{"type":20,"tag":157,"props":8080,"children":8081},{"class":159,"line":448},[8082],{"type":20,"tag":157,"props":8083,"children":8084},{},[8085],{"type":25,"value":8086},"   └─ default.conf\n",{"type":20,"tag":21,"props":8088,"children":8089},{},[8090,8092,8097],{"type":25,"value":8091},"这种结构的好处是：每个服务只关心自己的运行环境，整体启动则交给 ",{"type":20,"tag":84,"props":8093,"children":8095},{"className":8094},[],[8096],{"type":25,"value":7018},{"type":25,"value":8098},"。例如后端可以使用 Java 或 Node.js，AI 服务可以使用 Python，前端可以使用 Nuxt，它们不用把所有运行环境都堆在宿主机上。",{"type":20,"tag":21,"props":8100,"children":8101},{},[8102],{"type":25,"value":8103},"一个简化的 Compose 文件可能长这样：",{"type":20,"tag":126,"props":8105,"children":8107},{"className":5655,"code":8106,"language":5657,"meta":8,"style":8},"services:\n  frontend:\n    build: .\u002Ffrontend\n    expose:\n      - \"3000\"\n\n  backend:\n    build: .\u002Fbackend\n    expose:\n      - \"8080\"\n    environment:\n      NODE_ENV: production\n\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - .\u002Fnginx\u002Fdefault.conf:\u002Fetc\u002Fnginx\u002Fconf.d\u002Fdefault.conf:ro\n    depends_on:\n      - frontend\n      - backend\n",[8108],{"type":20,"tag":84,"props":8109,"children":8110},{"__ignoreMap":8},[8111,8124,8136,8153,8165,8178,8185,8197,8213,8224,8236,8248,8265,8272,8284,8301,8313,8325,8337,8349,8361,8373],{"type":20,"tag":157,"props":8112,"children":8113},{"class":159,"line":160},[8114,8119],{"type":20,"tag":157,"props":8115,"children":8116},{"style":5667},[8117],{"type":25,"value":8118},"services",{"type":20,"tag":157,"props":8120,"children":8121},{"style":892},[8122],{"type":25,"value":8123},":\n",{"type":20,"tag":157,"props":8125,"children":8126},{"class":159,"line":169},[8127,8132],{"type":20,"tag":157,"props":8128,"children":8129},{"style":5667},[8130],{"type":25,"value":8131},"  frontend",{"type":20,"tag":157,"props":8133,"children":8134},{"style":892},[8135],{"type":25,"value":8123},{"type":20,"tag":157,"props":8137,"children":8138},{"class":159,"line":179},[8139,8144,8148],{"type":20,"tag":157,"props":8140,"children":8141},{"style":5667},[8142],{"type":25,"value":8143},"    build",{"type":20,"tag":157,"props":8145,"children":8146},{"style":892},[8147],{"type":25,"value":908},{"type":20,"tag":157,"props":8149,"children":8150},{"style":254},[8151],{"type":25,"value":8152},".\u002Ffrontend\n",{"type":20,"tag":157,"props":8154,"children":8155},{"class":159,"line":188},[8156,8161],{"type":20,"tag":157,"props":8157,"children":8158},{"style":5667},[8159],{"type":25,"value":8160},"    expose",{"type":20,"tag":157,"props":8162,"children":8163},{"style":892},[8164],{"type":25,"value":8123},{"type":20,"tag":157,"props":8166,"children":8167},{"class":159,"line":196},[8168,8173],{"type":20,"tag":157,"props":8169,"children":8170},{"style":892},[8171],{"type":25,"value":8172},"      - ",{"type":20,"tag":157,"props":8174,"children":8175},{"style":254},[8176],{"type":25,"value":8177},"\"3000\"\n",{"type":20,"tag":157,"props":8179,"children":8180},{"class":159,"line":204},[8181],{"type":20,"tag":157,"props":8182,"children":8183},{"emptyLinePlaceholder":173},[8184],{"type":25,"value":176},{"type":20,"tag":157,"props":8186,"children":8187},{"class":159,"line":213},[8188,8193],{"type":20,"tag":157,"props":8189,"children":8190},{"style":5667},[8191],{"type":25,"value":8192},"  backend",{"type":20,"tag":157,"props":8194,"children":8195},{"style":892},[8196],{"type":25,"value":8123},{"type":20,"tag":157,"props":8198,"children":8199},{"class":159,"line":222},[8200,8204,8208],{"type":20,"tag":157,"props":8201,"children":8202},{"style":5667},[8203],{"type":25,"value":8143},{"type":20,"tag":157,"props":8205,"children":8206},{"style":892},[8207],{"type":25,"value":908},{"type":20,"tag":157,"props":8209,"children":8210},{"style":254},[8211],{"type":25,"value":8212},".\u002Fbackend\n",{"type":20,"tag":157,"props":8214,"children":8215},{"class":159,"line":440},[8216,8220],{"type":20,"tag":157,"props":8217,"children":8218},{"style":5667},[8219],{"type":25,"value":8160},{"type":20,"tag":157,"props":8221,"children":8222},{"style":892},[8223],{"type":25,"value":8123},{"type":20,"tag":157,"props":8225,"children":8226},{"class":159,"line":448},[8227,8231],{"type":20,"tag":157,"props":8228,"children":8229},{"style":892},[8230],{"type":25,"value":8172},{"type":20,"tag":157,"props":8232,"children":8233},{"style":254},[8234],{"type":25,"value":8235},"\"8080\"\n",{"type":20,"tag":157,"props":8237,"children":8238},{"class":159,"line":456},[8239,8244],{"type":20,"tag":157,"props":8240,"children":8241},{"style":5667},[8242],{"type":25,"value":8243},"    environment",{"type":20,"tag":157,"props":8245,"children":8246},{"style":892},[8247],{"type":25,"value":8123},{"type":20,"tag":157,"props":8249,"children":8250},{"class":159,"line":465},[8251,8256,8260],{"type":20,"tag":157,"props":8252,"children":8253},{"style":5667},[8254],{"type":25,"value":8255},"      NODE_ENV",{"type":20,"tag":157,"props":8257,"children":8258},{"style":892},[8259],{"type":25,"value":908},{"type":20,"tag":157,"props":8261,"children":8262},{"style":254},[8263],{"type":25,"value":8264},"production\n",{"type":20,"tag":157,"props":8266,"children":8267},{"class":159,"line":474},[8268],{"type":20,"tag":157,"props":8269,"children":8270},{"emptyLinePlaceholder":173},[8271],{"type":25,"value":176},{"type":20,"tag":157,"props":8273,"children":8274},{"class":159,"line":483},[8275,8280],{"type":20,"tag":157,"props":8276,"children":8277},{"style":5667},[8278],{"type":25,"value":8279},"  nginx",{"type":20,"tag":157,"props":8281,"children":8282},{"style":892},[8283],{"type":25,"value":8123},{"type":20,"tag":157,"props":8285,"children":8286},{"class":159,"line":491},[8287,8292,8296],{"type":20,"tag":157,"props":8288,"children":8289},{"style":5667},[8290],{"type":25,"value":8291},"    image",{"type":20,"tag":157,"props":8293,"children":8294},{"style":892},[8295],{"type":25,"value":908},{"type":20,"tag":157,"props":8297,"children":8298},{"style":254},[8299],{"type":25,"value":8300},"nginx:alpine\n",{"type":20,"tag":157,"props":8302,"children":8303},{"class":159,"line":499},[8304,8309],{"type":20,"tag":157,"props":8305,"children":8306},{"style":5667},[8307],{"type":25,"value":8308},"    ports",{"type":20,"tag":157,"props":8310,"children":8311},{"style":892},[8312],{"type":25,"value":8123},{"type":20,"tag":157,"props":8314,"children":8315},{"class":159,"line":508},[8316,8320],{"type":20,"tag":157,"props":8317,"children":8318},{"style":892},[8319],{"type":25,"value":8172},{"type":20,"tag":157,"props":8321,"children":8322},{"style":254},[8323],{"type":25,"value":8324},"\"80:80\"\n",{"type":20,"tag":157,"props":8326,"children":8327},{"class":159,"line":517},[8328,8333],{"type":20,"tag":157,"props":8329,"children":8330},{"style":5667},[8331],{"type":25,"value":8332},"    volumes",{"type":20,"tag":157,"props":8334,"children":8335},{"style":892},[8336],{"type":25,"value":8123},{"type":20,"tag":157,"props":8338,"children":8339},{"class":159,"line":1499},[8340,8344],{"type":20,"tag":157,"props":8341,"children":8342},{"style":892},[8343],{"type":25,"value":8172},{"type":20,"tag":157,"props":8345,"children":8346},{"style":254},[8347],{"type":25,"value":8348},".\u002Fnginx\u002Fdefault.conf:\u002Fetc\u002Fnginx\u002Fconf.d\u002Fdefault.conf:ro\n",{"type":20,"tag":157,"props":8350,"children":8351},{"class":159,"line":1507},[8352,8357],{"type":20,"tag":157,"props":8353,"children":8354},{"style":5667},[8355],{"type":25,"value":8356},"    depends_on",{"type":20,"tag":157,"props":8358,"children":8359},{"style":892},[8360],{"type":25,"value":8123},{"type":20,"tag":157,"props":8362,"children":8363},{"class":159,"line":1515},[8364,8368],{"type":20,"tag":157,"props":8365,"children":8366},{"style":892},[8367],{"type":25,"value":8172},{"type":20,"tag":157,"props":8369,"children":8370},{"style":254},[8371],{"type":25,"value":8372},"frontend\n",{"type":20,"tag":157,"props":8374,"children":8375},{"class":159,"line":1523},[8376,8380],{"type":20,"tag":157,"props":8377,"children":8378},{"style":892},[8379],{"type":25,"value":8172},{"type":20,"tag":157,"props":8381,"children":8382},{"style":254},[8383],{"type":25,"value":8384},"backend\n",{"type":20,"tag":21,"props":8386,"children":8387},{},[8388,8390,8396,8397,8403],{"type":25,"value":8389},"在同一个 Compose 项目里，服务会加入默认网络，并且可以通过服务名互相访问。也就是说，Nginx 容器里可以把请求转发到 ",{"type":20,"tag":84,"props":8391,"children":8393},{"className":8392},[],[8394],{"type":25,"value":8395},"http:\u002F\u002Ffrontend:3000",{"type":25,"value":7993},{"type":20,"tag":84,"props":8398,"children":8400},{"className":8399},[],[8401],{"type":25,"value":8402},"http:\u002F\u002Fbackend:8080",{"type":25,"value":8404},"，而不是写死某个容器 IP。容器 IP 可能会变化，服务名才是更稳定的连接方式。",{"type":20,"tag":1863,"props":8406,"children":8408},{"id":8407},"常用-docker-命令",[8409],{"type":25,"value":8410},"常用 Docker 命令",{"type":20,"tag":21,"props":8412,"children":8413},{},[8414],{"type":25,"value":8415},"初学阶段不需要背完所有命令，先掌握\"看状态、看日志、进容器、停服务、清资源\"这几类就够了。",{"type":20,"tag":28,"props":8417,"children":8419},{"id":8418},"查看容器",[8420],{"type":25,"value":8418},{"type":20,"tag":126,"props":8422,"children":8424},{"className":238,"code":8423,"language":237,"meta":8,"style":8},"docker ps\ndocker ps -a\ndocker ps --format \"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\"\n",[8425],{"type":20,"tag":84,"props":8426,"children":8427},{"__ignoreMap":8},[8428,8440,8457],{"type":20,"tag":157,"props":8429,"children":8430},{"class":159,"line":160},[8431,8435],{"type":20,"tag":157,"props":8432,"children":8433},{"style":248},[8434],{"type":25,"value":7626},{"type":20,"tag":157,"props":8436,"children":8437},{"style":254},[8438],{"type":25,"value":8439}," ps\n",{"type":20,"tag":157,"props":8441,"children":8442},{"class":159,"line":169},[8443,8447,8452],{"type":20,"tag":157,"props":8444,"children":8445},{"style":248},[8446],{"type":25,"value":7626},{"type":20,"tag":157,"props":8448,"children":8449},{"style":254},[8450],{"type":25,"value":8451}," ps",{"type":20,"tag":157,"props":8453,"children":8454},{"style":260},[8455],{"type":25,"value":8456}," -a\n",{"type":20,"tag":157,"props":8458,"children":8459},{"class":159,"line":179},[8460,8464,8468,8473],{"type":20,"tag":157,"props":8461,"children":8462},{"style":248},[8463],{"type":25,"value":7626},{"type":20,"tag":157,"props":8465,"children":8466},{"style":254},[8467],{"type":25,"value":8451},{"type":20,"tag":157,"props":8469,"children":8470},{"style":260},[8471],{"type":25,"value":8472}," --format",{"type":20,"tag":157,"props":8474,"children":8475},{"style":254},[8476],{"type":25,"value":8477}," \"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\"\n",{"type":20,"tag":21,"props":8479,"children":8480},{},[8481,8487,8489,8495],{"type":20,"tag":84,"props":8482,"children":8484},{"className":8483},[],[8485],{"type":25,"value":8486},"docker ps",{"type":25,"value":8488}," 只查看运行中的容器，",{"type":20,"tag":84,"props":8490,"children":8492},{"className":8491},[],[8493],{"type":25,"value":8494},"docker ps -a",{"type":25,"value":8496}," 会包含已经停止的容器。第三条命令可以用表格形式查看容器名称、状态和端口映射，更适合日常排查。",{"type":20,"tag":28,"props":8498,"children":8500},{"id":8499},"查看和删除镜像",[8501],{"type":25,"value":8499},{"type":20,"tag":126,"props":8503,"children":8505},{"className":238,"code":8504,"language":237,"meta":8,"style":8},"docker images\ndocker images your-app\ndocker rmi your-app:v1\n",[8506],{"type":20,"tag":84,"props":8507,"children":8508},{"__ignoreMap":8},[8509,8521,8538],{"type":20,"tag":157,"props":8510,"children":8511},{"class":159,"line":160},[8512,8516],{"type":20,"tag":157,"props":8513,"children":8514},{"style":248},[8515],{"type":25,"value":7626},{"type":20,"tag":157,"props":8517,"children":8518},{"style":254},[8519],{"type":25,"value":8520}," images\n",{"type":20,"tag":157,"props":8522,"children":8523},{"class":159,"line":169},[8524,8528,8533],{"type":20,"tag":157,"props":8525,"children":8526},{"style":248},[8527],{"type":25,"value":7626},{"type":20,"tag":157,"props":8529,"children":8530},{"style":254},[8531],{"type":25,"value":8532}," images",{"type":20,"tag":157,"props":8534,"children":8535},{"style":254},[8536],{"type":25,"value":8537}," your-app\n",{"type":20,"tag":157,"props":8539,"children":8540},{"class":159,"line":179},[8541,8545,8550],{"type":20,"tag":157,"props":8542,"children":8543},{"style":248},[8544],{"type":25,"value":7626},{"type":20,"tag":157,"props":8546,"children":8547},{"style":254},[8548],{"type":25,"value":8549}," rmi",{"type":20,"tag":157,"props":8551,"children":8552},{"style":254},[8553],{"type":25,"value":8554}," your-app:v1\n",{"type":20,"tag":21,"props":8556,"children":8557},{},[8558,8564,8566,8572],{"type":20,"tag":84,"props":8559,"children":8561},{"className":8560},[],[8562],{"type":25,"value":8563},"docker images",{"type":25,"value":8565}," 用来查看本机已有镜像。",{"type":20,"tag":84,"props":8567,"children":8569},{"className":8568},[],[8570],{"type":25,"value":8571},"docker rmi",{"type":25,"value":8573}," 用来删除镜像。如果某个镜像正在被容器使用，需要先停止并删除对应容器。",{"type":20,"tag":28,"props":8575,"children":8577},{"id":8576},"启动容器",[8578],{"type":25,"value":8576},{"type":20,"tag":126,"props":8580,"children":8582},{"className":238,"code":8581,"language":237,"meta":8,"style":8},"docker run -d \\\n  --name my-app \\\n  -p 80:8080 \\\n  -v \u002Fdata:\u002Fapp\u002Fdata \\\n  -e DB_HOST=db.example.com \\\n  --restart unless-stopped \\\n  your-app:v1.0\n",[8583],{"type":20,"tag":84,"props":8584,"children":8585},{"__ignoreMap":8},[8586,8605,8621,8637,8654,8671,8688],{"type":20,"tag":157,"props":8587,"children":8588},{"class":159,"line":160},[8589,8593,8597,8601],{"type":20,"tag":157,"props":8590,"children":8591},{"style":248},[8592],{"type":25,"value":7626},{"type":20,"tag":157,"props":8594,"children":8595},{"style":254},[8596],{"type":25,"value":2119},{"type":20,"tag":157,"props":8598,"children":8599},{"style":260},[8600],{"type":25,"value":7694},{"type":20,"tag":157,"props":8602,"children":8603},{"style":260},[8604],{"type":25,"value":7699},{"type":20,"tag":157,"props":8606,"children":8607},{"class":159,"line":169},[8608,8612,8617],{"type":20,"tag":157,"props":8609,"children":8610},{"style":260},[8611],{"type":25,"value":7707},{"type":20,"tag":157,"props":8613,"children":8614},{"style":254},[8615],{"type":25,"value":8616}," my-app",{"type":20,"tag":157,"props":8618,"children":8619},{"style":260},[8620],{"type":25,"value":7699},{"type":20,"tag":157,"props":8622,"children":8623},{"class":159,"line":179},[8624,8628,8633],{"type":20,"tag":157,"props":8625,"children":8626},{"style":260},[8627],{"type":25,"value":7723},{"type":20,"tag":157,"props":8629,"children":8630},{"style":254},[8631],{"type":25,"value":8632}," 80:8080",{"type":20,"tag":157,"props":8634,"children":8635},{"style":260},[8636],{"type":25,"value":7699},{"type":20,"tag":157,"props":8638,"children":8639},{"class":159,"line":188},[8640,8645,8650],{"type":20,"tag":157,"props":8641,"children":8642},{"style":260},[8643],{"type":25,"value":8644},"  -v",{"type":20,"tag":157,"props":8646,"children":8647},{"style":254},[8648],{"type":25,"value":8649}," \u002Fdata:\u002Fapp\u002Fdata",{"type":20,"tag":157,"props":8651,"children":8652},{"style":260},[8653],{"type":25,"value":7699},{"type":20,"tag":157,"props":8655,"children":8656},{"class":159,"line":196},[8657,8662,8667],{"type":20,"tag":157,"props":8658,"children":8659},{"style":260},[8660],{"type":25,"value":8661},"  -e",{"type":20,"tag":157,"props":8663,"children":8664},{"style":254},[8665],{"type":25,"value":8666}," DB_HOST=db.example.com",{"type":20,"tag":157,"props":8668,"children":8669},{"style":260},[8670],{"type":25,"value":7699},{"type":20,"tag":157,"props":8672,"children":8673},{"class":159,"line":204},[8674,8679,8684],{"type":20,"tag":157,"props":8675,"children":8676},{"style":260},[8677],{"type":25,"value":8678},"  --restart",{"type":20,"tag":157,"props":8680,"children":8681},{"style":254},[8682],{"type":25,"value":8683}," unless-stopped",{"type":20,"tag":157,"props":8685,"children":8686},{"style":260},[8687],{"type":25,"value":7699},{"type":20,"tag":157,"props":8689,"children":8690},{"class":159,"line":213},[8691],{"type":20,"tag":157,"props":8692,"children":8693},{"style":254},[8694],{"type":25,"value":8695},"  your-app:v1.0\n",{"type":20,"tag":21,"props":8697,"children":8698},{},[8699],{"type":25,"value":8700},"这是一条比较完整的启动命令：",{"type":20,"tag":44,"props":8702,"children":8703},{},[8704,8715,8740,8751,8762,8773],{"type":20,"tag":48,"props":8705,"children":8706},{},[8707,8713],{"type":20,"tag":84,"props":8708,"children":8710},{"className":8709},[],[8711],{"type":25,"value":8712},"--name my-app",{"type":25,"value":8714},"：给容器起一个名字，后续可以直接用名字操作它。",{"type":20,"tag":48,"props":8716,"children":8717},{},[8718,8724,8726,8731,8733,8739],{"type":20,"tag":84,"props":8719,"children":8721},{"className":8720},[],[8722],{"type":25,"value":8723},"-p 80:8080",{"type":25,"value":8725},"：把宿主机 ",{"type":20,"tag":84,"props":8727,"children":8729},{"className":8728},[],[8730],{"type":25,"value":7798},{"type":25,"value":8732}," 端口映射到容器 ",{"type":20,"tag":84,"props":8734,"children":8736},{"className":8735},[],[8737],{"type":25,"value":8738},"8080",{"type":25,"value":7807},{"type":20,"tag":48,"props":8741,"children":8742},{},[8743,8749],{"type":20,"tag":84,"props":8744,"children":8746},{"className":8745},[],[8747],{"type":25,"value":8748},"-v \u002Fdata:\u002Fapp\u002Fdata",{"type":25,"value":8750},"：挂载目录，用来持久化数据或提供配置文件。",{"type":20,"tag":48,"props":8752,"children":8753},{},[8754,8760],{"type":20,"tag":84,"props":8755,"children":8757},{"className":8756},[],[8758],{"type":25,"value":8759},"-e DB_HOST=db.example.com",{"type":25,"value":8761},"：注入环境变量。",{"type":20,"tag":48,"props":8763,"children":8764},{},[8765,8771],{"type":20,"tag":84,"props":8766,"children":8768},{"className":8767},[],[8769],{"type":25,"value":8770},"--restart unless-stopped",{"type":25,"value":8772},"：容器异常退出后自动重启，除非手动停止。",{"type":20,"tag":48,"props":8774,"children":8775},{},[8776,8782],{"type":20,"tag":84,"props":8777,"children":8779},{"className":8778},[],[8780],{"type":25,"value":8781},"your-app:v1.0",{"type":25,"value":8783},"：指定镜像和版本标签。",{"type":20,"tag":21,"props":8785,"children":8786},{},[8787,8789,8795,8797,8803,8805,8810,8812,8818,8819,8825,8826,8831],{"type":25,"value":8788},"这里不建议把 ",{"type":20,"tag":84,"props":8790,"children":8792},{"className":8791},[],[8793],{"type":25,"value":8794},"DB_HOST",{"type":25,"value":8796}," 写成 ",{"type":20,"tag":84,"props":8798,"children":8800},{"className":8799},[],[8801],{"type":25,"value":8802},"localhost",{"type":25,"value":8804},"，除非数据库就在同一个容器里。对容器来说，",{"type":20,"tag":84,"props":8806,"children":8808},{"className":8807},[],[8809],{"type":25,"value":8802},{"type":25,"value":8811}," 通常指容器自己，不是宿主机，也不是其他容器。多容器项目中，应该优先使用 Compose 服务名，例如 ",{"type":20,"tag":84,"props":8813,"children":8815},{"className":8814},[],[8816],{"type":25,"value":8817},"db",{"type":25,"value":965},{"type":20,"tag":84,"props":8820,"children":8822},{"className":8821},[],[8823],{"type":25,"value":8824},"redis",{"type":25,"value":965},{"type":20,"tag":84,"props":8827,"children":8829},{"className":8828},[],[8830],{"type":25,"value":6},{"type":25,"value":110},{"type":20,"tag":28,"props":8833,"children":8835},{"id":8834},"停止和重启容器",[8836],{"type":25,"value":8834},{"type":20,"tag":126,"props":8838,"children":8840},{"className":238,"code":8839,"language":237,"meta":8,"style":8},"docker stop my-app\ndocker start my-app\ndocker restart my-app\ndocker stop $(docker ps -q)\n",[8841],{"type":20,"tag":84,"props":8842,"children":8843},{"__ignoreMap":8},[8844,8861,8877,8893],{"type":20,"tag":157,"props":8845,"children":8846},{"class":159,"line":160},[8847,8851,8856],{"type":20,"tag":157,"props":8848,"children":8849},{"style":248},[8850],{"type":25,"value":7626},{"type":20,"tag":157,"props":8852,"children":8853},{"style":254},[8854],{"type":25,"value":8855}," stop",{"type":20,"tag":157,"props":8857,"children":8858},{"style":254},[8859],{"type":25,"value":8860}," my-app\n",{"type":20,"tag":157,"props":8862,"children":8863},{"class":159,"line":169},[8864,8868,8873],{"type":20,"tag":157,"props":8865,"children":8866},{"style":248},[8867],{"type":25,"value":7626},{"type":20,"tag":157,"props":8869,"children":8870},{"style":254},[8871],{"type":25,"value":8872}," start",{"type":20,"tag":157,"props":8874,"children":8875},{"style":254},[8876],{"type":25,"value":8860},{"type":20,"tag":157,"props":8878,"children":8879},{"class":159,"line":179},[8880,8884,8889],{"type":20,"tag":157,"props":8881,"children":8882},{"style":248},[8883],{"type":25,"value":7626},{"type":20,"tag":157,"props":8885,"children":8886},{"style":254},[8887],{"type":25,"value":8888}," restart",{"type":20,"tag":157,"props":8890,"children":8891},{"style":254},[8892],{"type":25,"value":8860},{"type":20,"tag":157,"props":8894,"children":8895},{"class":159,"line":188},[8896,8900,8904,8909,8913,8917,8922],{"type":20,"tag":157,"props":8897,"children":8898},{"style":248},[8899],{"type":25,"value":7626},{"type":20,"tag":157,"props":8901,"children":8902},{"style":254},[8903],{"type":25,"value":8855},{"type":20,"tag":157,"props":8905,"children":8906},{"style":892},[8907],{"type":25,"value":8908}," $(",{"type":20,"tag":157,"props":8910,"children":8911},{"style":248},[8912],{"type":25,"value":7626},{"type":20,"tag":157,"props":8914,"children":8915},{"style":254},[8916],{"type":25,"value":8451},{"type":20,"tag":157,"props":8918,"children":8919},{"style":260},[8920],{"type":25,"value":8921}," -q",{"type":20,"tag":157,"props":8923,"children":8924},{"style":892},[8925],{"type":25,"value":8926},")\n",{"type":20,"tag":21,"props":8928,"children":8929},{},[8930],{"type":25,"value":8931},"容器既可以通过名称操作，也可以通过容器 ID 操作。日常使用时，建议给重要容器都设置明确的名字。",{"type":20,"tag":28,"props":8933,"children":8935},{"id":8934},"查看日志",[8936],{"type":25,"value":8934},{"type":20,"tag":126,"props":8938,"children":8940},{"className":238,"code":8939,"language":237,"meta":8,"style":8},"docker logs my-app\ndocker logs -f my-app\ndocker logs --tail 100 my-app\ndocker logs --since 1h my-app\n",[8941],{"type":20,"tag":84,"props":8942,"children":8943},{"__ignoreMap":8},[8944,8960,8980,9005],{"type":20,"tag":157,"props":8945,"children":8946},{"class":159,"line":160},[8947,8951,8956],{"type":20,"tag":157,"props":8948,"children":8949},{"style":248},[8950],{"type":25,"value":7626},{"type":20,"tag":157,"props":8952,"children":8953},{"style":254},[8954],{"type":25,"value":8955}," logs",{"type":20,"tag":157,"props":8957,"children":8958},{"style":254},[8959],{"type":25,"value":8860},{"type":20,"tag":157,"props":8961,"children":8962},{"class":159,"line":169},[8963,8967,8971,8976],{"type":20,"tag":157,"props":8964,"children":8965},{"style":248},[8966],{"type":25,"value":7626},{"type":20,"tag":157,"props":8968,"children":8969},{"style":254},[8970],{"type":25,"value":8955},{"type":20,"tag":157,"props":8972,"children":8973},{"style":260},[8974],{"type":25,"value":8975}," -f",{"type":20,"tag":157,"props":8977,"children":8978},{"style":254},[8979],{"type":25,"value":8860},{"type":20,"tag":157,"props":8981,"children":8982},{"class":159,"line":179},[8983,8987,8991,8996,9001],{"type":20,"tag":157,"props":8984,"children":8985},{"style":248},[8986],{"type":25,"value":7626},{"type":20,"tag":157,"props":8988,"children":8989},{"style":254},[8990],{"type":25,"value":8955},{"type":20,"tag":157,"props":8992,"children":8993},{"style":260},[8994],{"type":25,"value":8995}," --tail",{"type":20,"tag":157,"props":8997,"children":8998},{"style":260},[8999],{"type":25,"value":9000}," 100",{"type":20,"tag":157,"props":9002,"children":9003},{"style":254},[9004],{"type":25,"value":8860},{"type":20,"tag":157,"props":9006,"children":9007},{"class":159,"line":188},[9008,9012,9016,9021,9026],{"type":20,"tag":157,"props":9009,"children":9010},{"style":248},[9011],{"type":25,"value":7626},{"type":20,"tag":157,"props":9013,"children":9014},{"style":254},[9015],{"type":25,"value":8955},{"type":20,"tag":157,"props":9017,"children":9018},{"style":260},[9019],{"type":25,"value":9020}," --since",{"type":20,"tag":157,"props":9022,"children":9023},{"style":254},[9024],{"type":25,"value":9025}," 1h",{"type":20,"tag":157,"props":9027,"children":9028},{"style":254},[9029],{"type":25,"value":8860},{"type":20,"tag":21,"props":9031,"children":9032},{},[9033,9035,9041,9043,9049],{"type":25,"value":9034},"排查线上问题时，",{"type":20,"tag":84,"props":9036,"children":9038},{"className":9037},[],[9039],{"type":25,"value":9040},"docker logs -f",{"type":25,"value":9042}," 很常用，它会持续输出日志，效果类似 ",{"type":20,"tag":84,"props":9044,"children":9046},{"className":9045},[],[9047],{"type":25,"value":9048},"tail -f",{"type":25,"value":110},{"type":20,"tag":28,"props":9051,"children":9053},{"id":9052},"进入容器",[9054],{"type":25,"value":9052},{"type":20,"tag":126,"props":9056,"children":9058},{"className":238,"code":9057,"language":237,"meta":8,"style":8},"docker exec -it my-app sh\ndocker exec -it my-app bash\ndocker exec my-app ls \u002Fapp\ndocker exec my-app env\n",[9059],{"type":20,"tag":84,"props":9060,"children":9061},{"__ignoreMap":8},[9062,9088,9112,9137],{"type":20,"tag":157,"props":9063,"children":9064},{"class":159,"line":160},[9065,9069,9074,9079,9083],{"type":20,"tag":157,"props":9066,"children":9067},{"style":248},[9068],{"type":25,"value":7626},{"type":20,"tag":157,"props":9070,"children":9071},{"style":254},[9072],{"type":25,"value":9073}," exec",{"type":20,"tag":157,"props":9075,"children":9076},{"style":260},[9077],{"type":25,"value":9078}," -it",{"type":20,"tag":157,"props":9080,"children":9081},{"style":254},[9082],{"type":25,"value":8616},{"type":20,"tag":157,"props":9084,"children":9085},{"style":254},[9086],{"type":25,"value":9087}," sh\n",{"type":20,"tag":157,"props":9089,"children":9090},{"class":159,"line":169},[9091,9095,9099,9103,9107],{"type":20,"tag":157,"props":9092,"children":9093},{"style":248},[9094],{"type":25,"value":7626},{"type":20,"tag":157,"props":9096,"children":9097},{"style":254},[9098],{"type":25,"value":9073},{"type":20,"tag":157,"props":9100,"children":9101},{"style":260},[9102],{"type":25,"value":9078},{"type":20,"tag":157,"props":9104,"children":9105},{"style":254},[9106],{"type":25,"value":8616},{"type":20,"tag":157,"props":9108,"children":9109},{"style":254},[9110],{"type":25,"value":9111}," bash\n",{"type":20,"tag":157,"props":9113,"children":9114},{"class":159,"line":179},[9115,9119,9123,9127,9132],{"type":20,"tag":157,"props":9116,"children":9117},{"style":248},[9118],{"type":25,"value":7626},{"type":20,"tag":157,"props":9120,"children":9121},{"style":254},[9122],{"type":25,"value":9073},{"type":20,"tag":157,"props":9124,"children":9125},{"style":254},[9126],{"type":25,"value":8616},{"type":20,"tag":157,"props":9128,"children":9129},{"style":254},[9130],{"type":25,"value":9131}," ls",{"type":20,"tag":157,"props":9133,"children":9134},{"style":254},[9135],{"type":25,"value":9136}," \u002Fapp\n",{"type":20,"tag":157,"props":9138,"children":9139},{"class":159,"line":188},[9140,9144,9148,9152],{"type":20,"tag":157,"props":9141,"children":9142},{"style":248},[9143],{"type":25,"value":7626},{"type":20,"tag":157,"props":9145,"children":9146},{"style":254},[9147],{"type":25,"value":9073},{"type":20,"tag":157,"props":9149,"children":9150},{"style":254},[9151],{"type":25,"value":8616},{"type":20,"tag":157,"props":9153,"children":9154},{"style":254},[9155],{"type":25,"value":9156}," env\n",{"type":20,"tag":21,"props":9158,"children":9159},{},[9160,9166,9168,9174,9176,9181],{"type":20,"tag":84,"props":9161,"children":9163},{"className":9162},[],[9164],{"type":25,"value":9165},"docker exec",{"type":25,"value":9167}," 可以在已经运行的容器里执行命令。基于 Alpine 的镜像通常只有 ",{"type":20,"tag":84,"props":9169,"children":9171},{"className":9170},[],[9172],{"type":25,"value":9173},"sh",{"type":25,"value":9175},"，Ubuntu、Debian 这类镜像通常可以使用 ",{"type":20,"tag":84,"props":9177,"children":9179},{"className":9178},[],[9180],{"type":25,"value":237},{"type":25,"value":110},{"type":20,"tag":28,"props":9183,"children":9185},{"id":9184},"删除容器和镜像",[9186],{"type":25,"value":9184},{"type":20,"tag":126,"props":9188,"children":9190},{"className":238,"code":9189,"language":237,"meta":8,"style":8},"docker rm my-app\ndocker rmi your-app:v1\n",[9191],{"type":20,"tag":84,"props":9192,"children":9193},{"__ignoreMap":8},[9194,9210],{"type":20,"tag":157,"props":9195,"children":9196},{"class":159,"line":160},[9197,9201,9206],{"type":20,"tag":157,"props":9198,"children":9199},{"style":248},[9200],{"type":25,"value":7626},{"type":20,"tag":157,"props":9202,"children":9203},{"style":254},[9204],{"type":25,"value":9205}," rm",{"type":20,"tag":157,"props":9207,"children":9208},{"style":254},[9209],{"type":25,"value":8860},{"type":20,"tag":157,"props":9211,"children":9212},{"class":159,"line":169},[9213,9217,9221],{"type":20,"tag":157,"props":9214,"children":9215},{"style":248},[9216],{"type":25,"value":7626},{"type":20,"tag":157,"props":9218,"children":9219},{"style":254},[9220],{"type":25,"value":8549},{"type":20,"tag":157,"props":9222,"children":9223},{"style":254},[9224],{"type":25,"value":8554},{"type":20,"tag":21,"props":9226,"children":9227},{},[9228,9234,9236,9241,9243,9248],{"type":20,"tag":84,"props":9229,"children":9231},{"className":9230},[],[9232],{"type":25,"value":9233},"docker rm",{"type":25,"value":9235}," 删除容器，",{"type":20,"tag":84,"props":9237,"children":9239},{"className":9238},[],[9240],{"type":25,"value":8571},{"type":25,"value":9242}," 删除镜像。清理资源时一般先用 ",{"type":20,"tag":84,"props":9244,"children":9246},{"className":9245},[],[9247],{"type":25,"value":8494},{"type":25,"value":9249}," 找到停止的容器，再决定是否删除。",{"type":20,"tag":1863,"props":9251,"children":9253},{"id":9252},"构建镜像时的-cpu-架构问题",[9254],{"type":25,"value":9255},"构建镜像时的 CPU 架构问题",{"type":20,"tag":21,"props":9257,"children":9258},{},[9259,9261,9267,9269,9275],{"type":25,"value":9260},"构建镜像时还要注意 CPU 架构。很多开发者使用 Apple Silicon Mac，比如 M1、M2、M3、M4，这类机器通常是 ",{"type":20,"tag":84,"props":9262,"children":9264},{"className":9263},[],[9265],{"type":25,"value":9266},"linux\u002Farm64",{"type":25,"value":9268}," 架构。而大多数云服务器、Intel\u002FAMD 服务器通常是 ",{"type":20,"tag":84,"props":9270,"children":9272},{"className":9271},[],[9273],{"type":25,"value":9274},"linux\u002Famd64",{"type":25,"value":9276}," 架构。",{"type":20,"tag":21,"props":9278,"children":9279},{},[9280],{"type":25,"value":9281},"常见架构可以这样理解：",{"type":20,"tag":44,"props":9283,"children":9284},{},[9285,9295],{"type":20,"tag":48,"props":9286,"children":9287},{},[9288,9293],{"type":20,"tag":84,"props":9289,"children":9291},{"className":9290},[],[9292],{"type":25,"value":9266},{"type":25,"value":9294},"：ARM 64 位架构，常见于 Apple Silicon Mac、部分 ARM 服务器、树莓派等。",{"type":20,"tag":48,"props":9296,"children":9297},{},[9298,9303],{"type":20,"tag":84,"props":9299,"children":9301},{"className":9300},[],[9302],{"type":25,"value":9274},{"type":25,"value":9304},"：x86_64 架构，常见于大多数云服务器和普通 Intel\u002FAMD 服务器。",{"type":20,"tag":21,"props":9306,"children":9307},{},[9308],{"type":25,"value":9309},"如果在 M 系列 Mac 上构建镜像，然后拿到 x86_64 云服务器上运行，就可能遇到架构不匹配的问题。部署到这类服务器时，可以显式指定目标平台：",{"type":20,"tag":126,"props":9311,"children":9313},{"className":238,"code":9312,"language":237,"meta":8,"style":8},"docker build --platform linux\u002Famd64 -t your-app:v1 .\n",[9314],{"type":20,"tag":84,"props":9315,"children":9316},{"__ignoreMap":8},[9317],{"type":20,"tag":157,"props":9318,"children":9319},{"class":159,"line":160},[9320,9324,9328,9333,9338,9342,9347],{"type":20,"tag":157,"props":9321,"children":9322},{"style":248},[9323],{"type":25,"value":7626},{"type":20,"tag":157,"props":9325,"children":9326},{"style":254},[9327],{"type":25,"value":7631},{"type":20,"tag":157,"props":9329,"children":9330},{"style":260},[9331],{"type":25,"value":9332}," --platform",{"type":20,"tag":157,"props":9334,"children":9335},{"style":254},[9336],{"type":25,"value":9337}," linux\u002Famd64",{"type":20,"tag":157,"props":9339,"children":9340},{"style":260},[9341],{"type":25,"value":7636},{"type":20,"tag":157,"props":9343,"children":9344},{"style":254},[9345],{"type":25,"value":9346}," your-app:v1",{"type":20,"tag":157,"props":9348,"children":9349},{"style":254},[9350],{"type":25,"value":7646},{"type":20,"tag":21,"props":9352,"children":9353},{},[9354,9356,9362],{"type":25,"value":9355},"如果需要同时支持多种架构，可以使用 ",{"type":20,"tag":84,"props":9357,"children":9359},{"className":9358},[],[9360],{"type":25,"value":9361},"docker buildx",{"type":25,"value":9363}," 构建多平台镜像，并推送到镜像仓库：",{"type":20,"tag":126,"props":9365,"children":9367},{"className":238,"code":9366,"language":237,"meta":8,"style":8},"docker buildx build \\\n  --platform linux\u002Famd64,linux\u002Farm64 \\\n  -t yourname\u002Fyour-app:v1 \\\n  --push .\n",[9368],{"type":20,"tag":84,"props":9369,"children":9370},{"__ignoreMap":8},[9371,9391,9408,9425],{"type":20,"tag":157,"props":9372,"children":9373},{"class":159,"line":160},[9374,9378,9383,9387],{"type":20,"tag":157,"props":9375,"children":9376},{"style":248},[9377],{"type":25,"value":7626},{"type":20,"tag":157,"props":9379,"children":9380},{"style":254},[9381],{"type":25,"value":9382}," buildx",{"type":20,"tag":157,"props":9384,"children":9385},{"style":254},[9386],{"type":25,"value":7631},{"type":20,"tag":157,"props":9388,"children":9389},{"style":260},[9390],{"type":25,"value":7699},{"type":20,"tag":157,"props":9392,"children":9393},{"class":159,"line":169},[9394,9399,9404],{"type":20,"tag":157,"props":9395,"children":9396},{"style":260},[9397],{"type":25,"value":9398},"  --platform",{"type":20,"tag":157,"props":9400,"children":9401},{"style":254},[9402],{"type":25,"value":9403}," linux\u002Famd64,linux\u002Farm64",{"type":20,"tag":157,"props":9405,"children":9406},{"style":260},[9407],{"type":25,"value":7699},{"type":20,"tag":157,"props":9409,"children":9410},{"class":159,"line":179},[9411,9416,9421],{"type":20,"tag":157,"props":9412,"children":9413},{"style":260},[9414],{"type":25,"value":9415},"  -t",{"type":20,"tag":157,"props":9417,"children":9418},{"style":254},[9419],{"type":25,"value":9420}," yourname\u002Fyour-app:v1",{"type":20,"tag":157,"props":9422,"children":9423},{"style":260},[9424],{"type":25,"value":7699},{"type":20,"tag":157,"props":9426,"children":9427},{"class":159,"line":188},[9428,9433],{"type":20,"tag":157,"props":9429,"children":9430},{"style":260},[9431],{"type":25,"value":9432},"  --push",{"type":20,"tag":157,"props":9434,"children":9435},{"style":254},[9436],{"type":25,"value":7646},{"type":20,"tag":21,"props":9438,"children":9439},{},[9440],{"type":25,"value":9441},"单平台构建适合个人项目或固定服务器架构；多平台构建适合要同时支持 x86_64 服务器、ARM 服务器或不同开发机器的项目。",{"type":20,"tag":1863,"props":9443,"children":9445},{"id":9444},"docker-和-nginx-的关系",[9446],{"type":25,"value":9447},"Docker 和 Nginx 的关系",{"type":20,"tag":21,"props":9449,"children":9450},{},[9451],{"type":25,"value":9452},"Docker 负责打包和运行应用，Nginx 更常见的角色是接收外部请求、处理域名和路径转发、统一配置 HTTPS。",{"type":20,"tag":21,"props":9454,"children":9455},{},[9456,9458,9464],{"type":25,"value":9457},"没有 Nginx，服务器也可以部署多个项目，只要每个项目监听不同端口，外部就能通过 ",{"type":20,"tag":84,"props":9459,"children":9461},{"className":9460},[],[9462],{"type":25,"value":9463},"IP + 端口",{"type":25,"value":9465}," 访问它们。例如：",{"type":20,"tag":126,"props":9467,"children":9469},{"className":324,"code":9468,"language":25,"meta":8,"style":8},"http:\u002F\u002F服务器IP:3000\nhttp:\u002F\u002F服务器IP:8080\nhttp:\u002F\u002F服务器IP:9000\n",[9470],{"type":20,"tag":84,"props":9471,"children":9472},{"__ignoreMap":8},[9473,9481,9489],{"type":20,"tag":157,"props":9474,"children":9475},{"class":159,"line":160},[9476],{"type":20,"tag":157,"props":9477,"children":9478},{},[9479],{"type":25,"value":9480},"http:\u002F\u002F服务器IP:3000\n",{"type":20,"tag":157,"props":9482,"children":9483},{"class":159,"line":169},[9484],{"type":20,"tag":157,"props":9485,"children":9486},{},[9487],{"type":25,"value":9488},"http:\u002F\u002F服务器IP:8080\n",{"type":20,"tag":157,"props":9490,"children":9491},{"class":159,"line":179},[9492],{"type":20,"tag":157,"props":9493,"children":9494},{},[9495],{"type":25,"value":9496},"http:\u002F\u002F服务器IP:9000\n",{"type":20,"tag":21,"props":9498,"children":9499},{},[9500],{"type":25,"value":9501},"但是这种方式不适合正式网站。用户不会希望记住端口号，HTTPS 配置也会变得分散。",{"type":20,"tag":21,"props":9503,"children":9504},{},[9505,9507,9512,9513,9519],{"type":25,"value":9506},"加入 Nginx 后，可以让外部统一访问标准的 ",{"type":20,"tag":84,"props":9508,"children":9510},{"className":9509},[],[9511],{"type":25,"value":7798},{"type":25,"value":7993},{"type":20,"tag":84,"props":9514,"children":9516},{"className":9515},[],[9517],{"type":25,"value":9518},"443",{"type":25,"value":9520}," 端口，再由 Nginx 根据域名、子域名或路径转发到不同项目：",{"type":20,"tag":126,"props":9522,"children":9524},{"className":324,"code":9523,"language":25,"meta":8,"style":8},"blog.example.com  ->  frontend:3000\napi.example.com   ->  backend:8080\nai.example.com    ->  ai-service:9000\n",[9525],{"type":20,"tag":84,"props":9526,"children":9527},{"__ignoreMap":8},[9528,9536,9544],{"type":20,"tag":157,"props":9529,"children":9530},{"class":159,"line":160},[9531],{"type":20,"tag":157,"props":9532,"children":9533},{},[9534],{"type":25,"value":9535},"blog.example.com  ->  frontend:3000\n",{"type":20,"tag":157,"props":9537,"children":9538},{"class":159,"line":169},[9539],{"type":20,"tag":157,"props":9540,"children":9541},{},[9542],{"type":25,"value":9543},"api.example.com   ->  backend:8080\n",{"type":20,"tag":157,"props":9545,"children":9546},{"class":159,"line":179},[9547],{"type":20,"tag":157,"props":9548,"children":9549},{},[9550],{"type":25,"value":9551},"ai.example.com    ->  ai-service:9000\n",{"type":20,"tag":21,"props":9553,"children":9554},{},[9555,9557],{"type":25,"value":9556},"所以更准确的理解是：",{"type":20,"tag":33,"props":9558,"children":9559},{},[9560],{"type":25,"value":9561},"Nginx 不是 Docker 的替代品。Docker 负责运行应用，Nginx 负责把外部请求转发到正确的应用。",{"type":20,"tag":21,"props":9563,"children":9564},{},[9565,9567,9573,9575,9581],{"type":25,"value":9566},"如果 Nginx 直接安装在宿主机上，可以把容器端口绑定到 ",{"type":20,"tag":84,"props":9568,"children":9570},{"className":9569},[],[9571],{"type":25,"value":9572},"127.0.0.1",{"type":25,"value":9574},"，再让 Nginx 转发到本机端口。如果 Nginx 也在 Compose 里，则可以直接用服务名转发，例如 ",{"type":20,"tag":84,"props":9576,"children":9578},{"className":9577},[],[9579],{"type":25,"value":9580},"proxy_pass http:\u002F\u002Ffrontend:3000;",{"type":25,"value":110},{"type":20,"tag":1863,"props":9583,"children":9585},{"id":9584},"上传服务器的一种流程",[9586],{"type":25,"value":9584},{"type":20,"tag":21,"props":9588,"children":9589},{},[9590],{"type":25,"value":9591},"如果不使用镜像仓库，也可以先在本地构建镜像，再把镜像文件上传到服务器。",{"type":20,"tag":21,"props":9593,"children":9594},{},[9595],{"type":25,"value":9596},"整体流程是：",{"type":20,"tag":126,"props":9598,"children":9600},{"className":324,"code":9599,"language":25,"meta":8,"style":8},"构建镜像 -> 保存镜像到文件 -> scp 上传到 Linux 服务器 -> 加载镜像 -> 运行容器\n",[9601],{"type":20,"tag":84,"props":9602,"children":9603},{"__ignoreMap":8},[9604],{"type":20,"tag":157,"props":9605,"children":9606},{"class":159,"line":160},[9607],{"type":20,"tag":157,"props":9608,"children":9609},{},[9610],{"type":25,"value":9599},{"type":20,"tag":21,"props":9612,"children":9613},{},[9614],{"type":25,"value":9615},"对应命令大致如下：",{"type":20,"tag":126,"props":9617,"children":9619},{"className":238,"code":9618,"language":237,"meta":8,"style":8},"# 本地构建镜像（注意指定目标平台）\ndocker build --platform linux\u002Famd64 -t your-app:v1 .\n\n# 保存镜像为文件\ndocker save your-app:v1 -o your-app-v1.tar\n\n# 上传到服务器\nscp your-app-v1.tar user@server:\u002Ftmp\u002F\n\n# 登录服务器\nssh user@server\n\n# 加载镜像\ndocker load -i \u002Ftmp\u002Fyour-app-v1.tar\n\n# 运行容器\ndocker run -d --name your-app -p 80:3000 your-app:v1\n",[9620],{"type":20,"tag":84,"props":9621,"children":9622},{"__ignoreMap":8},[9623,9632,9663,9670,9678,9704,9711,9719,9737,9744,9752,9765,9772,9780,9802,9809,9817],{"type":20,"tag":157,"props":9624,"children":9625},{"class":159,"line":160},[9626],{"type":20,"tag":157,"props":9627,"children":9629},{"style":9628},"--shiki-default:#6A737D",[9630],{"type":25,"value":9631},"# 本地构建镜像（注意指定目标平台）\n",{"type":20,"tag":157,"props":9633,"children":9634},{"class":159,"line":169},[9635,9639,9643,9647,9651,9655,9659],{"type":20,"tag":157,"props":9636,"children":9637},{"style":248},[9638],{"type":25,"value":7626},{"type":20,"tag":157,"props":9640,"children":9641},{"style":254},[9642],{"type":25,"value":7631},{"type":20,"tag":157,"props":9644,"children":9645},{"style":260},[9646],{"type":25,"value":9332},{"type":20,"tag":157,"props":9648,"children":9649},{"style":254},[9650],{"type":25,"value":9337},{"type":20,"tag":157,"props":9652,"children":9653},{"style":260},[9654],{"type":25,"value":7636},{"type":20,"tag":157,"props":9656,"children":9657},{"style":254},[9658],{"type":25,"value":9346},{"type":20,"tag":157,"props":9660,"children":9661},{"style":254},[9662],{"type":25,"value":7646},{"type":20,"tag":157,"props":9664,"children":9665},{"class":159,"line":179},[9666],{"type":20,"tag":157,"props":9667,"children":9668},{"emptyLinePlaceholder":173},[9669],{"type":25,"value":176},{"type":20,"tag":157,"props":9671,"children":9672},{"class":159,"line":188},[9673],{"type":20,"tag":157,"props":9674,"children":9675},{"style":9628},[9676],{"type":25,"value":9677},"# 保存镜像为文件\n",{"type":20,"tag":157,"props":9679,"children":9680},{"class":159,"line":196},[9681,9685,9690,9694,9699],{"type":20,"tag":157,"props":9682,"children":9683},{"style":248},[9684],{"type":25,"value":7626},{"type":20,"tag":157,"props":9686,"children":9687},{"style":254},[9688],{"type":25,"value":9689}," save",{"type":20,"tag":157,"props":9691,"children":9692},{"style":254},[9693],{"type":25,"value":9346},{"type":20,"tag":157,"props":9695,"children":9696},{"style":260},[9697],{"type":25,"value":9698}," -o",{"type":20,"tag":157,"props":9700,"children":9701},{"style":254},[9702],{"type":25,"value":9703}," your-app-v1.tar\n",{"type":20,"tag":157,"props":9705,"children":9706},{"class":159,"line":204},[9707],{"type":20,"tag":157,"props":9708,"children":9709},{"emptyLinePlaceholder":173},[9710],{"type":25,"value":176},{"type":20,"tag":157,"props":9712,"children":9713},{"class":159,"line":213},[9714],{"type":20,"tag":157,"props":9715,"children":9716},{"style":9628},[9717],{"type":25,"value":9718},"# 上传到服务器\n",{"type":20,"tag":157,"props":9720,"children":9721},{"class":159,"line":222},[9722,9727,9732],{"type":20,"tag":157,"props":9723,"children":9724},{"style":248},[9725],{"type":25,"value":9726},"scp",{"type":20,"tag":157,"props":9728,"children":9729},{"style":254},[9730],{"type":25,"value":9731}," your-app-v1.tar",{"type":20,"tag":157,"props":9733,"children":9734},{"style":254},[9735],{"type":25,"value":9736}," user@server:\u002Ftmp\u002F\n",{"type":20,"tag":157,"props":9738,"children":9739},{"class":159,"line":440},[9740],{"type":20,"tag":157,"props":9741,"children":9742},{"emptyLinePlaceholder":173},[9743],{"type":25,"value":176},{"type":20,"tag":157,"props":9745,"children":9746},{"class":159,"line":448},[9747],{"type":20,"tag":157,"props":9748,"children":9749},{"style":9628},[9750],{"type":25,"value":9751},"# 登录服务器\n",{"type":20,"tag":157,"props":9753,"children":9754},{"class":159,"line":456},[9755,9760],{"type":20,"tag":157,"props":9756,"children":9757},{"style":248},[9758],{"type":25,"value":9759},"ssh",{"type":20,"tag":157,"props":9761,"children":9762},{"style":254},[9763],{"type":25,"value":9764}," user@server\n",{"type":20,"tag":157,"props":9766,"children":9767},{"class":159,"line":465},[9768],{"type":20,"tag":157,"props":9769,"children":9770},{"emptyLinePlaceholder":173},[9771],{"type":25,"value":176},{"type":20,"tag":157,"props":9773,"children":9774},{"class":159,"line":474},[9775],{"type":20,"tag":157,"props":9776,"children":9777},{"style":9628},[9778],{"type":25,"value":9779},"# 加载镜像\n",{"type":20,"tag":157,"props":9781,"children":9782},{"class":159,"line":483},[9783,9787,9792,9797],{"type":20,"tag":157,"props":9784,"children":9785},{"style":248},[9786],{"type":25,"value":7626},{"type":20,"tag":157,"props":9788,"children":9789},{"style":254},[9790],{"type":25,"value":9791}," load",{"type":20,"tag":157,"props":9793,"children":9794},{"style":260},[9795],{"type":25,"value":9796}," -i",{"type":20,"tag":157,"props":9798,"children":9799},{"style":254},[9800],{"type":25,"value":9801}," \u002Ftmp\u002Fyour-app-v1.tar\n",{"type":20,"tag":157,"props":9803,"children":9804},{"class":159,"line":491},[9805],{"type":20,"tag":157,"props":9806,"children":9807},{"emptyLinePlaceholder":173},[9808],{"type":25,"value":176},{"type":20,"tag":157,"props":9810,"children":9811},{"class":159,"line":499},[9812],{"type":20,"tag":157,"props":9813,"children":9814},{"style":9628},[9815],{"type":25,"value":9816},"# 运行容器\n",{"type":20,"tag":157,"props":9818,"children":9819},{"class":159,"line":508},[9820,9824,9828,9832,9837,9842,9847,9851],{"type":20,"tag":157,"props":9821,"children":9822},{"style":248},[9823],{"type":25,"value":7626},{"type":20,"tag":157,"props":9825,"children":9826},{"style":254},[9827],{"type":25,"value":2119},{"type":20,"tag":157,"props":9829,"children":9830},{"style":260},[9831],{"type":25,"value":7694},{"type":20,"tag":157,"props":9833,"children":9834},{"style":260},[9835],{"type":25,"value":9836}," --name",{"type":20,"tag":157,"props":9838,"children":9839},{"style":254},[9840],{"type":25,"value":9841}," your-app",{"type":20,"tag":157,"props":9843,"children":9844},{"style":260},[9845],{"type":25,"value":9846}," -p",{"type":20,"tag":157,"props":9848,"children":9849},{"style":254},[9850],{"type":25,"value":7728},{"type":20,"tag":157,"props":9852,"children":9853},{"style":254},[9854],{"type":25,"value":8554},{"type":20,"tag":21,"props":9856,"children":9857},{},[9858],{"type":25,"value":9859},"这种方式适合个人项目、小项目或刚开始学习部署的时候。它的优点是直观，不需要先配置镜像仓库；缺点是手工步骤多，版本管理和回滚不够方便。",{"type":20,"tag":21,"props":9861,"children":9862},{},[9863],{"type":25,"value":9864},"更正式的生产环境里，通常会把镜像推送到镜像仓库，例如 Docker Hub、GitHub Container Registry 或私有镜像仓库，然后让服务器直接拉取指定版本的镜像：",{"type":20,"tag":126,"props":9866,"children":9868},{"className":324,"code":9867,"language":25,"meta":8,"style":8},"本地或 CI 构建镜像 -> 推送到镜像仓库 -> 服务器拉取镜像 -> 重启容器或 Compose 项目\n",[9869],{"type":20,"tag":84,"props":9870,"children":9871},{"__ignoreMap":8},[9872],{"type":20,"tag":157,"props":9873,"children":9874},{"class":159,"line":160},[9875],{"type":20,"tag":157,"props":9876,"children":9877},{},[9878],{"type":25,"value":9867},{"type":20,"tag":21,"props":9880,"children":9881},{},[9882],{"type":25,"value":9883},"这样做更利于版本追踪、自动化部署和回滚。",{"type":20,"tag":1863,"props":9885,"children":9887},{"id":9886},"入门时最容易踩的坑",[9888],{"type":25,"value":9886},{"type":20,"tag":5719,"props":9890,"children":9891},{},[9892,9920,9959,9980,10008],{"type":20,"tag":48,"props":9893,"children":9894},{},[9895,9907,9911,9913,9918],{"type":20,"tag":33,"props":9896,"children":9897},{},[9898,9900,9905],{"type":25,"value":9899},"把 ",{"type":20,"tag":84,"props":9901,"children":9903},{"className":9902},[],[9904],{"type":25,"value":8802},{"type":25,"value":9906}," 理解错",{"type":20,"tag":9908,"props":9909,"children":9910},"br",{},[],{"type":25,"value":9912},"在容器内部，",{"type":20,"tag":84,"props":9914,"children":9916},{"className":9915},[],[9917],{"type":25,"value":8802},{"type":25,"value":9919}," 通常指容器自己。容器访问宿主机、其他容器或外部数据库时，要根据网络环境使用正确地址。",{"type":20,"tag":48,"props":9921,"children":9922},{},[9923,9928,9931,9936,9938,9944,9946,9951,9953,9958],{"type":20,"tag":33,"props":9924,"children":9925},{},[9926],{"type":25,"value":9927},"端口方向写反",{"type":20,"tag":9908,"props":9929,"children":9930},{},[],{"type":20,"tag":84,"props":9932,"children":9934},{"className":9933},[],[9935],{"type":25,"value":7790},{"type":25,"value":9937}," 是 ",{"type":20,"tag":84,"props":9939,"children":9941},{"className":9940},[],[9942],{"type":25,"value":9943},"宿主机端口:容器端口",{"type":25,"value":9945},"。如果应用在容器里监听 ",{"type":20,"tag":84,"props":9947,"children":9949},{"className":9948},[],[9950],{"type":25,"value":7344},{"type":25,"value":9952},"，右边就应该是 ",{"type":20,"tag":84,"props":9954,"children":9956},{"className":9955},[],[9957],{"type":25,"value":7344},{"type":25,"value":110},{"type":20,"tag":48,"props":9960,"children":9961},{},[9962,9967,9970,9972,9978],{"type":20,"tag":33,"props":9963,"children":9964},{},[9965],{"type":25,"value":9966},"把敏感服务暴露到公网",{"type":20,"tag":9908,"props":9968,"children":9969},{},[],{"type":25,"value":9971},"数据库、Redis、内部管理后台不要随便 ",{"type":20,"tag":84,"props":9973,"children":9975},{"className":9974},[],[9976],{"type":25,"value":9977},"-p",{"type":25,"value":9979}," 到公网。能走内网或 Compose 网络的，就不要暴露到外部。",{"type":20,"tag":48,"props":9981,"children":9982},{},[9983,9988,9991,9993,9998,10000,10006],{"type":20,"tag":33,"props":9984,"children":9985},{},[9986],{"type":25,"value":9987},"镜像里复制了太多无关文件",{"type":20,"tag":9908,"props":9989,"children":9990},{},[],{"type":25,"value":9992},"忘记写 ",{"type":20,"tag":84,"props":9994,"children":9996},{"className":9995},[],[9997],{"type":25,"value":7398},{"type":25,"value":9999}," 会让镜像变大，也可能把 ",{"type":20,"tag":84,"props":10001,"children":10003},{"className":10002},[],[10004],{"type":25,"value":10005},".env",{"type":25,"value":10007}," 等敏感文件打进镜像。",{"type":20,"tag":48,"props":10009,"children":10010},{},[10011,10023,10026,10028,10033,10034,10040],{"type":20,"tag":33,"props":10012,"children":10013},{},[10014,10016,10021],{"type":25,"value":10015},"只会 ",{"type":20,"tag":84,"props":10017,"children":10019},{"className":10018},[],[10020],{"type":25,"value":7757},{"type":25,"value":10022},"，不会看日志",{"type":20,"tag":9908,"props":10024,"children":10025},{},[],{"type":25,"value":10027},"容器启动失败时，先看 ",{"type":20,"tag":84,"props":10029,"children":10031},{"className":10030},[],[10032],{"type":25,"value":8494},{"type":25,"value":7043},{"type":20,"tag":84,"props":10035,"children":10037},{"className":10036},[],[10038],{"type":25,"value":10039},"docker logs 容器名",{"type":25,"value":10041},"，通常比反复重启更有效。",{"type":20,"tag":1863,"props":10043,"children":10045},{"id":10044},"总结",[10046],{"type":25,"value":10044},{"type":20,"tag":21,"props":10048,"children":10049},{},[10050],{"type":25,"value":10051},"Docker 入门可以先抓住这几件事：",{"type":20,"tag":5719,"props":10053,"children":10054},{},[10055,10060,10104,10122,10140,10150,10155],{"type":20,"tag":48,"props":10056,"children":10057},{},[10058],{"type":25,"value":10059},"镜像是静态的构建产物，容器是镜像运行起来后的实例。",{"type":20,"tag":48,"props":10061,"children":10062},{},[10063,10068,10070,10076,10077,10083,10084,10090,10091,10096,10097,10102],{"type":20,"tag":84,"props":10064,"children":10066},{"className":10065},[],[10067],{"type":25,"value":7141},{"type":25,"value":10069}," 是构建镜像的说明书，",{"type":20,"tag":84,"props":10071,"children":10073},{"className":10072},[],[10074],{"type":25,"value":10075},"FROM",{"type":25,"value":965},{"type":20,"tag":84,"props":10078,"children":10080},{"className":10079},[],[10081],{"type":25,"value":10082},"WORKDIR",{"type":25,"value":965},{"type":20,"tag":84,"props":10085,"children":10087},{"className":10086},[],[10088],{"type":25,"value":10089},"COPY",{"type":25,"value":965},{"type":20,"tag":84,"props":10092,"children":10094},{"className":10093},[],[10095],{"type":25,"value":7374},{"type":25,"value":965},{"type":20,"tag":84,"props":10098,"children":10100},{"className":10099},[],[10101],{"type":25,"value":7385},{"type":25,"value":10103}," 是最常见的指令。",{"type":20,"tag":48,"props":10105,"children":10106},{},[10107,10113,10115,10120],{"type":20,"tag":84,"props":10108,"children":10110},{"className":10109},[],[10111],{"type":25,"value":10112},"docker build",{"type":25,"value":10114}," 用来构建镜像，",{"type":20,"tag":84,"props":10116,"children":10118},{"className":10117},[],[10119],{"type":25,"value":7757},{"type":25,"value":10121}," 用来启动容器。",{"type":20,"tag":48,"props":10123,"children":10124},{},[10125,10127,10132,10134,10139],{"type":25,"value":10126},"端口映射里，",{"type":20,"tag":84,"props":10128,"children":10130},{"className":10129},[],[10131],{"type":25,"value":9943},{"type":25,"value":10133},"，例如 ",{"type":20,"tag":84,"props":10135,"children":10137},{"className":10136},[],[10138],{"type":25,"value":7828},{"type":25,"value":110},{"type":20,"tag":48,"props":10141,"children":10142},{},[10143,10148],{"type":20,"tag":84,"props":10144,"children":10146},{"className":10145},[],[10147],{"type":25,"value":7018},{"type":25,"value":10149}," 适合管理多容器项目，服务之间可以通过服务名访问。",{"type":20,"tag":48,"props":10151,"children":10152},{},[10153],{"type":25,"value":10154},"Nginx 不是 Docker 的替代品，它通常负责接收外部请求并转发到不同容器或服务。",{"type":20,"tag":48,"props":10156,"children":10157},{},[10158],{"type":25,"value":10159},"正式部署时，把镜像构建、推送、拉取和重启流程标准化，比直接在服务器上手动安装依赖更可靠。",{"type":20,"tag":21,"props":10161,"children":10162},{},[10163],{"type":25,"value":10164},"学 Docker 不需要一开始就把所有命令都背下来。先理解镜像、容器、Dockerfile、端口映射和日志查看，再拿一个真实项目从构建到部署跑通一遍，很多概念就会自然连起来。",{"type":20,"tag":1863,"props":10166,"children":10167},{"id":4926},[10168],{"type":25,"value":4926},{"type":20,"tag":44,"props":10170,"children":10171},{},[10172,10182,10192,10202,10212,10222],{"type":20,"tag":48,"props":10173,"children":10174},{},[10175],{"type":20,"tag":101,"props":10176,"children":10179},{"href":10177,"rel":10178},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fbest-practices\u002F",[105],[10180],{"type":25,"value":10181},"Docker Docs: Dockerfile best practices",{"type":20,"tag":48,"props":10183,"children":10184},{},[10185],{"type":20,"tag":101,"props":10186,"children":10189},{"href":10187,"rel":10188},"https:\u002F\u002Fdocs.docker.com\u002Fget-started\u002Fdocker-concepts\u002Frunning-containers\u002Fpublishing-ports\u002F",[105],[10190],{"type":25,"value":10191},"Docker Docs: Publishing and exposing ports",{"type":20,"tag":48,"props":10193,"children":10194},{},[10195],{"type":20,"tag":101,"props":10196,"children":10199},{"href":10197,"rel":10198},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fhow-tos\u002Fnetworking\u002F",[105],[10200],{"type":25,"value":10201},"Docker Docs: Networking in Compose",{"type":20,"tag":48,"props":10203,"children":10204},{},[10205],{"type":20,"tag":101,"props":10206,"children":10209},{"href":10207,"rel":10208},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[105],[10210],{"type":25,"value":10211},"Docker Docs: Multi-platform builds",{"type":20,"tag":48,"props":10213,"children":10214},{},[10215],{"type":20,"tag":101,"props":10216,"children":10219},{"href":10217,"rel":10218},"https:\u002F\u002Fdocs.docker.com\u002Freference\u002Fcli\u002Fdocker\u002Fimage\u002Fsave\u002F",[105],[10220],{"type":25,"value":10221},"Docker Docs: docker image save",{"type":20,"tag":48,"props":10223,"children":10224},{},[10225],{"type":20,"tag":101,"props":10226,"children":10229},{"href":10227,"rel":10228},"https:\u002F\u002Fdocs.docker.com\u002Freference\u002Fcli\u002Fdocker\u002Fimage\u002Fload\u002F",[105],[10230],{"type":25,"value":10231},"Docker Docs: docker image load",{"type":20,"tag":1785,"props":10233,"children":10234},{},[10235],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":10237},[10238,10239,10240,10241,10242,10243,10244,10253,10254,10255,10256,10257,10258],{"id":6791,"depth":169,"text":6794},{"id":6853,"depth":169,"text":6856},{"id":7028,"depth":169,"text":7028},{"id":7129,"depth":169,"text":7132},{"id":7597,"depth":169,"text":7597},{"id":7971,"depth":169,"text":7971},{"id":8407,"depth":169,"text":8410,"children":10245},[10246,10247,10248,10249,10250,10251,10252],{"id":8418,"depth":179,"text":8418},{"id":8499,"depth":179,"text":8499},{"id":8576,"depth":179,"text":8576},{"id":8834,"depth":179,"text":8834},{"id":8934,"depth":179,"text":8934},{"id":9052,"depth":179,"text":9052},{"id":9184,"depth":179,"text":9184},{"id":9252,"depth":169,"text":9255},{"id":9444,"depth":169,"text":9447},{"id":9584,"depth":169,"text":9584},{"id":9886,"depth":169,"text":9886},{"id":10044,"depth":169,"text":10044},{"id":4926,"depth":169,"text":4926},"content:articles:devops:Docker.md","articles\u002Fdevops\u002FDocker.md","articles\u002Fdevops\u002FDocker",{"_path":10263,"_dir":1808,"_draft":7,"_partial":7,"_locale":8,"title":10264,"description":10265,"date":10266,"tags":10267,"body":10268,"_type":1800,"_id":11114,"_source":1802,"_file":11115,"_stem":11116,"_extension":1805},"\u002Farticles\u002Fai\u002Fmpl-hydrophobicity","用MLP预测氨基酸亲疏水性：一个完整的机器学习小实验-PyTorch版","使用PyTorch构建MLP模型，结合RDKit Morgan指纹特征工程，通过留一交叉验证预测20种标准氨基酸的亲疏水性，覆盖数据处理、模型训练、正则化与评估的完整流程。","2026-05-11",[13,1813],{"type":17,"children":10269,"toc":11097},[10270,10275,10280,10308,10313,10321,10326,10331,10336,10344,10349,10390,10395,10401,10406,10414,10438,10443,10448,10456,10461,10466,10473,10478,10486,10491,10496,10501,10509,10514,10522,10527,10532,10537,10569,10574,10582,10593,10603,10608,10613,10618,10623,10628,10652,10657,10665,10670,10675,10687,10695,10700,10708,10712,10758,10763,10768,10776,10781,10789,10794,10799,10804,10809,10815,10820,10825,10832,10837,10845,10850,10856,10861,10866,10872,10877,10896,10901,10907,10912,10917,10925,10930,10948,10953,10958,10963,10968,10996,11001,11006,11011,11029,11033,11038,11046,11051,11079,11084],{"type":20,"tag":21,"props":10271,"children":10272},{},[10273],{"type":25,"value":10274},"最近我做了一个很小的机器学习项目：用 MLP 预测 20 种标准氨基酸的亲疏水性。",{"type":20,"tag":21,"props":10276,"children":10277},{},[10278],{"type":25,"value":10279},"这个项目的数据量很小，模型也不复杂，但它刚好覆盖了一个机器学习实验最重要的几个环节：",{"type":20,"tag":44,"props":10281,"children":10282},{},[10283,10288,10293,10298,10303],{"type":20,"tag":48,"props":10284,"children":10285},{},[10286],{"type":25,"value":10287},"原始数据如何变成模型能理解的数值特征",{"type":20,"tag":48,"props":10289,"children":10290},{},[10291],{"type":25,"value":10292},"神经网络如何通过损失函数和优化器学习",{"type":20,"tag":48,"props":10294,"children":10295},{},[10296],{"type":25,"value":10297},"小数据集为什么容易过拟合",{"type":20,"tag":48,"props":10299,"children":10300},{},[10301],{"type":25,"value":10302},"为什么评估方式比单次准确率更重要",{"type":20,"tag":48,"props":10304,"children":10305},{},[10306],{"type":25,"value":10307},"为什么要做 baseline 和 正则化",{"type":20,"tag":21,"props":10309,"children":10310},{},[10311],{"type":25,"value":10312},"项目地址中的核心流程是：",{"type":20,"tag":126,"props":10314,"children":10316},{"code":10315},"SMILES 字符串 -> RDKit 解析 -> Morgan 指纹 -> MLP 分类 -> 留一交叉验证\n",[10317],{"type":20,"tag":84,"props":10318,"children":10319},{"__ignoreMap":8},[10320],{"type":25,"value":10315},{"type":20,"tag":1863,"props":10322,"children":10324},{"id":10323},"项目目标",[10325],{"type":25,"value":10323},{"type":20,"tag":21,"props":10327,"children":10328},{},[10329],{"type":25,"value":10330},"给定一个氨基酸的分子结构，用机器学习模型预测它是疏水还是亲水。",{"type":20,"tag":21,"props":10332,"children":10333},{},[10334],{"type":25,"value":10335},"数据文件中每一行是一种氨基酸，例如：",{"type":20,"tag":126,"props":10337,"children":10339},{"code":10338},"name,abbreviation,three_letter,smiles,hydrophobic\n丙氨酸,Ala,Ala,CC(N)C(=O)O,1\n丝氨酸,Ser,Ser,NC(CO)C(=O)O,0\n",[10340],{"type":20,"tag":84,"props":10341,"children":10342},{"__ignoreMap":8},[10343],{"type":25,"value":10338},{"type":20,"tag":21,"props":10345,"children":10346},{},[10347],{"type":25,"value":10348},"其中：",{"type":20,"tag":44,"props":10350,"children":10351},{},[10352,10363],{"type":20,"tag":48,"props":10353,"children":10354},{},[10355,10361],{"type":20,"tag":84,"props":10356,"children":10358},{"className":10357},[],[10359],{"type":25,"value":10360},"smiles",{"type":25,"value":10362}," 是氨基酸的分子结构表示",{"type":20,"tag":48,"props":10364,"children":10365},{},[10366,10372,10374,10380,10382,10388],{"type":20,"tag":84,"props":10367,"children":10369},{"className":10368},[],[10370],{"type":25,"value":10371},"hydrophobic",{"type":25,"value":10373}," 是标签，",{"type":20,"tag":84,"props":10375,"children":10377},{"className":10376},[],[10378],{"type":25,"value":10379},"1",{"type":25,"value":10381}," 表示疏水，",{"type":20,"tag":84,"props":10383,"children":10385},{"className":10384},[],[10386],{"type":25,"value":10387},"0",{"type":25,"value":10389}," 表示亲水",{"type":20,"tag":21,"props":10391,"children":10392},{},[10393],{"type":25,"value":10394},"这是一个二分类问题。",{"type":20,"tag":1863,"props":10396,"children":10398},{"id":10397},"为什么不能直接把-smiles-喂给神经网络",[10399],{"type":25,"value":10400},"为什么不能直接把 SMILES 喂给神经网络",{"type":20,"tag":21,"props":10402,"children":10403},{},[10404],{"type":25,"value":10405},"SMILES 是一种文本形式的分子表示，例如丙氨酸的 SMILES 是：",{"type":20,"tag":126,"props":10407,"children":10409},{"code":10408},"CC(N)C(=O)O\n",[10410],{"type":20,"tag":84,"props":10411,"children":10412},{"__ignoreMap":8},[10413],{"type":25,"value":10408},{"type":20,"tag":21,"props":10415,"children":10416},{},[10417,10419,10424,10425,10430,10431,10436],{"type":25,"value":10418},"但是神经网络本质上处理的是数值张量。它并不直接理解 ",{"type":20,"tag":84,"props":10420,"children":10422},{"className":10421},[],[10423],{"type":25,"value":2210},{"type":25,"value":965},{"type":20,"tag":84,"props":10426,"children":10428},{"className":10427},[],[10429],{"type":25,"value":2244},{"type":25,"value":965},{"type":20,"tag":84,"props":10432,"children":10434},{"className":10433},[],[10435],{"type":25,"value":2227},{"type":25,"value":10437}," 这些字符代表什么化学意义。",{"type":20,"tag":21,"props":10439,"children":10440},{},[10441],{"type":25,"value":10442},"所以第一步要做特征工程：把 SMILES 转换成模型可以学习的数值向量。",{"type":20,"tag":21,"props":10444,"children":10445},{},[10446],{"type":25,"value":10447},"在这个项目中，我使用 RDKit 生成 Morgan 指纹：",{"type":20,"tag":126,"props":10449,"children":10451},{"code":10450},"def smiles_to_morgan_bits(\n    smiles: str,\n    radius: int = 2,\n    fp_size: int = 2048,\n) -> torch.Tensor:\n    mol = Chem.MolFromSmiles(smiles)\n    if mol is None:\n        raise ValueError(f\"Invalid SMILES: {smiles}\")\n​\n    generator = AllChem.GetMorganGenerator(radius=radius, fpSize=fp_size)\n    fingerprint = generator.GetFingerprint(mol)\n    return torch.tensor(\n        list(map(int, fingerprint.ToBitString())),\n        dtype=torch.float32,\n    )\n",[10452],{"type":20,"tag":84,"props":10453,"children":10454},{"__ignoreMap":8},[10455],{"type":25,"value":10450},{"type":20,"tag":21,"props":10457,"children":10458},{},[10459],{"type":25,"value":10460},"Morgan 指纹可以理解为：把分子中的局部结构模式编码成一个固定长度的 0\u002F1 向量。",{"type":20,"tag":21,"props":10462,"children":10463},{},[10464],{"type":25,"value":10465},"比如原始输入是：",{"type":20,"tag":126,"props":10467,"children":10468},{"code":10408},[10469],{"type":20,"tag":84,"props":10470,"children":10471},{"__ignoreMap":8},[10472],{"type":25,"value":10408},{"type":20,"tag":21,"props":10474,"children":10475},{},[10476],{"type":25,"value":10477},"经过特征工程后变成类似这样的向量：",{"type":20,"tag":126,"props":10479,"children":10481},{"code":10480},"[0, 1, 0, 0, 1, ..., 0]\n",[10482],{"type":20,"tag":84,"props":10483,"children":10484},{"__ignoreMap":8},[10485],{"type":25,"value":10480},{"type":20,"tag":21,"props":10487,"children":10488},{},[10489],{"type":25,"value":10490},"在这个项目中，每个氨基酸最终都会变成一个 2048 维的向量。",{"type":20,"tag":1863,"props":10492,"children":10494},{"id":10493},"模型结构",[10495],{"type":25,"value":10493},{"type":20,"tag":21,"props":10497,"children":10498},{},[10499],{"type":25,"value":10500},"模型使用的是一个很小的 MLP：",{"type":20,"tag":126,"props":10502,"children":10504},{"code":10503},"Input (2048) -> Linear -> ReLU -> Dropout -> Linear -> Output (1)\n",[10505],{"type":20,"tag":84,"props":10506,"children":10507},{"__ignoreMap":8},[10508],{"type":25,"value":10503},{"type":20,"tag":21,"props":10510,"children":10511},{},[10512],{"type":25,"value":10513},"对应代码：",{"type":20,"tag":126,"props":10515,"children":10517},{"code":10516},"model = HydroMLP(in_dim=2048, hidden_layer_sizes=(32,), dropout=0.1)\n",[10518],{"type":20,"tag":84,"props":10519,"children":10520},{"__ignoreMap":8},[10521],{"type":25,"value":10516},{"type":20,"tag":21,"props":10523,"children":10524},{},[10525],{"type":25,"value":10526},"这里有一个重要选择：模型没有设计得很大。",{"type":20,"tag":21,"props":10528,"children":10529},{},[10530],{"type":25,"value":10531},"原因是数据只有 20 条，而输入特征却有 2048 维。如果模型太大，它很容易把训练集记住，而不是真的学到亲疏水性的规律。这就是过拟合。",{"type":20,"tag":21,"props":10533,"children":10534},{},[10535],{"type":25,"value":10536},"所以我做了两个约束：",{"type":20,"tag":44,"props":10538,"children":10539},{},[10540,10551],{"type":20,"tag":48,"props":10541,"children":10542},{},[10543,10545],{"type":25,"value":10544},"使用较小的隐藏层：",{"type":20,"tag":84,"props":10546,"children":10548},{"className":10547},[],[10549],{"type":25,"value":10550},"2048 -> 32 -> 1",{"type":20,"tag":48,"props":10552,"children":10553},{},[10554,10556,10562,10563],{"type":25,"value":10555},"加入正则化：",{"type":20,"tag":84,"props":10557,"children":10559},{"className":10558},[],[10560],{"type":25,"value":10561},"Dropout",{"type":25,"value":7043},{"type":20,"tag":84,"props":10564,"children":10566},{"className":10565},[],[10567],{"type":25,"value":10568},"weight_decay",{"type":20,"tag":21,"props":10570,"children":10571},{},[10572],{"type":25,"value":10573},"训练时使用：",{"type":20,"tag":126,"props":10575,"children":10577},{"code":10576},"criterion = nn.BCEWithLogitsLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.003, weight_decay=1e-3)\n",[10578],{"type":20,"tag":84,"props":10579,"children":10580},{"__ignoreMap":8},[10581],{"type":25,"value":10576},{"type":20,"tag":21,"props":10583,"children":10584},{},[10585,10591],{"type":20,"tag":84,"props":10586,"children":10588},{"className":10587},[],[10589],{"type":25,"value":10590},"BCEWithLogitsLoss",{"type":25,"value":10592}," 适合二分类任务。它内部会把模型输出的 logit 转换成概率，再计算二分类交叉熵。",{"type":20,"tag":21,"props":10594,"children":10595},{},[10596,10601],{"type":20,"tag":84,"props":10597,"children":10599},{"className":10598},[],[10600],{"type":25,"value":10568},{"type":25,"value":10602}," 是 L2 正则化，可以限制模型参数不要变得过大，从而降低过拟合风险。",{"type":20,"tag":1863,"props":10604,"children":10606},{"id":10605},"为什么使用留一交叉验证",[10607],{"type":25,"value":10605},{"type":20,"tag":21,"props":10609,"children":10610},{},[10611],{"type":25,"value":10612},"一开始我用的是普通的训练集\u002F测试集划分，例如 15 条训练、5 条测试。",{"type":20,"tag":21,"props":10614,"children":10615},{},[10616],{"type":25,"value":10617},"但这个项目只有 20 条数据。测试集只有 5 条时，结果非常容易受随机划分影响。某一次准确率高，不一定说明模型真的好；某一次准确率低，也不一定说明模型完全没学到东西。",{"type":20,"tag":21,"props":10619,"children":10620},{},[10621],{"type":25,"value":10622},"因此我改成了留一交叉验证。",{"type":20,"tag":21,"props":10624,"children":10625},{},[10626],{"type":25,"value":10627},"留一交叉验证的做法是：",{"type":20,"tag":5719,"props":10629,"children":10631},{"start":10630},0,[10632,10637,10642,10647],{"type":20,"tag":48,"props":10633,"children":10634},{},[10635],{"type":25,"value":10636},"每次拿 1 个氨基酸作为测试样本",{"type":20,"tag":48,"props":10638,"children":10639},{},[10640],{"type":25,"value":10641},"剩下 19 个氨基酸作为训练样本",{"type":20,"tag":48,"props":10643,"children":10644},{},[10645],{"type":25,"value":10646},"重复 20 次，让每个氨基酸都当一次测试样本",{"type":20,"tag":48,"props":10648,"children":10649},{},[10650],{"type":25,"value":10651},"汇总 20 次预测结果，计算总体准确率",{"type":20,"tag":21,"props":10653,"children":10654},{},[10655],{"type":25,"value":10656},"代码中的核心逻辑是：",{"type":20,"tag":126,"props":10658,"children":10660},{"code":10659},"for test_idx in range(len(X)):\n    train_idx = [i for i in range(len(X)) if i != test_idx]\n​\n    model = train_model(X[train_idx], y[train_idx])\n    model.eval()\n​\n    with torch.no_grad():\n        logit = model(X[test_idx].unsqueeze(0))\n        prob = torch.sigmoid(logit).item()\n        pred = int(prob > 0.5)\n",[10661],{"type":20,"tag":84,"props":10662,"children":10663},{"__ignoreMap":8},[10664],{"type":25,"value":10659},{"type":20,"tag":21,"props":10666,"children":10667},{},[10668],{"type":25,"value":10669},"对于小数据集来说，留一交叉验证比单次随机划分更适合用来观察模型表现。",{"type":20,"tag":1863,"props":10671,"children":10673},{"id":10672},"如何复现",[10674],{"type":25,"value":10672},{"type":20,"tag":21,"props":10676,"children":10677},{},[10678,10680,10685],{"type":25,"value":10679},"项目使用 ",{"type":20,"tag":84,"props":10681,"children":10683},{"className":10682},[],[10684],{"type":25,"value":1884},{"type":25,"value":10686}," 管理依赖。安装依赖后，直接运行主脚本：",{"type":20,"tag":126,"props":10688,"children":10690},{"code":10689},"uv sync\nuv run python main.py\n",[10691],{"type":20,"tag":84,"props":10692,"children":10693},{"__ignoreMap":8},[10694],{"type":25,"value":10689},{"type":20,"tag":21,"props":10696,"children":10697},{},[10698],{"type":25,"value":10699},"项目结构如下：",{"type":20,"tag":126,"props":10701,"children":10703},{"code":10702},"├── data\u002F\n│   └── amino_acids.csv\n├── src\u002F\n│   ├── features.py\n│   └── model.py\n├── main.py\n└── pyproject.toml\n",[10704],{"type":20,"tag":84,"props":10705,"children":10706},{"__ignoreMap":8},[10707],{"type":25,"value":10702},{"type":20,"tag":21,"props":10709,"children":10710},{},[10711],{"type":25,"value":10348},{"type":20,"tag":44,"props":10713,"children":10714},{},[10715,10726,10737,10748],{"type":20,"tag":48,"props":10716,"children":10717},{},[10718,10724],{"type":20,"tag":84,"props":10719,"children":10721},{"className":10720},[],[10722],{"type":25,"value":10723},"data\u002Famino_acids.csv",{"type":25,"value":10725}," 保存 20 种氨基酸的数据和标签",{"type":20,"tag":48,"props":10727,"children":10728},{},[10729,10735],{"type":20,"tag":84,"props":10730,"children":10732},{"className":10731},[],[10733],{"type":25,"value":10734},"src\u002Ffeatures.py",{"type":25,"value":10736}," 负责把 SMILES 转换成 Morgan 指纹",{"type":20,"tag":48,"props":10738,"children":10739},{},[10740,10746],{"type":20,"tag":84,"props":10741,"children":10743},{"className":10742},[],[10744],{"type":25,"value":10745},"src\u002Fmodel.py",{"type":25,"value":10747}," 定义 MLP 模型",{"type":20,"tag":48,"props":10749,"children":10750},{},[10751,10756],{"type":20,"tag":84,"props":10752,"children":10754},{"className":10753},[],[10755],{"type":25,"value":144},{"type":25,"value":10757}," 负责训练、留一交叉验证和结果输出",{"type":20,"tag":1863,"props":10759,"children":10761},{"id":10760},"实验结果",[10762],{"type":25,"value":10760},{"type":20,"tag":21,"props":10764,"children":10765},{},[10766],{"type":25,"value":10767},"当前运行结果是：",{"type":20,"tag":126,"props":10769,"children":10771},{"code":10770},"留一交叉验证准确率: 65.0% (13\u002F20)\n",[10772],{"type":20,"tag":84,"props":10773,"children":10774},{"__ignoreMap":8},[10775],{"type":25,"value":10770},{"type":20,"tag":21,"props":10777,"children":10778},{},[10779],{"type":25,"value":10780},"部分预测结果如下：",{"type":20,"tag":126,"props":10782,"children":10784},{"code":10783},"✓ 丙氨酸: 预测=疏水 (疏水概率 0.70), 真实=疏水\n✓ 缬氨酸: 预测=疏水 (疏水概率 0.61), 真实=疏水\n✗ 亮氨酸: 预测=亲水 (疏水概率 0.31), 真实=疏水\n✓ 丝氨酸: 预测=亲水 (疏水概率 0.29), 真实=亲水\n✗ 酪氨酸: 预测=疏水 (疏水概率 0.97), 真实=亲水\n✓ 精氨酸: 预测=亲水 (疏水概率 0.02), 真实=亲水\n",[10785],{"type":20,"tag":84,"props":10786,"children":10787},{"__ignoreMap":8},[10788],{"type":25,"value":10783},{"type":20,"tag":21,"props":10790,"children":10791},{},[10792],{"type":25,"value":10793},"这个结果说明模型确实学到了一部分规律，但还不稳定。",{"type":20,"tag":21,"props":10795,"children":10796},{},[10797],{"type":25,"value":10798},"比如它能识别一些明显的亲水氨基酸，也能识别一部分疏水氨基酸。但对于边界比较模糊，或者结构上有特殊基团的氨基酸，仍然容易出错。",{"type":20,"tag":21,"props":10800,"children":10801},{},[10802],{"type":25,"value":10803},"这也提醒我：不能只看训练集损失。如果训练损失很低，但留一交叉验证表现一般，那模型很可能只是记住了训练样本。",{"type":20,"tag":1863,"props":10805,"children":10807},{"id":10806},"我从这个项目学到了什么",[10808],{"type":25,"value":10806},{"type":20,"tag":28,"props":10810,"children":10812},{"id":10811},"_1-特征工程是机器学习的入口",[10813],{"type":25,"value":10814},"1. 特征工程是机器学习的入口",{"type":20,"tag":21,"props":10816,"children":10817},{},[10818],{"type":25,"value":10819},"模型并不是直接学习 SMILES 字符串，而是学习 Morgan 指纹。",{"type":20,"tag":21,"props":10821,"children":10822},{},[10823],{"type":25,"value":10824},"所以这个项目真正的输入不是：",{"type":20,"tag":126,"props":10826,"children":10827},{"code":10408},[10828],{"type":20,"tag":84,"props":10829,"children":10830},{"__ignoreMap":8},[10831],{"type":25,"value":10408},{"type":20,"tag":21,"props":10833,"children":10834},{},[10835],{"type":25,"value":10836},"而是：",{"type":20,"tag":126,"props":10838,"children":10840},{"code":10839},"2048 维 Morgan 指纹向量\n",[10841],{"type":20,"tag":84,"props":10842,"children":10843},{"__ignoreMap":8},[10844],{"type":25,"value":10839},{"type":20,"tag":21,"props":10846,"children":10847},{},[10848],{"type":25,"value":10849},"特征工程决定了模型能看到什么信息。",{"type":20,"tag":28,"props":10851,"children":10853},{"id":10852},"_2-小数据项目里评估比训练更重要",[10854],{"type":25,"value":10855},"2. 小数据项目里，评估比训练更重要",{"type":20,"tag":21,"props":10857,"children":10858},{},[10859],{"type":25,"value":10860},"只有 20 条数据时，模型很容易把训练集背下来。",{"type":20,"tag":21,"props":10862,"children":10863},{},[10864],{"type":25,"value":10865},"如果只看训练损失，很容易得到错误信心。留一交叉验证虽然不能让数据变多，但能让评估更完整。",{"type":20,"tag":28,"props":10867,"children":10869},{"id":10868},"_3-正则化是在限制模型死记硬背",[10870],{"type":25,"value":10871},"3. 正则化是在限制模型死记硬背",{"type":20,"tag":21,"props":10873,"children":10874},{},[10875],{"type":25,"value":10876},"这个项目里使用了两种正则化方式：",{"type":20,"tag":44,"props":10878,"children":10879},{},[10880,10888],{"type":20,"tag":48,"props":10881,"children":10882},{},[10883],{"type":20,"tag":84,"props":10884,"children":10886},{"className":10885},[],[10887],{"type":25,"value":10561},{"type":20,"tag":48,"props":10889,"children":10890},{},[10891],{"type":20,"tag":84,"props":10892,"children":10894},{"className":10893},[],[10895],{"type":25,"value":10568},{"type":20,"tag":21,"props":10897,"children":10898},{},[10899],{"type":25,"value":10900},"它们的目的不是让模型更复杂，而是让模型更克制。",{"type":20,"tag":28,"props":10902,"children":10904},{"id":10903},"_4-baseline-很重要",[10905],{"type":25,"value":10906},"4. Baseline 很重要",{"type":20,"tag":21,"props":10908,"children":10909},{},[10910],{"type":25,"value":10911},"这个项目目前已经有了 MLP，但下一步应该做 baseline。",{"type":20,"tag":21,"props":10913,"children":10914},{},[10915],{"type":25,"value":10916},"Baseline 就是一个简单参照模型，用来回答一个问题：",{"type":20,"tag":6665,"props":10918,"children":10919},{},[10920],{"type":20,"tag":21,"props":10921,"children":10922},{},[10923],{"type":25,"value":10924},"我的复杂模型真的比简单方法更好吗？",{"type":20,"tag":21,"props":10926,"children":10927},{},[10928],{"type":25,"value":10929},"可以尝试的 baseline 包括：",{"type":20,"tag":44,"props":10931,"children":10932},{},[10933,10938,10943],{"type":20,"tag":48,"props":10934,"children":10935},{},[10936],{"type":25,"value":10937},"多数类 baseline：永远预测数据中数量更多的类别",{"type":20,"tag":48,"props":10939,"children":10940},{},[10941],{"type":25,"value":10942},"Logistic Regression：使用同样的 Morgan 指纹，但只训练线性分类器",{"type":20,"tag":48,"props":10944,"children":10945},{},[10946],{"type":25,"value":10947},"RDKit 描述符模型：使用 LogP、分子量、TPSA、氢键供体\u002F受体数量等少量特征",{"type":20,"tag":21,"props":10949,"children":10950},{},[10951],{"type":25,"value":10952},"如果一个简单 baseline 就能达到和 MLP 接近的准确率，那说明 MLP 可能并没有带来明显收益。",{"type":20,"tag":1863,"props":10954,"children":10956},{"id":10955},"项目局限",[10957],{"type":25,"value":10955},{"type":20,"tag":21,"props":10959,"children":10960},{},[10961],{"type":25,"value":10962},"这个项目是一个学习项目，不适合直接当作严肃的化学预测模型。",{"type":20,"tag":21,"props":10964,"children":10965},{},[10966],{"type":25,"value":10967},"主要局限有：",{"type":20,"tag":44,"props":10969,"children":10970},{},[10971,10976,10981,10986,10991],{"type":20,"tag":48,"props":10972,"children":10973},{},[10974],{"type":25,"value":10975},"数据只有 20 条，远远不够训练稳定模型",{"type":20,"tag":48,"props":10977,"children":10978},{},[10979],{"type":25,"value":10980},"亲疏水性本身不是绝对二分类，不同教材或标度可能会有不同划分",{"type":20,"tag":48,"props":10982,"children":10983},{},[10984],{"type":25,"value":10985},"Morgan 指纹只是一种特征表示，可能没有捕捉到所有与亲疏水性相关的信息",{"type":20,"tag":48,"props":10987,"children":10988},{},[10989],{"type":25,"value":10990},"没有和 baseline 模型做系统比较",{"type":20,"tag":48,"props":10992,"children":10993},{},[10994],{"type":25,"value":10995},"没有调参实验，也没有更多评价指标",{"type":20,"tag":21,"props":10997,"children":10998},{},[10999],{"type":25,"value":11000},"这些局限并不代表项目没有价值。相反，它们正好说明了机器学习实验中最重要的一点：模型结果必须结合数据、特征、评估方式一起解释。",{"type":20,"tag":1863,"props":11002,"children":11004},{"id":11003},"后续可以继续做什么",[11005],{"type":25,"value":11003},{"type":20,"tag":21,"props":11007,"children":11008},{},[11009],{"type":25,"value":11010},"后续我想从三个方向继续优化：",{"type":20,"tag":5719,"props":11012,"children":11013},{"start":10630},[11014,11019,11024],{"type":20,"tag":48,"props":11015,"children":11016},{},[11017],{"type":25,"value":11018},"增加 baseline 用 Logistic Regression、Random Forest 或多数类预测作为对照。",{"type":20,"tag":48,"props":11020,"children":11021},{},[11022],{"type":25,"value":11023},"尝试 RDKit 分子描述符 不只使用 Morgan 指纹，还可以加入 LogP、TPSA、分子量、氢键供体和受体数量等更直观的化学特征。",{"type":20,"tag":48,"props":11025,"children":11026},{},[11027],{"type":25,"value":11028},"输出更多评价指标 除了 accuracy，还可以看 confusion matrix、precision、recall，观察模型到底更容易把哪一类预测错。",{"type":20,"tag":1863,"props":11030,"children":11031},{"id":10044},[11032],{"type":25,"value":10044},{"type":20,"tag":21,"props":11034,"children":11035},{},[11036],{"type":25,"value":11037},"这个项目很小，但它让我完整走了一遍机器学习实验流程：",{"type":20,"tag":126,"props":11039,"children":11041},{"code":11040},"数据 -> 特征工程 -> 模型 -> 训练 -> 正则化 -> 交叉验证 -> 结果解释\n",[11042],{"type":20,"tag":84,"props":11043,"children":11044},{"__ignoreMap":8},[11045],{"type":25,"value":11040},{"type":20,"tag":21,"props":11047,"children":11048},{},[11049],{"type":25,"value":11050},"对我来说，这个项目最重要的收获不是准确率有多高，而是开始理解：",{"type":20,"tag":44,"props":11052,"children":11053},{},[11054,11059,11064,11069,11074],{"type":20,"tag":48,"props":11055,"children":11056},{},[11057],{"type":25,"value":11058},"模型只能学习它看到的特征",{"type":20,"tag":48,"props":11060,"children":11061},{},[11062],{"type":25,"value":11063},"训练集表现好不代表泛化能力强",{"type":20,"tag":48,"props":11065,"children":11066},{},[11067],{"type":25,"value":11068},"小数据集更需要谨慎评估",{"type":20,"tag":48,"props":11070,"children":11071},{},[11072],{"type":25,"value":11073},"baseline 是判断模型价值的参照物",{"type":20,"tag":48,"props":11075,"children":11076},{},[11077],{"type":25,"value":11078},"机器学习结果需要被解释，而不是只被展示",{"type":20,"tag":21,"props":11080,"children":11081},{},[11082],{"type":25,"value":11083},"这也是我觉得这个项目适合作为机器学习入门练习的原因：它不大，但关键概念都在里面。",{"type":20,"tag":11085,"props":11086,"children":11088},"h4",{"id":11087},"项目地址httpsgiteecomo_insistmpl-hydrophobicity",[11089,11091],{"type":25,"value":11090},"项目地址：",{"type":20,"tag":101,"props":11092,"children":11095},{"href":11093,"rel":11094},"https:\u002F\u002Fgitee.com\u002Fo_insist\u002Fmpl-hydrophobicity",[105],[11096],{"type":25,"value":11093},{"title":8,"searchDepth":169,"depth":169,"links":11098},[11099,11100,11101,11102,11103,11104,11105,11111,11112,11113],{"id":10323,"depth":169,"text":10323},{"id":10397,"depth":169,"text":10400},{"id":10493,"depth":169,"text":10493},{"id":10605,"depth":169,"text":10605},{"id":10672,"depth":169,"text":10672},{"id":10760,"depth":169,"text":10760},{"id":10806,"depth":169,"text":10806,"children":11106},[11107,11108,11109,11110],{"id":10811,"depth":179,"text":10814},{"id":10852,"depth":179,"text":10855},{"id":10868,"depth":179,"text":10871},{"id":10903,"depth":179,"text":10906},{"id":10955,"depth":169,"text":10955},{"id":11003,"depth":169,"text":11003},{"id":10044,"depth":169,"text":10044},"content:articles:ai:mpl-hydrophobicity.md","articles\u002Fai\u002Fmpl-hydrophobicity.md","articles\u002Fai\u002Fmpl-hydrophobicity",{"_path":11118,"_dir":6776,"_draft":7,"_partial":7,"_locale":8,"title":11119,"description":11120,"date":11121,"tags":11122,"body":11123,"_type":1800,"_id":12316,"_source":1802,"_file":12317,"_stem":12318,"_extension":1805},"\u002Farticles\u002Fdevops\u002Fssh","Mac在外网SSH绕过内网NAT的完整指北","无需公网 IP，通过 Tailscale 组建虚拟局域网，实现 Mac 远程 SSH 登录家里 Windows 主机的完整配置指南。","2026-05-07",[14,6781],{"type":17,"children":11124,"toc":12287},[11125,11130,11143,11155,11164,11169,11192,11197,11208,11213,11236,11241,11272,11275,11281,11286,11292,11306,11312,11317,11333,11339,11385,11390,11395,11409,11414,11477,11483,11497,11510,11513,11519,11524,11529,11554,11559,11594,11607,11613,11618,11632,11637,11651,11656,11676,11679,11685,11690,11709,11714,11728,11733,11738,11757,11770,11773,11785,11796,11837,11842,11861,11874,11877,11883,11888,11894,11918,11923,11948,11954,11967,11985,11997,12011,12016,12036,12039,12044,12183,12186,12191,12196,12219,12222,12226,12238,12243,12248,12278,12283],{"type":20,"tag":1863,"props":11126,"children":11128},{"id":11127},"导致问题的原因",[11129],{"type":25,"value":11127},{"type":20,"tag":21,"props":11131,"children":11132},{},[11133,11135,11141],{"type":25,"value":11134},"我的需求是Mac在外网SSH连接家里Windows主机做训练和微调大模型，但现在路由器都自带 ",{"type":20,"tag":84,"props":11136,"children":11138},{"className":11137},[],[11139],{"type":25,"value":11140},"NAT",{"type":25,"value":11142}," 功能，家里的电脑没有一个可以被外网直接访问的公网地址；学校或实验室网络也常常有额外限制，所以直接通过公网 IP 连接往往行不通。",{"type":20,"tag":21,"props":11144,"children":11145},{},[11146,11148,11153],{"type":25,"value":11147},"这篇文章记录一套我自己会长期使用的方案：",{"type":20,"tag":33,"props":11149,"children":11150},{},[11151],{"type":25,"value":11152},"用 Tailscale 把 Mac 和 Windows 组到同一个虚拟局域网里，再通过 SSH 远程登录 Windows 主机。",{"type":25,"value":11154}," 这样不用折腾公网 IP、端口映射和 DDNS，配置成本低，稳定性也更适合个人使用。",{"type":20,"tag":21,"props":11156,"children":11157},{},[11158],{"type":20,"tag":11159,"props":11160,"children":11163},"img",{"alt":11161,"src":11162},"Mac 通过 Tailscale SSH 连接 Windows 的网络结构示意","\u002Fimg\u002Fssh-tail.png",[],{"type":20,"tag":1863,"props":11165,"children":11167},{"id":11166},"这篇文章适合谁",[11168],{"type":25,"value":11166},{"type":20,"tag":44,"props":11170,"children":11171},{},[11172,11177,11182,11187],{"type":20,"tag":48,"props":11173,"children":11174},{},[11175],{"type":25,"value":11176},"家里有一台 Windows 台式机或工作站",{"type":20,"tag":48,"props":11178,"children":11179},{},[11180],{"type":25,"value":11181},"手头主要使用 MacBook",{"type":20,"tag":48,"props":11183,"children":11184},{},[11185],{"type":25,"value":11186},"需要在外面远程连接家里的机器",{"type":20,"tag":48,"props":11188,"children":11189},{},[11190],{"type":25,"value":11191},"不想折腾公网 IP、路由器端口转发和 DDNS",{"type":20,"tag":1863,"props":11193,"children":11195},{"id":11194},"方案原理",[11196],{"type":25,"value":11194},{"type":20,"tag":21,"props":11198,"children":11199},{},[11200,11206],{"type":20,"tag":84,"props":11201,"children":11203},{"className":11202},[],[11204],{"type":25,"value":11205},"Tailscale",{"type":25,"value":11207}," 可以把多台设备拉进同一个加密的虚拟网络中。只要 Mac 和 Windows 登录到同一个账号，它们就像处在同一个局域网里，可以直接通过 Tailscale 分配的地址互相访问。",{"type":20,"tag":21,"props":11209,"children":11210},{},[11211],{"type":25,"value":11212},"这套方案的核心优点是：",{"type":20,"tag":44,"props":11214,"children":11215},{},[11216,11221,11226,11231],{"type":20,"tag":48,"props":11217,"children":11218},{},[11219],{"type":25,"value":11220},"不需要公网 IP",{"type":20,"tag":48,"props":11222,"children":11223},{},[11224],{"type":25,"value":11225},"不需要在路由器上开放 22 端口",{"type":20,"tag":48,"props":11227,"children":11228},{},[11229],{"type":25,"value":11230},"自带加密传输，安全性比裸露公网端口更高",{"type":20,"tag":48,"props":11232,"children":11233},{},[11234],{"type":25,"value":11235},"对复杂网络环境更友好，适合家里和实验室这种跨网络场景",{"type":20,"tag":1863,"props":11237,"children":11239},{"id":11238},"整体流程",[11240],{"type":25,"value":11238},{"type":20,"tag":5719,"props":11242,"children":11243},{},[11244,11255,11267],{"type":20,"tag":48,"props":11245,"children":11246},{},[11247,11249],{"type":25,"value":11248},"在 Windows 上安装并启用 ",{"type":20,"tag":84,"props":11250,"children":11252},{"className":11251},[],[11253],{"type":25,"value":11254},"OpenSSH Server",{"type":20,"tag":48,"props":11256,"children":11257},{},[11258,11260,11265],{"type":25,"value":11259},"在 Mac 和 Windows 上安装 ",{"type":20,"tag":84,"props":11261,"children":11263},{"className":11262},[],[11264],{"type":25,"value":11205},{"type":25,"value":11266},"，并登录同一个账号",{"type":20,"tag":48,"props":11268,"children":11269},{},[11270],{"type":25,"value":11271},"在 Mac 上通过 Tailscale 地址发起 SSH 连接",{"type":20,"tag":5056,"props":11273,"children":11274},{},[],{"type":20,"tag":1863,"props":11276,"children":11278},{"id":11277},"第一步在-windows-上启用-ssh-服务",[11279],{"type":25,"value":11280},"第一步：在 Windows 上启用 SSH 服务",{"type":20,"tag":21,"props":11282,"children":11283},{},[11284],{"type":25,"value":11285},"Windows 11 已经内置了 OpenSSH 组件，但很多机器默认只装了客户端，没有启用服务端。",{"type":20,"tag":28,"props":11287,"children":11289},{"id":11288},"方法一图形界面安装",[11290],{"type":25,"value":11291},"方法一：图形界面安装",{"type":20,"tag":126,"props":11293,"children":11295},{"className":324,"code":11294,"language":25,"meta":8,"style":8},"设置 -> 系统 -> 可选功能 -> 添加功能 -> 搜索 \"OpenSSH Server\" -> 安装\n",[11296],{"type":20,"tag":84,"props":11297,"children":11298},{"__ignoreMap":8},[11299],{"type":20,"tag":157,"props":11300,"children":11301},{"class":159,"line":160},[11302],{"type":20,"tag":157,"props":11303,"children":11304},{},[11305],{"type":25,"value":11294},{"type":20,"tag":28,"props":11307,"children":11309},{"id":11308},"方法二powershell-安装",[11310],{"type":25,"value":11311},"方法二：PowerShell 安装",{"type":20,"tag":21,"props":11313,"children":11314},{},[11315],{"type":25,"value":11316},"以管理员身份打开 PowerShell，执行：",{"type":20,"tag":126,"props":11318,"children":11322},{"className":11319,"code":11320,"language":11321,"meta":8,"style":8},"language-powershell shiki shiki-themes github-dark","Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0\n","powershell",[11323],{"type":20,"tag":84,"props":11324,"children":11325},{"__ignoreMap":8},[11326],{"type":20,"tag":157,"props":11327,"children":11328},{"class":159,"line":160},[11329],{"type":20,"tag":157,"props":11330,"children":11331},{},[11332],{"type":25,"value":11320},{"type":20,"tag":28,"props":11334,"children":11336},{"id":11335},"启动-sshd-并设置为开机自启",[11337],{"type":25,"value":11338},"启动 sshd 并设置为开机自启",{"type":20,"tag":126,"props":11340,"children":11342},{"className":11319,"code":11341,"language":11321,"meta":8,"style":8},"# 启动 SSH 服务\nStart-Service sshd\n\n# 设置为开机自动启动\nSet-Service -Name sshd -StartupType Automatic\n",[11343],{"type":20,"tag":84,"props":11344,"children":11345},{"__ignoreMap":8},[11346,11354,11362,11369,11377],{"type":20,"tag":157,"props":11347,"children":11348},{"class":159,"line":160},[11349],{"type":20,"tag":157,"props":11350,"children":11351},{},[11352],{"type":25,"value":11353},"# 启动 SSH 服务\n",{"type":20,"tag":157,"props":11355,"children":11356},{"class":159,"line":169},[11357],{"type":20,"tag":157,"props":11358,"children":11359},{},[11360],{"type":25,"value":11361},"Start-Service sshd\n",{"type":20,"tag":157,"props":11363,"children":11364},{"class":159,"line":179},[11365],{"type":20,"tag":157,"props":11366,"children":11367},{"emptyLinePlaceholder":173},[11368],{"type":25,"value":176},{"type":20,"tag":157,"props":11370,"children":11371},{"class":159,"line":188},[11372],{"type":20,"tag":157,"props":11373,"children":11374},{},[11375],{"type":25,"value":11376},"# 设置为开机自动启动\n",{"type":20,"tag":157,"props":11378,"children":11379},{"class":159,"line":196},[11380],{"type":20,"tag":157,"props":11381,"children":11382},{},[11383],{"type":25,"value":11384},"Set-Service -Name sshd -StartupType Automatic\n",{"type":20,"tag":28,"props":11386,"children":11388},{"id":11387},"检查防火墙规则",[11389],{"type":25,"value":11387},{"type":20,"tag":21,"props":11391,"children":11392},{},[11393],{"type":25,"value":11394},"通常安装 OpenSSH Server 后，Windows 会自动创建防火墙规则。可以先检查：",{"type":20,"tag":126,"props":11396,"children":11398},{"className":11319,"code":11397,"language":11321,"meta":8,"style":8},"Get-NetFirewallRule -Name \"OpenSSH-Server-In-TCP\"\n",[11399],{"type":20,"tag":84,"props":11400,"children":11401},{"__ignoreMap":8},[11402],{"type":20,"tag":157,"props":11403,"children":11404},{"class":159,"line":160},[11405],{"type":20,"tag":157,"props":11406,"children":11407},{},[11408],{"type":25,"value":11397},{"type":20,"tag":21,"props":11410,"children":11411},{},[11412],{"type":25,"value":11413},"如果没有这条规则，再手动创建：",{"type":20,"tag":126,"props":11415,"children":11417},{"className":11319,"code":11416,"language":11321,"meta":8,"style":8},"New-NetFirewallRule -Name \"OpenSSH-Server-In-TCP\" `\n  -DisplayName \"OpenSSH Server (sshd)\" `\n  -Enabled True `\n  -Direction Inbound `\n  -Protocol TCP `\n  -Action Allow `\n  -LocalPort 22\n",[11418],{"type":20,"tag":84,"props":11419,"children":11420},{"__ignoreMap":8},[11421,11429,11437,11445,11453,11461,11469],{"type":20,"tag":157,"props":11422,"children":11423},{"class":159,"line":160},[11424],{"type":20,"tag":157,"props":11425,"children":11426},{},[11427],{"type":25,"value":11428},"New-NetFirewallRule -Name \"OpenSSH-Server-In-TCP\" `\n",{"type":20,"tag":157,"props":11430,"children":11431},{"class":159,"line":169},[11432],{"type":20,"tag":157,"props":11433,"children":11434},{},[11435],{"type":25,"value":11436},"  -DisplayName \"OpenSSH Server (sshd)\" `\n",{"type":20,"tag":157,"props":11438,"children":11439},{"class":159,"line":179},[11440],{"type":20,"tag":157,"props":11441,"children":11442},{},[11443],{"type":25,"value":11444},"  -Enabled True `\n",{"type":20,"tag":157,"props":11446,"children":11447},{"class":159,"line":188},[11448],{"type":20,"tag":157,"props":11449,"children":11450},{},[11451],{"type":25,"value":11452},"  -Direction Inbound `\n",{"type":20,"tag":157,"props":11454,"children":11455},{"class":159,"line":196},[11456],{"type":20,"tag":157,"props":11457,"children":11458},{},[11459],{"type":25,"value":11460},"  -Protocol TCP `\n",{"type":20,"tag":157,"props":11462,"children":11463},{"class":159,"line":204},[11464],{"type":20,"tag":157,"props":11465,"children":11466},{},[11467],{"type":25,"value":11468},"  -Action Allow `\n",{"type":20,"tag":157,"props":11470,"children":11471},{"class":159,"line":213},[11472],{"type":20,"tag":157,"props":11473,"children":11474},{},[11475],{"type":25,"value":11476},"  -LocalPort 22\n",{"type":20,"tag":28,"props":11478,"children":11480},{"id":11479},"验证-ssh-服务是否正常",[11481],{"type":25,"value":11482},"验证 SSH 服务是否正常",{"type":20,"tag":126,"props":11484,"children":11486},{"className":11319,"code":11485,"language":11321,"meta":8,"style":8},"Get-Service sshd\n",[11487],{"type":20,"tag":84,"props":11488,"children":11489},{"__ignoreMap":8},[11490],{"type":20,"tag":157,"props":11491,"children":11492},{"class":159,"line":160},[11493],{"type":20,"tag":157,"props":11494,"children":11495},{},[11496],{"type":25,"value":11485},{"type":20,"tag":21,"props":11498,"children":11499},{},[11500,11502,11508],{"type":25,"value":11501},"如果状态显示为 ",{"type":20,"tag":84,"props":11503,"children":11505},{"className":11504},[],[11506],{"type":25,"value":11507},"Running",{"type":25,"value":11509},"，说明 SSH 服务已经起来了。",{"type":20,"tag":5056,"props":11511,"children":11512},{},[],{"type":20,"tag":1863,"props":11514,"children":11516},{"id":11515},"第二步在两台设备上安装并登录-tailscale",[11517],{"type":25,"value":11518},"第二步：在两台设备上安装并登录 Tailscale",{"type":20,"tag":21,"props":11520,"children":11521},{},[11522],{"type":25,"value":11523},"Mac 和 Windows 两端都需要安装 Tailscale，并登录同一个账号。",{"type":20,"tag":28,"props":11525,"children":11527},{"id":11526},"安装方式",[11528],{"type":25,"value":11526},{"type":20,"tag":5719,"props":11530,"children":11531},{},[11532,11544,11549],{"type":20,"tag":48,"props":11533,"children":11534},{},[11535,11537],{"type":25,"value":11536},"打开 ",{"type":20,"tag":101,"props":11538,"children":11541},{"href":11539,"rel":11540},"https:\u002F\u002Ftailscale.com\u002Fdownloads",[105],[11542],{"type":25,"value":11543},"Tailscale 下载页",{"type":20,"tag":48,"props":11545,"children":11546},{},[11547],{"type":25,"value":11548},"根据平台下载安装包",{"type":20,"tag":48,"props":11550,"children":11551},{},[11552],{"type":25,"value":11553},"安装完成后登录同一个账号",{"type":20,"tag":21,"props":11555,"children":11556},{},[11557],{"type":25,"value":11558},"常见平台选择：",{"type":20,"tag":44,"props":11560,"children":11561},{},[11562,11581],{"type":20,"tag":48,"props":11563,"children":11564},{},[11565,11567,11573,11575],{"type":25,"value":11566},"Mac：",{"type":20,"tag":84,"props":11568,"children":11570},{"className":11569},[],[11571],{"type":25,"value":11572},"App Store",{"type":25,"value":11574}," 或官方 ",{"type":20,"tag":84,"props":11576,"children":11578},{"className":11577},[],[11579],{"type":25,"value":11580},"dmg",{"type":20,"tag":48,"props":11582,"children":11583},{},[11584,11586,11592],{"type":25,"value":11585},"Windows：官方 ",{"type":20,"tag":84,"props":11587,"children":11589},{"className":11588},[],[11590],{"type":25,"value":11591},"exe",{"type":25,"value":11593}," 安装包",{"type":20,"tag":21,"props":11595,"children":11596},{},[11597,11599,11605],{"type":25,"value":11598},"登录完成后，两台设备就会出现在同一个 ",{"type":20,"tag":84,"props":11600,"children":11602},{"className":11601},[],[11603],{"type":25,"value":11604},"Tailnet",{"type":25,"value":11606}," 里。",{"type":20,"tag":28,"props":11608,"children":11610},{"id":11609},"查看-windows-的-tailscale-地址",[11611],{"type":25,"value":11612},"查看 Windows 的 Tailscale 地址",{"type":20,"tag":21,"props":11614,"children":11615},{},[11616],{"type":25,"value":11617},"在 Windows PowerShell 中执行：",{"type":20,"tag":126,"props":11619,"children":11621},{"className":11319,"code":11620,"language":11321,"meta":8,"style":8},"tailscale ip -4\n",[11622],{"type":20,"tag":84,"props":11623,"children":11624},{"__ignoreMap":8},[11625],{"type":20,"tag":157,"props":11626,"children":11627},{"class":159,"line":160},[11628],{"type":20,"tag":157,"props":11629,"children":11630},{},[11631],{"type":25,"value":11620},{"type":20,"tag":21,"props":11633,"children":11634},{},[11635],{"type":25,"value":11636},"你会看到一个类似下面的地址：",{"type":20,"tag":126,"props":11638,"children":11640},{"className":324,"code":11639,"language":25,"meta":8,"style":8},"100.xx.xx.xx\n",[11641],{"type":20,"tag":84,"props":11642,"children":11643},{"__ignoreMap":8},[11644],{"type":20,"tag":157,"props":11645,"children":11646},{"class":159,"line":160},[11647],{"type":20,"tag":157,"props":11648,"children":11649},{},[11650],{"type":25,"value":11639},{"type":20,"tag":21,"props":11652,"children":11653},{},[11654],{"type":25,"value":11655},"也可以在 Mac 上查看当前 Tailnet 里的设备状态：",{"type":20,"tag":126,"props":11657,"children":11659},{"className":238,"code":11658,"language":237,"meta":8,"style":8},"tailscale status\n",[11660],{"type":20,"tag":84,"props":11661,"children":11662},{"__ignoreMap":8},[11663],{"type":20,"tag":157,"props":11664,"children":11665},{"class":159,"line":160},[11666,11671],{"type":20,"tag":157,"props":11667,"children":11668},{"style":248},[11669],{"type":25,"value":11670},"tailscale",{"type":20,"tag":157,"props":11672,"children":11673},{"style":254},[11674],{"type":25,"value":11675}," status\n",{"type":20,"tag":5056,"props":11677,"children":11678},{},[],{"type":20,"tag":1863,"props":11680,"children":11682},{"id":11681},"第三步从-mac-发起-ssh-连接",[11683],{"type":25,"value":11684},"第三步：从 Mac 发起 SSH 连接",{"type":20,"tag":21,"props":11686,"children":11687},{},[11688],{"type":25,"value":11689},"拿到 Windows 主机的 Tailscale 地址之后，就可以直接在 Mac 终端连接：",{"type":20,"tag":126,"props":11691,"children":11693},{"className":238,"code":11692,"language":237,"meta":8,"style":8},"ssh 你的Windows用户名@100.xx.xx.xx\n",[11694],{"type":20,"tag":84,"props":11695,"children":11696},{"__ignoreMap":8},[11697],{"type":20,"tag":157,"props":11698,"children":11699},{"class":159,"line":160},[11700,11704],{"type":20,"tag":157,"props":11701,"children":11702},{"style":248},[11703],{"type":25,"value":9759},{"type":20,"tag":157,"props":11705,"children":11706},{"style":254},[11707],{"type":25,"value":11708}," 你的Windows用户名@100.xx.xx.xx\n",{"type":20,"tag":21,"props":11710,"children":11711},{},[11712],{"type":25,"value":11713},"如果你不确定 Windows 的用户名，可以先在 Windows 终端执行：",{"type":20,"tag":126,"props":11715,"children":11717},{"className":11319,"code":11716,"language":11321,"meta":8,"style":8},"whoami\n",[11718],{"type":20,"tag":84,"props":11719,"children":11720},{"__ignoreMap":8},[11721],{"type":20,"tag":157,"props":11722,"children":11723},{"class":159,"line":160},[11724],{"type":20,"tag":157,"props":11725,"children":11726},{},[11727],{"type":25,"value":11716},{"type":20,"tag":21,"props":11729,"children":11730},{},[11731],{"type":25,"value":11732},"然后使用返回结果中的用户名部分进行连接。",{"type":20,"tag":28,"props":11734,"children":11736},{"id":11735},"一个连接示例",[11737],{"type":25,"value":11735},{"type":20,"tag":126,"props":11739,"children":11741},{"className":238,"code":11740,"language":237,"meta":8,"style":8},"ssh wangkun@100.xx.xx.xx\n",[11742],{"type":20,"tag":84,"props":11743,"children":11744},{"__ignoreMap":8},[11745],{"type":20,"tag":157,"props":11746,"children":11747},{"class":159,"line":160},[11748,11752],{"type":20,"tag":157,"props":11749,"children":11750},{"style":248},[11751],{"type":25,"value":9759},{"type":20,"tag":157,"props":11753,"children":11754},{"style":254},[11755],{"type":25,"value":11756}," wangkun@100.xx.xx.xx\n",{"type":20,"tag":21,"props":11758,"children":11759},{},[11760,11762,11768],{"type":25,"value":11761},"第一次连接时，终端会提示你确认主机指纹，输入 ",{"type":20,"tag":84,"props":11763,"children":11765},{"className":11764},[],[11766],{"type":25,"value":11767},"yes",{"type":25,"value":11769}," 即可。",{"type":20,"tag":5056,"props":11771,"children":11772},{},[],{"type":20,"tag":1863,"props":11774,"children":11776},{"id":11775},"可选优化配置-sshconfig",[11777,11779],{"type":25,"value":11778},"可选优化：配置 ",{"type":20,"tag":84,"props":11780,"children":11782},{"className":11781},[],[11783],{"type":25,"value":11784},"~\u002F.ssh\u002Fconfig",{"type":20,"tag":21,"props":11786,"children":11787},{},[11788,11790,11795],{"type":25,"value":11789},"如果你不想每次都手动输入完整 IP，可以在 Mac 上编辑 ",{"type":20,"tag":84,"props":11791,"children":11793},{"className":11792},[],[11794],{"type":25,"value":11784},{"type":25,"value":146},{"type":20,"tag":126,"props":11797,"children":11801},{"className":11798,"code":11799,"language":11800,"meta":8,"style":8},"language-sshconfig shiki shiki-themes github-dark","Host home-gpu\n    HostName 100.xx.xx.xx\n    User 你的Windows用户名\n    Port 22\n","sshconfig",[11802],{"type":20,"tag":84,"props":11803,"children":11804},{"__ignoreMap":8},[11805,11813,11821,11829],{"type":20,"tag":157,"props":11806,"children":11807},{"class":159,"line":160},[11808],{"type":20,"tag":157,"props":11809,"children":11810},{},[11811],{"type":25,"value":11812},"Host home-gpu\n",{"type":20,"tag":157,"props":11814,"children":11815},{"class":159,"line":169},[11816],{"type":20,"tag":157,"props":11817,"children":11818},{},[11819],{"type":25,"value":11820},"    HostName 100.xx.xx.xx\n",{"type":20,"tag":157,"props":11822,"children":11823},{"class":159,"line":179},[11824],{"type":20,"tag":157,"props":11825,"children":11826},{},[11827],{"type":25,"value":11828},"    User 你的Windows用户名\n",{"type":20,"tag":157,"props":11830,"children":11831},{"class":159,"line":188},[11832],{"type":20,"tag":157,"props":11833,"children":11834},{},[11835],{"type":25,"value":11836},"    Port 22\n",{"type":20,"tag":21,"props":11838,"children":11839},{},[11840],{"type":25,"value":11841},"保存后，以后只需要输入：",{"type":20,"tag":126,"props":11843,"children":11845},{"className":238,"code":11844,"language":237,"meta":8,"style":8},"ssh home-gpu\n",[11846],{"type":20,"tag":84,"props":11847,"children":11848},{"__ignoreMap":8},[11849],{"type":20,"tag":157,"props":11850,"children":11851},{"class":159,"line":160},[11852,11856],{"type":20,"tag":157,"props":11853,"children":11854},{"style":248},[11855],{"type":25,"value":9759},{"type":20,"tag":157,"props":11857,"children":11858},{"style":254},[11859],{"type":25,"value":11860}," home-gpu\n",{"type":20,"tag":21,"props":11862,"children":11863},{},[11864,11866,11872],{"type":25,"value":11865},"如果你的 Tailscale 网络里设备名比较稳定，也可以把 ",{"type":20,"tag":84,"props":11867,"children":11869},{"className":11868},[],[11870],{"type":25,"value":11871},"HostName",{"type":25,"value":11873}," 换成设备名。",{"type":20,"tag":5056,"props":11875,"children":11876},{},[],{"type":20,"tag":1863,"props":11878,"children":11880},{"id":11879},"可选优化配置-ssh-密钥免密登录",[11881],{"type":25,"value":11882},"可选优化：配置 SSH 密钥免密登录",{"type":20,"tag":21,"props":11884,"children":11885},{},[11886],{"type":25,"value":11887},"如果你经常要连接这台机器，推荐配置 SSH 密钥登录，省去重复输入密码，也更安全。",{"type":20,"tag":28,"props":11889,"children":11891},{"id":11890},"在-mac-上生成密钥",[11892],{"type":25,"value":11893},"在 Mac 上生成密钥",{"type":20,"tag":126,"props":11895,"children":11897},{"className":238,"code":11896,"language":237,"meta":8,"style":8},"ssh-keygen -t ed25519\n",[11898],{"type":20,"tag":84,"props":11899,"children":11900},{"__ignoreMap":8},[11901],{"type":20,"tag":157,"props":11902,"children":11903},{"class":159,"line":160},[11904,11909,11913],{"type":20,"tag":157,"props":11905,"children":11906},{"style":248},[11907],{"type":25,"value":11908},"ssh-keygen",{"type":20,"tag":157,"props":11910,"children":11911},{"style":260},[11912],{"type":25,"value":7636},{"type":20,"tag":157,"props":11914,"children":11915},{"style":254},[11916],{"type":25,"value":11917}," ed25519\n",{"type":20,"tag":21,"props":11919,"children":11920},{},[11921],{"type":25,"value":11922},"一路回车即可，默认会生成：",{"type":20,"tag":44,"props":11924,"children":11925},{},[11926,11937],{"type":20,"tag":48,"props":11927,"children":11928},{},[11929,11931],{"type":25,"value":11930},"私钥：",{"type":20,"tag":84,"props":11932,"children":11934},{"className":11933},[],[11935],{"type":25,"value":11936},"~\u002F.ssh\u002Fid_ed25519",{"type":20,"tag":48,"props":11938,"children":11939},{},[11940,11942],{"type":25,"value":11941},"公钥：",{"type":20,"tag":84,"props":11943,"children":11945},{"className":11944},[],[11946],{"type":25,"value":11947},"~\u002F.ssh\u002Fid_ed25519.pub",{"type":20,"tag":28,"props":11949,"children":11951},{"id":11950},"将公钥写入-windows",[11952],{"type":25,"value":11953},"将公钥写入 Windows",{"type":20,"tag":21,"props":11955,"children":11956},{},[11957,11959,11965],{"type":25,"value":11958},"如果你的系统装了 ",{"type":20,"tag":84,"props":11960,"children":11962},{"className":11961},[],[11963],{"type":25,"value":11964},"ssh-copy-id",{"type":25,"value":11966},"，可以直接执行：",{"type":20,"tag":126,"props":11968,"children":11970},{"className":238,"code":11969,"language":237,"meta":8,"style":8},"ssh-copy-id 你的Windows用户名@100.xx.xx.xx\n",[11971],{"type":20,"tag":84,"props":11972,"children":11973},{"__ignoreMap":8},[11974],{"type":20,"tag":157,"props":11975,"children":11976},{"class":159,"line":160},[11977,11981],{"type":20,"tag":157,"props":11978,"children":11979},{"style":248},[11980],{"type":25,"value":11964},{"type":20,"tag":157,"props":11982,"children":11983},{"style":254},[11984],{"type":25,"value":11708},{"type":20,"tag":21,"props":11986,"children":11987},{},[11988,11990,11995],{"type":25,"value":11989},"如果没有 ",{"type":20,"tag":84,"props":11991,"children":11993},{"className":11992},[],[11994],{"type":25,"value":11964},{"type":25,"value":11996},"，就把公钥内容手动追加到 Windows 的这个文件中：",{"type":20,"tag":126,"props":11998,"children":12000},{"className":324,"code":11999,"language":25,"meta":8,"style":8},"C:\\Users\\你的用户名\\.ssh\\authorized_keys\n",[12001],{"type":20,"tag":84,"props":12002,"children":12003},{"__ignoreMap":8},[12004],{"type":20,"tag":157,"props":12005,"children":12006},{"class":159,"line":160},[12007],{"type":20,"tag":157,"props":12008,"children":12009},{},[12010],{"type":25,"value":11999},{"type":20,"tag":21,"props":12012,"children":12013},{},[12014],{"type":25,"value":12015},"公钥内容可以用下面这条命令查看：",{"type":20,"tag":126,"props":12017,"children":12019},{"className":238,"code":12018,"language":237,"meta":8,"style":8},"cat ~\u002F.ssh\u002Fid_ed25519.pub\n",[12020],{"type":20,"tag":84,"props":12021,"children":12022},{"__ignoreMap":8},[12023],{"type":20,"tag":157,"props":12024,"children":12025},{"class":159,"line":160},[12026,12031],{"type":20,"tag":157,"props":12027,"children":12028},{"style":248},[12029],{"type":25,"value":12030},"cat",{"type":20,"tag":157,"props":12032,"children":12033},{"style":254},[12034],{"type":25,"value":12035}," ~\u002F.ssh\u002Fid_ed25519.pub\n",{"type":20,"tag":5056,"props":12037,"children":12038},{},[],{"type":20,"tag":1863,"props":12040,"children":12042},{"id":12041},"常见问题排查",[12043],{"type":25,"value":12041},{"type":20,"tag":1902,"props":12045,"children":12046},{},[12047,12068],{"type":20,"tag":1906,"props":12048,"children":12049},{},[12050],{"type":20,"tag":1910,"props":12051,"children":12052},{},[12053,12058,12063],{"type":20,"tag":1914,"props":12054,"children":12055},{},[12056],{"type":25,"value":12057},"现象",{"type":20,"tag":1914,"props":12059,"children":12060},{},[12061],{"type":25,"value":12062},"常见原因",{"type":20,"tag":1914,"props":12064,"children":12065},{},[12066],{"type":25,"value":12067},"处理方式",{"type":20,"tag":1930,"props":12069,"children":12070},{},[12071,12107,12129,12165],{"type":20,"tag":1910,"props":12072,"children":12073},{},[12074,12083,12094],{"type":20,"tag":1937,"props":12075,"children":12076},{},[12077],{"type":20,"tag":84,"props":12078,"children":12080},{"className":12079},[],[12081],{"type":25,"value":12082},"Connection refused",{"type":20,"tag":1937,"props":12084,"children":12085},{},[12086,12092],{"type":20,"tag":84,"props":12087,"children":12089},{"className":12088},[],[12090],{"type":25,"value":12091},"sshd",{"type":25,"value":12093}," 没启动，或者防火墙规则不存在",{"type":20,"tag":1937,"props":12095,"children":12096},{},[12097,12099,12105],{"type":25,"value":12098},"检查 ",{"type":20,"tag":84,"props":12100,"children":12102},{"className":12101},[],[12103],{"type":25,"value":12104},"Get-Service sshd",{"type":25,"value":12106}," 和防火墙规则",{"type":20,"tag":1910,"props":12108,"children":12109},{},[12110,12119,12124],{"type":20,"tag":1937,"props":12111,"children":12112},{},[12113],{"type":20,"tag":84,"props":12114,"children":12116},{"className":12115},[],[12117],{"type":25,"value":12118},"Connection timed out",{"type":20,"tag":1937,"props":12120,"children":12121},{},[12122],{"type":25,"value":12123},"Tailscale 没连上，或 Windows 处于休眠状态",{"type":20,"tag":1937,"props":12125,"children":12126},{},[12127],{"type":25,"value":12128},"确认两台设备在线，并检查电源设置",{"type":20,"tag":1910,"props":12130,"children":12131},{},[12132,12141,12146],{"type":20,"tag":1937,"props":12133,"children":12134},{},[12135],{"type":20,"tag":84,"props":12136,"children":12138},{"className":12137},[],[12139],{"type":25,"value":12140},"Permission denied",{"type":20,"tag":1937,"props":12142,"children":12143},{},[12144],{"type":25,"value":12145},"用户名不对、密码不对，或密钥未正确写入",{"type":20,"tag":1937,"props":12147,"children":12148},{},[12149,12151,12157,12159],{"type":25,"value":12150},"先用 ",{"type":20,"tag":84,"props":12152,"children":12154},{"className":12153},[],[12155],{"type":25,"value":12156},"whoami",{"type":25,"value":12158}," 确认用户名，再检查 ",{"type":20,"tag":84,"props":12160,"children":12162},{"className":12161},[],[12163],{"type":25,"value":12164},"authorized_keys",{"type":20,"tag":1910,"props":12166,"children":12167},{},[12168,12173,12178],{"type":20,"tag":1937,"props":12169,"children":12170},{},[12171],{"type":25,"value":12172},"看得到 Tailscale 设备但连不上 SSH",{"type":20,"tag":1937,"props":12174,"children":12175},{},[12176],{"type":25,"value":12177},"Tailscale 正常，SSH 服务本身没配好",{"type":20,"tag":1937,"props":12179,"children":12180},{},[12181],{"type":25,"value":12182},"回到第一步检查 OpenSSH Server 是否安装完成",{"type":20,"tag":5056,"props":12184,"children":12185},{},[],{"type":20,"tag":1863,"props":12187,"children":12189},{"id":12188},"安全建议",[12190],{"type":25,"value":12188},{"type":20,"tag":21,"props":12192,"children":12193},{},[12194],{"type":25,"value":12195},"这套方案已经比“直接把家里 22 端口暴露到公网”安全很多，但如果要长期使用，还是建议再做几件事：",{"type":20,"tag":44,"props":12197,"children":12198},{},[12199,12204,12209,12214],{"type":20,"tag":48,"props":12200,"children":12201},{},[12202],{"type":25,"value":12203},"优先使用 SSH 密钥登录，而不是只靠密码",{"type":20,"tag":48,"props":12205,"children":12206},{},[12207],{"type":25,"value":12208},"不要在路由器上额外做 22 端口映射",{"type":20,"tag":48,"props":12210,"children":12211},{},[12212],{"type":25,"value":12213},"给 Windows 账户设置强密码",{"type":20,"tag":48,"props":12215,"children":12216},{},[12217],{"type":25,"value":12218},"如果机器需要长期远程访问，检查是否会自动休眠",{"type":20,"tag":5056,"props":12220,"children":12221},{},[],{"type":20,"tag":1863,"props":12223,"children":12224},{"id":10044},[12225],{"type":25,"value":10044},{"type":20,"tag":21,"props":12227,"children":12228},{},[12229,12231,12236],{"type":25,"value":12230},"如果你的目标只是“在外面稳定地连回家里的 Windows 主机”，那么 ",{"type":20,"tag":33,"props":12232,"children":12233},{},[12234],{"type":25,"value":12235},"OpenSSH Server + Tailscale",{"type":25,"value":12237}," 是一套非常省心的方案。",{"type":20,"tag":21,"props":12239,"children":12240},{},[12241],{"type":25,"value":12242},"它的优势不在于炫技，而在于简单、实用、可长期维护：不用研究公网 IP，不用折腾路由器，也不用担心一堆家庭网络环境带来的坑。对于需要远程跑模型、传文件、执行命令的人来说，这基本已经够用了。",{"type":20,"tag":21,"props":12244,"children":12245},{},[12246],{"type":25,"value":12247},"如果后面你还想继续完善这套远程方案，可以再往下加：",{"type":20,"tag":44,"props":12249,"children":12250},{},[12251,12268,12273],{"type":20,"tag":48,"props":12252,"children":12253},{},[12254,12259,12260,12266],{"type":20,"tag":84,"props":12255,"children":12257},{"className":12256},[],[12258],{"type":25,"value":9726},{"type":25,"value":7993},{"type":20,"tag":84,"props":12261,"children":12263},{"className":12262},[],[12264],{"type":25,"value":12265},"rsync",{"type":25,"value":12267}," 传文件",{"type":20,"tag":48,"props":12269,"children":12270},{},[12271],{"type":25,"value":12272},"VS Code Remote SSH 远程开发",{"type":20,"tag":48,"props":12274,"children":12275},{},[12276],{"type":25,"value":12277},"Jupyter \u002F WebUI 通过 Tailscale 内网访问",{"type":20,"tag":21,"props":12279,"children":12280},{},[12281],{"type":25,"value":12282},"这样你的家用 GPU 主机，基本就能变成一台随时可用的私人算力节点。",{"type":20,"tag":1785,"props":12284,"children":12285},{},[12286],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":12288},[12289,12290,12291,12292,12293,12300,12304,12307,12309,12313,12314,12315],{"id":11127,"depth":169,"text":11127},{"id":11166,"depth":169,"text":11166},{"id":11194,"depth":169,"text":11194},{"id":11238,"depth":169,"text":11238},{"id":11277,"depth":169,"text":11280,"children":12294},[12295,12296,12297,12298,12299],{"id":11288,"depth":179,"text":11291},{"id":11308,"depth":179,"text":11311},{"id":11335,"depth":179,"text":11338},{"id":11387,"depth":179,"text":11387},{"id":11479,"depth":179,"text":11482},{"id":11515,"depth":169,"text":11518,"children":12301},[12302,12303],{"id":11526,"depth":179,"text":11526},{"id":11609,"depth":179,"text":11612},{"id":11681,"depth":169,"text":11684,"children":12305},[12306],{"id":11735,"depth":179,"text":11735},{"id":11775,"depth":169,"text":12308},"可选优化：配置 ~\u002F.ssh\u002Fconfig",{"id":11879,"depth":169,"text":11882,"children":12310},[12311,12312],{"id":11890,"depth":179,"text":11893},{"id":11950,"depth":179,"text":11953},{"id":12041,"depth":169,"text":12041},{"id":12188,"depth":169,"text":12188},{"id":10044,"depth":169,"text":10044},"content:articles:devops:SSH连接.md","articles\u002Fdevops\u002FSSH连接.md","articles\u002Fdevops\u002FSSH连接",{"_path":12320,"_dir":1808,"_draft":7,"_partial":7,"_locale":8,"title":12321,"description":12322,"date":12323,"tags":12324,"body":12326,"_type":1800,"_id":13706,"_source":1802,"_file":13707,"_stem":13708,"_extension":1805},"\u002Farticles\u002Fai\u002Famino-hydro-classifier","AminoHydro Classifier：用 SMILES 和 MLP 判断氨基酸亲疏水性","基于 RDKit 提取 Morgan 指纹，使用 MLP 神经网络对氨基酸进行亲疏水性二分类的入门项目完整笔记","2026-05-05",[12325,13,1813],"深度学习",{"type":17,"children":12327,"toc":13692},[12328,12333,12345,12350,12364,12369,12374,12379,12426,12439,12444,12449,12453,12458,12463,12494,12499,12511,12516,12539,12544,12548,12553,12558,12563,12591,12603,12617,12629,12648,12654,12659,12664,12686,12691,12696,12734,12739,12750,12781,12786,12792,12797,12802,12816,12821,12835,12840,12845,12866,12877,12971,12984,12989,13001,13025,13030,13137,13157,13162,13166,13171,13256,13261,13266,13271,13276,13281,13295,13300,13334,13339,13362,13367,13390,13403,13472,13485,13490,13495,13509,13514,13557,13562,13567,13572,13577,13582,13587,13592,13597,13602,13607,13645,13650,13654,13659,13673,13678,13683,13688],{"type":20,"tag":21,"props":12329,"children":12330},{},[12331],{"type":25,"value":12332},"最近我做了一个很小但很完整的 AI 制药入门项目：输入一个氨基酸的 SMILES 字符串，程序会判断它更偏向亲水还是疏水。",{"type":20,"tag":21,"props":12334,"children":12335},{},[12336,12338,12343],{"type":25,"value":12337},"这个项目的名字叫 ",{"type":20,"tag":33,"props":12339,"children":12340},{},[12341],{"type":25,"value":12342},"AminoHydro Classifier",{"type":25,"value":12344},"。它不追求复杂模型，也不假装自己已经能替代真正的药物性质预测系统。它更像一个“最小可运行样例”：把计算化学里的分子表示、RDKit 特征提取、机器学习分类器训练和模型预测串成一条完整链路。",{"type":20,"tag":21,"props":12346,"children":12347},{},[12348],{"type":25,"value":12349},"核心流程可以概括为：",{"type":20,"tag":126,"props":12351,"children":12353},{"className":324,"code":12352,"language":25,"meta":8,"style":8},"SMILES 字符串 -> RDKit 解析 -> Mol 对象 -> Morgan 指纹 -> MLP 神经网络 -> 亲水 \u002F 疏水\n",[12354],{"type":20,"tag":84,"props":12355,"children":12356},{"__ignoreMap":8},[12357],{"type":20,"tag":157,"props":12358,"children":12359},{"class":159,"line":160},[12360],{"type":20,"tag":157,"props":12361,"children":12362},{},[12363],{"type":25,"value":12352},{"type":20,"tag":21,"props":12365,"children":12366},{},[12367],{"type":25,"value":12368},"这条链路虽然短，但已经包含了很多 AI 制药项目里反复出现的基础概念。",{"type":20,"tag":1863,"props":12370,"children":12372},{"id":12371},"为什么从氨基酸开始",[12373],{"type":25,"value":12371},{"type":20,"tag":21,"props":12375,"children":12376},{},[12377],{"type":25,"value":12378},"氨基酸是蛋白质的基本组成单元。标准蛋白质编码氨基酸有 20 种，它们可以通过不同排列组合形成大量蛋白质。每个氨基酸都有共同的主链结构：",{"type":20,"tag":44,"props":12380,"children":12381},{},[12382,12393,12404,12415],{"type":20,"tag":48,"props":12383,"children":12384},{},[12385,12387],{"type":25,"value":12386},"氨基：",{"type":20,"tag":84,"props":12388,"children":12390},{"className":12389},[],[12391],{"type":25,"value":12392},"-NH2",{"type":20,"tag":48,"props":12394,"children":12395},{},[12396,12398],{"type":25,"value":12397},"羧基：",{"type":20,"tag":84,"props":12399,"children":12401},{"className":12400},[],[12402],{"type":25,"value":12403},"-COOH",{"type":20,"tag":48,"props":12405,"children":12406},{},[12407,12409],{"type":25,"value":12408},"一个氢原子：",{"type":20,"tag":84,"props":12410,"children":12412},{"className":12411},[],[12413],{"type":25,"value":12414},"H",{"type":20,"tag":48,"props":12416,"children":12417},{},[12418,12420],{"type":25,"value":12419},"一个侧链基团：",{"type":20,"tag":84,"props":12421,"children":12423},{"className":12422},[],[12424],{"type":25,"value":12425},"R group",{"type":20,"tag":21,"props":12427,"children":12428},{},[12429,12431,12437],{"type":25,"value":12430},"真正决定不同氨基酸性质的，主要是侧链 ",{"type":20,"tag":84,"props":12432,"children":12434},{"className":12433},[],[12435],{"type":25,"value":12436},"R",{"type":25,"value":12438},"。有的侧链偏非极性，更容易和脂溶性环境相处，通常被认为更疏水；有的侧链带有羟基、羧基、氨基等极性或可电离基团，更容易和水形成相互作用，通常被认为更亲水。",{"type":20,"tag":21,"props":12440,"children":12441},{},[12442],{"type":25,"value":12443},"亲疏水性在药物设计里非常重要。比如，一个分子如果过于亲水，可能难以穿过脂质膜；如果过于疏水，又可能带来溶解度差、非特异性结合强等问题。血脑屏障 BBB 也是一个典型例子：一般来说，更合适的脂溶性有助于分子跨越屏障，但真实情况还会受到分子量、极性表面积、氢键供受体、转运蛋白等多种因素影响。",{"type":20,"tag":21,"props":12445,"children":12446},{},[12447],{"type":25,"value":12448},"所以，氨基酸亲疏水性是一个很适合作为入门任务的性质：概念直观，数据量小，容易验证，也能自然引出分子机器学习的基本流程。",{"type":20,"tag":1863,"props":12450,"children":12451},{"id":2144},[12452],{"type":25,"value":2147},{"type":20,"tag":21,"props":12454,"children":12455},{},[12456],{"type":25,"value":12457},"计算机不能直接理解“亮氨酸”“赖氨酸”这样的中文名称，也不能直接理解课本上的二维结构图。我们需要一种机器可读的表示方法。",{"type":20,"tag":21,"props":12459,"children":12460},{},[12461],{"type":25,"value":12462},"SMILES 就是其中一种常见格式。它可以用一串文本描述分子的原子、键、环、支链等结构信息。例如：",{"type":20,"tag":126,"props":12464,"children":12466},{"className":324,"code":12465,"language":25,"meta":8,"style":8},"亮氨酸 Leu: CC(C)CC(N)C(=O)O\n丝氨酸 Ser: NC(CO)C(=O)O\n赖氨酸 Lys: NCCCCC(N)C(=O)O\n",[12467],{"type":20,"tag":84,"props":12468,"children":12469},{"__ignoreMap":8},[12470,12478,12486],{"type":20,"tag":157,"props":12471,"children":12472},{"class":159,"line":160},[12473],{"type":20,"tag":157,"props":12474,"children":12475},{},[12476],{"type":25,"value":12477},"亮氨酸 Leu: CC(C)CC(N)C(=O)O\n",{"type":20,"tag":157,"props":12479,"children":12480},{"class":159,"line":169},[12481],{"type":20,"tag":157,"props":12482,"children":12483},{},[12484],{"type":25,"value":12485},"丝氨酸 Ser: NC(CO)C(=O)O\n",{"type":20,"tag":157,"props":12487,"children":12488},{"class":159,"line":179},[12489],{"type":20,"tag":157,"props":12490,"children":12491},{},[12492],{"type":25,"value":12493},"赖氨酸 Lys: NCCCCC(N)C(=O)O\n",{"type":20,"tag":21,"props":12495,"children":12496},{},[12497],{"type":25,"value":12498},"这些字符串看起来像化学版的“密码”，但对 RDKit 这样的化学信息学工具来说，它们是可以被解析的结构描述。",{"type":20,"tag":21,"props":12500,"children":12501},{},[12502,12504,12509],{"type":25,"value":12503},"项目的数据集在 ",{"type":20,"tag":84,"props":12505,"children":12507},{"className":12506},[],[12508],{"type":25,"value":10723},{"type":25,"value":12510},"，一共包含 20 个蛋白质编码氨基酸，每条数据包括名称、缩写、三字母代码、SMILES 字符串和亲疏水标签。",{"type":20,"tag":21,"props":12512,"children":12513},{},[12514],{"type":25,"value":12515},"标签约定是：",{"type":20,"tag":126,"props":12517,"children":12519},{"className":324,"code":12518,"language":25,"meta":8,"style":8},"1 = 疏水\n0 = 亲水\n",[12520],{"type":20,"tag":84,"props":12521,"children":12522},{"__ignoreMap":8},[12523,12531],{"type":20,"tag":157,"props":12524,"children":12525},{"class":159,"line":160},[12526],{"type":20,"tag":157,"props":12527,"children":12528},{},[12529],{"type":25,"value":12530},"1 = 疏水\n",{"type":20,"tag":157,"props":12532,"children":12533},{"class":159,"line":169},[12534],{"type":20,"tag":157,"props":12535,"children":12536},{},[12537],{"type":25,"value":12538},"0 = 亲水\n",{"type":20,"tag":21,"props":12540,"children":12541},{},[12542],{"type":25,"value":12543},"当前数据集中有 9 个疏水氨基酸、11 个亲水氨基酸。",{"type":20,"tag":1863,"props":12545,"children":12546},{"id":2364},[12547],{"type":25,"value":2367},{"type":20,"tag":21,"props":12549,"children":12550},{},[12551],{"type":25,"value":12552},"一个很容易混淆的问题是：RDKit 是不是分类器？",{"type":20,"tag":21,"props":12554,"children":12555},{},[12556],{"type":25,"value":12557},"答案是：不是。",{"type":20,"tag":21,"props":12559,"children":12560},{},[12561],{"type":25,"value":12562},"RDKit 更像是一个“分子工具箱”。它不会自动告诉我们一个分子是亲水还是疏水，但它能做很多机器学习前必需的事情，比如：",{"type":20,"tag":44,"props":12564,"children":12565},{},[12566,12571,12576,12586],{"type":20,"tag":48,"props":12567,"children":12568},{},[12569],{"type":25,"value":12570},"读取 SMILES 字符串",{"type":20,"tag":48,"props":12572,"children":12573},{},[12574],{"type":25,"value":12575},"检查分子是否合法",{"type":20,"tag":48,"props":12577,"children":12578},{},[12579,12581],{"type":25,"value":12580},"构建内部的分子对象 ",{"type":20,"tag":84,"props":12582,"children":12584},{"className":12583},[],[12585],{"type":25,"value":2451},{"type":20,"tag":48,"props":12587,"children":12588},{},[12589],{"type":25,"value":12590},"计算分子指纹、描述符、子结构等特征",{"type":20,"tag":21,"props":12592,"children":12593},{},[12594,12596,12601],{"type":25,"value":12595},"在这个项目里，RDKit 的第一步工作是把 SMILES 转成 ",{"type":20,"tag":84,"props":12597,"children":12599},{"className":12598},[],[12600],{"type":25,"value":2451},{"type":25,"value":12602}," 对象：",{"type":20,"tag":126,"props":12604,"children":12606},{"className":151,"code":12605,"language":150,"meta":8,"style":8},"mol = Chem.MolFromSmiles(smiles)\n",[12607],{"type":20,"tag":84,"props":12608,"children":12609},{"__ignoreMap":8},[12610],{"type":20,"tag":157,"props":12611,"children":12612},{"class":159,"line":160},[12613],{"type":20,"tag":157,"props":12614,"children":12615},{},[12616],{"type":25,"value":12605},{"type":20,"tag":21,"props":12618,"children":12619},{},[12620,12622,12627],{"type":25,"value":12621},"可以把 ",{"type":20,"tag":84,"props":12623,"children":12625},{"className":12624},[],[12626],{"type":25,"value":2451},{"type":25,"value":12628}," 理解成 RDKit 在程序内部使用的分子结构。它比字符串更结构化，知道哪些原子连在一起，哪些是支链，哪些是环结构。",{"type":20,"tag":21,"props":12630,"children":12631},{},[12632,12634,12639,12641,12646],{"type":25,"value":12633},"但是机器学习模型仍然不能直接吃 ",{"type":20,"tag":84,"props":12635,"children":12637},{"className":12636},[],[12638],{"type":25,"value":2451},{"type":25,"value":12640}," 对象。下一步，我们还要把 ",{"type":20,"tag":84,"props":12642,"children":12644},{"className":12643},[],[12645],{"type":25,"value":2451},{"type":25,"value":12647}," 转成数值向量。",{"type":20,"tag":1863,"props":12649,"children":12651},{"id":12650},"morgan-指纹把分子变成-2048-位向量",[12652],{"type":25,"value":12653},"Morgan 指纹：把分子变成 2048 位向量",{"type":20,"tag":21,"props":12655,"children":12656},{},[12657],{"type":25,"value":12658},"这个项目使用 Morgan fingerprint，也就是常说的 Morgan 指纹。它和 ECFP 类指纹思想接近，会围绕每个原子观察一定半径内的局部化学环境，然后把这些结构信息编码到一个固定长度的二进制向量里。",{"type":20,"tag":21,"props":12660,"children":12661},{},[12662],{"type":25,"value":12663},"项目里默认使用：",{"type":20,"tag":126,"props":12665,"children":12667},{"className":324,"code":12666,"language":25,"meta":8,"style":8},"radius = 2\nn_bits = 2048\n",[12668],{"type":20,"tag":84,"props":12669,"children":12670},{"__ignoreMap":8},[12671,12678],{"type":20,"tag":157,"props":12672,"children":12673},{"class":159,"line":160},[12674],{"type":20,"tag":157,"props":12675,"children":12676},{},[12677],{"type":25,"value":3958},{"type":20,"tag":157,"props":12679,"children":12680},{"class":159,"line":169},[12681],{"type":20,"tag":157,"props":12682,"children":12683},{},[12684],{"type":25,"value":12685},"n_bits = 2048\n",{"type":20,"tag":21,"props":12687,"children":12688},{},[12689],{"type":25,"value":12690},"也就是说，每个氨基酸最终都会变成一个长度为 2048 的 0\u002F1 向量。",{"type":20,"tag":21,"props":12692,"children":12693},{},[12694],{"type":25,"value":12695},"可以这样理解：",{"type":20,"tag":126,"props":12697,"children":12699},{"className":324,"code":12698,"language":25,"meta":8,"style":8},"SMILES: CC(C)CC(N)C(=O)O\n\nMorgan 指纹:\n[0, 1, 0, 0, 1, 0, ..., 1, 0]\n",[12700],{"type":20,"tag":84,"props":12701,"children":12702},{"__ignoreMap":8},[12703,12711,12718,12726],{"type":20,"tag":157,"props":12704,"children":12705},{"class":159,"line":160},[12706],{"type":20,"tag":157,"props":12707,"children":12708},{},[12709],{"type":25,"value":12710},"SMILES: CC(C)CC(N)C(=O)O\n",{"type":20,"tag":157,"props":12712,"children":12713},{"class":159,"line":169},[12714],{"type":20,"tag":157,"props":12715,"children":12716},{"emptyLinePlaceholder":173},[12717],{"type":25,"value":176},{"type":20,"tag":157,"props":12719,"children":12720},{"class":159,"line":179},[12721],{"type":20,"tag":157,"props":12722,"children":12723},{},[12724],{"type":25,"value":12725},"Morgan 指纹:\n",{"type":20,"tag":157,"props":12727,"children":12728},{"class":159,"line":188},[12729],{"type":20,"tag":157,"props":12730,"children":12731},{},[12732],{"type":25,"value":12733},"[0, 1, 0, 0, 1, 0, ..., 1, 0]\n",{"type":20,"tag":21,"props":12735,"children":12736},{},[12737],{"type":25,"value":12738},"这个向量不是给人看的，而是给模型看的。它把“分子结构”转换成了“机器学习特征”。",{"type":20,"tag":21,"props":12740,"children":12741},{},[12742,12744,12749],{"type":25,"value":12743},"项目中的对应代码在 ",{"type":20,"tag":84,"props":12745,"children":12747},{"className":12746},[],[12748],{"type":25,"value":10734},{"type":25,"value":146},{"type":20,"tag":126,"props":12751,"children":12753},{"className":151,"code":12752,"language":150,"meta":8,"style":8},"generator = rdFingerprintGenerator.GetMorganGenerator(radius=radius, fpSize=n_bits)\nfp = generator.GetFingerprint(mol)\nreturn np.array(fp, dtype=int)\n",[12754],{"type":20,"tag":84,"props":12755,"children":12756},{"__ignoreMap":8},[12757,12765,12773],{"type":20,"tag":157,"props":12758,"children":12759},{"class":159,"line":160},[12760],{"type":20,"tag":157,"props":12761,"children":12762},{},[12763],{"type":25,"value":12764},"generator = rdFingerprintGenerator.GetMorganGenerator(radius=radius, fpSize=n_bits)\n",{"type":20,"tag":157,"props":12766,"children":12767},{"class":159,"line":169},[12768],{"type":20,"tag":157,"props":12769,"children":12770},{},[12771],{"type":25,"value":12772},"fp = generator.GetFingerprint(mol)\n",{"type":20,"tag":157,"props":12774,"children":12775},{"class":159,"line":179},[12776],{"type":20,"tag":157,"props":12777,"children":12778},{},[12779],{"type":25,"value":12780},"return np.array(fp, dtype=int)\n",{"type":20,"tag":21,"props":12782,"children":12783},{},[12784],{"type":25,"value":12785},"这里有一个关键点：Morgan 指纹不是神经网络，也不是预测模型。它只是特征工程的一部分。真正做分类的是后面的 MLP。",{"type":20,"tag":1863,"props":12787,"children":12789},{"id":12788},"mlp最经典的前馈神经网络",[12790],{"type":25,"value":12791},"MLP：最经典的前馈神经网络",{"type":20,"tag":21,"props":12793,"children":12794},{},[12795],{"type":25,"value":12796},"MLP，全称 Multi-Layer Perceptron，多层感知机。它是最经典的前馈神经网络之一。",{"type":20,"tag":21,"props":12798,"children":12799},{},[12800],{"type":25,"value":12801},"它的基本结构可以简单理解为：",{"type":20,"tag":126,"props":12803,"children":12805},{"className":324,"code":12804,"language":25,"meta":8,"style":8},"输入层 -> 隐藏层 -> 激活函数 -> 隐藏层 -> 输出层\n",[12806],{"type":20,"tag":84,"props":12807,"children":12808},{"__ignoreMap":8},[12809],{"type":20,"tag":157,"props":12810,"children":12811},{"class":159,"line":160},[12812],{"type":20,"tag":157,"props":12813,"children":12814},{},[12815],{"type":25,"value":12804},{"type":20,"tag":21,"props":12817,"children":12818},{},[12819],{"type":25,"value":12820},"每一层都在做类似这样的事情：",{"type":20,"tag":126,"props":12822,"children":12824},{"className":324,"code":12823,"language":25,"meta":8,"style":8},"加权求和 -> 加上偏置 -> 经过激活函数 -> 传给下一层\n",[12825],{"type":20,"tag":84,"props":12826,"children":12827},{"__ignoreMap":8},[12828],{"type":20,"tag":157,"props":12829,"children":12830},{"class":159,"line":160},[12831],{"type":20,"tag":157,"props":12832,"children":12833},{},[12834],{"type":25,"value":12823},{"type":20,"tag":21,"props":12836,"children":12837},{},[12838],{"type":25,"value":12839},"如果没有激活函数，多层线性变换叠在一起本质上仍然只是线性模型。加入 ReLU、Sigmoid、Tanh 这样的非线性激活函数后，模型才有能力学习更复杂的非线性关系。",{"type":20,"tag":21,"props":12841,"children":12842},{},[12843],{"type":25,"value":12844},"在这个项目里，MLP 的输入是 2048 维 Morgan 指纹，输出是一个二分类结果：",{"type":20,"tag":126,"props":12846,"children":12848},{"className":324,"code":12847,"language":25,"meta":8,"style":8},"0 = 亲水\n1 = 疏水\n",[12849],{"type":20,"tag":84,"props":12850,"children":12851},{"__ignoreMap":8},[12852,12859],{"type":20,"tag":157,"props":12853,"children":12854},{"class":159,"line":160},[12855],{"type":20,"tag":157,"props":12856,"children":12857},{},[12858],{"type":25,"value":12538},{"type":20,"tag":157,"props":12860,"children":12861},{"class":159,"line":169},[12862],{"type":20,"tag":157,"props":12863,"children":12864},{},[12865],{"type":25,"value":12530},{"type":20,"tag":21,"props":12867,"children":12868},{},[12869,12871,12876],{"type":25,"value":12870},"模型定义在 ",{"type":20,"tag":84,"props":12872,"children":12874},{"className":12873},[],[12875],{"type":25,"value":10745},{"type":25,"value":146},{"type":20,"tag":126,"props":12878,"children":12880},{"className":151,"code":12879,"language":150,"meta":8,"style":8},"model = MLPClassifier(\n    hidden_layer_sizes=(128, 64),\n    activation=\"relu\",\n    solver=\"adam\",\n    alpha=0.001,\n    max_iter=1000,\n    random_state=42,\n    early_stopping=True,\n    validation_fraction=0.2,\n    n_iter_no_change=20,\n)\n",[12881],{"type":20,"tag":84,"props":12882,"children":12883},{"__ignoreMap":8},[12884,12892,12900,12908,12916,12924,12932,12940,12948,12956,12964],{"type":20,"tag":157,"props":12885,"children":12886},{"class":159,"line":160},[12887],{"type":20,"tag":157,"props":12888,"children":12889},{},[12890],{"type":25,"value":12891},"model = MLPClassifier(\n",{"type":20,"tag":157,"props":12893,"children":12894},{"class":159,"line":169},[12895],{"type":20,"tag":157,"props":12896,"children":12897},{},[12898],{"type":25,"value":12899},"    hidden_layer_sizes=(128, 64),\n",{"type":20,"tag":157,"props":12901,"children":12902},{"class":159,"line":179},[12903],{"type":20,"tag":157,"props":12904,"children":12905},{},[12906],{"type":25,"value":12907},"    activation=\"relu\",\n",{"type":20,"tag":157,"props":12909,"children":12910},{"class":159,"line":188},[12911],{"type":20,"tag":157,"props":12912,"children":12913},{},[12914],{"type":25,"value":12915},"    solver=\"adam\",\n",{"type":20,"tag":157,"props":12917,"children":12918},{"class":159,"line":196},[12919],{"type":20,"tag":157,"props":12920,"children":12921},{},[12922],{"type":25,"value":12923},"    alpha=0.001,\n",{"type":20,"tag":157,"props":12925,"children":12926},{"class":159,"line":204},[12927],{"type":20,"tag":157,"props":12928,"children":12929},{},[12930],{"type":25,"value":12931},"    max_iter=1000,\n",{"type":20,"tag":157,"props":12933,"children":12934},{"class":159,"line":213},[12935],{"type":20,"tag":157,"props":12936,"children":12937},{},[12938],{"type":25,"value":12939},"    random_state=42,\n",{"type":20,"tag":157,"props":12941,"children":12942},{"class":159,"line":222},[12943],{"type":20,"tag":157,"props":12944,"children":12945},{},[12946],{"type":25,"value":12947},"    early_stopping=True,\n",{"type":20,"tag":157,"props":12949,"children":12950},{"class":159,"line":440},[12951],{"type":20,"tag":157,"props":12952,"children":12953},{},[12954],{"type":25,"value":12955},"    validation_fraction=0.2,\n",{"type":20,"tag":157,"props":12957,"children":12958},{"class":159,"line":448},[12959],{"type":20,"tag":157,"props":12960,"children":12961},{},[12962],{"type":25,"value":12963},"    n_iter_no_change=20,\n",{"type":20,"tag":157,"props":12965,"children":12966},{"class":159,"line":456},[12967],{"type":20,"tag":157,"props":12968,"children":12969},{},[12970],{"type":25,"value":8926},{"type":20,"tag":21,"props":12972,"children":12973},{},[12974,12976,12982],{"type":25,"value":12975},"这里用了两层隐藏层，分别有 128 和 64 个神经元。",{"type":20,"tag":84,"props":12977,"children":12979},{"className":12978},[],[12980],{"type":25,"value":12981},"early_stopping=True",{"type":25,"value":12983}," 表示如果验证集效果长时间没有提升，训练会提前停止，避免在小数据集上过度训练。",{"type":20,"tag":1863,"props":12985,"children":12987},{"id":12986},"训练流程",[12988],{"type":25,"value":12986},{"type":20,"tag":21,"props":12990,"children":12991},{},[12992,12994,12999],{"type":25,"value":12993},"训练入口在 ",{"type":20,"tag":84,"props":12995,"children":12997},{"className":12996},[],[12998],{"type":25,"value":144},{"type":25,"value":13000},"，运行：",{"type":20,"tag":126,"props":13002,"children":13004},{"className":238,"code":13003,"language":237,"meta":8,"style":8},"python main.py train\n",[13005],{"type":20,"tag":84,"props":13006,"children":13007},{"__ignoreMap":8},[13008],{"type":20,"tag":157,"props":13009,"children":13010},{"class":159,"line":160},[13011,13015,13020],{"type":20,"tag":157,"props":13012,"children":13013},{"style":248},[13014],{"type":25,"value":150},{"type":20,"tag":157,"props":13016,"children":13017},{"style":254},[13018],{"type":25,"value":13019}," main.py",{"type":20,"tag":157,"props":13021,"children":13022},{"style":254},[13023],{"type":25,"value":13024}," train\n",{"type":20,"tag":21,"props":13026,"children":13027},{},[13028],{"type":25,"value":13029},"完整训练流程如下：",{"type":20,"tag":5719,"props":13031,"children":13032},{},[13033,13045,13056,13068,13088,13101,13113,13118],{"type":20,"tag":48,"props":13034,"children":13035},{},[13036,13038,13043],{"type":25,"value":13037},"从 ",{"type":20,"tag":84,"props":13039,"children":13041},{"className":13040},[],[13042],{"type":25,"value":10723},{"type":25,"value":13044}," 读取 20 个氨基酸。",{"type":20,"tag":48,"props":13046,"children":13047},{},[13048,13050,13055],{"type":25,"value":13049},"每个 SMILES 先通过 RDKit 转成 ",{"type":20,"tag":84,"props":13051,"children":13053},{"className":13052},[],[13054],{"type":25,"value":2451},{"type":25,"value":110},{"type":20,"tag":48,"props":13057,"children":13058},{},[13059,13061,13066],{"type":25,"value":13060},"每个 ",{"type":20,"tag":84,"props":13062,"children":13064},{"className":13063},[],[13065],{"type":25,"value":2451},{"type":25,"value":13067}," 再转成 2048 维 Morgan 指纹。",{"type":20,"tag":48,"props":13069,"children":13070},{},[13071,13073,13079,13081,13087],{"type":25,"value":13072},"得到特征矩阵 ",{"type":20,"tag":84,"props":13074,"children":13076},{"className":13075},[],[13077],{"type":25,"value":13078},"X",{"type":25,"value":13080}," 和标签数组 ",{"type":20,"tag":84,"props":13082,"children":13084},{"className":13083},[],[13085],{"type":25,"value":13086},"y",{"type":25,"value":110},{"type":20,"tag":48,"props":13089,"children":13090},{},[13091,13093,13099],{"type":25,"value":13092},"使用 ",{"type":20,"tag":84,"props":13094,"children":13096},{"className":13095},[],[13097],{"type":25,"value":13098},"train_test_split(..., stratify=y)",{"type":25,"value":13100}," 切分训练集和测试集。",{"type":20,"tag":48,"props":13102,"children":13103},{},[13104,13106,13112],{"type":25,"value":13105},"训练 ",{"type":20,"tag":84,"props":13107,"children":13109},{"className":13108},[],[13110],{"type":25,"value":13111},"MLPClassifier",{"type":25,"value":110},{"type":20,"tag":48,"props":13114,"children":13115},{},[13116],{"type":25,"value":13117},"打印准确率、分类报告和混淆矩阵。",{"type":20,"tag":48,"props":13119,"children":13120},{},[13121,13122,13128,13130,13136],{"type":25,"value":13092},{"type":20,"tag":84,"props":13123,"children":13125},{"className":13124},[],[13126],{"type":25,"value":13127},"joblib",{"type":25,"value":13129}," 保存模型到 ",{"type":20,"tag":84,"props":13131,"children":13133},{"className":13132},[],[13134],{"type":25,"value":13135},"models\u002Fmlp_classifier.pkl",{"type":25,"value":110},{"type":20,"tag":21,"props":13138,"children":13139},{},[13140,13142,13148,13150,13155],{"type":25,"value":13141},"其中 ",{"type":20,"tag":84,"props":13143,"children":13145},{"className":13144},[],[13146],{"type":25,"value":13147},"stratify=y",{"type":25,"value":13149}," 是一个小但重要的细节。因为数据集很小，只有 20 条。如果随机切分时某一类样本在测试集里太少，评估结果会非常不稳定。",{"type":20,"tag":84,"props":13151,"children":13153},{"className":13152},[],[13154],{"type":25,"value":13147},{"type":25,"value":13156}," 可以尽量保证训练集和测试集中的亲水\u002F疏水比例接近原始数据。",{"type":20,"tag":21,"props":13158,"children":13159},{},[13160],{"type":25,"value":13161},"训练时，项目还做了 5 折交叉验证。交叉验证会重复多次切分训练集和验证集，比单次切分更能反映模型在小数据集上的波动。",{"type":20,"tag":1863,"props":13163,"children":13164},{"id":10760},[13165],{"type":25,"value":10760},{"type":20,"tag":21,"props":13167,"children":13168},{},[13169],{"type":25,"value":13170},"在当前数据和默认参数下，我运行了一次训练，得到结果如下：",{"type":20,"tag":126,"props":13172,"children":13174},{"className":324,"code":13173,"language":25,"meta":8,"style":8},"数据集大小: 20 个氨基酸\n疏水性氨基酸: 9 个\n亲水性氨基酸: 11 个\n\n5 折交叉验证准确率: 0.5000 (+\u002F- 0.1581)\n测试集准确率: 0.6000\n\n混淆矩阵:\n[[2 1]\n [1 1]]\n",[13175],{"type":20,"tag":84,"props":13176,"children":13177},{"__ignoreMap":8},[13178,13186,13194,13202,13209,13217,13225,13232,13240,13248],{"type":20,"tag":157,"props":13179,"children":13180},{"class":159,"line":160},[13181],{"type":20,"tag":157,"props":13182,"children":13183},{},[13184],{"type":25,"value":13185},"数据集大小: 20 个氨基酸\n",{"type":20,"tag":157,"props":13187,"children":13188},{"class":159,"line":169},[13189],{"type":20,"tag":157,"props":13190,"children":13191},{},[13192],{"type":25,"value":13193},"疏水性氨基酸: 9 个\n",{"type":20,"tag":157,"props":13195,"children":13196},{"class":159,"line":179},[13197],{"type":20,"tag":157,"props":13198,"children":13199},{},[13200],{"type":25,"value":13201},"亲水性氨基酸: 11 个\n",{"type":20,"tag":157,"props":13203,"children":13204},{"class":159,"line":188},[13205],{"type":20,"tag":157,"props":13206,"children":13207},{"emptyLinePlaceholder":173},[13208],{"type":25,"value":176},{"type":20,"tag":157,"props":13210,"children":13211},{"class":159,"line":196},[13212],{"type":20,"tag":157,"props":13213,"children":13214},{},[13215],{"type":25,"value":13216},"5 折交叉验证准确率: 0.5000 (+\u002F- 0.1581)\n",{"type":20,"tag":157,"props":13218,"children":13219},{"class":159,"line":204},[13220],{"type":20,"tag":157,"props":13221,"children":13222},{},[13223],{"type":25,"value":13224},"测试集准确率: 0.6000\n",{"type":20,"tag":157,"props":13226,"children":13227},{"class":159,"line":213},[13228],{"type":20,"tag":157,"props":13229,"children":13230},{"emptyLinePlaceholder":173},[13231],{"type":25,"value":176},{"type":20,"tag":157,"props":13233,"children":13234},{"class":159,"line":222},[13235],{"type":20,"tag":157,"props":13236,"children":13237},{},[13238],{"type":25,"value":13239},"混淆矩阵:\n",{"type":20,"tag":157,"props":13241,"children":13242},{"class":159,"line":440},[13243],{"type":20,"tag":157,"props":13244,"children":13245},{},[13246],{"type":25,"value":13247},"[[2 1]\n",{"type":20,"tag":157,"props":13249,"children":13250},{"class":159,"line":448},[13251],{"type":20,"tag":157,"props":13252,"children":13253},{},[13254],{"type":25,"value":13255}," [1 1]]\n",{"type":20,"tag":21,"props":13257,"children":13258},{},[13259],{"type":25,"value":13260},"这个结果并不惊艳，甚至可以说很朴素。但这正是这个项目值得写出来的地方：数据只有 20 条，模型还使用了 2048 维稀疏指纹，这在机器学习里是典型的“小样本、高维特征”场景。",{"type":20,"tag":21,"props":13262,"children":13263},{},[13264],{"type":25,"value":13265},"在这种情况下，模型很容易受到训练\u002F测试划分影响。一次测试集准确率 0.60，并不能说明模型已经学到了稳定、可泛化的化学规律。它更多说明：这条技术链路可以跑通，模型能基于分子指纹做出一个可解释的二分类输出。",{"type":20,"tag":21,"props":13267,"children":13268},{},[13269],{"type":25,"value":13270},"如果要做成更严肃的性质预测模型，需要更多数据、更稳健的评估方式，以及更仔细的特征和模型选择。",{"type":20,"tag":1863,"props":13272,"children":13274},{"id":13273},"预测流程",[13275],{"type":25,"value":13273},{"type":20,"tag":21,"props":13277,"children":13278},{},[13279],{"type":25,"value":13280},"训练完成后，模型会保存为：",{"type":20,"tag":126,"props":13282,"children":13284},{"className":324,"code":13283,"language":25,"meta":8,"style":8},"models\u002Fmlp_classifier.pkl\n",[13285],{"type":20,"tag":84,"props":13286,"children":13287},{"__ignoreMap":8},[13288],{"type":20,"tag":157,"props":13289,"children":13290},{"class":159,"line":160},[13291],{"type":20,"tag":157,"props":13292,"children":13293},{},[13294],{"type":25,"value":13283},{"type":20,"tag":21,"props":13296,"children":13297},{},[13298],{"type":25,"value":13299},"预测时的流程和训练时保持一致：",{"type":20,"tag":5719,"props":13301,"children":13302},{},[13303,13308,13313,13324,13329],{"type":20,"tag":48,"props":13304,"children":13305},{},[13306],{"type":25,"value":13307},"读取已经保存的模型。",{"type":20,"tag":48,"props":13309,"children":13310},{},[13311],{"type":25,"value":13312},"输入一个新的 SMILES 字符串。",{"type":20,"tag":48,"props":13314,"children":13315},{},[13316,13318,13323],{"type":25,"value":13317},"用 RDKit 解析成 ",{"type":20,"tag":84,"props":13319,"children":13321},{"className":13320},[],[13322],{"type":25,"value":2451},{"type":25,"value":110},{"type":20,"tag":48,"props":13325,"children":13326},{},[13327],{"type":25,"value":13328},"转成同样参数的 Morgan 指纹。",{"type":20,"tag":48,"props":13330,"children":13331},{},[13332],{"type":25,"value":13333},"输入 MLP，得到类别和概率。",{"type":20,"tag":21,"props":13335,"children":13336},{},[13337],{"type":25,"value":13338},"运行演示：",{"type":20,"tag":126,"props":13340,"children":13342},{"className":238,"code":13341,"language":237,"meta":8,"style":8},"python main.py demo\n",[13343],{"type":20,"tag":84,"props":13344,"children":13345},{"__ignoreMap":8},[13346],{"type":20,"tag":157,"props":13347,"children":13348},{"class":159,"line":160},[13349,13353,13357],{"type":20,"tag":157,"props":13350,"children":13351},{"style":248},[13352],{"type":25,"value":150},{"type":20,"tag":157,"props":13354,"children":13355},{"style":254},[13356],{"type":25,"value":13019},{"type":20,"tag":157,"props":13358,"children":13359},{"style":254},[13360],{"type":25,"value":13361}," demo\n",{"type":20,"tag":21,"props":13363,"children":13364},{},[13365],{"type":25,"value":13366},"也可以进入交互模式：",{"type":20,"tag":126,"props":13368,"children":13370},{"className":238,"code":13369,"language":237,"meta":8,"style":8},"python main.py interactive\n",[13371],{"type":20,"tag":84,"props":13372,"children":13373},{"__ignoreMap":8},[13374],{"type":20,"tag":157,"props":13375,"children":13376},{"class":159,"line":160},[13377,13381,13385],{"type":20,"tag":157,"props":13378,"children":13379},{"style":248},[13380],{"type":25,"value":150},{"type":20,"tag":157,"props":13382,"children":13383},{"style":254},[13384],{"type":25,"value":13019},{"type":20,"tag":157,"props":13386,"children":13387},{"style":254},[13388],{"type":25,"value":13389}," interactive\n",{"type":20,"tag":21,"props":13391,"children":13392},{},[13393,13395,13401],{"type":25,"value":13394},"预测函数在 ",{"type":20,"tag":84,"props":13396,"children":13398},{"className":13397},[],[13399],{"type":25,"value":13400},"src\u002Fpredict.py",{"type":25,"value":13402},"，返回结果包括：",{"type":20,"tag":126,"props":13404,"children":13406},{"className":151,"code":13405,"language":150,"meta":8,"style":8},"{\n    \"smiles\": smiles,\n    \"prediction\": 0 or 1,\n    \"label\": \"亲水\" or \"疏水\",\n    \"confidence\": confidence,\n    \"hydrophobic_prob\": hydrophobic_prob,\n    \"hydrophilic_prob\": hydrophilic_prob,\n}\n",[13407],{"type":20,"tag":84,"props":13408,"children":13409},{"__ignoreMap":8},[13410,13417,13425,13433,13441,13449,13457,13465],{"type":20,"tag":157,"props":13411,"children":13412},{"class":159,"line":160},[13413],{"type":20,"tag":157,"props":13414,"children":13415},{},[13416],{"type":25,"value":895},{"type":20,"tag":157,"props":13418,"children":13419},{"class":159,"line":169},[13420],{"type":20,"tag":157,"props":13421,"children":13422},{},[13423],{"type":25,"value":13424},"    \"smiles\": smiles,\n",{"type":20,"tag":157,"props":13426,"children":13427},{"class":159,"line":179},[13428],{"type":20,"tag":157,"props":13429,"children":13430},{},[13431],{"type":25,"value":13432},"    \"prediction\": 0 or 1,\n",{"type":20,"tag":157,"props":13434,"children":13435},{"class":159,"line":188},[13436],{"type":20,"tag":157,"props":13437,"children":13438},{},[13439],{"type":25,"value":13440},"    \"label\": \"亲水\" or \"疏水\",\n",{"type":20,"tag":157,"props":13442,"children":13443},{"class":159,"line":196},[13444],{"type":20,"tag":157,"props":13445,"children":13446},{},[13447],{"type":25,"value":13448},"    \"confidence\": confidence,\n",{"type":20,"tag":157,"props":13450,"children":13451},{"class":159,"line":204},[13452],{"type":20,"tag":157,"props":13453,"children":13454},{},[13455],{"type":25,"value":13456},"    \"hydrophobic_prob\": hydrophobic_prob,\n",{"type":20,"tag":157,"props":13458,"children":13459},{"class":159,"line":213},[13460],{"type":20,"tag":157,"props":13461,"children":13462},{},[13463],{"type":25,"value":13464},"    \"hydrophilic_prob\": hydrophilic_prob,\n",{"type":20,"tag":157,"props":13466,"children":13467},{"class":159,"line":222},[13468],{"type":20,"tag":157,"props":13469,"children":13470},{},[13471],{"type":25,"value":943},{"type":20,"tag":21,"props":13473,"children":13474},{},[13475,13477,13483],{"type":25,"value":13476},"这里的 ",{"type":20,"tag":84,"props":13478,"children":13480},{"className":13479},[],[13481],{"type":25,"value":13482},"confidence",{"type":25,"value":13484}," 本质上是模型对预测类别的概率估计。它可以作为参考，但在这么小的数据集上，不能把它理解成严格可靠的化学置信度。",{"type":20,"tag":1863,"props":13486,"children":13488},{"id":13487},"这个项目真正学到什么",[13489],{"type":25,"value":13487},{"type":20,"tag":21,"props":13491,"children":13492},{},[13493],{"type":25,"value":13494},"我觉得这个项目的价值不在于“用 MLP 精准预测氨基酸亲疏水性”，而在于把 AI 制药中一个常见问题拆成了几个清楚的层次：",{"type":20,"tag":126,"props":13496,"children":13498},{"className":324,"code":13497,"language":25,"meta":8,"style":8},"化学对象 -> 机器可读表示 -> 数值特征 -> 机器学习模型 -> 性质预测\n",[13499],{"type":20,"tag":84,"props":13500,"children":13501},{"__ignoreMap":8},[13502],{"type":20,"tag":157,"props":13503,"children":13504},{"class":159,"line":160},[13505],{"type":20,"tag":157,"props":13506,"children":13507},{},[13508],{"type":25,"value":13497},{"type":20,"tag":21,"props":13510,"children":13511},{},[13512],{"type":25,"value":13513},"更具体地说，它帮助我理解了：",{"type":20,"tag":44,"props":13515,"children":13516},{},[13517,13522,13527,13537,13542,13547,13552],{"type":20,"tag":48,"props":13518,"children":13519},{},[13520],{"type":25,"value":13521},"SMILES 是分子的文本表示，不是模型特征本身。",{"type":20,"tag":48,"props":13523,"children":13524},{},[13525],{"type":25,"value":13526},"RDKit 是化学信息学工具箱，不是神经网络分类器。",{"type":20,"tag":48,"props":13528,"children":13529},{},[13530,13535],{"type":20,"tag":84,"props":13531,"children":13533},{"className":13532},[],[13534],{"type":25,"value":2451},{"type":25,"value":13536}," 是 RDKit 内部的结构化分子对象。",{"type":20,"tag":48,"props":13538,"children":13539},{},[13540],{"type":25,"value":13541},"Morgan 指纹把分子局部结构编码成固定长度向量。",{"type":20,"tag":48,"props":13543,"children":13544},{},[13545],{"type":25,"value":13546},"MLP 接收的是数值向量，而不是原始化学名称或 SMILES。",{"type":20,"tag":48,"props":13548,"children":13549},{},[13550],{"type":25,"value":13551},"亲疏水标签是人为定义的数据监督信号，模型是在学习这个标签规则。",{"type":20,"tag":48,"props":13553,"children":13554},{},[13555],{"type":25,"value":13556},"小数据集上的准确率很容易波动，不能过度解读。",{"type":20,"tag":21,"props":13558,"children":13559},{},[13560],{"type":25,"value":13561},"如果把这个项目看成一个“分子机器学习 Hello World”，它已经足够完整。",{"type":20,"tag":1863,"props":13563,"children":13565},{"id":13564},"局限性",[13566],{"type":25,"value":13564},{"type":20,"tag":21,"props":13568,"children":13569},{},[13570],{"type":25,"value":13571},"这个项目也有明显局限。",{"type":20,"tag":21,"props":13573,"children":13574},{},[13575],{"type":25,"value":13576},"第一，数据量太小。20 个样本无法支撑复杂神经网络稳定学习，尤其输入还是 2048 维指纹。",{"type":20,"tag":21,"props":13578,"children":13579},{},[13580],{"type":25,"value":13581},"第二，亲疏水标签本身是简化的。真实分子的亲疏水性通常会用 logP、logD、溶解度、极性表面积等更连续、更细致的指标描述，而不是简单二分类。",{"type":20,"tag":21,"props":13583,"children":13584},{},[13585],{"type":25,"value":13586},"第三，氨基酸在不同 pH 条件下会有不同电荷状态。当前 SMILES 和标签没有显式考虑环境 pH、电离状态、两性离子形式等因素。",{"type":20,"tag":21,"props":13588,"children":13589},{},[13590],{"type":25,"value":13591},"第四，Morgan 指纹虽然经典，但它会压缩分子信息，也可能发生哈希碰撞。对于更复杂任务，可以尝试更多分子描述符、图神经网络或预训练分子模型。",{"type":20,"tag":21,"props":13593,"children":13594},{},[13595],{"type":25,"value":13596},"第五，模型评估还很初级。当前的交叉验证和测试集评估适合教学演示，但不适合宣称真实性能。",{"type":20,"tag":1863,"props":13598,"children":13600},{"id":13599},"可以怎么继续优化",[13601],{"type":25,"value":13599},{"type":20,"tag":21,"props":13603,"children":13604},{},[13605],{"type":25,"value":13606},"如果继续扩展这个项目，我会优先考虑这些方向：",{"type":20,"tag":5719,"props":13608,"children":13609},{},[13610,13615,13620,13625,13630,13635,13640],{"type":20,"tag":48,"props":13611,"children":13612},{},[13613],{"type":25,"value":13614},"增加数据量，引入更多天然或人工氨基酸及其性质数据。",{"type":20,"tag":48,"props":13616,"children":13617},{},[13618],{"type":25,"value":13619},"把二分类标签换成连续性质，例如 logP 或实验溶解度。",{"type":20,"tag":48,"props":13621,"children":13622},{},[13623],{"type":25,"value":13624},"加入更多 RDKit 分子描述符，例如分子量、TPSA、氢键供体\u002F受体数量、可旋转键数量。",{"type":20,"tag":48,"props":13626,"children":13627},{},[13628],{"type":25,"value":13629},"对比不同模型，例如 Logistic Regression、Random Forest、SVM、XGBoost。",{"type":20,"tag":48,"props":13631,"children":13632},{},[13633],{"type":25,"value":13634},"使用留一法交叉验证，适配 20 条样本这种极小数据集。",{"type":20,"tag":48,"props":13636,"children":13637},{},[13638],{"type":25,"value":13639},"做一个简单 Web 页面，让用户输入 SMILES 后实时看到预测结果。",{"type":20,"tag":48,"props":13641,"children":13642},{},[13643],{"type":25,"value":13644},"增加非法 SMILES 检查和可视化分子结构展示。",{"type":20,"tag":21,"props":13646,"children":13647},{},[13648],{"type":25,"value":13649},"这些扩展会让项目从“跑通流程”逐渐接近一个可展示、可解释、可交互的小型 AI 制药工具。",{"type":20,"tag":1863,"props":13651,"children":13652},{"id":10044},[13653],{"type":25,"value":10044},{"type":20,"tag":21,"props":13655,"children":13656},{},[13657],{"type":25,"value":13658},"AminoHydro Classifier 是一个很小的项目，但它覆盖了分子机器学习中最基础也最重要的一条链路：",{"type":20,"tag":126,"props":13660,"children":13662},{"className":324,"code":13661,"language":25,"meta":8,"style":8},"分子字符串 -> 化学结构 -> 分子指纹 -> 神经网络 -> 性质预测\n",[13663],{"type":20,"tag":84,"props":13664,"children":13665},{"__ignoreMap":8},[13666],{"type":20,"tag":157,"props":13667,"children":13668},{"class":159,"line":160},[13669],{"type":20,"tag":157,"props":13670,"children":13671},{},[13672],{"type":25,"value":13661},{"type":20,"tag":21,"props":13674,"children":13675},{},[13676],{"type":25,"value":13677},"通过它，我更清楚地理解了 RDKit 和机器学习模型之间的分工：RDKit 负责把化学结构变成可计算特征，MLP 负责从特征中学习分类边界。",{"type":20,"tag":21,"props":13679,"children":13680},{},[13681],{"type":25,"value":13682},"这个项目目前不适合作为严肃的药物性质预测模型，但非常适合作为 AI 制药入门练习。它足够小，小到每一步都能看懂；又足够完整，完整到可以从数据、训练、评估一直走到预测。",{"type":20,"tag":21,"props":13684,"children":13685},{},[13686],{"type":25,"value":13687},"对我来说，这正是学习 AI 制药很好的起点：不是一上来追逐巨大的模型，而是先把一条最小的分子机器学习流水线亲手跑通。",{"type":20,"tag":1785,"props":13689,"children":13690},{},[13691],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":13693},[13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705],{"id":12371,"depth":169,"text":12371},{"id":2144,"depth":169,"text":2147},{"id":2364,"depth":169,"text":2367},{"id":12650,"depth":169,"text":12653},{"id":12788,"depth":169,"text":12791},{"id":12986,"depth":169,"text":12986},{"id":10760,"depth":169,"text":10760},{"id":13273,"depth":169,"text":13273},{"id":13487,"depth":169,"text":13487},{"id":13564,"depth":169,"text":13564},{"id":13599,"depth":169,"text":13599},{"id":10044,"depth":169,"text":10044},"content:articles:ai:amino-hydro-classifier.md","articles\u002Fai\u002Famino-hydro-classifier.md","articles\u002Fai\u002Famino-hydro-classifier",{"_path":13710,"_dir":1808,"_draft":7,"_partial":7,"_locale":8,"title":13711,"description":13712,"date":13713,"tags":13714,"body":13715,"_type":1800,"_id":13867,"_source":1802,"_file":13868,"_stem":13869,"_extension":1805},"\u002Farticles\u002Fai\u002Falphafold-intro","AlphaFold：蛋白质结构预测的革命","介绍 AlphaFold 如何利用深度学习解决蛋白质折叠问题，以及它对生物制药的影响。","2026-04-17",[12325,1813],{"type":17,"children":13716,"toc":13860},[13717,13722,13727,13733,13738,13766,13771,13776,13809,13814,13832,13837],{"type":20,"tag":1863,"props":13718,"children":13720},{"id":13719},"蛋白质折叠问题",[13721],{"type":25,"value":13719},{"type":20,"tag":21,"props":13723,"children":13724},{},[13725],{"type":25,"value":13726},"蛋白质的功能取决于其三维结构，而氨基酸序列如何折叠成特定结构一直是生物学领域的重大挑战。这个被称为\"蛋白质折叠问题\"的难题困扰了科学家50多年。",{"type":20,"tag":1863,"props":13728,"children":13730},{"id":13729},"alphafold-的突破",[13731],{"type":25,"value":13732},"AlphaFold 的突破",{"type":20,"tag":21,"props":13734,"children":13735},{},[13736],{"type":25,"value":13737},"2020年，DeepMind 的 AlphaFold2 在 CASP14 竞赛中取得了突破性成果：",{"type":20,"tag":44,"props":13739,"children":13740},{},[13741,13751,13761],{"type":20,"tag":48,"props":13742,"children":13743},{},[13744,13749],{"type":20,"tag":33,"props":13745,"children":13746},{},[13747],{"type":25,"value":13748},"GDT 分数超过 90",{"type":25,"value":13750},"，接近实验精度",{"type":20,"tag":48,"props":13752,"children":13753},{},[13754,13756],{"type":25,"value":13755},"能够预测",{"type":20,"tag":33,"props":13757,"children":13758},{},[13759],{"type":25,"value":13760},"大部分蛋白质的单链结构",{"type":20,"tag":48,"props":13762,"children":13763},{},[13764],{"type":25,"value":13765},"预测速度远超传统实验方法",{"type":20,"tag":1863,"props":13767,"children":13769},{"id":13768},"核心技术",[13770],{"type":25,"value":13768},{"type":20,"tag":21,"props":13772,"children":13773},{},[13774],{"type":25,"value":13775},"AlphaFold2 的关键创新包括：",{"type":20,"tag":5719,"props":13777,"children":13778},{},[13779,13789,13799],{"type":20,"tag":48,"props":13780,"children":13781},{},[13782,13787],{"type":20,"tag":33,"props":13783,"children":13784},{},[13785],{"type":25,"value":13786},"注意力机制",{"type":25,"value":13788},"：利用 Transformer 架构处理序列信息",{"type":20,"tag":48,"props":13790,"children":13791},{},[13792,13797],{"type":20,"tag":33,"props":13793,"children":13794},{},[13795],{"type":25,"value":13796},"进化特征 (MSA)",{"type":25,"value":13798},"：从多序列比对中提取共进化信息",{"type":20,"tag":48,"props":13800,"children":13801},{},[13802,13807],{"type":20,"tag":33,"props":13803,"children":13804},{},[13805],{"type":25,"value":13806},"结构模块",{"type":25,"value":13808},"：直接输出原子坐标",{"type":20,"tag":1863,"props":13810,"children":13812},{"id":13811},"对药物研发的影响",[13813],{"type":25,"value":13811},{"type":20,"tag":44,"props":13815,"children":13816},{},[13817,13822,13827],{"type":20,"tag":48,"props":13818,"children":13819},{},[13820],{"type":25,"value":13821},"加速靶点蛋白结构解析",{"type":20,"tag":48,"props":13823,"children":13824},{},[13825],{"type":25,"value":13826},"辅助药物分子设计",{"type":20,"tag":48,"props":13828,"children":13829},{},[13830],{"type":25,"value":13831},"帮助理解疾病机制",{"type":20,"tag":1863,"props":13833,"children":13835},{"id":13834},"学习资源",[13836],{"type":25,"value":13834},{"type":20,"tag":44,"props":13838,"children":13839},{},[13840,13850],{"type":20,"tag":48,"props":13841,"children":13842},{},[13843],{"type":20,"tag":101,"props":13844,"children":13847},{"href":13845,"rel":13846},"https:\u002F\u002Fwww.nature.com\u002Farticles\u002Fs41586-021-03819-2",[105],[13848],{"type":25,"value":13849},"AlphaFold 论文",{"type":20,"tag":48,"props":13851,"children":13852},{},[13853],{"type":20,"tag":101,"props":13854,"children":13857},{"href":13855,"rel":13856},"https:\u002F\u002Falphafold.ebi.ac.uk\u002F",[105],[13858],{"type":25,"value":13859},"AlphaFold DB",{"title":8,"searchDepth":169,"depth":169,"links":13861},[13862,13863,13864,13865,13866],{"id":13719,"depth":169,"text":13719},{"id":13729,"depth":169,"text":13732},{"id":13768,"depth":169,"text":13768},{"id":13811,"depth":169,"text":13811},{"id":13834,"depth":169,"text":13834},"content:articles:ai:alphafold-intro.md","articles\u002Fai\u002Falphafold-intro.md","articles\u002Fai\u002Falphafold-intro",{"_path":13871,"_dir":13872,"_draft":7,"_partial":7,"_locale":8,"title":13873,"description":13874,"date":13875,"tags":13876,"body":13877,"_type":1800,"_id":14320,"_source":1802,"_file":14321,"_stem":14322,"_extension":1805},"\u002Farticles\u002Fagent\u002Flangchainrag","agent","LangChain 实现 RAG 检索增强问答系统：两种 Agent 方案详解","基于 LangChain 最新 API，完整实现 RAG 智能检索问答系统，涵盖大模型配置、文档处理、向量入库及工具调用型与上下文注入型两种 Agent 方案的构建与选型。","2026-03-25",[15],{"type":17,"children":13878,"toc":14297},[13879,13884,13890,13898,13901,13907,13929,13935,13943,13949,13957,13963,13971,13974,13980,13985,13991,13999,14005,14013,14019,14027,14030,14036,14048,14053,14059,14064,14076,14084,14090,14098,14101,14107,14112,14131,14139,14145,14153,14156,14162,14168,14191,14197,14253,14256,14261,14266,14271,14284],{"type":20,"tag":21,"props":13880,"children":13881},{},[13882],{"type":25,"value":13883},"✨ 本文代码均为可直接运行的完整代码，基于LangChain最新版API编写，无过时语法，放心食用～",{"type":20,"tag":1863,"props":13885,"children":13887},{"id":13886},"一安装项目依赖包",[13888],{"type":25,"value":13889},"✅ 一、安装项目依赖包",{"type":20,"tag":126,"props":13891,"children":13893},{"code":13892},"# 安装所有核心依赖，一行命令完成配置\npip install langchain langchain-text-splitters langchain-community bs4 python-dotenv\n",[13894],{"type":20,"tag":84,"props":13895,"children":13896},{"__ignoreMap":8},[13897],{"type":25,"value":13892},{"type":20,"tag":5056,"props":13899,"children":13900},{},[],{"type":20,"tag":1863,"props":13902,"children":13904},{"id":13903},"二初始化三大核心组件核心配置",[13905],{"type":25,"value":13906},"✅ 二、初始化三大核心组件（核心配置）",{"type":20,"tag":21,"props":13908,"children":13909},{},[13910,13912,13917,13918,13923,13924],{"type":25,"value":13911},"构建RAG Agent的核心三要素：",{"type":20,"tag":33,"props":13913,"children":13914},{},[13915],{"type":25,"value":13916},"对话大模型",{"type":25,"value":965},{"type":20,"tag":33,"props":13919,"children":13920},{},[13921],{"type":25,"value":13922},"文本嵌入模型",{"type":25,"value":965},{"type":20,"tag":33,"props":13925,"children":13926},{},[13927],{"type":25,"value":13928},"向量存储器",{"type":20,"tag":28,"props":13930,"children":13932},{"id":13931},"_1-配置大语言模型llm-对话生成核心",[13933],{"type":25,"value":13934},"1. 配置大语言模型（LLM）- 对话生成核心",{"type":20,"tag":126,"props":13936,"children":13938},{"code":13937},"# 导入对话模型及环境变量配置依赖\nfrom langchain_openai import ChatOpenAI\nimport os\nfrom dotenv import load_dotenv\n\n# 加载.env文件中的环境变量（私密密钥管理，规范开发）\nload_dotenv()\n\n# 配置通义千问大模型（qwen-max）参数\nmodel_name = \"qwen-max\"\napi_key = os.getenv(\"DASHSCOPE_API_KEY\")\nbase_url = os.getenv(\"DASHSCOPE_BASE_URL\")\n\n# 初始化聊天模型：低随机性保证回答严谨，适配知识类问答场景\nmodel = ChatOpenAI(\n    model=model_name,\n    api_key=api_key,\n    base_url=base_url,\n    temperature=0.1,  # 温度值越低，回答越精准、确定性越强\n)\n",[13939],{"type":20,"tag":84,"props":13940,"children":13941},{"__ignoreMap":8},[13942],{"type":25,"value":13937},{"type":20,"tag":28,"props":13944,"children":13946},{"id":13945},"_2-配置文本嵌入模型-文本向量化核心",[13947],{"type":25,"value":13948},"2. 配置文本嵌入模型 - 文本向量化核心",{"type":20,"tag":126,"props":13950,"children":13952},{"code":13951},"# 导入HuggingFace嵌入模型\nfrom langchain_huggingface import HuggingFaceEmbeddings\n\n# 初始化嵌入模型，行业主流轻量级高质量选型\n# 特点：文本表征能力强、适配中文+英文，首次运行自动缓存至本地，无需重复下载\nembeddings = HuggingFaceEmbeddings(model_name=\"sentence-transformers\u002Fall-mpnet-base-v2\")\n",[13953],{"type":20,"tag":84,"props":13954,"children":13955},{"__ignoreMap":8},[13956],{"type":25,"value":13951},{"type":20,"tag":28,"props":13958,"children":13960},{"id":13959},"_3-配置向量存储器-向量数据存储核心",[13961],{"type":25,"value":13962},"3. 配置向量存储器 - 向量数据存储核心",{"type":20,"tag":126,"props":13964,"children":13966},{"code":13965},"# 导入内存级向量存储库\nfrom langchain_core.vectorstores import InMemoryVectorStore\n\n# 初始化内存向量库，轻量化无部署，无需持久化磁盘，适合快速开发\u002F演示场景\n# 绑定已初始化的嵌入模型，实现文本-向量的自动转换与匹配\nvector_store = InMemoryVectorStore(embeddings)\n",[13967],{"type":20,"tag":84,"props":13968,"children":13969},{"__ignoreMap":8},[13970],{"type":25,"value":13965},{"type":20,"tag":5056,"props":13972,"children":13973},{},[],{"type":20,"tag":1863,"props":13975,"children":13977},{"id":13976},"三文档处理全流程加载-分片-入库构建检索知识库",[13978],{"type":25,"value":13979},"✅ 三、文档处理全流程：加载 → 分片 → 入库（构建检索知识库）",{"type":20,"tag":21,"props":13981,"children":13982},{},[13983],{"type":25,"value":13984},"RAG核心前置步骤：将非结构化的网页文本，处理为结构化的向量知识库，共分3步完成，流程标准化且可复用",{"type":20,"tag":28,"props":13986,"children":13988},{"id":13987},"_1-文档加载精准爬取网页核心内容",[13989],{"type":25,"value":13990},"1. 文档加载：精准爬取网页核心内容",{"type":20,"tag":126,"props":13992,"children":13994},{"code":13993},"# 导入网页加载器及网页解析依赖\nimport bs4\nfrom langchain_community.document_loaders import WebBaseLoader\n\n# 网页解析规则：只提取指定class的核心内容（标题\u002F头部\u002F正文），过滤冗余HTML标签，提升数据质量\nbs4_strainer = bs4.SoupStrainer(class_=(\"post-title\", \"post-header\", \"post-content\"))\n\n# 初始化网页加载器，指定爬取路径+解析规则\nloader = WebBaseLoader(\n    web_paths=(\"https:\u002F\u002Flilianweng.github.io\u002Fposts\u002F2023-06-23-agent\u002F\",),\n    bs_kwargs={\"parse_only\": bs4_strainer},\n)\n\n# 加载网页文档至上下文\ndocs = loader.load()\n\n# 校验加载结果：确保成功加载1篇文档\nassert len(docs) == 1\n# 输出文档总字符数，直观查看文本体量\nprint(f\"✅ 文档加载完成，总字符数：{len(docs[0].page_content)}\")\n",[13995],{"type":20,"tag":84,"props":13996,"children":13997},{"__ignoreMap":8},[13998],{"type":25,"value":13993},{"type":20,"tag":28,"props":14000,"children":14002},{"id":14001},"_2-文档分片最优策略切割文本保留上下文关联",[14003],{"type":25,"value":14004},"2. 文档分片：最优策略切割文本，保留上下文关联",{"type":20,"tag":126,"props":14006,"children":14008},{"code":14007},"# 导入递归字符分割器\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\n\n# 初始化文本分割器，采用行业最优的递归分割策略\ntext_splitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000,        # 单个文本块最大字符数，适配嵌入模型输入长度限制\n    chunk_overlap=200,      # 相邻文本块重叠字符数，避免关键信息被截断，保留上下文关联性\n    add_start_index=True,   # 记录文本块在原始文档中的起始索引，便于溯源匹配内容\n)\n\n# 对加载的文档进行分片处理\nall_splits = text_splitter.split_documents(docs)\n\n# 输出分片结果\nprint(f\"✅ 文档分片完成，原始文档切分为 {len(all_splits)} 个子文档\")\n",[14009],{"type":20,"tag":84,"props":14010,"children":14011},{"__ignoreMap":8},[14012],{"type":25,"value":14007},{"type":20,"tag":28,"props":14014,"children":14016},{"id":14015},"_3-向量入库将分片文本存入向量库完成知识库构建",[14017],{"type":25,"value":14018},"3. 向量入库：将分片文本存入向量库，完成知识库构建",{"type":20,"tag":126,"props":14020,"children":14022},{"code":14021},"# 将所有文本分片存入向量存储器，自动完成「文本→向量」转换+存储\ndocument_ids = vector_store.add_documents(documents=all_splits)\n\n# 预览前3个文本块的唯一标识ID\nprint(f\"✅ 向量入库完成，文本块ID预览：{document_ids[:3]}\")\n",[14023],{"type":20,"tag":84,"props":14024,"children":14025},{"__ignoreMap":8},[14026],{"type":25,"value":14021},{"type":20,"tag":5056,"props":14028,"children":14029},{},[],{"type":20,"tag":1863,"props":14031,"children":14033},{"id":14032},"四核心实现构建-rag-agent-检索问答智能体两种主流方案",[14034],{"type":25,"value":14035},"✅ 四、核心实现：构建 RAG Agent 检索问答智能体（两种主流方案）",{"type":20,"tag":21,"props":14037,"children":14038},{},[14039,14041,14046],{"type":25,"value":14040},"RAG的核心价值：让大模型结合",{"type":20,"tag":33,"props":14042,"children":14043},{},[14044],{"type":25,"value":14045},"外部知识库",{"type":25,"value":14047},"回答问题，解决大模型「知识过时、事实性错误、领域知识不足」的痛点；",{"type":20,"tag":21,"props":14049,"children":14050},{},[14051],{"type":25,"value":14052},"以下提供两种工业界主流的RAG Agent实现方案，按需选择即可，均为可直接运行的最优写法",{"type":20,"tag":28,"props":14054,"children":14056},{"id":14055},"方案一工具调用型-rag-agent推荐",[14057],{"type":25,"value":14058},"✅ 方案一：工具调用型 RAG Agent（推荐）",{"type":20,"tag":11085,"props":14060,"children":14062},{"id":14061},"核心逻辑",[14063],{"type":25,"value":14061},{"type":20,"tag":21,"props":14065,"children":14066},{},[14067,14069,14074],{"type":25,"value":14068},"自定义检索工具，让大模型",{"type":20,"tag":33,"props":14070,"children":14071},{},[14072],{"type":25,"value":14073},"自主决策是否调用检索工具",{"type":25,"value":14075},"，并基于检索到的上下文生成答案，具备「工具调用思维」，适配复杂多轮问答\u002F多步骤查询场景，灵活性拉满。",{"type":20,"tag":126,"props":14077,"children":14079},{"code":14078},"# 导入工具装饰器，封装自定义检索工具\nfrom langchain.tools import tool\n\n# 封装检索工具：返回检索到的上下文内容+原始文档对象，指定返回格式规范\n@tool(response_format=\"content_and_artifact\")\ndef retrieve_context(query: str):\n    \"\"\"核心检索工具：根据用户查询语句，从向量库中检索相关上下文信息，辅助回答问题\"\"\"\n    # 相似度检索：返回匹配度最高的2条文本内容（k值可按需调整）\n    retrieved_docs = vector_store.similarity_search(query, k=2)\n    # 格式化拼接检索结果：带上元数据+文本内容，提升大模型理解效率\n    serialized_context = \"\\n\\n\".join(\n        (f\"Source: {doc.metadata}\\nContent: {doc.page_content}\")\n        for doc in retrieved_docs\n    )\n    # 返回格式化文本 + 原始文档，兼顾可读性与溯源性\n    return serialized_context, retrieved_docs\n\n# 构建工具调用型智能体\nfrom langchain.agents import create_agent\n\n# 配置智能体核心参数：绑定大模型+检索工具+系统提示词\ntools = [retrieve_context]\n# 系统提示词：明确智能体能力边界与行为准则，精准引导大模型调用工具\nsystem_prompt = (\n    \"你是一个专业的问答助手，你可以调用检索工具获取外部知识库的上下文信息。\\n\"\n    \"请务必使用检索工具辅助回答用户的查询问题，确保答案的准确性和事实性。\"\n)\n# 初始化工具调用型RAG Agent\nagent = create_agent(model, tools, system_prompt=system_prompt)\n",[14080],{"type":20,"tag":84,"props":14081,"children":14082},{"__ignoreMap":8},[14083],{"type":25,"value":14078},{"type":20,"tag":11085,"props":14085,"children":14087},{"id":14086},"测试复杂多步骤查询智能体自主调用工具",[14088],{"type":25,"value":14089},"✅ 测试：复杂多步骤查询（智能体自主调用工具）",{"type":20,"tag":126,"props":14091,"children":14093},{"code":14092},"# 测试提问：多步骤复杂查询，考验智能体的工具调用能力与逻辑推理能力\nquery = (\n    \"What is the standard method for Task Decomposition?\\n\\n\"\n    \"Once you get the answer, look up common extensions of that method.\"\n)\n\n# 流式输出回答结果，实时查看智能体的思考+回答过程（体验更佳）\nprint(\"===== 工具调用型RAG Agent 回答结果 =====\")\nfor event in agent.stream(\n    {\"messages\": [{\"role\": \"user\", \"content\": query}]},\n    stream_mode=\"values\",\n):\n    event[\"messages\"][-1].pretty_print()\n",[14094],{"type":20,"tag":84,"props":14095,"children":14096},{"__ignoreMap":8},[14097],{"type":25,"value":14092},{"type":20,"tag":5056,"props":14099,"children":14100},{},[],{"type":20,"tag":28,"props":14102,"children":14104},{"id":14103},"方案二上下文注入型-rag-agent极简高效",[14105],{"type":25,"value":14106},"✅ 方案二：上下文注入型 RAG Agent（极简高效）",{"type":20,"tag":11085,"props":14108,"children":14110},{"id":14109},"核心逻辑-1",[14111],{"type":25,"value":14061},{"type":20,"tag":21,"props":14113,"children":14114},{},[14115,14117,14122,14124,14129],{"type":25,"value":14116},"通过",{"type":20,"tag":33,"props":14118,"children":14119},{},[14120],{"type":25,"value":14121},"中间件(middleware)",{"type":25,"value":14123}," 实现「全自动检索+上下文注入」，无需显式定义工具，智能体会在回答前",{"type":20,"tag":33,"props":14125,"children":14126},{},[14127],{"type":25,"value":14128},"自动检索",{"type":25,"value":14130},"并将上下文注入到系统提示词中，全程无感调用，代码极简、运行高效，适配简单单轮问答场景。",{"type":20,"tag":126,"props":14132,"children":14134},{"code":14133},"# 构建上下文注入型智能体\nfrom langchain.agents.middleware import dynamic_prompt, ModelRequest\n\n# 定义动态提示词中间件：自动检索+注入上下文，无感知完成检索逻辑\n@dynamic_prompt\ndef prompt_with_context(request: ModelRequest) -> str:\n    \"\"\"核心中间件：从请求中提取用户最新问题，检索相关上下文并注入系统提示词\"\"\"\n    # 提取用户最新的查询语句\n    last_query = request.state[\"messages\"][-1].text\n    # 自动执行相似度检索，获取相关上下文\n    retrieved_docs = vector_store.similarity_search(last_query)\n    # 格式化拼接检索到的文本内容\n    docs_content = \"\\n\\n\".join(doc.page_content for doc in retrieved_docs)\n    # 构造带上下文的系统提示词，让大模型基于外部知识回答\n    system_message = (\n        \"你是一个专业且乐于助人的问答助手，请严格基于下方提供的上下文信息回答用户问题：\\n\\n\"\n        f\"{docs_content}\"\n    )\n    return system_message\n\n# 初始化上下文注入型RAG Agent：无需传入工具，中间件自动完成检索逻辑\nagent = create_agent(model, tools=[], middleware=[prompt_with_context])\n",[14135],{"type":20,"tag":84,"props":14136,"children":14137},{"__ignoreMap":8},[14138],{"type":25,"value":14133},{"type":20,"tag":11085,"props":14140,"children":14142},{"id":14141},"测试基础单轮查询极简高效",[14143],{"type":25,"value":14144},"✅ 测试：基础单轮查询（极简高效）",{"type":20,"tag":126,"props":14146,"children":14148},{"code":14147},"# 测试提问：基础单轮查询，验证上下文注入效果\nquery = \"What is task decomposition?\"\n\n# 流式输出回答结果\nprint(\"\\n===== 上下文注入型RAG Agent 回答结果 =====\")\nfor step in agent.stream(\n    {\"messages\": [{\"role\": \"user\", \"content\": query}]},\n    stream_mode=\"values\",\n):\n    step[\"messages\"][-1].pretty_print()\n",[14149],{"type":20,"tag":84,"props":14150,"children":14151},{"__ignoreMap":8},[14152],{"type":25,"value":14147},{"type":20,"tag":5056,"props":14154,"children":14155},{},[],{"type":20,"tag":1863,"props":14157,"children":14159},{"id":14158},"核心知识点补充",[14160],{"type":25,"value":14161},"✨ 核心知识点补充",{"type":20,"tag":28,"props":14163,"children":14165},{"id":14164},"两种agent方案对比-选型建议",[14166],{"type":25,"value":14167},"✅ 两种Agent方案对比 & 选型建议",{"type":20,"tag":5719,"props":14169,"children":14170},{},[14171,14181],{"type":20,"tag":48,"props":14172,"children":14173},{},[14174,14179],{"type":20,"tag":33,"props":14175,"children":14176},{},[14177],{"type":25,"value":14178},"工具调用型（方案一）",{"type":25,"value":14180}," ：适合「复杂查询、多轮问答、多步骤推理」场景，大模型自主决策是否调用工具，灵活性强，是工业界主流方案；",{"type":20,"tag":48,"props":14182,"children":14183},{},[14184,14189],{"type":20,"tag":33,"props":14185,"children":14186},{},[14187],{"type":25,"value":14188},"上下文注入型（方案二）",{"type":25,"value":14190}," ：适合「简单单轮问答、快速开发」场景，代码量少、无感知检索，开发效率高，但灵活性稍弱。",{"type":20,"tag":28,"props":14192,"children":14194},{"id":14193},"核心优化点说明",[14195],{"type":25,"value":14196},"✅ 核心优化点说明",{"type":20,"tag":5719,"props":14198,"children":14199},{},[14200,14218,14229,14242],{"type":20,"tag":48,"props":14201,"children":14202},{},[14203,14209,14211,14216],{"type":20,"tag":84,"props":14204,"children":14206},{"className":14205},[],[14207],{"type":25,"value":14208},"temperature=0.1",{"type":25,"value":14210},"：低温度值保证回答的",{"type":20,"tag":33,"props":14212,"children":14213},{},[14214],{"type":25,"value":14215},"精准性和确定性",{"type":25,"value":14217},"，适配知识类问答场景，避免生成无关内容；",{"type":20,"tag":48,"props":14219,"children":14220},{},[14221,14227],{"type":20,"tag":84,"props":14222,"children":14224},{"className":14223},[],[14225],{"type":25,"value":14226},"chunk_overlap=200",{"type":25,"value":14228},"：文本块重叠设计，彻底解决「关键信息被截断」的问题，提升检索召回率；",{"type":20,"tag":48,"props":14230,"children":14231},{},[14232,14234,14240],{"type":25,"value":14233},"流式输出",{"type":20,"tag":84,"props":14235,"children":14237},{"className":14236},[],[14238],{"type":25,"value":14239},"stream()",{"type":25,"value":14241},"：实时返回回答内容，提升用户体验，避免长时间等待；",{"type":20,"tag":48,"props":14243,"children":14244},{},[14245,14251],{"type":20,"tag":84,"props":14246,"children":14248},{"className":14247},[],[14249],{"type":25,"value":14250},"InMemoryVectorStore",{"type":25,"value":14252},"：轻量化向量库，无需部署、无需持久化，适合快速开发和演示，生产环境可替换为Chroma\u002FPinecone等持久化向量库。",{"type":20,"tag":5056,"props":14254,"children":14255},{},[],{"type":20,"tag":28,"props":14257,"children":14258},{"id":10044},[14259],{"type":25,"value":14260},"✨ 总结",{"type":20,"tag":21,"props":14262,"children":14263},{},[14264],{"type":25,"value":14265},"本文完整实现了基于LangChain的RAG Agent智能检索问答系统，从「依赖安装→组件配置→文档处理→智能体构建→测试验证」全流程闭环，代码可直接复制运行，两种主流方案全覆盖，适配不同业务场景。RAG作为LLM落地的核心技术之一，该套代码可无缝迁移至PDF\u002F文档\u002F本地知识库等场景，实用性拉满。",{"type":20,"tag":28,"props":14267,"children":14269},{"id":14268},"代码仓库",[14270],{"type":25,"value":14268},{"type":20,"tag":21,"props":14272,"children":14273},{},[14274,14276],{"type":25,"value":14275},"gitee：",{"type":20,"tag":101,"props":14277,"children":14281},{"href":14278,"rel":14279,"title":14280},"https:\u002F\u002Flink.juejin.cn\u002F?target=https%3A%2F%2Fgitee.com%2Fo_insist%2Flangchain1.0_learn.git",[105],"https:\u002F\u002Fgitee.com\u002Fo_insist\u002Flangchain1.0_learn.git",[14282],{"type":25,"value":14283},"gitee.com\u002Fo_insist\u002Fla…",{"type":20,"tag":21,"props":14285,"children":14286},{},[14287,14289],{"type":25,"value":14288},"github：",{"type":20,"tag":101,"props":14290,"children":14294},{"href":14291,"rel":14292,"title":14293},"https:\u002F\u002Flink.juejin.cn\u002F?target=https%3A%2F%2Fgithub.com%2Fo-insist%2Flangchain1.0_learn.git",[105],"https:\u002F\u002Fgithub.com\u002Fo-insist\u002Flangchain1.0_learn.git",[14295],{"type":25,"value":14296},"github.com\u002Fo-insist\u002Fla…",{"title":8,"searchDepth":169,"depth":169,"links":14298},[14299,14300,14305,14310,14314],{"id":13886,"depth":169,"text":13889},{"id":13903,"depth":169,"text":13906,"children":14301},[14302,14303,14304],{"id":13931,"depth":179,"text":13934},{"id":13945,"depth":179,"text":13948},{"id":13959,"depth":179,"text":13962},{"id":13976,"depth":169,"text":13979,"children":14306},[14307,14308,14309],{"id":13987,"depth":179,"text":13990},{"id":14001,"depth":179,"text":14004},{"id":14015,"depth":179,"text":14018},{"id":14032,"depth":169,"text":14035,"children":14311},[14312,14313],{"id":14055,"depth":179,"text":14058},{"id":14103,"depth":179,"text":14106},{"id":14158,"depth":169,"text":14161,"children":14315},[14316,14317,14318,14319],{"id":14164,"depth":179,"text":14167},{"id":14193,"depth":179,"text":14196},{"id":10044,"depth":179,"text":14260},{"id":14268,"depth":179,"text":14268},"content:articles:agent:langchain实现RAG问答系统.md","articles\u002Fagent\u002Flangchain实现RAG问答系统.md","articles\u002Fagent\u002Flangchain实现RAG问答系统",{"_path":14324,"_dir":13872,"_draft":7,"_partial":7,"_locale":8,"title":14325,"description":14326,"date":14327,"tags":14328,"body":14329,"_type":1800,"_id":14534,"_source":1802,"_file":14535,"_stem":14536,"_extension":1805},"\u002Farticles\u002Fagent\u002Flangchainpdf","LangChain 实现 PDF 检索：从文档加载到向量查询的完整流程","基于 LangChain 框架，完整讲解 PDF 文档加载、文本分片、向量转换、Chroma 向量库存储及多种检索方式的实现方法。","2026-03-23",[15],{"type":17,"children":14330,"toc":14521},[14331,14337,14342,14350,14356,14361,14369,14375,14380,14388,14394,14399,14407,14413,14418,14424,14429,14437,14443,14448,14456,14462,14467,14475,14481,14486,14494,14498,14507,14516],{"type":20,"tag":1863,"props":14332,"children":14334},{"id":14333},"一文档加载读取-pdf-内容至上下文",[14335],{"type":25,"value":14336},"一、文档加载：读取 PDF 内容至上下文",{"type":20,"tag":21,"props":14338,"children":14339},{},[14340],{"type":25,"value":14341},"通过 PyPDFLoader 加载目标 PDF 文件，将文档内容载入程序上下文，为后续处理奠定基础。加载后可查看文档页数及首页核心信息，快速验证加载效果。",{"type":20,"tag":126,"props":14343,"children":14345},{"code":14344},"from langchain_community.document_loaders import PyPDFLoader\n​\n# 定义 PDF 文件路径（请根据实际场景调整）\nfile_path = \".\u002Fstatic\u002F26考研考点排查表.pdf\"\n# 初始化 PDF 加载器\nloader = PyPDFLoader(file_path)\n​\n# 加载文档内容至上下文\ndocs = loader.load()\n​\n# 验证加载结果：输出文档页数、首页前200字符内容及元数据\nprint(f\"文档总页数：{len(docs)}\")\nprint(f\"首页内容预览（前200字符）：\\n{docs[0].page_content[:200]}\\n\")\nprint(f\"首页元数据：{docs[0].metadata}\")\n",[14346],{"type":20,"tag":84,"props":14347,"children":14348},{"__ignoreMap":8},[14349],{"type":25,"value":14344},{"type":20,"tag":1863,"props":14351,"children":14353},{"id":14352},"二文档分片合理切割文本保留上下文关联",[14354],{"type":25,"value":14355},"二、文档分片：合理切割文本，保留上下文关联",{"type":20,"tag":21,"props":14357,"children":14358},{},[14359],{"type":25,"value":14360},"为适配向量模型的输入长度限制，同时避免割裂关键信息，采用递归字符分割策略：将文档切割为 1000 字符\u002F块的文本片段，且相邻块保留 200 字符重叠。这种重叠设计能有效降低重要表述与关联上下文被拆分的风险，保障后续检索的准确性。",{"type":20,"tag":126,"props":14362,"children":14364},{"code":14363},"from langchain_text_splitters import RecursiveCharacterTextSplitter\n​\n# 初始化文本分割器，配置分片参数\ntext_splitter = RecursiveCharacterTextSplitter(\n    chunk_size=1000,  # 单个文本块的最大字符数\n    chunk_overlap=200,  # 相邻文本块的重叠字符数\n    add_start_index=True  # 为每个块添加原始文档中的起始索引，便于溯源\n)\n​\n# 对加载的文档进行分片处理\nall_splits = text_splitter.split_documents(docs)\n​\n# 预览分片结果（仅展示前3块，避免大量文本输出）\nprint(\"=== 文本分片结果预览（前3个块） ===\")\nfor i, chunk in enumerate(all_splits[:3]):\n    print(f\"块 #{i+1} | 字符长度: {len(chunk.page_content)} | 内容预览: {chunk.page_content[:50]}{'...' if len(chunk.page_content) > 50 else ''}\")\nprint(f\"\\n文档分片完成，总块数：{len(all_splits)}\")\n",[14365],{"type":20,"tag":84,"props":14366,"children":14367},{"__ignoreMap":8},[14368],{"type":25,"value":14363},{"type":20,"tag":1863,"props":14370,"children":14372},{"id":14371},"三向量转换将文本片段转为数值向量",[14373],{"type":25,"value":14374},"三、向量转换：将文本片段转为数值向量",{"type":20,"tag":21,"props":14376,"children":14377},{},[14378],{"type":25,"value":14379},"文本属于非结构化数据，无法直接用于相似度匹配。通过 Hugging Face 提供的预训练嵌入模型，将分割后的文本块转换为固定长度的数值向量，实现非结构化文本的结构化表征。此处选用 sentence-transformers\u002Fall-mpnet-base-v2 模型，兼顾向量表征效果与通用性。",{"type":20,"tag":126,"props":14381,"children":14383},{"code":14382},"from langchain_huggingface import HuggingFaceEmbeddings\n​\n# 初始化嵌入模型（首次执行会自动从 Hugging Face Hub 下载至本地缓存，默认路径：～\u002F.cache\u002Fhuggingface\u002Fhub）\nembeddings = HuggingFaceEmbeddings(model_name=\"sentence-transformers\u002Fall-mpnet-base-v2\")\n​\n# 测试向量生成：对前2个文本块进行嵌入转换\nvector_1 = embeddings.embed_query(all_splits[0].page_content)\nvector_2 = embeddings.embed_query(all_splits[1].page_content)\n​\n# 验证向量一致性：同一模型生成的向量长度必须相同\nassert len(vector_1) == len(vector_2)\nprint(f\"向量生成完成，单个向量长度：{len(vector_1)}\\n\")\nprint(f\"第一个向量预览（前10个元素）：{vector_1[:10]}\")\n",[14384],{"type":20,"tag":84,"props":14385,"children":14386},{"__ignoreMap":8},[14387],{"type":25,"value":14382},{"type":20,"tag":1863,"props":14389,"children":14391},{"id":14390},"四向量存储将向量与文本关联存入数据库",[14392],{"type":25,"value":14393},"四、向量存储：将向量与文本关联存入数据库",{"type":20,"tag":21,"props":14395,"children":14396},{},[14397],{"type":25,"value":14398},"将生成的文本向量与其对应的原始文本块关联存储，便于后续快速检索。此处选用轻量级向量数据库 Chroma，支持本地持久化存储，无需复杂的服务部署，适合快速验证和小规模应用场景。",{"type":20,"tag":126,"props":14400,"children":14402},{"code":14401},"from langchain_chroma import Chroma\n​\n# 初始化 Chroma 向量数据库\nvector_store = Chroma(\n    collection_name=\"example_collection\",  # 向量集合名称，便于区分不同文档\n    embedding_function=embeddings,  # 关联嵌入模型\n    persist_directory=\".\u002Fchroma_langchain_db\"  # 本地持久化存储路径（可选，删除则仅存于内存）\n)\n​\n# 将所有文本块及其向量存入数据库，并返回各块的唯一ID\nids = vector_store.add_documents(documents=all_splits)\nprint(f\"向量存储完成，共存入 {len(ids)} 个文本块的向量数据\")\n",[14403],{"type":20,"tag":84,"props":14404,"children":14405},{"__ignoreMap":8},[14406],{"type":25,"value":14401},{"type":20,"tag":1863,"props":14408,"children":14410},{"id":14409},"五多样检索基于向量相似度的灵活查询",[14411],{"type":25,"value":14412},"五、多样检索：基于向量相似度的灵活查询",{"type":20,"tag":21,"props":14414,"children":14415},{},[14416],{"type":25,"value":14417},"向量数据库的核心价值在于通过向量相似度匹配，快速定位与查询需求相关的文本内容。以下提供 4 种常用检索方式，适配不同业务场景（如同步\u002F异步、是否需要相似度分数等）。",{"type":20,"tag":28,"props":14419,"children":14421},{"id":14420},"_1-基础文本检索根据查询字符串返回相似文档",[14422],{"type":25,"value":14423},"1. 基础文本检索：根据查询字符串返回相似文档",{"type":20,"tag":21,"props":14425,"children":14426},{},[14427],{"type":25,"value":14428},"直接输入查询文本（如“数一”），数据库自动将其转为向量，再匹配相似度最高的文档并返回。",{"type":20,"tag":126,"props":14430,"children":14432},{"code":14431},"# 输入查询文本，检索相似文档\nresults = vector_store.similarity_search(\"数一\")\n​\n# 输出相似度最高的文档内容\nprint(\"=== 基础文本检索结果（相似度最高） ===\")\nprint(results[0])\n",[14433],{"type":20,"tag":84,"props":14434,"children":14435},{"__ignoreMap":8},[14436],{"type":25,"value":14431},{"type":20,"tag":28,"props":14438,"children":14440},{"id":14439},"_2-异步文本检索非阻塞查询支持并行任务",[14441],{"type":25,"value":14442},"2. 异步文本检索：非阻塞查询，支持并行任务",{"type":20,"tag":21,"props":14444,"children":14445},{},[14446],{"type":25,"value":14447},"采用异步方式执行检索，不阻塞主线程，可在检索过程中并行处理其他任务，提升程序执行效率，适合高并发场景。",{"type":20,"tag":126,"props":14449,"children":14451},{"code":14450},"# 异步检索（需在异步函数中执行，或使用异步环境）\nresults = await vector_store.asimilarity_search(\"数一\")\n​\n# 输出相似度最高的文档内容\nprint(\"=== 异步文本检索结果（相似度最高） ===\")\nprint(results[0])\n",[14452],{"type":20,"tag":84,"props":14453,"children":14454},{"__ignoreMap":8},[14455],{"type":25,"value":14450},{"type":20,"tag":28,"props":14457,"children":14459},{"id":14458},"_3-带相似度分数的检索量化匹配程度",[14460],{"type":25,"value":14461},"3. 带相似度分数的检索：量化匹配程度",{"type":20,"tag":21,"props":14463,"children":14464},{},[14465],{"type":25,"value":14466},"检索时返回相似文档及对应的相似度分数（该分数为距离度量，值越小表示相似度越高），可通过分数筛选符合阈值的结果，提升检索精准度。",{"type":20,"tag":126,"props":14468,"children":14470},{"code":14469},"# 检索相似文档并返回相似度分数\nresults = vector_store.similarity_search_with_score(\"数一\")\n​\n# 提取并输出Top1结果的分数和文档内容\ndoc, score = results[0]\nprint(\"=== 带相似度分数的检索结果 ===\")\nprint(f\"相似度分数（值越小越相似）：{score:.4f}\\n\")\nprint(f\"匹配文档内容：\\n{doc}\")\n",[14471],{"type":20,"tag":84,"props":14472,"children":14473},{"__ignoreMap":8},[14474],{"type":25,"value":14469},{"type":20,"tag":28,"props":14476,"children":14478},{"id":14477},"_4-向量直接检索基于预生成向量的精准匹配",[14479],{"type":25,"value":14480},"4. 向量直接检索：基于预生成向量的精准匹配",{"type":20,"tag":21,"props":14482,"children":14483},{},[14484],{"type":25,"value":14485},"若已提前生成查询文本的向量，可直接传入向量进行检索，跳过数据库内部的向量转换步骤，进一步提升检索速度。",{"type":20,"tag":126,"props":14487,"children":14489},{"code":14488},"# 先手动生成查询文本的向量\nquery_embedding = embeddings.embed_query(\"数一\")\n​\n# 直接传入向量进行相似检索\nresults = vector_store.similarity_search_by_vector(query_embedding)\n​\n# 输出相似度最高的文档内容\nprint(\"=== 向量直接检索结果（相似度最高） ===\")\nprint(results[0])\n",[14490],{"type":20,"tag":84,"props":14491,"children":14492},{"__ignoreMap":8},[14493],{"type":25,"value":14488},{"type":20,"tag":28,"props":14495,"children":14496},{"id":14268},[14497],{"type":25,"value":14268},{"type":20,"tag":21,"props":14499,"children":14500},{},[14501,14502],{"type":25,"value":14275},{"type":20,"tag":101,"props":14503,"children":14505},{"href":14280,"rel":14504},[105],[14506],{"type":25,"value":14280},{"type":20,"tag":21,"props":14508,"children":14509},{},[14510,14511],{"type":25,"value":14288},{"type":20,"tag":101,"props":14512,"children":14514},{"href":14293,"rel":14513},[105],[14515],{"type":25,"value":14293},{"type":20,"tag":21,"props":14517,"children":14518},{},[14519],{"type":25,"value":14520},"✨ 学习之路，循序渐进，持续更新中...",{"title":8,"searchDepth":169,"depth":169,"links":14522},[14523,14524,14525,14526,14527],{"id":14333,"depth":169,"text":14336},{"id":14352,"depth":169,"text":14355},{"id":14371,"depth":169,"text":14374},{"id":14390,"depth":169,"text":14393},{"id":14409,"depth":169,"text":14412,"children":14528},[14529,14530,14531,14532,14533],{"id":14420,"depth":179,"text":14423},{"id":14439,"depth":179,"text":14442},{"id":14458,"depth":179,"text":14461},{"id":14477,"depth":179,"text":14480},{"id":14268,"depth":179,"text":14268},"content:articles:agent:langchain实现pdf检索.md","articles\u002Fagent\u002Flangchain实现pdf检索.md","articles\u002Fagent\u002Flangchain实现pdf检索",{"_path":14538,"_dir":13872,"_draft":7,"_partial":7,"_locale":8,"title":14539,"description":14540,"date":14541,"tags":14542,"body":14543,"_type":1800,"_id":14854,"_source":1802,"_file":14855,"_stem":14856,"_extension":1805},"\u002Farticles\u002Fagent\u002Frag","RAG 入门：用检索增强生成解决上下文限制与幻觉","从分片、索引、Embedding、召回、重排到生成，通俗讲清 RAG 的完整工作流与核心价值，适合理解文档问答系统的基础原理。","2026-03-21",[15],{"type":17,"children":14544,"toc":14840},[14545,14550,14561,14567,14572,14595,14601,14606,14612,14623,14628,14641,14653,14679,14684,14690,14702,14707,14713,14718,14723,14729,14734,14739,14745,14750,14755,14761,14814,14820],{"type":20,"tag":21,"props":14546,"children":14547},{},[14548],{"type":25,"value":14549},"用大模型处理大量文件问答时，常遇到两个痛点：要么文件太多超出上下文窗口，要么模型瞎编答案（幻觉）",{"type":20,"tag":21,"props":14551,"children":14552},{},[14553,14555,14560],{"type":25,"value":14554},"而RAG（检索增强生成，Retrieval-Augmented Generation）就是解决这两个问题的“神器”。它的核心逻辑特别简单——",{"type":20,"tag":33,"props":14556,"children":14557},{},[14558],{"type":25,"value":14559},"不让大模型“瞎猜”，只给它“精准的参考资料”再答题",{"type":25,"value":110},{"type":20,"tag":1863,"props":14562,"children":14564},{"id":14563},"一核心对比正常问答-vs-rag问答",[14565],{"type":25,"value":14566},"一、核心对比：正常问答 vs RAG问答",{"type":20,"tag":21,"props":14568,"children":14569},{},[14570],{"type":25,"value":14571},"先通过两个场景，快速get RAG的价值：",{"type":20,"tag":44,"props":14573,"children":14574},{},[14575,14585],{"type":20,"tag":48,"props":14576,"children":14577},{},[14578,14583],{"type":20,"tag":33,"props":14579,"children":14580},{},[14581],{"type":25,"value":14582},"正常大模型问答",{"type":25,"value":14584},"：把所有文件 + 问题直接丢给大模型。 缺点：文件多了会超出上下文窗口（装不下），模型记不住细节就容易“编答案”，而且旧文件的知识无法及时更新。",{"type":20,"tag":48,"props":14586,"children":14587},{},[14588,14593],{"type":20,"tag":33,"props":14589,"children":14590},{},[14591],{"type":25,"value":14592},"RAG问答",{"type":25,"value":14594},"：先筛选出和问题相关的文件片段，再把“相关片段 + 问题”交给大模型。 优点：精准投喂核心信息，既解决上下文超限问题，又大幅降低幻觉，还能通过更新文件实现知识实时迭代。",{"type":20,"tag":1863,"props":14596,"children":14598},{"id":14597},"二rag关键名词拆解通俗版",[14599],{"type":25,"value":14600},"二、RAG关键名词拆解（通俗版）",{"type":20,"tag":21,"props":14602,"children":14603},{},[14604],{"type":25,"value":14605},"RAG的核心逻辑靠“5个关键步骤”落地，先把每个步骤的核心概念讲明白：",{"type":20,"tag":28,"props":14607,"children":14609},{"id":14608},"_1-分片给文件分块既装得下又不碎",[14610],{"type":25,"value":14611},"1. 分片：给文件“分块”，既装得下又不碎",{"type":20,"tag":21,"props":14613,"children":14614},{},[14615,14617,14622],{"type":25,"value":14616},"简单说就是把大文件拆成小片段，拆分依据可以是",{"type":20,"tag":33,"props":14618,"children":14619},{},[14620],{"type":25,"value":14621},"长度、章节、页码",{"type":25,"value":110},{"type":20,"tag":21,"props":14624,"children":14625},{},[14626],{"type":25,"value":14627},"核心目的：① 适配大模型的上下文窗口（比如把10万字文档拆成500字\u002F段，避免超出模型上限）；② 保证片段语义完整（不能把一个完整句子从中间切开，否则后续检索会出错）。",{"type":20,"tag":28,"props":14629,"children":14631},{"id":14630},"_2-索引给片段建字典方便快速查找",[14632,14634,14639],{"type":25,"value":14633},"2. 索引：给片段",{"type":20,"tag":33,"props":14635,"children":14636},{},[14637],{"type":25,"value":14638},"建字典",{"type":25,"value":14640},"，方便快速查找",{"type":20,"tag":21,"props":14642,"children":14643},{},[14644,14646,14651],{"type":25,"value":14645},"这是RAG能",{"type":20,"tag":33,"props":14647,"children":14648},{},[14649],{"type":25,"value":14650},"快速找相关片段",{"type":25,"value":14652},"的核心步骤，过程很简单：",{"type":20,"tag":21,"props":14654,"children":14655},{},[14656,14658,14663,14665,14670,14672,14677],{"type":25,"value":14657},"通过embedding（嵌入）技术，把每个拆分后的文本片段转换成计算机能理解的“",{"type":20,"tag":33,"props":14659,"children":14660},{},[14661],{"type":25,"value":14662},"向量",{"type":25,"value":14664},"，再把",{"type":20,"tag":33,"props":14666,"children":14667},{},[14668],{"type":25,"value":14669},"原始片段文本 + 对应向量",{"type":25,"value":14671},"一起存到专门的",{"type":20,"tag":33,"props":14673,"children":14674},{},[14675],{"type":25,"value":14676},"向量数据库",{"type":25,"value":14678},"里。",{"type":20,"tag":21,"props":14680,"children":14681},{},[14682],{"type":25,"value":14683},"类比：就像给书籍建索引目录，后续找相关内容不用逐页翻，直接查索引就行。",{"type":20,"tag":28,"props":14685,"children":14687},{"id":14686},"_3-embedding文本的数字身份证",[14688],{"type":25,"value":14689},"3. Embedding：文本的“数字身份证”",{"type":20,"tag":21,"props":14691,"children":14692},{},[14693,14695,14700],{"type":25,"value":14694},"简单说就是",{"type":20,"tag":33,"props":14696,"children":14697},{},[14698],{"type":25,"value":14699},"把文本转换成向量（一串数字）",{"type":25,"value":14701}," 的过程。",{"type":20,"tag":21,"props":14703,"children":14704},{},[14705],{"type":25,"value":14706},"核心逻辑：语义越相近的文本，转换成的向量越“像”（数字差异越小）。比如“猫喜欢吃鱼”和“猫咪爱吃鱼”的向量会非常接近。",{"type":20,"tag":28,"props":14708,"children":14710},{"id":14709},"_4-召回根据数字相似度找候选片段",[14711],{"type":25,"value":14712},"4. 召回：根据“数字相似度”找候选片段",{"type":20,"tag":21,"props":14714,"children":14715},{},[14716],{"type":25,"value":14717},"先把用户的问题也转换成向量，然后在向量数据库里，通过“向量相似性计算”（比如余弦相似度），快速找出和问题最相关的10个左右片段。",{"type":20,"tag":21,"props":14719,"children":14720},{},[14721],{"type":25,"value":14722},"这里有个小细节：召回会分“粗召回”和“精召回”——粗召回负责从海量片段里快速筛选出20个左右候选（追求速度），精召回再初步过滤掉不相关的，最终留下10个左右核心候选。",{"type":20,"tag":28,"props":14724,"children":14726},{"id":14725},"_5-重排给候选片段排优先级",[14727],{"type":25,"value":14728},"5. 重排：给候选片段“排优先级”",{"type":20,"tag":21,"props":14730,"children":14731},{},[14732],{"type":25,"value":14733},"在召回的10个片段里，用更精细的策略（比如更精准的语义匹配、关键词权重、片段在原文的位置等）重新排序，最终筛选出3个最相关的核心片段。",{"type":20,"tag":21,"props":14735,"children":14736},{},[14737],{"type":25,"value":14738},"核心目的：提升传给大模型的片段质量，减少“噪音”（无关信息），让大模型答题更精准。",{"type":20,"tag":28,"props":14740,"children":14742},{"id":14741},"_6-生成给大模型精准投喂再答题",[14743],{"type":25,"value":14744},"6. 生成：给大模型“精准投喂”再答题",{"type":20,"tag":21,"props":14746,"children":14747},{},[14748],{"type":25,"value":14749},"这是RAG的最后一步，也是落地的关键：把重排后的3个核心片段 + 原始问题，组合成一个清晰的提示词（Prompt），再传给大模型。",{"type":20,"tag":21,"props":14751,"children":14752},{},[14753],{"type":25,"value":14754},"示例提示词模板： “以下是与问题相关的参考资料：{重排后的3个片段}。请严格根据这些参考资料回答问题，不要编造信息。如果资料中没有相关答案，请直接回复‘暂无相关信息’。问题：{用户的原始问题}”",{"type":20,"tag":1863,"props":14756,"children":14758},{"id":14757},"三rag完整工作流",[14759],{"type":25,"value":14760},"三、RAG完整工作流",{"type":20,"tag":5719,"props":14762,"children":14763},{},[14764,14774,14784,14794,14804],{"type":20,"tag":48,"props":14765,"children":14766},{},[14767,14772],{"type":20,"tag":33,"props":14768,"children":14769},{},[14770],{"type":25,"value":14771},"第一步：分片",{"type":25,"value":14773},"：把10万字的论文\u002F文档，按“500字\u002F段+段落边界”拆成小片段，保证每个片段语义完整。",{"type":20,"tag":48,"props":14775,"children":14776},{},[14777,14782],{"type":20,"tag":33,"props":14778,"children":14779},{},[14780],{"type":25,"value":14781},"第二步：索引",{"type":25,"value":14783},"：用embedding工具把每个片段转成向量，和原始片段一起存到向量数据库（比如Chroma、FAISS），建好“检索索引”。",{"type":20,"tag":48,"props":14785,"children":14786},{},[14787,14792],{"type":20,"tag":33,"props":14788,"children":14789},{},[14790],{"type":25,"value":14791},"第三步：召回",{"type":25,"value":14793},"：用户问“这篇论文的核心创新点是什么？”，先把这个问题转成向量，在向量数据库里通过相似性计算，粗召回10个相关片段。",{"type":20,"tag":48,"props":14795,"children":14796},{},[14797,14802],{"type":20,"tag":33,"props":14798,"children":14799},{},[14800],{"type":25,"value":14801},"第四步：重排",{"type":25,"value":14803},"：用更精细的策略给10个片段排序，筛选出3个最贴近“核心创新点”的片段（比如包含“创新”“提出”等关键词的片段）。",{"type":20,"tag":48,"props":14805,"children":14806},{},[14807,14812],{"type":20,"tag":33,"props":14808,"children":14809},{},[14810],{"type":25,"value":14811},"第五步：生成",{"type":25,"value":14813},"：把这3个片段和用户问题组合成提示词，传给大模型，大模型基于这些精准资料，生成不跑偏、不编造的答案。",{"type":20,"tag":1863,"props":14815,"children":14817},{"id":14816},"四总结rag的核心价值与适用场景",[14818],{"type":25,"value":14819},"四、总结：RAG的核心价值与适用场景",{"type":20,"tag":5719,"props":14821,"children":14822},{},[14823,14835],{"type":20,"tag":48,"props":14824,"children":14825},{},[14826,14828,14833],{"type":25,"value":14827},"核心价值：",{"type":20,"tag":33,"props":14829,"children":14830},{},[14831],{"type":25,"value":14832},"让大模型“有据可依”",{"type":25,"value":14834}," ，解决上下文超限、知识过时、幻觉三大痛点，不用重新训练大模型，就能快速适配特定领域的文档问答（比如企业知识库、论文库、行业手册等）。",{"type":20,"tag":48,"props":14836,"children":14837},{},[14838],{"type":25,"value":14839},"适用场景：企业内部知识库问答、论文\u002F文献检索问答、客服智能回复（基于产品手册）、法律\u002F医疗文档咨询等。",{"title":8,"searchDepth":169,"depth":169,"links":14841},[14842,14843,14852,14853],{"id":14563,"depth":169,"text":14566},{"id":14597,"depth":169,"text":14600,"children":14844},[14845,14846,14848,14849,14850,14851],{"id":14608,"depth":179,"text":14611},{"id":14630,"depth":179,"text":14847},"2. 索引：给片段建字典，方便快速查找",{"id":14686,"depth":179,"text":14689},{"id":14709,"depth":179,"text":14712},{"id":14725,"depth":179,"text":14728},{"id":14741,"depth":179,"text":14744},{"id":14757,"depth":169,"text":14760},{"id":14816,"depth":169,"text":14819},"content:articles:agent:RAG.md","articles\u002Fagent\u002FRAG.md","articles\u002Fagent\u002FRAG",{"_path":14858,"_dir":6776,"_draft":7,"_partial":7,"_locale":8,"title":14859,"description":14860,"date":14861,"tags":14862,"body":14864,"_type":1800,"_id":15081,"_source":1802,"_file":15082,"_stem":15083,"_extension":1805},"\u002Farticles\u002Fdevops\u002Fmac","macOS 环境变量排查：解决 npm 全局命令 command not found","从 Claude CLI 安装后无法执行出发，梳理 zsh 与 bash 配置文件差异，并给出在 macOS 下修复 PATH 环境变量的实用方案。","2026-03-20",[14863],"随笔",{"type":17,"children":14865,"toc":15075},[14866,14871,14876,14921,14926,14939,14952,14971,14976,15028,15033],{"type":20,"tag":1863,"props":14867,"children":14869},{"id":14868},"先说发现这个坑的起因",[14870],{"type":25,"value":14868},{"type":20,"tag":21,"props":14872,"children":14873},{},[14874],{"type":25,"value":14875},"最近刚考研结束，之前是干前后端开发的，现在想去接触大模型人工智能相关的东西，此处省略一万字学习过程中的心酸历程。今天突然想尝试一下claude code。",{"type":20,"tag":21,"props":14877,"children":14878},{},[14879,14881,14887,14889,14895,14897,14903,14905,14911,14913,14919],{"type":25,"value":14880},"然后就按照文档",{"type":20,"tag":84,"props":14882,"children":14884},{"className":14883},[],[14885],{"type":25,"value":14886},"npm install -g @anthropic-ai\u002Fclaude-code",{"type":25,"value":14888},"，然后",{"type":20,"tag":84,"props":14890,"children":14892},{"className":14891},[],[14893],{"type":25,"value":14894},"claude --version",{"type":25,"value":14896},"，但！",{"type":20,"tag":84,"props":14898,"children":14900},{"className":14899},[],[14901],{"type":25,"value":14902},"command not found: claude",{"type":25,"value":14904},"，我心思是npm全局安装的路径没有在系统的 ",{"type":20,"tag":84,"props":14906,"children":14908},{"className":14907},[],[14909],{"type":25,"value":14910},"PATH",{"type":25,"value":14912}," 环境变量中。我就去找了",{"type":20,"tag":84,"props":14914,"children":14916},{"className":14915},[],[14917],{"type":25,"value":14918},".bash_profile",{"type":25,"value":14920},"，发现文件里配置了npm的环境变量。",{"type":20,"tag":1863,"props":14922,"children":14924},{"id":14923},"原因解读",[14925],{"type":25,"value":14923},{"type":20,"tag":21,"props":14927,"children":14928},{},[14929,14931,14937],{"type":25,"value":14930},"macOS Catalina (10.15) 及以后版本默认使用Zsh作为终端shell，",{"type":20,"tag":84,"props":14932,"children":14934},{"className":14933},[],[14935],{"type":25,"value":14936},"~\u002F.zshrc",{"type":25,"value":14938},"是默认配置文件。",{"type":20,"tag":21,"props":14940,"children":14941},{},[14942,14944,14950],{"type":25,"value":14943},"旧版macOS和Linux默认使用Bash作为终端，，",{"type":20,"tag":84,"props":14945,"children":14947},{"className":14946},[],[14948],{"type":25,"value":14949},"~\u002F.bash_profile",{"type":25,"value":14951},"是默认配置文件。且macOS不会同时加载两个配置文件。",{"type":20,"tag":21,"props":14953,"children":14954},{},[14955,14957,14962,14964,14969],{"type":25,"value":14956},"也就是说，现在mac只认",{"type":20,"tag":84,"props":14958,"children":14960},{"className":14959},[],[14961],{"type":25,"value":14936},{"type":25,"value":14963},"的配置，而我环境变量都写在了",{"type":20,"tag":84,"props":14965,"children":14967},{"className":14966},[],[14968],{"type":25,"value":14949},{"type":25,"value":14970},"，不会生效",{"type":20,"tag":1863,"props":14972,"children":14974},{"id":14973},"解决办法",[14975],{"type":25,"value":14973},{"type":20,"tag":5719,"props":14977,"children":14978},{},[14979,14996],{"type":20,"tag":48,"props":14980,"children":14981},{},[14982,14984,14989,14991],{"type":25,"value":14983},"将",{"type":20,"tag":84,"props":14985,"children":14987},{"className":14986},[],[14988],{"type":25,"value":14949},{"type":25,"value":14990},"中的配置粘贴复制到",{"type":20,"tag":84,"props":14992,"children":14994},{"className":14993},[],[14995],{"type":25,"value":14936},{"type":20,"tag":48,"props":14997,"children":14998},{},[14999,15001,15006,15008,15014,15015,15020],{"type":25,"value":15000},"在",{"type":20,"tag":84,"props":15002,"children":15004},{"className":15003},[],[15005],{"type":25,"value":14936},{"type":25,"value":15007},"中添加如下配置，这样系统会同时加载 ",{"type":20,"tag":84,"props":15009,"children":15011},{"className":15010},[],[15012],{"type":25,"value":15013},".zshrc",{"type":25,"value":7043},{"type":20,"tag":84,"props":15016,"children":15018},{"className":15017},[],[15019],{"type":25,"value":14918},{"type":20,"tag":126,"props":15021,"children":15023},{"code":15022},"# 在 zsh 中加载 bash 配置\nif [ -f ~\u002F.bash_profile ]; then\n    source ~\u002F.bash_profile\nfi\n",[15024],{"type":20,"tag":84,"props":15025,"children":15026},{"__ignoreMap":8},[15027],{"type":25,"value":15022},{"type":20,"tag":1863,"props":15029,"children":15031},{"id":15030},"总结此过程学习到的",[15032],{"type":25,"value":15030},{"type":20,"tag":5719,"props":15034,"children":15035},{},[15036,15062],{"type":20,"tag":48,"props":15037,"children":15038},{},[15039,15045,15047,15052,15054,15060],{"type":20,"tag":84,"props":15040,"children":15042},{"className":15041},[],[15043],{"type":25,"value":15044},"npm config get prefix",{"type":25,"value":15046},"： npm（Node Package Manager）命令，用于",{"type":20,"tag":33,"props":15048,"children":15049},{},[15050],{"type":25,"value":15051},"查看当前npm配置中设置的全局安装路径（prefix）",{"type":25,"value":15053}," ，是当使用 ",{"type":20,"tag":84,"props":15055,"children":15057},{"className":15056},[],[15058],{"type":25,"value":15059},"npm install -g 包名",{"type":25,"value":15061}," 全局安装包时，包被安装到的位置",{"type":20,"tag":48,"props":15063,"children":15064},{},[15065,15067],{"type":25,"value":15066},"命令配置环境变量",{"type":20,"tag":126,"props":15068,"children":15070},{"code":15069},"echo 'export PATH=\"\u002Fusr\u002Flocal\u002Flib\u002Fnpm\u002Fbin:$PATH\"' >> ~\u002F.zshrc\nsource ~\u002F.zshrc\n",[15071],{"type":20,"tag":84,"props":15072,"children":15073},{"__ignoreMap":8},[15074],{"type":25,"value":15069},{"title":8,"searchDepth":169,"depth":169,"links":15076},[15077,15078,15079,15080],{"id":14868,"depth":169,"text":14868},{"id":14923,"depth":169,"text":14923},{"id":14973,"depth":169,"text":14973},{"id":15030,"depth":169,"text":15030},"content:articles:devops:mac环境变量.md","articles\u002Fdevops\u002Fmac环境变量.md","articles\u002Fdevops\u002Fmac环境变量",{"_path":15085,"_dir":15086,"_draft":7,"_partial":7,"_locale":8,"title":15087,"description":15088,"date":15089,"tags":15090,"body":15091,"_type":1800,"_id":15194,"_source":1802,"_file":15195,"_stem":15196,"_extension":1805},"\u002Farticles\u002Fother\u002Fhello-world","other","欢迎来到 AI × 生物制药博客","这是我的第一篇学习笔记，记录开启 AI 与生物制药交叉领域学习之旅的起点。","2024-04-17",[14863],{"type":17,"children":15092,"toc":15189},[15093,15098,15103,15108,15151,15156,15161,15184],{"type":20,"tag":1863,"props":15094,"children":15096},{"id":15095},"为什么开始这个博客",[15097],{"type":25,"value":15095},{"type":20,"tag":21,"props":15099,"children":15100},{},[15101],{"type":25,"value":15102},"人工智能正在深刻改变生物制药行业。从 AlphaFold 的蛋白质结构预测到生成式 AI 设计新分子，这个交叉领域充满了令人兴奋的机会。",{"type":20,"tag":1863,"props":15104,"children":15106},{"id":15105},"学习计划",[15107],{"type":25,"value":15105},{"type":20,"tag":44,"props":15109,"children":15110},{},[15111,15121,15131,15141],{"type":20,"tag":48,"props":15112,"children":15113},{},[15114,15119],{"type":20,"tag":33,"props":15115,"children":15116},{},[15117],{"type":25,"value":15118},"基础知识",{"type":25,"value":15120},"：补充生物学、化学基础",{"type":20,"tag":48,"props":15122,"children":15123},{},[15124,15129],{"type":20,"tag":33,"props":15125,"children":15126},{},[15127],{"type":25,"value":15128},"AI 技术",{"type":25,"value":15130},"：深入学习深度学习、图神经网络",{"type":20,"tag":48,"props":15132,"children":15133},{},[15134,15139],{"type":20,"tag":33,"props":15135,"children":15136},{},[15137],{"type":25,"value":15138},"行业应用",{"type":25,"value":15140},"：了解药物研发全流程",{"type":20,"tag":48,"props":15142,"children":15143},{},[15144,15149],{"type":20,"tag":33,"props":15145,"children":15146},{},[15147],{"type":25,"value":15148},"实践项目",{"type":25,"value":15150},"：动手做相关项目",{"type":20,"tag":1863,"props":15152,"children":15154},{"id":15153},"关于这个博客",[15155],{"type":25,"value":15153},{"type":20,"tag":21,"props":15157,"children":15158},{},[15159],{"type":25,"value":15160},"我会在这里记录：",{"type":20,"tag":5719,"props":15162,"children":15163},{},[15164,15169,15174,15179],{"type":20,"tag":48,"props":15165,"children":15166},{},[15167],{"type":25,"value":15168},"学习过程中的知识点整理",{"type":20,"tag":48,"props":15170,"children":15171},{},[15172],{"type":25,"value":15173},"论文阅读笔记",{"type":20,"tag":48,"props":15175,"children":15176},{},[15177],{"type":25,"value":15178},"项目实践总结",{"type":20,"tag":48,"props":15180,"children":15181},{},[15182],{"type":25,"value":15183},"行业动态观察",{"type":20,"tag":21,"props":15185,"children":15186},{},[15187],{"type":25,"value":15188},"希望这个博客能帮助到同样对这个领域感兴趣的朋友！",{"title":8,"searchDepth":169,"depth":169,"links":15190},[15191,15192,15193],{"id":15095,"depth":169,"text":15095},{"id":15105,"depth":169,"text":15105},{"id":15153,"depth":169,"text":15153},"content:articles:other:hello-world.md","articles\u002Fother\u002Fhello-world.md","articles\u002Fother\u002Fhello-world",{"_path":15198,"_dir":15199,"_draft":7,"_partial":7,"_locale":8,"title":15200,"description":15201,"date":15202,"tags":15203,"body":15204,"_type":1800,"_id":15747,"_source":1802,"_file":15748,"_stem":15749,"_extension":1805},"\u002Farticles\u002Ffrontend\u002Ffluter-vs-rn","frontend","Flutter vs React Native：跨平台移动开发框架深度对比与选型指南","深度对比 Flutter 与 React Native 两大跨平台框架，从语言特性、性能表现、UI 开发、生态社区等多维度分析差异，助你做出合适的技术选型决策。","2023-04-23",[14],{"type":17,"children":15205,"toc":15724},[15206,15211,15216,15229,15238,15252,15258,15263,15268,15273,15279,15284,15289,15294,15299,15304,15309,15314,15319,15324,15329,15334,15340,15345,15350,15355,15367,15373,15378,15383,15388,15393,15398,15404,15409,15417,15422,15427,15432,15437,15442,15447,15452,15457,15462,15467,15472,15477,15482,15487,15492,15497,15502,15507,15512,15517,15522,15527,15532,15538,15543,15548,15553,15558,15565,15570,15575,15580,15585,15590,15595,15600,15605,15611,15616,15621,15626,15631,15637,15642,15647,15652,15657,15662,15667,15672,15677,15682,15688,15693,15698,15703,15708,15714,15719],{"type":20,"tag":1863,"props":15207,"children":15209},{"id":15208},"前言",[15210],{"type":25,"value":15208},{"type":20,"tag":21,"props":15212,"children":15213},{},[15214],{"type":25,"value":15215},"随着移动应用程序开发越来越受欢迎，企业正在寻找方法来创建可在各种设备上使用的跨平台应用程序。",{"type":20,"tag":21,"props":15217,"children":15218},{},[15219,15221,15228],{"type":25,"value":15220},"当我们说跨平台时，我们当然指的是Android和iOS。根据",{"type":20,"tag":101,"props":15222,"children":15225},{"href":15223,"rel":15224},"https:\u002F\u002Fwww.statista.com\u002Fstatistics\u002F272698\u002Fglobal-market-share-held-by-mobile-operating-systems-since-2009\u002F",[105],[15226],{"type":25,"value":15227},"Statista",{"type":25,"value":146},{"type":20,"tag":21,"props":15230,"children":15231},{},[15232],{"type":20,"tag":15233,"props":15234,"children":15235},"em",{},[15236],{"type":25,"value":15237},"Android 在 2021 年 6 月保持了其作为全球领先移动操作系统的地位，以接近 73% 的份额控制着移动操作系统市场。Google 的 Android 和 Apple 的 iOS 共同占据了全球 99% 以上的市场份额。",{"type":20,"tag":21,"props":15239,"children":15240},{},[15241,15243,15250],{"type":25,"value":15242},"在本文中，我们将比较两个流行的跨平台开发框架：Flutter 和",{"type":20,"tag":101,"props":15244,"children":15247},{"href":15245,"rel":15246},"https:\u002F\u002Freactnative.dev\u002F",[105],[15248],{"type":25,"value":15249},"React Native",{"type":25,"value":15251},"。我们将研究每个框架的优缺点，并讨论哪个更适合在 2023 年使用。",{"type":20,"tag":1863,"props":15253,"children":15255},{"id":15254},"为什么移动应用程序开发如此受欢迎",[15256],{"type":25,"value":15257},"为什么移动应用程序开发如此受欢迎？",{"type":20,"tag":21,"props":15259,"children":15260},{},[15261],{"type":25,"value":15262},"开发移动应用程序是一个稳步增长的业务领域。几乎地球上所有人都拥有手机，这意味着潜在用户的数量几乎是无限的。因此，现在几乎所有东西都有应用程序。",{"type":20,"tag":21,"props":15264,"children":15265},{},[15266],{"type":25,"value":15267},"您可以选择多种方式来设计和构建应用程序。您可以使用本机方法，例如 Swift 和 Objective-C 来创建 iOS 应用程序和 Java 来创建 Android 应用程序。这些是官方的 Apple \u002F Google 软件编程语言，分别提供支持和经常更新的功能。",{"type":20,"tag":21,"props":15269,"children":15270},{},[15271],{"type":25,"value":15272},"或者，您可以使用跨平台框架，例如 Flutter 或 React Native。",{"type":20,"tag":1863,"props":15274,"children":15276},{"id":15275},"什么是跨平台应用程序开发",[15277],{"type":25,"value":15278},"什么是跨平台应用程序开发？",{"type":20,"tag":21,"props":15280,"children":15281},{},[15282],{"type":25,"value":15283},"在我们开始之前，让我们定义术语“跨平台应用程序开发”并将其分为两类：混合开发和本机开发。",{"type":20,"tag":21,"props":15285,"children":15286},{},[15287],{"type":25,"value":15288},"跨平台应用程序是指可以使用单一代码库开发并且在 iOS 和 Android 操作系统上功能几乎相同的应用程序。（在本文中，我们专注于移动应用程序开发）",{"type":20,"tag":28,"props":15290,"children":15292},{"id":15291},"混合开发",[15293],{"type":25,"value":15291},{"type":20,"tag":21,"props":15295,"children":15296},{},[15297],{"type":25,"value":15298},"混合应用程序是结合 HTML5、CSS 和 JavaScript 等网络技术开发的。这意味着混合应用程序跨平台共享一些代码（例如 HTML\u002FCSS\u002FJS 代码），并且此共享代码在目标平台上的 webview 中运行。",{"type":20,"tag":21,"props":15300,"children":15301},{},[15302],{"type":25,"value":15303},"WebView 应用程序是使用嵌入式 webviews 呈现其用户界面的混合应用程序，您可以在其中使用 HTML5、CSS 和 JavaScript 进行自定义。",{"type":20,"tag":21,"props":15305,"children":15306},{},[15307],{"type":25,"value":15308},"WebView 应用程序在开箱即用地访问设备 API 方面会有一些限制，需要额外的努力才能实现与本机应用程序相同的某些功能。权衡是这些应用程序是开箱即用的跨平台，这可以节省大量时间。",{"type":20,"tag":21,"props":15310,"children":15311},{},[15312],{"type":25,"value":15313},"混合应用程序在两个平台上可能看起来相同但行为不同，这取决于它们可用的特定于平台的 API。例如，天气应用程序会检查两个平台上当前位置的天气服务的 API，并根据每个平台上可用的内容返回不同的数据。",{"type":20,"tag":28,"props":15315,"children":15317},{"id":15316},"原生开发",[15318],{"type":25,"value":15316},{"type":20,"tag":21,"props":15320,"children":15321},{},[15322],{"type":25,"value":15323},"本机应用程序是使用其目标平台（例如 Android 或 iOS）的本机 SDK 开发的。这意味着它们不跨平台共享任何代码，并且此共享代码仅为目标平台编写，而 UI 是使用特定于平台的小部件和库实现的。",{"type":20,"tag":21,"props":15325,"children":15326},{},[15327],{"type":25,"value":15328},"原生应用提供了比混合应用更好的用户体验，并且在每个平台上看起来更原生，但由于开发人员需要时间学习目标平台的 API，它们的开发成本更高，发布新功能的时间也更长。",{"type":20,"tag":21,"props":15330,"children":15331},{},[15332],{"type":25,"value":15333},"一般来说，最好使用目标平台的原生开发工具（例如 Android Studio 或 Xcode）来开发您的应用程序。",{"type":20,"tag":28,"props":15335,"children":15337},{"id":15336},"flutter-和-react-native跨平台框架",[15338],{"type":25,"value":15339},"Flutter 和 React Native：跨平台框架",{"type":20,"tag":21,"props":15341,"children":15342},{},[15343],{"type":25,"value":15344},"Flutter 和 React Native 都是当今最好的跨平台开发框架之一。他们都使用本机小部件来提供高度可定制、响应迅速的 UI，同时跨不同平台共享代码。",{"type":20,"tag":21,"props":15346,"children":15347},{},[15348],{"type":25,"value":15349},"Flutter 框架由谷歌开发，而 React Native 框架由 Facebook 开发，因此这些科技巨头拥有非常庞大的团队来处理从平台的 SDK 到文档、支持等一切事务。",{"type":20,"tag":21,"props":15351,"children":15352},{},[15353],{"type":25,"value":15354},"虽然 Flutter 和 React Native 应用程序都是原生的，但它们优于传统的原生应用程序开发，因为它们可以跨平台共享很大一部分代码库。",{"type":20,"tag":21,"props":15356,"children":15357},{},[15358,15365],{"type":20,"tag":101,"props":15359,"children":15362},{"href":15360,"rel":15361},"https:\u002F\u002Fengineering.instagram.com\u002Freact-native-at-instagram-dd828a9a90c7#.8wdmfmhep",[105],[15363],{"type":25,"value":15364},"据 Instagram 称",{"type":25,"value":15366},"，iOS 和 Android 之间通过 React Native 功能共享的代码量超过 90%。",{"type":20,"tag":1863,"props":15368,"children":15370},{"id":15369},"flutter-和-react-native-的历史",[15371],{"type":25,"value":15372},"Flutter 和 React Native 的历史",{"type":20,"tag":21,"props":15374,"children":15375},{},[15376],{"type":25,"value":15377},"Flutter 是在 2016 年 10 月的 Dart 开发者峰会上宣布的。这个跨平台移动应用程序开发框架背后的主要思想是为开发人员提供工具，以使用用 Google 自己的 Dart 编程语言编写的单一代码库为 iOS 和 Android 构建原生应用程序。",{"type":20,"tag":21,"props":15379,"children":15380},{},[15381],{"type":25,"value":15382},"Flutter 的第一个稳定版本 (1.0) 于 2018 年 2 月 16 日发布。",{"type":20,"tag":21,"props":15384,"children":15385},{},[15386],{"type":25,"value":15387},"React Native 的起步时间比 Flutter 早一点，2015 年 3 月发布了第一个 beta 版本，但直到 2017 年 3 月才离开 beta 阶段。2017 年 9 月 5 日，React Native 在技术人员的大力支持下达到了 1.0 版巨人脸书。",{"type":20,"tag":21,"props":15389,"children":15390},{},[15391],{"type":25,"value":15392},"正如您所见，这两种技术都相对较新，但React Native 已经被 Facebook、Instagram、Airbnb 和 Uber 等大公司使用。",{"type":20,"tag":21,"props":15394,"children":15395},{},[15396],{"type":25,"value":15397},"Flutter 也已经被宝马、丰田、eBay，当然还有谷歌自己的 Google Pay 所接受。",{"type":20,"tag":1863,"props":15399,"children":15401},{"id":15400},"flutter-和-react-native-的比较",[15402],{"type":25,"value":15403},"Flutter 和 React Native 的比较",{"type":20,"tag":21,"props":15405,"children":15406},{},[15407],{"type":25,"value":15408},"Flutter 和 React Native 的主要区别在于 React Native 不会编译成原生移动语言（Java、Swift、Objective-C），而是简单地运行其JavaScript代码。另一方面，Flutter 将其 Dart 语言编译为原生语言，这会影响性能（稍后讨论）。",{"type":20,"tag":21,"props":15410,"children":15411},{},[15412],{"type":20,"tag":11159,"props":15413,"children":15416},{"alt":15414,"src":15415},"Javascript 与飞镖","https:\u002F\u002Fp3-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fc2a24191c6054383b57014958b17bbe0~tplv-k3u1fbpfcp-zoom-1.image#?w=600&h=280&s=66151&e=png&a=1&b=e1c435",[],{"type":20,"tag":21,"props":15418,"children":15419},{},[15420],{"type":25,"value":15421},"另一个很大的区别是原生 JavaScript（JSX 除外）用于在 React Native 上编写组件。由于 React 的动态特性，Facebook 开发人员建议在使用 React 时使用 Flow 或 TypeScript。对于 Flutter，Google 也推荐使用 Dart 来编写代码，因为它具有静态类型系统。",{"type":20,"tag":21,"props":15423,"children":15424},{},[15425],{"type":25,"value":15426},"在我们看来，选择这两种技术中的哪一种应该更多地取决于您的偏好，而不是它们的实际特性和功能。",{"type":20,"tag":21,"props":15428,"children":15429},{},[15430],{"type":25,"value":15431},"当然，了解所有编程范例是件好事，这样您就可以轻松地掌握新的语言和框架，即使它们不是用您熟悉的语言编写的。",{"type":20,"tag":21,"props":15433,"children":15434},{},[15435],{"type":25,"value":15436},"已经熟悉 JavaScript (ES2015+) 或 TypeScript\u002FFlow 的程序员会发现使用 React Native 开始工作要容易得多。对于使用 React 开发 Web 的开发人员来说尤其如此，因为 React 和 React Native 之间有很多重叠之处。",{"type":20,"tag":21,"props":15438,"children":15439},{},[15440],{"type":25,"value":15441},"JavaScript 在移动开发领域仍然占有重要的市场份额，而且由于 React Native 和 Flutter 都允许您选择自己喜欢的编程语言，因此很难说哪一种在 2023 年更受欢迎。",{"type":20,"tag":21,"props":15443,"children":15444},{},[15445],{"type":25,"value":15446},"还有其他重要因素可能会影响此决定，例如：",{"type":20,"tag":21,"props":15448,"children":15449},{},[15450],{"type":25,"value":15451},"– 公司对特定技术栈的偏好",{"type":20,"tag":21,"props":15453,"children":15454},{},[15455],{"type":25,"value":15456},"– 开发人员对给定语言\u002F框架的熟悉程度",{"type":20,"tag":21,"props":15458,"children":15459},{},[15460],{"type":25,"value":15461},"– 具备使用特定技术所需技能的开发人员的可用性",{"type":20,"tag":21,"props":15463,"children":15464},{},[15465],{"type":25,"value":15466},"正如我们已经指出的那样，React Native 和 Flutter 都将在 2023 年成为重要的参与者，因此您可以选择哪个是您长期目标的最佳选择。",{"type":20,"tag":1863,"props":15468,"children":15470},{"id":15469},"跨平台开发框架的工作原理",[15471],{"type":25,"value":15469},{"type":20,"tag":21,"props":15473,"children":15474},{},[15475],{"type":25,"value":15476},"尽管跨平台移动开发框架共享许多概念和功能，但它们在创建时都考虑到了不同的目标。",{"type":20,"tag":21,"props":15478,"children":15479},{},[15480],{"type":25,"value":15481},"React Native 旨在提供本机代码性能，并结合 React web 带来的开发便利性。这个想法不是在 iOS 和 Android 之间使用一组共享组件，而是将完全独立的 UI 包装到一个 JavaScript 包中，允许您在一个地方发布几乎一半的应用程序代码。",{"type":20,"tag":21,"props":15483,"children":15484},{},[15485],{"type":25,"value":15486},"Flutter 的创建主要是为了满足谷歌对……谷歌的需求。换句话说，这是将快速开发周期与本机代码性能结合起来并构建可在 iOS 和 Android 应用程序之间共享的可重用 UI 组件的另一种尝试。这就是 Google 的 Flutter 比 React Native 快得多的原因。",{"type":20,"tag":21,"props":15488,"children":15489},{},[15490],{"type":25,"value":15491},"Flutter 的设计理念也是让应用程序开发更容易、更易于访问，因为它允许使用 Dart 编写代码，Dart 是一种可以在周末学习并在几天甚至几小时内掌握的语言，具体取决于开发人员的技能。",{"type":20,"tag":21,"props":15493,"children":15494},{},[15495],{"type":25,"value":15496},"这就是为什么我们相信 Flutter 将成为需要在不牺牲性能或功能的情况下快速创建大量原生移动应用程序的公司的首选移动开发框架。",{"type":20,"tag":1863,"props":15498,"children":15500},{"id":15499},"构建移动应用再次变得有趣",[15501],{"type":25,"value":15499},{"type":20,"tag":21,"props":15503,"children":15504},{},[15505],{"type":25,"value":15506},"当谷歌宣布推出 Flutter 时，开发人员惊讶于它在实践中与其他专门为构建跨平台移动应用程序而开发的技术相比表现出色。",{"type":20,"tag":21,"props":15508,"children":15509},{},[15510],{"type":25,"value":15511},"React Native 在 iOS 和 Android 之间共享 UI 代码的理念是一个伟大的创举，但由于 React Native 的固有局限性，由此产生的应用程序无法像原生应用程序那样执行。",{"type":20,"tag":21,"props":15513,"children":15514},{},[15515],{"type":25,"value":15516},"Flutter 带有许多您今天在任何其他工具中都找不到的好东西。Dart 是一种令人印象深刻的语言，它是为创建移动应用程序而从头开始构建的。",{"type":20,"tag":21,"props":15518,"children":15519},{},[15520],{"type":25,"value":15521},"Dart 是目前可用于构建 Android 和 iOS 应用程序的最快语言，可以更轻松地构建高性能 UI 组件，具有强大的 IDE（集成开发环境）支持和强大的自动完成功能，允许在不丢失应用程序状态的情况下进行实时编码原型设计，并最终拥抱面向对象的编程，使其成为强制性的。",{"type":20,"tag":21,"props":15523,"children":15524},{},[15525],{"type":25,"value":15526},"Flutter 带有一个完整的工具链和一组漂亮的类似 Material Design 的小部件，开发人员可以在他们的应用程序中重复使用这些小部件。谷歌还创建了许多与第 3 方库的集成，例如用于以有效方式处理图像的图像处理库、SQL数据库（通过抽象可访问）和文本编辑器。",{"type":20,"tag":21,"props":15528,"children":15529},{},[15530],{"type":25,"value":15531},"所有这些都作为一个内聚包呈现给开发人员，该包在设计时考虑了速度、易用性、生产力和性能。",{"type":20,"tag":1863,"props":15533,"children":15535},{"id":15534},"flutter-和-react-native-应用的优缺点",[15536],{"type":25,"value":15537},"Flutter 和 React Native 应用的优缺点",{"type":20,"tag":21,"props":15539,"children":15540},{},[15541],{"type":25,"value":15542},"使用 Flutter 创建的应用程序与原生应用程序没有区别。它们具有相同的性能和相同的外观（除了一些特定于平台的风格方面）。",{"type":20,"tag":21,"props":15544,"children":15545},{},[15546],{"type":25,"value":15547},"人们在使用 React Native 构建应用程序时通常抱怨的主要问题与其运行时环境有关，这比为每个架构管理单独的进程更重。这意味着您将无法使用 React Native 实现纯原生应用程序的性能，尽管您可以接近。",{"type":20,"tag":21,"props":15549,"children":15550},{},[15551],{"type":25,"value":15552},"在支持现有 JavaScript 代码库和允许重用 iOS 和 Android 应用程序之间共享的某些组件方面，Flutter 没有与 React Native 相同的优势。",{"type":20,"tag":21,"props":15554,"children":15555},{},[15556],{"type":25,"value":15557},"现在，让我们更深入地探讨一下这两个框架的技术优缺点。",{"type":20,"tag":21,"props":15559,"children":15560},{},[15561],{"type":20,"tag":11159,"props":15562,"children":15564},{"alt":15563,"src":8},"Flutter 和 React Native 的优缺点",[],{"type":20,"tag":28,"props":15566,"children":15568},{"id":15567},"本机性能方面的优缺点",[15569],{"type":25,"value":15567},{"type":20,"tag":21,"props":15571,"children":15572},{},[15573],{"type":25,"value":15574},"React Native 带有改进的 JavaScript 虚拟机，由于其 JIT 编译器，它比 V8 更快。它还受益于作为一个提前编译的框架，这意味着你可以自由地发布你需要的任何代码库，因为它会被编译成一个本地可执行文件。",{"type":20,"tag":21,"props":15576,"children":15577},{},[15578],{"type":25,"value":15579},"实际上，React Native 与纯原生应用程序一样快，因为它可以实现与 iOS 应用程序相同的性能，而无需对 iOS 构建设置进行任何更改。",{"type":20,"tag":21,"props":15581,"children":15582},{},[15583],{"type":25,"value":15584},"Flutter 带有自己的 Ahead-of-time 编译器，一旦您构建了项目，它将为 iOS 和 Android 生成优化的代码。您无需像 React Native 那样在应用程序二进制文件中交付整个代码库即可获得本机性能。",{"type":20,"tag":28,"props":15586,"children":15588},{"id":15587},"应用程序大小的优缺点",[15589],{"type":25,"value":15587},{"type":20,"tag":21,"props":15591,"children":15592},{},[15593],{"type":25,"value":15594},"React Native 应用程序通常带有一个 JavaScript 运行时，压缩后重约 300kb，尽管可以通过调整一些选项来减少这个数字，例如绕过填充（这将强制 React Native 跳过用结果填充其虚拟 DOM 的过程将其与本机 UI 进行比较）以及将 useDeveloperMode 设置为 true（这将调整内存中的图像大小并降低其质量）。",{"type":20,"tag":21,"props":15596,"children":15597},{},[15598],{"type":25,"value":15599},"Flutter 带有一个提前编译器，它允许开发人员只发布他们正在构建的应用程序所需的代码库，而无需与它捆绑任何东西。",{"type":20,"tag":21,"props":15601,"children":15602},{},[15603],{"type":25,"value":15604},"如果您愿意，可以在现有的 JavaScript VM 中运行 Flutter，这将允许您节省应用程序所需的空间。",{"type":20,"tag":28,"props":15606,"children":15608},{"id":15607},"最低要求的-sdk-版本的优缺点",[15609],{"type":25,"value":15610},"最低要求的 SDK 版本的优缺点",{"type":20,"tag":21,"props":15612,"children":15613},{},[15614],{"type":25,"value":15615},"React Native 通常可以毫无问题地针对任何 iOS 9+ 或 Android 5.0+ SDK 构建，但不用说，要获得最佳性能，您应该以发布时可用的最新 SDK 版本为目标。",{"type":20,"tag":21,"props":15617,"children":15618},{},[15619],{"type":25,"value":15620},"在实践中，React Native 应用程序可以针对较旧的 iOS 和 Android SDK 构建，在运行时只提供有限的功能集，尽管要获得所有功能，您仍然应该以可用的最新 SDK 版本为目标。",{"type":20,"tag":21,"props":15622,"children":15623},{},[15624],{"type":25,"value":15625},"Flutter 应用程序可以针对 Android 版本 21 (Lollipop) 和更新版本构建，但建议针对可用的最新 SDK 版本构建以获得最佳性能。",{"type":20,"tag":21,"props":15627,"children":15628},{},[15629],{"type":25,"value":15630},"Flutter 可以在 iOS 8 或更高版本上运行，但调用某些 API 可能会导致运行时崩溃，因为 Apple 已经弃用了 Flutter 使用的大部分 API。",{"type":20,"tag":28,"props":15632,"children":15634},{"id":15633},"ui开发的优缺点",[15635],{"type":25,"value":15636},"UI开发的优缺点",{"type":20,"tag":21,"props":15638,"children":15639},{},[15640],{"type":25,"value":15641},"Flutter 自带一组用于呈现 UI 的小部件，这意味着您可以在构建 Flutter 应用程序时重用现有的 iOS 或 Android 代码。",{"type":20,"tag":21,"props":15643,"children":15644},{},[15645],{"type":25,"value":15646},"一些第三方库可用于更轻松地重用现有的本机组件，尽管这仍在进行中，因为将 Flutter 小部件映射到现有的 iOS 和 Android UI 组件并不容易。",{"type":20,"tag":21,"props":15648,"children":15649},{},[15650],{"type":25,"value":15651},"React Native 带有一个桥接器，允许您将现有的 iOS 和 Android 代码重用为 JavaScript 模块，并公开一些 API 以手动创建本机 UI 组件和处理渲染它们的 JavaScript 代码之间的桥接器。",{"type":20,"tag":28,"props":15653,"children":15655},{"id":15654},"调试方面的优缺点",[15656],{"type":25,"value":15654},{"type":20,"tag":21,"props":15658,"children":15659},{},[15660],{"type":25,"value":15661},"React Native 带有自己的调试器，可以附加到您在 iOS 和 Android 上运行的应用程序，它为开发人员提供了 JavaScript 虚拟机当前状态的预览，以及用于检查内存使用情况或动态调整某些选项的各种工具.",{"type":20,"tag":21,"props":15663,"children":15664},{},[15665],{"type":25,"value":15666},"Flutter 也有自己的调试器，它可以附加到你在 iOS 和 Android 上运行的应用程序，为开发人员提供渲染引擎当前状态的预览，以及用于检查内存使用或动态调整某些选项的各种工具.",{"type":20,"tag":28,"props":15668,"children":15670},{"id":15669},"移动平台之间代码重用的优缺点",[15671],{"type":25,"value":15669},{"type":20,"tag":21,"props":15673,"children":15674},{},[15675],{"type":25,"value":15676},"React Native 带有自己的一组 API，可在开发 iOS 和 Android 时使用。虽然大多数使用 React Native 的公司会先在一个平台（通常是 iOS）上开发他们的应用程序，然后再将它们移植到另一个平台，但如果您愿意，也可以在 iOS 和 Android 应用程序之间编写共享组件。",{"type":20,"tag":21,"props":15678,"children":15679},{},[15680],{"type":25,"value":15681},"Flutter 应用程序是使用特定于平台的代码构建的，因此无法在 iOS 和 Android 应用程序之间共享任何代码。但是，可以使用第三方库来更轻松地重用现有的本机组件。",{"type":20,"tag":1863,"props":15683,"children":15685},{"id":15684},"flutter-和-react-native-哪个更容易学",[15686],{"type":25,"value":15687},"Flutter 和 React Native 哪个更容易学？",{"type":20,"tag":21,"props":15689,"children":15690},{},[15691],{"type":25,"value":15692},"React Native 和 Flutter 都同样容易学习（就 API 而言），尽管这将取决于开发人员的专业知识。两者都有一个庞大且参与度高的开发人员社区，可以帮助新的开发人员并不断创建新的工具和组件。",{"type":20,"tag":21,"props":15694,"children":15695},{},[15696],{"type":25,"value":15697},"对于编码经验很少或没有编码经验的全新开发人员，我们可能会建议从 React Native 开始，因为它带有一组可用于构建 iOS 和 Android 应用程序的预定义组件，这意味着您可以一次学习一个东西无需担心学习用于呈现视图的所有 API。",{"type":20,"tag":21,"props":15699,"children":15700},{},[15701],{"type":25,"value":15702},"但是，我们可能会建议具有一定编码经验的开发人员选择 Flutter 而不是 React Native，因为 Flutter 提供的 API 更接近您在 iOS 和 Android 中可以找到的 API。",{"type":20,"tag":21,"props":15704,"children":15705},{},[15706],{"type":25,"value":15707},"此外，Flutter 背后的团队非常注重确保 Flutter 提供的开发体验能够与其他 SDK（包括 React Native）提供的开发体验相媲美。",{"type":20,"tag":1863,"props":15709,"children":15711},{"id":15710},"_2023-年-flutter-vs-react-native",[15712],{"type":25,"value":15713},"2023 年 Flutter vs. React Native",{"type":20,"tag":21,"props":15715,"children":15716},{},[15717],{"type":25,"value":15718},"React Native 于 2015 年问世，此后被许多公司使用。JavaScript 世界变化非常快，因此 React Native 也随着时间的推移而发展以包含新功能，这要归功于开源社区的贡献。",{"type":20,"tag":21,"props":15720,"children":15721},{},[15722],{"type":25,"value":15723},"Flutter 是一项更新得多的技术，如果您来自 Android 或 iOS 世界，可能会感觉很陌生。Google 付出了很多努力让它变得非常容易学习，所以大多数熟悉 iOS 或 Android 开发的人应该能够很快上手。",{"title":8,"searchDepth":169,"depth":169,"links":15725},[15726,15727,15728,15733,15734,15735,15736,15737,15745,15746],{"id":15208,"depth":169,"text":15208},{"id":15254,"depth":169,"text":15257},{"id":15275,"depth":169,"text":15278,"children":15729},[15730,15731,15732],{"id":15291,"depth":179,"text":15291},{"id":15316,"depth":179,"text":15316},{"id":15336,"depth":179,"text":15339},{"id":15369,"depth":169,"text":15372},{"id":15400,"depth":169,"text":15403},{"id":15469,"depth":169,"text":15469},{"id":15499,"depth":169,"text":15499},{"id":15534,"depth":169,"text":15537,"children":15738},[15739,15740,15741,15742,15743,15744],{"id":15567,"depth":179,"text":15567},{"id":15587,"depth":179,"text":15587},{"id":15607,"depth":179,"text":15610},{"id":15633,"depth":179,"text":15636},{"id":15654,"depth":179,"text":15654},{"id":15669,"depth":179,"text":15669},{"id":15684,"depth":169,"text":15687},{"id":15710,"depth":169,"text":15713},"content:articles:frontend:fluter-vs-rn.md","articles\u002Ffrontend\u002Ffluter-vs-rn.md","articles\u002Ffrontend\u002Ffluter-vs-rn",{"_path":15751,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":15752,"description":15753,"date":15754,"tags":15755,"body":15756,"_type":1800,"_id":37182,"_source":1802,"_file":37183,"_stem":37184,"_extension":1805},"\u002Farticles\u002Fbackend\u002Fssm","SSM 框架学习笔记","Spring、SpringMVC、MyBatis 三大框架整合开发的核心知识点与实践总结","2023-03-23",[14],{"type":17,"children":15757,"toc":37153},[15758,15764,15769,15782,15788,15801,15807,15813,15825,15830,15835,15840,15845,15851,15856,15861,15866,15871,15876,15882,15890,15895,15900,15905,15913,15918,15923,15928,15933,15941,15946,15951,15956,15962,15968,15976,16015,16020,16029,16035,16048,16199,16205,16223,16404,16410,16418,16456,16462,16493,16511,16573,16627,16720,16726,17036,17042,17050,17107,17115,17325,17333,17346,17352,17691,17697,17750,17756,17832,17838,17867,17934,17940,17956,17964,18050,18058,18096,18102,18128,18175,18181,18189,18252,18259,18296,18300,18331,18337,18343,18350,18402,18409,18447,18454,18535,18541,18548,18592,18599,18637,18644,18739,18745,18752,18803,18810,18847,18854,18935,18941,18948,18961,18968,19005,19012,19049,19056,19152,19158,19166,19173,19196,19203,19231,19238,19310,19316,19322,19330,19337,19389,19396,19458,19465,19546,19552,19559,19604,19611,19650,19657,19730,19736,19743,19788,19795,19833,19840,19928,19934,19941,19986,19993,20063,20070,20158,20164,20169,20175,20181,20189,20197,20228,20236,20288,20293,20303,20311,20385,20393,20430,20437,20467,20474,20548,20557,20564,20664,20670,20683,20695,20701,20708,20760,20768,20904,20910,20934,20941,21078,21084,21089,21097,21105,21157,21165,21301,21306,21314,21322,21359,21367,21405,21412,21493,21499,21504,21512,21520,21602,21610,21618,21740,21746,21759,21765,21772,21809,21816,21957,21964,22060,22066,22072,22079,22116,22123,22243,22249,22256,22293,22301,22339,22346,22427,22433,22451,22457,22465,22471,22479,22587,22593,22614,22736,22742,22758,22875,22881,22894,23031,23037,23065,23070,23077,23139,23144,23151,23212,23218,23226,23400,23406,23412,23420,23425,23433,23462,23468,23476,23484,23521,23529,23534,23540,23548,23553,23558,23563,23568,23574,23579,23585,23616,23624,24197,24205,24520,24528,24533,24541,25117,25123,25131,25137,25143,25151,25156,25161,25166,25171,25176,25181,25186,25191,25196,25202,25208,25214,25220,25265,25273,25340,25346,25472,25478,25484,25490,25513,25519,25527,25533,25566,25572,25659,25665,25671,25677,25690,25772,25780,25786,25791,25824,25898,25904,25910,25916,25929,25936,26054,26062,26143,26161,26277,26285,26413,26419,26437,26566,26574,26587,26595,26607,26613,26621,26629,26714,26720,26775,26781,26843,26849,26857,26931,26939,26970,26978,27041,27047,27055,27221,27229,27335,27343,27351,27447,27455,27463,27570,27576,27584,27704,27712,27858,27864,27871,27928,27936,28092,28100,28193,28199,28207,28481,28489,28746,28752,28760,28768,28809,28817,28985,28991,28999,29061,29069,29106,29112,29158,29166,29700,29707,29810,29816,29834,29842,30025,30033,30097,30105,30209,30215,30246,30254,30385,30394,30522,30527,30533,30564,30575,30583,30688,30696,30729,30737,30782,30788,30803,30910,30916,30989,31086,31092,31098,31111,31117,31246,31252,31279,31285,31291,31312,31323,31486,31505,31595,31603,31614,31851,31861,31964,31970,31981,32004,32015,32100,32108,32159,32165,32228,32975,32981,32994,33154,33160,33165,33171,33177,33183,33188,33194,33201,33490,33504,33538,33546,33696,33704,34176,34182,34188,34196,34201,34214,34220,34228,34236,34254,34261,34277,34300,34306,34312,34319,34598,34605,34639,34646,34833,34841,34970,34983,35081,35123,35128,35134,35140,35179,35184,35190,35195,35206,35230,35236,35309,35315,35321,35338,35549,35555,35581,35790,35798,35811,35817,35822,35827,35832,35937,35943,36187,36193,36198,36203,36209,36215,36220,36225,36231,36244,36397,36403,36409,36455,36460,36468,36524,36532,36590,36596,36604,36744,36750,36756,36764,36838,36846,36895,36901,36908,37022,37029,37143,37149],{"type":20,"tag":15759,"props":15760,"children":15762},"h1",{"id":15761},"扩展提升",[15763],{"type":25,"value":15761},{"type":20,"tag":28,"props":15765,"children":15767},{"id":15766},"数据库截断与清空",[15768],{"type":25,"value":15766},{"type":20,"tag":44,"props":15770,"children":15771},{},[15772,15777],{"type":20,"tag":48,"props":15773,"children":15774},{},[15775],{"type":25,"value":15776},"清空：将表清空，再次添加时，id接着清空之前的表继续自增",{"type":20,"tag":48,"props":15778,"children":15779},{},[15780],{"type":25,"value":15781},"截断：删除表，并重新创建一个一模一样的表，id重新计数",{"type":20,"tag":1863,"props":15783,"children":15785},{"id":15784},"mybatis",[15786],{"type":25,"value":15787},"MyBatis",{"type":20,"tag":6665,"props":15789,"children":15790},{},[15791,15796],{"type":20,"tag":21,"props":15792,"children":15793},{},[15794],{"type":25,"value":15795},"Hibernate和JAP全自动框架",{"type":20,"tag":21,"props":15797,"children":15798},{},[15799],{"type":25,"value":15800},"MyBatis半自动",{"type":20,"tag":28,"props":15802,"children":15804},{"id":15803},"_1mybatis简介",[15805],{"type":25,"value":15806},"1.MyBatis简介",{"type":20,"tag":11085,"props":15808,"children":15810},{"id":15809},"_11-mybatis历史",[15811],{"type":25,"value":15812},"1.1 MyBatis历史",{"type":20,"tag":21,"props":15814,"children":15815},{},[15816,15818,15823],{"type":25,"value":15817},"MyBatis最初是Apache的一个开源项目",{"type":20,"tag":33,"props":15819,"children":15820},{},[15821],{"type":25,"value":15822},"iBatis",{"type":25,"value":15824},", 2010年6月这个项目由Apache Software Foundation迁",{"type":20,"tag":21,"props":15826,"children":15827},{},[15828],{"type":25,"value":15829},"移到了Google Code。随着开发团队转投Google Code旗下， iBatis3.x正式更名为MyBatis。代码于",{"type":20,"tag":21,"props":15831,"children":15832},{},[15833],{"type":25,"value":15834},"2013年11月迁移到Github。",{"type":20,"tag":21,"props":15836,"children":15837},{},[15838],{"type":25,"value":15839},"iBatis一词来源于“internet”和“abatis”的组合，是一个基于Java的持久层框架。 iBatis提供的持久层框架",{"type":20,"tag":21,"props":15841,"children":15842},{},[15843],{"type":25,"value":15844},"包括SQL Maps和Data Access Objects（DAO）",{"type":20,"tag":11085,"props":15846,"children":15848},{"id":15847},"_12-mybatis特性",[15849],{"type":25,"value":15850},"1.2 MyBatis特性",{"type":20,"tag":21,"props":15852,"children":15853},{},[15854],{"type":25,"value":15855},"1） MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架",{"type":20,"tag":21,"props":15857,"children":15858},{},[15859],{"type":25,"value":15860},"2） MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集",{"type":20,"tag":21,"props":15862,"children":15863},{},[15864],{"type":25,"value":15865},"3） MyBatis可以使用简单的XML或注解用于配置和原始映射，将接口和Java的POJO（Plain Old Java",{"type":20,"tag":21,"props":15867,"children":15868},{},[15869],{"type":25,"value":15870},"Objects，普通的Java对象）映射成数据库中的记录",{"type":20,"tag":21,"props":15872,"children":15873},{},[15874],{"type":25,"value":15875},"4） MyBatis 是一个 半自动的ORM（Object Relation Mapping）框架",{"type":20,"tag":11085,"props":15877,"children":15879},{"id":15878},"_13-和其它持久化层技术对比",[15880],{"type":25,"value":15881},"1.3 和其它持久化层技术对比",{"type":20,"tag":21,"props":15883,"children":15884},{},[15885],{"type":20,"tag":33,"props":15886,"children":15887},{},[15888],{"type":25,"value":15889},"JDBC：",{"type":20,"tag":21,"props":15891,"children":15892},{},[15893],{"type":25,"value":15894},"SQL 夹杂在Java代码中耦合度高，导致硬编码内伤",{"type":20,"tag":21,"props":15896,"children":15897},{},[15898],{"type":25,"value":15899},"维护不易且实际开发需求中 SQL 有变化，频繁修改的情况多见",{"type":20,"tag":21,"props":15901,"children":15902},{},[15903],{"type":25,"value":15904},"代码冗长，开发效率低",{"type":20,"tag":21,"props":15906,"children":15907},{},[15908],{"type":20,"tag":33,"props":15909,"children":15910},{},[15911],{"type":25,"value":15912},"Hibernate 和 JPA：",{"type":20,"tag":21,"props":15914,"children":15915},{},[15916],{"type":25,"value":15917},"操作简便，开发效率高",{"type":20,"tag":21,"props":15919,"children":15920},{},[15921],{"type":25,"value":15922},"程序中的长难复杂 SQL 需要绕过框架",{"type":20,"tag":21,"props":15924,"children":15925},{},[15926],{"type":25,"value":15927},"基于全映射的全自动框架，大量字段的 POJO 进行部分映射时比较困难。",{"type":20,"tag":21,"props":15929,"children":15930},{},[15931],{"type":25,"value":15932},"反射操作太多，导致数据库性能下降",{"type":20,"tag":21,"props":15934,"children":15935},{},[15936],{"type":20,"tag":33,"props":15937,"children":15938},{},[15939],{"type":25,"value":15940},"MyBatis：",{"type":20,"tag":21,"props":15942,"children":15943},{},[15944],{"type":25,"value":15945},"轻量级，性能出色",{"type":20,"tag":21,"props":15947,"children":15948},{},[15949],{"type":25,"value":15950},"SQL 和 Java 编码分开，功能边界清晰。Java代码专注业务、SQL语句专注数据",{"type":20,"tag":21,"props":15952,"children":15953},{},[15954],{"type":25,"value":15955},"开发效率稍逊于HIbernate，但是完全能够接受",{"type":20,"tag":28,"props":15957,"children":15959},{"id":15958},"_2-搭建mybatis",[15960],{"type":25,"value":15961},"2. 搭建MyBatis",{"type":20,"tag":11085,"props":15963,"children":15965},{"id":15964},"_21-注意事项",[15966],{"type":25,"value":15967},"2.1 注意事项",{"type":20,"tag":21,"props":15969,"children":15970},{},[15971],{"type":20,"tag":33,"props":15972,"children":15973},{},[15974],{"type":25,"value":15975},"MySQL不同版本的注意事项",{"type":20,"tag":5719,"props":15977,"children":15978},{},[15979,15997],{"type":20,"tag":48,"props":15980,"children":15981},{},[15982,15984],{"type":25,"value":15983},"驱动类driver-class-name\n",{"type":20,"tag":44,"props":15985,"children":15986},{},[15987,15992],{"type":20,"tag":48,"props":15988,"children":15989},{},[15990],{"type":25,"value":15991},"MySQL 5版本使用jdbc5驱动，驱动类使用：com.mysql.jdbc.Driver",{"type":20,"tag":48,"props":15993,"children":15994},{},[15995],{"type":25,"value":15996},"MySQL 8版本使用jdbc8驱动，驱动类使用：com.mysql.cj.jdbc.Driver",{"type":20,"tag":48,"props":15998,"children":15999},{},[16000,16002],{"type":25,"value":16001},"连接地址url\n",{"type":20,"tag":44,"props":16003,"children":16004},{},[16005,16010],{"type":20,"tag":48,"props":16006,"children":16007},{},[16008],{"type":25,"value":16009},"MySQL 5版本的url：jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fssm",{"type":20,"tag":48,"props":16011,"children":16012},{},[16013],{"type":25,"value":16014},"MySQL 8版本的url：jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fssm?serverTimezone=UTC",{"type":20,"tag":21,"props":16016,"children":16017},{},[16018],{"type":25,"value":16019},"否则运行测试用例报告如下错误：",{"type":20,"tag":21,"props":16021,"children":16022},{},[16023],{"type":20,"tag":84,"props":16024,"children":16026},{"className":16025},[],[16027],{"type":25,"value":16028},"java.sql.SQLException: The server time zone value 'ÖÐ¹ú±ê×¼Ê±¼ä' is unrecognized or represents more",{"type":20,"tag":11085,"props":16030,"children":16032},{"id":16031},"_22-创建maven工程",[16033],{"type":25,"value":16034},"2.2 创建Maven工程",{"type":20,"tag":5719,"props":16036,"children":16037},{},[16038,16043],{"type":20,"tag":48,"props":16039,"children":16040},{},[16041],{"type":25,"value":16042},"打包方式：jar",{"type":20,"tag":48,"props":16044,"children":16045},{},[16046],{"type":25,"value":16047},"引入依赖",{"type":20,"tag":126,"props":16049,"children":16053},{"className":16050,"code":16051,"language":16052,"meta":8,"style":8},"language-java shiki shiki-themes github-dark","\u003Cdependencies> \u003C!-- Mybatis核心 -->\n    \u003Cdependency>\n        \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n        \u003CartifactId>mybatis\u003C\u002FartifactId>\n        \u003Cversion>3.5.7\u003C\u002Fversion>\n    \u003C\u002Fdependency> \u003C!-- junit测试 -->\n    \u003Cdependency>\n        \u003CgroupId>junit\u003C\u002FgroupId>\n        \u003CartifactId>junit\u003C\u002FartifactId>\n        \u003Cversion>4.12\u003C\u002Fversion>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency> \u003C!-- MySQL驱动 -->\n    \u003Cdependency>\n        \u003CgroupId>mysql\u003C\u002FgroupId>\n        \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n        \u003Cversion>8.0.16\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n","java",[16054],{"type":20,"tag":84,"props":16055,"children":16056},{"__ignoreMap":8},[16057,16065,16073,16081,16089,16097,16105,16112,16120,16128,16136,16144,16152,16159,16167,16175,16183,16191],{"type":20,"tag":157,"props":16058,"children":16059},{"class":159,"line":160},[16060],{"type":20,"tag":157,"props":16061,"children":16062},{},[16063],{"type":25,"value":16064},"\u003Cdependencies> \u003C!-- Mybatis核心 -->\n",{"type":20,"tag":157,"props":16066,"children":16067},{"class":159,"line":169},[16068],{"type":20,"tag":157,"props":16069,"children":16070},{},[16071],{"type":25,"value":16072},"    \u003Cdependency>\n",{"type":20,"tag":157,"props":16074,"children":16075},{"class":159,"line":179},[16076],{"type":20,"tag":157,"props":16077,"children":16078},{},[16079],{"type":25,"value":16080},"        \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":16082,"children":16083},{"class":159,"line":188},[16084],{"type":20,"tag":157,"props":16085,"children":16086},{},[16087],{"type":25,"value":16088},"        \u003CartifactId>mybatis\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":16090,"children":16091},{"class":159,"line":196},[16092],{"type":20,"tag":157,"props":16093,"children":16094},{},[16095],{"type":25,"value":16096},"        \u003Cversion>3.5.7\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":16098,"children":16099},{"class":159,"line":204},[16100],{"type":20,"tag":157,"props":16101,"children":16102},{},[16103],{"type":25,"value":16104},"    \u003C\u002Fdependency> \u003C!-- junit测试 -->\n",{"type":20,"tag":157,"props":16106,"children":16107},{"class":159,"line":213},[16108],{"type":20,"tag":157,"props":16109,"children":16110},{},[16111],{"type":25,"value":16072},{"type":20,"tag":157,"props":16113,"children":16114},{"class":159,"line":222},[16115],{"type":20,"tag":157,"props":16116,"children":16117},{},[16118],{"type":25,"value":16119},"        \u003CgroupId>junit\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":16121,"children":16122},{"class":159,"line":440},[16123],{"type":20,"tag":157,"props":16124,"children":16125},{},[16126],{"type":25,"value":16127},"        \u003CartifactId>junit\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":16129,"children":16130},{"class":159,"line":448},[16131],{"type":20,"tag":157,"props":16132,"children":16133},{},[16134],{"type":25,"value":16135},"        \u003Cversion>4.12\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":16137,"children":16138},{"class":159,"line":456},[16139],{"type":20,"tag":157,"props":16140,"children":16141},{},[16142],{"type":25,"value":16143},"        \u003Cscope>test\u003C\u002Fscope>\n",{"type":20,"tag":157,"props":16145,"children":16146},{"class":159,"line":465},[16147],{"type":20,"tag":157,"props":16148,"children":16149},{},[16150],{"type":25,"value":16151},"    \u003C\u002Fdependency> \u003C!-- MySQL驱动 -->\n",{"type":20,"tag":157,"props":16153,"children":16154},{"class":159,"line":474},[16155],{"type":20,"tag":157,"props":16156,"children":16157},{},[16158],{"type":25,"value":16072},{"type":20,"tag":157,"props":16160,"children":16161},{"class":159,"line":483},[16162],{"type":20,"tag":157,"props":16163,"children":16164},{},[16165],{"type":25,"value":16166},"        \u003CgroupId>mysql\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":16168,"children":16169},{"class":159,"line":491},[16170],{"type":20,"tag":157,"props":16171,"children":16172},{},[16173],{"type":25,"value":16174},"        \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":16176,"children":16177},{"class":159,"line":499},[16178],{"type":20,"tag":157,"props":16179,"children":16180},{},[16181],{"type":25,"value":16182},"        \u003Cversion>8.0.16\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":16184,"children":16185},{"class":159,"line":508},[16186],{"type":20,"tag":157,"props":16187,"children":16188},{},[16189],{"type":25,"value":16190},"    \u003C\u002Fdependency>\n",{"type":20,"tag":157,"props":16192,"children":16193},{"class":159,"line":517},[16194],{"type":20,"tag":157,"props":16195,"children":16196},{},[16197],{"type":25,"value":16198},"\u003C\u002Fdependencies>\n",{"type":20,"tag":11085,"props":16200,"children":16202},{"id":16201},"_23-创建mybatis的核心配置文件",[16203],{"type":25,"value":16204},"2.3 创建MyBatis的核心配置文件",{"type":20,"tag":6665,"props":16206,"children":16207},{},[16208,16213,16218],{"type":20,"tag":21,"props":16209,"children":16210},{},[16211],{"type":25,"value":16212},"习惯上命名为mybatis-config.xml，这个文件名仅仅只是建议，并非强制要求。将来整合Spring之后，这个配置文件可以省略，所以大家操作时可以直接复制、粘贴。",{"type":20,"tag":21,"props":16214,"children":16215},{},[16216],{"type":25,"value":16217},"核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息。",{"type":20,"tag":21,"props":16219,"children":16220},{},[16221],{"type":25,"value":16222},"核心配置文件存放的位置是src\u002Fmain\u002Fresources目录下。",{"type":20,"tag":126,"props":16224,"children":16226},{"className":16050,"code":16225,"language":16052,"meta":8,"style":8},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?> \u003C!DOCTYPE configuration PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Config 3.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-config.dtd\">\n\n\u003C!--设置连接数据库的环境-->\n\u003Cconfiguration>\n    \u003Cenvironments default=\"development\">\n        \u003Cenvironment id=\"development\">\n            \u003CtransactionManager type=\"JDBC\"\u002F>\n            \u003CdataSource type=\"POOLED\">\n                \u003Cproperty name=\"driver\" value=\"com.mysql.cj.jdbc.Driver\"\u002F>\n                \u003Cproperty name=\"url\" value=\"jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fssm?serverTimezone=UTC\"\u002F>\n                \u003Cproperty name=\"username\" value=\"root\"\u002F>\n                \u003Cproperty name=\"password\" value=\"wangkun1\"\u002F>\n            \u003C\u002FdataSource>\n        \u003C\u002Fenvironment>\n    \u003C\u002Fenvironments>\n\n    \u003C!--引入映射文件-->\n    \u003Cmappers>\n        \u003Cmapper resource=\"mappers\u002FUserMapper.xml\"\u002F>\n    \u003C\u002Fmappers>\n\u003C\u002Fconfiguration>\n",[16227],{"type":20,"tag":84,"props":16228,"children":16229},{"__ignoreMap":8},[16230,16238,16246,16253,16261,16269,16277,16285,16293,16301,16309,16317,16325,16333,16341,16349,16357,16364,16372,16380,16388,16396],{"type":20,"tag":157,"props":16231,"children":16232},{"class":159,"line":160},[16233],{"type":20,"tag":157,"props":16234,"children":16235},{},[16236],{"type":25,"value":16237},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?> \u003C!DOCTYPE configuration PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Config 3.0\u002F\u002FEN\"\n",{"type":20,"tag":157,"props":16239,"children":16240},{"class":159,"line":169},[16241],{"type":20,"tag":157,"props":16242,"children":16243},{},[16244],{"type":25,"value":16245},"        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-config.dtd\">\n",{"type":20,"tag":157,"props":16247,"children":16248},{"class":159,"line":179},[16249],{"type":20,"tag":157,"props":16250,"children":16251},{"emptyLinePlaceholder":173},[16252],{"type":25,"value":176},{"type":20,"tag":157,"props":16254,"children":16255},{"class":159,"line":188},[16256],{"type":20,"tag":157,"props":16257,"children":16258},{},[16259],{"type":25,"value":16260},"\u003C!--设置连接数据库的环境-->\n",{"type":20,"tag":157,"props":16262,"children":16263},{"class":159,"line":196},[16264],{"type":20,"tag":157,"props":16265,"children":16266},{},[16267],{"type":25,"value":16268},"\u003Cconfiguration>\n",{"type":20,"tag":157,"props":16270,"children":16271},{"class":159,"line":204},[16272],{"type":20,"tag":157,"props":16273,"children":16274},{},[16275],{"type":25,"value":16276},"    \u003Cenvironments default=\"development\">\n",{"type":20,"tag":157,"props":16278,"children":16279},{"class":159,"line":213},[16280],{"type":20,"tag":157,"props":16281,"children":16282},{},[16283],{"type":25,"value":16284},"        \u003Cenvironment id=\"development\">\n",{"type":20,"tag":157,"props":16286,"children":16287},{"class":159,"line":222},[16288],{"type":20,"tag":157,"props":16289,"children":16290},{},[16291],{"type":25,"value":16292},"            \u003CtransactionManager type=\"JDBC\"\u002F>\n",{"type":20,"tag":157,"props":16294,"children":16295},{"class":159,"line":440},[16296],{"type":20,"tag":157,"props":16297,"children":16298},{},[16299],{"type":25,"value":16300},"            \u003CdataSource type=\"POOLED\">\n",{"type":20,"tag":157,"props":16302,"children":16303},{"class":159,"line":448},[16304],{"type":20,"tag":157,"props":16305,"children":16306},{},[16307],{"type":25,"value":16308},"                \u003Cproperty name=\"driver\" value=\"com.mysql.cj.jdbc.Driver\"\u002F>\n",{"type":20,"tag":157,"props":16310,"children":16311},{"class":159,"line":456},[16312],{"type":20,"tag":157,"props":16313,"children":16314},{},[16315],{"type":25,"value":16316},"                \u003Cproperty name=\"url\" value=\"jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fssm?serverTimezone=UTC\"\u002F>\n",{"type":20,"tag":157,"props":16318,"children":16319},{"class":159,"line":465},[16320],{"type":20,"tag":157,"props":16321,"children":16322},{},[16323],{"type":25,"value":16324},"                \u003Cproperty name=\"username\" value=\"root\"\u002F>\n",{"type":20,"tag":157,"props":16326,"children":16327},{"class":159,"line":474},[16328],{"type":20,"tag":157,"props":16329,"children":16330},{},[16331],{"type":25,"value":16332},"                \u003Cproperty name=\"password\" value=\"wangkun1\"\u002F>\n",{"type":20,"tag":157,"props":16334,"children":16335},{"class":159,"line":483},[16336],{"type":20,"tag":157,"props":16337,"children":16338},{},[16339],{"type":25,"value":16340},"            \u003C\u002FdataSource>\n",{"type":20,"tag":157,"props":16342,"children":16343},{"class":159,"line":491},[16344],{"type":20,"tag":157,"props":16345,"children":16346},{},[16347],{"type":25,"value":16348},"        \u003C\u002Fenvironment>\n",{"type":20,"tag":157,"props":16350,"children":16351},{"class":159,"line":499},[16352],{"type":20,"tag":157,"props":16353,"children":16354},{},[16355],{"type":25,"value":16356},"    \u003C\u002Fenvironments>\n",{"type":20,"tag":157,"props":16358,"children":16359},{"class":159,"line":508},[16360],{"type":20,"tag":157,"props":16361,"children":16362},{"emptyLinePlaceholder":173},[16363],{"type":25,"value":176},{"type":20,"tag":157,"props":16365,"children":16366},{"class":159,"line":517},[16367],{"type":20,"tag":157,"props":16368,"children":16369},{},[16370],{"type":25,"value":16371},"    \u003C!--引入映射文件-->\n",{"type":20,"tag":157,"props":16373,"children":16374},{"class":159,"line":1499},[16375],{"type":20,"tag":157,"props":16376,"children":16377},{},[16378],{"type":25,"value":16379},"    \u003Cmappers>\n",{"type":20,"tag":157,"props":16381,"children":16382},{"class":159,"line":1507},[16383],{"type":20,"tag":157,"props":16384,"children":16385},{},[16386],{"type":25,"value":16387},"        \u003Cmapper resource=\"mappers\u002FUserMapper.xml\"\u002F>\n",{"type":20,"tag":157,"props":16389,"children":16390},{"class":159,"line":1515},[16391],{"type":20,"tag":157,"props":16392,"children":16393},{},[16394],{"type":25,"value":16395},"    \u003C\u002Fmappers>\n",{"type":20,"tag":157,"props":16397,"children":16398},{"class":159,"line":1523},[16399],{"type":20,"tag":157,"props":16400,"children":16401},{},[16402],{"type":25,"value":16403},"\u003C\u002Fconfiguration>\n",{"type":20,"tag":11085,"props":16405,"children":16407},{"id":16406},"_24-创建mapper接口",[16408],{"type":25,"value":16409},"2.4 创建mapper接口",{"type":20,"tag":6665,"props":16411,"children":16412},{},[16413],{"type":20,"tag":21,"props":16414,"children":16415},{},[16416],{"type":25,"value":16417},"MyBatis中的mapper接口相当于以前的dao。但是区别在于，mapper仅仅是接口，我们不需要提供实现类。",{"type":20,"tag":126,"props":16419,"children":16421},{"className":16050,"code":16420,"language":16052,"meta":8,"style":8},"public interface UserMapper { \n    \u002F** 添加用户信息 *\u002F \n    int insertUser(); \n}\n",[16422],{"type":20,"tag":84,"props":16423,"children":16424},{"__ignoreMap":8},[16425,16433,16441,16449],{"type":20,"tag":157,"props":16426,"children":16427},{"class":159,"line":160},[16428],{"type":20,"tag":157,"props":16429,"children":16430},{},[16431],{"type":25,"value":16432},"public interface UserMapper { \n",{"type":20,"tag":157,"props":16434,"children":16435},{"class":159,"line":169},[16436],{"type":20,"tag":157,"props":16437,"children":16438},{},[16439],{"type":25,"value":16440},"    \u002F** 添加用户信息 *\u002F \n",{"type":20,"tag":157,"props":16442,"children":16443},{"class":159,"line":179},[16444],{"type":20,"tag":157,"props":16445,"children":16446},{},[16447],{"type":25,"value":16448},"    int insertUser(); \n",{"type":20,"tag":157,"props":16450,"children":16451},{"class":159,"line":188},[16452],{"type":20,"tag":157,"props":16453,"children":16454},{},[16455],{"type":25,"value":943},{"type":20,"tag":11085,"props":16457,"children":16459},{"id":16458},"_25-创建mapper映射文件",[16460],{"type":25,"value":16461},"2.5 创建mapper映射文件",{"type":20,"tag":21,"props":16463,"children":16464},{},[16465,16467,16472,16474,16478,16480,16484,16486,16491],{"type":25,"value":16466},"相关概念：",{"type":20,"tag":33,"props":16468,"children":16469},{},[16470],{"type":25,"value":16471},"ORM",{"type":25,"value":16473},"（",{"type":20,"tag":33,"props":16475,"children":16476},{},[16477],{"type":25,"value":2227},{"type":25,"value":16479},"bject ",{"type":20,"tag":33,"props":16481,"children":16482},{},[16483],{"type":25,"value":12436},{"type":25,"value":16485},"elationship ",{"type":20,"tag":33,"props":16487,"children":16488},{},[16489],{"type":25,"value":16490},"M",{"type":25,"value":16492},"apping）对象关系映射。",{"type":20,"tag":44,"props":16494,"children":16495},{},[16496,16501,16506],{"type":20,"tag":48,"props":16497,"children":16498},{},[16499],{"type":25,"value":16500},"对象：Java的实体类对象",{"type":20,"tag":48,"props":16502,"children":16503},{},[16504],{"type":25,"value":16505},"关系：关系型数据库",{"type":20,"tag":48,"props":16507,"children":16508},{},[16509],{"type":25,"value":16510},"映射：二者之间的对应关系",{"type":20,"tag":1902,"props":16512,"children":16513},{},[16514,16531],{"type":20,"tag":1906,"props":16515,"children":16516},{},[16517],{"type":20,"tag":1910,"props":16518,"children":16519},{},[16520,16526],{"type":20,"tag":1914,"props":16521,"children":16523},{"align":16522},"center",[16524],{"type":25,"value":16525},"Java概念",{"type":20,"tag":1914,"props":16527,"children":16528},{"align":16522},[16529],{"type":25,"value":16530},"数据库概念",{"type":20,"tag":1930,"props":16532,"children":16533},{},[16534,16547,16560],{"type":20,"tag":1910,"props":16535,"children":16536},{},[16537,16542],{"type":20,"tag":1937,"props":16538,"children":16539},{"align":16522},[16540],{"type":25,"value":16541},"类",{"type":20,"tag":1937,"props":16543,"children":16544},{"align":16522},[16545],{"type":25,"value":16546},"表",{"type":20,"tag":1910,"props":16548,"children":16549},{},[16550,16555],{"type":20,"tag":1937,"props":16551,"children":16552},{"align":16522},[16553],{"type":25,"value":16554},"属性",{"type":20,"tag":1937,"props":16556,"children":16557},{"align":16522},[16558],{"type":25,"value":16559},"字段\u002F列",{"type":20,"tag":1910,"props":16561,"children":16562},{},[16563,16568],{"type":20,"tag":1937,"props":16564,"children":16565},{"align":16522},[16566],{"type":25,"value":16567},"对象",{"type":20,"tag":1937,"props":16569,"children":16570},{"align":16522},[16571],{"type":25,"value":16572},"记录\u002F行",{"type":20,"tag":6665,"props":16574,"children":16575},{},[16576,16581,16586,16591,16599,16604,16609,16614],{"type":20,"tag":21,"props":16577,"children":16578},{},[16579],{"type":25,"value":16580},"1、映射文件的命名规则：",{"type":20,"tag":21,"props":16582,"children":16583},{},[16584],{"type":25,"value":16585},"表所对应的实体类的类名+Mapper.xml，例如：表t_user，映射的实体类为User，所对应的映射文件为UserMapper.xml",{"type":20,"tag":21,"props":16587,"children":16588},{},[16589],{"type":25,"value":16590},"因此一个映射文件对应一个实体类，对应一张表的操作",{"type":20,"tag":21,"props":16592,"children":16593},{},[16594],{"type":20,"tag":33,"props":16595,"children":16596},{},[16597],{"type":25,"value":16598},"一张表 ==> 一个实体类 ==> 一个mapper接口 ==> 映射文件",{"type":20,"tag":21,"props":16600,"children":16601},{},[16602],{"type":25,"value":16603},"MyBatis映射文件用于编写SQL，访问以及操作表中的数据",{"type":20,"tag":21,"props":16605,"children":16606},{},[16607],{"type":25,"value":16608},"MyBatis映射文件存放的位置是src\u002Fmain\u002Fresources\u002Fmappers目录下",{"type":20,"tag":21,"props":16610,"children":16611},{},[16612],{"type":25,"value":16613},"2、 MyBatis中可以面向接口操作数据，要保证两个一致：",{"type":20,"tag":44,"props":16615,"children":16616},{},[16617,16622],{"type":20,"tag":48,"props":16618,"children":16619},{},[16620],{"type":25,"value":16621},"mapper接口的全类名和映射文件的命名空间（namespace）保持一致",{"type":20,"tag":48,"props":16623,"children":16624},{},[16625],{"type":25,"value":16626},"mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致",{"type":20,"tag":126,"props":16628,"children":16630},{"className":16050,"code":16629,"language":16052,"meta":8,"style":8},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?> \u003C!DOCTYPE mapper PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Mapper 3.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-mapper.dtd\">\n\u003Cmapper namespace=\"com.wangkun.mybatis.mapper.UserMapper\">\n\n    \u003C!--int insertUser();-->\n    \u003Cinsert id=\"insertUser\">\n        insert into t_user\n        values (null, 'admin', '123456', 23, '男', '12345@qq.com')\n    \u003C\u002Finsert>\n\n\u003C\u002Fmapper>\n",[16631],{"type":20,"tag":84,"props":16632,"children":16633},{"__ignoreMap":8},[16634,16642,16650,16658,16665,16673,16681,16689,16697,16705,16712],{"type":20,"tag":157,"props":16635,"children":16636},{"class":159,"line":160},[16637],{"type":20,"tag":157,"props":16638,"children":16639},{},[16640],{"type":25,"value":16641},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?> \u003C!DOCTYPE mapper PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Mapper 3.0\u002F\u002FEN\"\n",{"type":20,"tag":157,"props":16643,"children":16644},{"class":159,"line":169},[16645],{"type":20,"tag":157,"props":16646,"children":16647},{},[16648],{"type":25,"value":16649},"        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-mapper.dtd\">\n",{"type":20,"tag":157,"props":16651,"children":16652},{"class":159,"line":179},[16653],{"type":20,"tag":157,"props":16654,"children":16655},{},[16656],{"type":25,"value":16657},"\u003Cmapper namespace=\"com.wangkun.mybatis.mapper.UserMapper\">\n",{"type":20,"tag":157,"props":16659,"children":16660},{"class":159,"line":188},[16661],{"type":20,"tag":157,"props":16662,"children":16663},{"emptyLinePlaceholder":173},[16664],{"type":25,"value":176},{"type":20,"tag":157,"props":16666,"children":16667},{"class":159,"line":196},[16668],{"type":20,"tag":157,"props":16669,"children":16670},{},[16671],{"type":25,"value":16672},"    \u003C!--int insertUser();-->\n",{"type":20,"tag":157,"props":16674,"children":16675},{"class":159,"line":204},[16676],{"type":20,"tag":157,"props":16677,"children":16678},{},[16679],{"type":25,"value":16680},"    \u003Cinsert id=\"insertUser\">\n",{"type":20,"tag":157,"props":16682,"children":16683},{"class":159,"line":213},[16684],{"type":20,"tag":157,"props":16685,"children":16686},{},[16687],{"type":25,"value":16688},"        insert into t_user\n",{"type":20,"tag":157,"props":16690,"children":16691},{"class":159,"line":222},[16692],{"type":20,"tag":157,"props":16693,"children":16694},{},[16695],{"type":25,"value":16696},"        values (null, 'admin', '123456', 23, '男', '12345@qq.com')\n",{"type":20,"tag":157,"props":16698,"children":16699},{"class":159,"line":440},[16700],{"type":20,"tag":157,"props":16701,"children":16702},{},[16703],{"type":25,"value":16704},"    \u003C\u002Finsert>\n",{"type":20,"tag":157,"props":16706,"children":16707},{"class":159,"line":448},[16708],{"type":20,"tag":157,"props":16709,"children":16710},{"emptyLinePlaceholder":173},[16711],{"type":25,"value":176},{"type":20,"tag":157,"props":16713,"children":16714},{"class":159,"line":456},[16715],{"type":20,"tag":157,"props":16716,"children":16717},{},[16718],{"type":25,"value":16719},"\u003C\u002Fmapper>\n",{"type":20,"tag":11085,"props":16721,"children":16723},{"id":16722},"_26-创建测试类",[16724],{"type":25,"value":16725},"2.6 创建测试类",{"type":20,"tag":126,"props":16727,"children":16729},{"className":16050,"code":16728,"language":16052,"meta":8,"style":8},"package com.wangkun.mybatis.test;\n\nimport com.wangkun.mybatis.mapper.UserMapper;\nimport org.apache.ibatis.io.Resources;\nimport org.apache.ibatis.session.SqlSession;\nimport org.apache.ibatis.session.SqlSessionFactory;\nimport org.apache.ibatis.session.SqlSessionFactoryBuilder;\nimport org.junit.Test;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\npublic class MybatisTest {\n    @Test\n    public void testInsert() throws IOException {\n\n        InputStream is = Resources.getResourceAsStream(\"mybatis-config.xml\");\n        \u002F\u002F 创建SqlSessionFactoryBuilder对象\n        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();\n        \u002F\u002F 通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory，生产SqlSession对象\n        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);\n        \u002F\u002F 创建SqlSession对象，此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务\n        SqlSession sqlSession = sqlSessionFactory.openSession();\n        \u002F\u002F 创建SqlSession对象，此时通过SqlSession对象所操作的sql都会自动提交\n        \u002F\u002F SqlSession sqlSession = sqlSessionFactory.openSession(true);\n\n        \u002F\u002F 通过代理模式创建UserMapper接口的代理实现类对象\n        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);\n        \u002F\u002F 调用UserMapper接口中的方法，就可以根据UserMapper的全类名匹配元素文件，通过调用的方法名匹配 映射文件中的SQL标签，并执行标签中的SQL语句\n        int result = userMapper.insertUser();\n\n        \u002F*上面两行代码就相当于*\u002F\n        \u002F\u002F sqlSession.insert(\"com.wangkun.mybatis.mapper.UserMapper.insertUser\");\n        sqlSession.commit();\n        sqlSession.close();\n\n        System.out.println(\"结果：\" + result);\n    }\n}\n",[16730],{"type":20,"tag":84,"props":16731,"children":16732},{"__ignoreMap":8},[16733,16741,16748,16756,16764,16772,16780,16788,16796,16803,16811,16819,16826,16834,16842,16850,16857,16865,16873,16881,16889,16897,16905,16913,16921,16929,16936,16944,16952,16960,16968,16975,16983,16991,16999,17007,17014,17022,17029],{"type":20,"tag":157,"props":16734,"children":16735},{"class":159,"line":160},[16736],{"type":20,"tag":157,"props":16737,"children":16738},{},[16739],{"type":25,"value":16740},"package com.wangkun.mybatis.test;\n",{"type":20,"tag":157,"props":16742,"children":16743},{"class":159,"line":169},[16744],{"type":20,"tag":157,"props":16745,"children":16746},{"emptyLinePlaceholder":173},[16747],{"type":25,"value":176},{"type":20,"tag":157,"props":16749,"children":16750},{"class":159,"line":179},[16751],{"type":20,"tag":157,"props":16752,"children":16753},{},[16754],{"type":25,"value":16755},"import com.wangkun.mybatis.mapper.UserMapper;\n",{"type":20,"tag":157,"props":16757,"children":16758},{"class":159,"line":188},[16759],{"type":20,"tag":157,"props":16760,"children":16761},{},[16762],{"type":25,"value":16763},"import org.apache.ibatis.io.Resources;\n",{"type":20,"tag":157,"props":16765,"children":16766},{"class":159,"line":196},[16767],{"type":20,"tag":157,"props":16768,"children":16769},{},[16770],{"type":25,"value":16771},"import org.apache.ibatis.session.SqlSession;\n",{"type":20,"tag":157,"props":16773,"children":16774},{"class":159,"line":204},[16775],{"type":20,"tag":157,"props":16776,"children":16777},{},[16778],{"type":25,"value":16779},"import org.apache.ibatis.session.SqlSessionFactory;\n",{"type":20,"tag":157,"props":16781,"children":16782},{"class":159,"line":213},[16783],{"type":20,"tag":157,"props":16784,"children":16785},{},[16786],{"type":25,"value":16787},"import org.apache.ibatis.session.SqlSessionFactoryBuilder;\n",{"type":20,"tag":157,"props":16789,"children":16790},{"class":159,"line":222},[16791],{"type":20,"tag":157,"props":16792,"children":16793},{},[16794],{"type":25,"value":16795},"import org.junit.Test;\n",{"type":20,"tag":157,"props":16797,"children":16798},{"class":159,"line":440},[16799],{"type":20,"tag":157,"props":16800,"children":16801},{"emptyLinePlaceholder":173},[16802],{"type":25,"value":176},{"type":20,"tag":157,"props":16804,"children":16805},{"class":159,"line":448},[16806],{"type":20,"tag":157,"props":16807,"children":16808},{},[16809],{"type":25,"value":16810},"import java.io.IOException;\n",{"type":20,"tag":157,"props":16812,"children":16813},{"class":159,"line":456},[16814],{"type":20,"tag":157,"props":16815,"children":16816},{},[16817],{"type":25,"value":16818},"import java.io.InputStream;\n",{"type":20,"tag":157,"props":16820,"children":16821},{"class":159,"line":465},[16822],{"type":20,"tag":157,"props":16823,"children":16824},{"emptyLinePlaceholder":173},[16825],{"type":25,"value":176},{"type":20,"tag":157,"props":16827,"children":16828},{"class":159,"line":474},[16829],{"type":20,"tag":157,"props":16830,"children":16831},{},[16832],{"type":25,"value":16833},"public class MybatisTest {\n",{"type":20,"tag":157,"props":16835,"children":16836},{"class":159,"line":483},[16837],{"type":20,"tag":157,"props":16838,"children":16839},{},[16840],{"type":25,"value":16841},"    @Test\n",{"type":20,"tag":157,"props":16843,"children":16844},{"class":159,"line":491},[16845],{"type":20,"tag":157,"props":16846,"children":16847},{},[16848],{"type":25,"value":16849},"    public void testInsert() throws IOException {\n",{"type":20,"tag":157,"props":16851,"children":16852},{"class":159,"line":499},[16853],{"type":20,"tag":157,"props":16854,"children":16855},{"emptyLinePlaceholder":173},[16856],{"type":25,"value":176},{"type":20,"tag":157,"props":16858,"children":16859},{"class":159,"line":508},[16860],{"type":20,"tag":157,"props":16861,"children":16862},{},[16863],{"type":25,"value":16864},"        InputStream is = Resources.getResourceAsStream(\"mybatis-config.xml\");\n",{"type":20,"tag":157,"props":16866,"children":16867},{"class":159,"line":517},[16868],{"type":20,"tag":157,"props":16869,"children":16870},{},[16871],{"type":25,"value":16872},"        \u002F\u002F 创建SqlSessionFactoryBuilder对象\n",{"type":20,"tag":157,"props":16874,"children":16875},{"class":159,"line":1499},[16876],{"type":20,"tag":157,"props":16877,"children":16878},{},[16879],{"type":25,"value":16880},"        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();\n",{"type":20,"tag":157,"props":16882,"children":16883},{"class":159,"line":1507},[16884],{"type":20,"tag":157,"props":16885,"children":16886},{},[16887],{"type":25,"value":16888},"        \u002F\u002F 通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory，生产SqlSession对象\n",{"type":20,"tag":157,"props":16890,"children":16891},{"class":159,"line":1515},[16892],{"type":20,"tag":157,"props":16893,"children":16894},{},[16895],{"type":25,"value":16896},"        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);\n",{"type":20,"tag":157,"props":16898,"children":16899},{"class":159,"line":1523},[16900],{"type":20,"tag":157,"props":16901,"children":16902},{},[16903],{"type":25,"value":16904},"        \u002F\u002F 创建SqlSession对象，此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务\n",{"type":20,"tag":157,"props":16906,"children":16907},{"class":159,"line":1532},[16908],{"type":20,"tag":157,"props":16909,"children":16910},{},[16911],{"type":25,"value":16912},"        SqlSession sqlSession = sqlSessionFactory.openSession();\n",{"type":20,"tag":157,"props":16914,"children":16915},{"class":159,"line":1541},[16916],{"type":20,"tag":157,"props":16917,"children":16918},{},[16919],{"type":25,"value":16920},"        \u002F\u002F 创建SqlSession对象，此时通过SqlSession对象所操作的sql都会自动提交\n",{"type":20,"tag":157,"props":16922,"children":16923},{"class":159,"line":1550},[16924],{"type":20,"tag":157,"props":16925,"children":16926},{},[16927],{"type":25,"value":16928},"        \u002F\u002F SqlSession sqlSession = sqlSessionFactory.openSession(true);\n",{"type":20,"tag":157,"props":16930,"children":16931},{"class":159,"line":1558},[16932],{"type":20,"tag":157,"props":16933,"children":16934},{"emptyLinePlaceholder":173},[16935],{"type":25,"value":176},{"type":20,"tag":157,"props":16937,"children":16938},{"class":159,"line":1566},[16939],{"type":20,"tag":157,"props":16940,"children":16941},{},[16942],{"type":25,"value":16943},"        \u002F\u002F 通过代理模式创建UserMapper接口的代理实现类对象\n",{"type":20,"tag":157,"props":16945,"children":16946},{"class":159,"line":1574},[16947],{"type":20,"tag":157,"props":16948,"children":16949},{},[16950],{"type":25,"value":16951},"        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);\n",{"type":20,"tag":157,"props":16953,"children":16954},{"class":159,"line":1582},[16955],{"type":20,"tag":157,"props":16956,"children":16957},{},[16958],{"type":25,"value":16959},"        \u002F\u002F 调用UserMapper接口中的方法，就可以根据UserMapper的全类名匹配元素文件，通过调用的方法名匹配 映射文件中的SQL标签，并执行标签中的SQL语句\n",{"type":20,"tag":157,"props":16961,"children":16962},{"class":159,"line":1591},[16963],{"type":20,"tag":157,"props":16964,"children":16965},{},[16966],{"type":25,"value":16967},"        int result = userMapper.insertUser();\n",{"type":20,"tag":157,"props":16969,"children":16970},{"class":159,"line":1599},[16971],{"type":20,"tag":157,"props":16972,"children":16973},{"emptyLinePlaceholder":173},[16974],{"type":25,"value":176},{"type":20,"tag":157,"props":16976,"children":16977},{"class":159,"line":1608},[16978],{"type":20,"tag":157,"props":16979,"children":16980},{},[16981],{"type":25,"value":16982},"        \u002F*上面两行代码就相当于*\u002F\n",{"type":20,"tag":157,"props":16984,"children":16985},{"class":159,"line":1617},[16986],{"type":20,"tag":157,"props":16987,"children":16988},{},[16989],{"type":25,"value":16990},"        \u002F\u002F sqlSession.insert(\"com.wangkun.mybatis.mapper.UserMapper.insertUser\");\n",{"type":20,"tag":157,"props":16992,"children":16993},{"class":159,"line":1626},[16994],{"type":20,"tag":157,"props":16995,"children":16996},{},[16997],{"type":25,"value":16998},"        sqlSession.commit();\n",{"type":20,"tag":157,"props":17000,"children":17001},{"class":159,"line":1634},[17002],{"type":20,"tag":157,"props":17003,"children":17004},{},[17005],{"type":25,"value":17006},"        sqlSession.close();\n",{"type":20,"tag":157,"props":17008,"children":17009},{"class":159,"line":1642},[17010],{"type":20,"tag":157,"props":17011,"children":17012},{"emptyLinePlaceholder":173},[17013],{"type":25,"value":176},{"type":20,"tag":157,"props":17015,"children":17016},{"class":159,"line":1650},[17017],{"type":20,"tag":157,"props":17018,"children":17019},{},[17020],{"type":25,"value":17021},"        System.out.println(\"结果：\" + result);\n",{"type":20,"tag":157,"props":17023,"children":17024},{"class":159,"line":1659},[17025],{"type":20,"tag":157,"props":17026,"children":17027},{},[17028],{"type":25,"value":872},{"type":20,"tag":157,"props":17030,"children":17031},{"class":159,"line":1668},[17032],{"type":20,"tag":157,"props":17033,"children":17034},{},[17035],{"type":25,"value":943},{"type":20,"tag":11085,"props":17037,"children":17039},{"id":17038},"_27-日志功能",[17040],{"type":25,"value":17041},"2.7 日志功能",{"type":20,"tag":5719,"props":17043,"children":17044},{},[17045],{"type":20,"tag":48,"props":17046,"children":17047},{},[17048],{"type":25,"value":17049},"加入依赖",{"type":20,"tag":126,"props":17051,"children":17055},{"className":17052,"code":17053,"language":17054,"meta":8,"style":8},"language-xml shiki shiki-themes github-dark","\u003C!-- log4j日志 -->\n\u003Cdependency>\n    \u003CgroupId>log4j\u003C\u002FgroupId>\n    \u003CartifactId>log4j\u003C\u002FartifactId>\n    \u003Cversion>1.2.17\u003C\u002Fversion>\n\u003C\u002Fdependency>\n","xml",[17056],{"type":20,"tag":84,"props":17057,"children":17058},{"__ignoreMap":8},[17059,17067,17075,17083,17091,17099],{"type":20,"tag":157,"props":17060,"children":17061},{"class":159,"line":160},[17062],{"type":20,"tag":157,"props":17063,"children":17064},{},[17065],{"type":25,"value":17066},"\u003C!-- log4j日志 -->\n",{"type":20,"tag":157,"props":17068,"children":17069},{"class":159,"line":169},[17070],{"type":20,"tag":157,"props":17071,"children":17072},{},[17073],{"type":25,"value":17074},"\u003Cdependency>\n",{"type":20,"tag":157,"props":17076,"children":17077},{"class":159,"line":179},[17078],{"type":20,"tag":157,"props":17079,"children":17080},{},[17081],{"type":25,"value":17082},"    \u003CgroupId>log4j\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":17084,"children":17085},{"class":159,"line":188},[17086],{"type":20,"tag":157,"props":17087,"children":17088},{},[17089],{"type":25,"value":17090},"    \u003CartifactId>log4j\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":17092,"children":17093},{"class":159,"line":196},[17094],{"type":20,"tag":157,"props":17095,"children":17096},{},[17097],{"type":25,"value":17098},"    \u003Cversion>1.2.17\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":17100,"children":17101},{"class":159,"line":204},[17102],{"type":20,"tag":157,"props":17103,"children":17104},{},[17105],{"type":25,"value":17106},"\u003C\u002Fdependency>\n",{"type":20,"tag":5719,"props":17108,"children":17109},{"start":169},[17110],{"type":20,"tag":48,"props":17111,"children":17112},{},[17113],{"type":25,"value":17114},"加入log4j配置文件",{"type":20,"tag":126,"props":17116,"children":17118},{"className":17052,"code":17117,"language":17054,"meta":8,"style":8},"\u003C!--src\u002Fmain\u002Fresources\u002Flog4j.xml-->\n\u003C?xml version=\"1.0\" encoding=\"GB2312\" ?>\n\u003C!DOCTYPE log4j:configuration SYSTEM\n        \"http:\u002F\u002Flogging.apache.org\u002Flog4j\u002F1.2\u002Fapidocs\u002Forg\u002Fapache\u002Flog4j\u002Fxml\u002Fdoc-files\u002Flog4j.dtd\">\n\n\u003Clog4j:configuration debug=\"true\">\n\n    \u003Cappender name=\"STDOUT\" class=\"org.apache.log4j.ConsoleAppender\">\n        \u003Cparam name=\"Encoding\" value=\"UTF-8\"\u002F>\n        \u003Clayout class=\"org.apache.log4j.PatternLayout\">\n            \u003Cparam name=\"ConversionPattern\" value=\"%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \\n\"\u002F>\n        \u003C\u002Flayout>\n    \u003C\u002Fappender>\n    \u003Clogger name=\"java.sql\">\n        \u003Clevel value=\"debug\"\u002F>\n    \u003C\u002Flogger>\n    \u003Clogger name=\"org.apache.ibatis\">\n        \u003Clevel value=\"info\"\u002F>\n    \u003C\u002Flogger>\n  \n    \u003Croot>\n        \u003Clevel value=\"debug\"\u002F>\n        \u003Cappender-ref ref=\"STDOUT\"\u002F>\n    \u003C\u002Froot>\n  \n\u003C\u002Flog4j:configuration>\n",[17119],{"type":20,"tag":84,"props":17120,"children":17121},{"__ignoreMap":8},[17122,17130,17138,17146,17154,17161,17169,17176,17184,17192,17200,17208,17216,17224,17232,17240,17248,17256,17264,17271,17279,17287,17294,17302,17310,17317],{"type":20,"tag":157,"props":17123,"children":17124},{"class":159,"line":160},[17125],{"type":20,"tag":157,"props":17126,"children":17127},{},[17128],{"type":25,"value":17129},"\u003C!--src\u002Fmain\u002Fresources\u002Flog4j.xml-->\n",{"type":20,"tag":157,"props":17131,"children":17132},{"class":159,"line":169},[17133],{"type":20,"tag":157,"props":17134,"children":17135},{},[17136],{"type":25,"value":17137},"\u003C?xml version=\"1.0\" encoding=\"GB2312\" ?>\n",{"type":20,"tag":157,"props":17139,"children":17140},{"class":159,"line":179},[17141],{"type":20,"tag":157,"props":17142,"children":17143},{},[17144],{"type":25,"value":17145},"\u003C!DOCTYPE log4j:configuration SYSTEM\n",{"type":20,"tag":157,"props":17147,"children":17148},{"class":159,"line":188},[17149],{"type":20,"tag":157,"props":17150,"children":17151},{},[17152],{"type":25,"value":17153},"        \"http:\u002F\u002Flogging.apache.org\u002Flog4j\u002F1.2\u002Fapidocs\u002Forg\u002Fapache\u002Flog4j\u002Fxml\u002Fdoc-files\u002Flog4j.dtd\">\n",{"type":20,"tag":157,"props":17155,"children":17156},{"class":159,"line":196},[17157],{"type":20,"tag":157,"props":17158,"children":17159},{"emptyLinePlaceholder":173},[17160],{"type":25,"value":176},{"type":20,"tag":157,"props":17162,"children":17163},{"class":159,"line":204},[17164],{"type":20,"tag":157,"props":17165,"children":17166},{},[17167],{"type":25,"value":17168},"\u003Clog4j:configuration debug=\"true\">\n",{"type":20,"tag":157,"props":17170,"children":17171},{"class":159,"line":213},[17172],{"type":20,"tag":157,"props":17173,"children":17174},{"emptyLinePlaceholder":173},[17175],{"type":25,"value":176},{"type":20,"tag":157,"props":17177,"children":17178},{"class":159,"line":222},[17179],{"type":20,"tag":157,"props":17180,"children":17181},{},[17182],{"type":25,"value":17183},"    \u003Cappender name=\"STDOUT\" class=\"org.apache.log4j.ConsoleAppender\">\n",{"type":20,"tag":157,"props":17185,"children":17186},{"class":159,"line":440},[17187],{"type":20,"tag":157,"props":17188,"children":17189},{},[17190],{"type":25,"value":17191},"        \u003Cparam name=\"Encoding\" value=\"UTF-8\"\u002F>\n",{"type":20,"tag":157,"props":17193,"children":17194},{"class":159,"line":448},[17195],{"type":20,"tag":157,"props":17196,"children":17197},{},[17198],{"type":25,"value":17199},"        \u003Clayout class=\"org.apache.log4j.PatternLayout\">\n",{"type":20,"tag":157,"props":17201,"children":17202},{"class":159,"line":456},[17203],{"type":20,"tag":157,"props":17204,"children":17205},{},[17206],{"type":25,"value":17207},"            \u003Cparam name=\"ConversionPattern\" value=\"%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \\n\"\u002F>\n",{"type":20,"tag":157,"props":17209,"children":17210},{"class":159,"line":465},[17211],{"type":20,"tag":157,"props":17212,"children":17213},{},[17214],{"type":25,"value":17215},"        \u003C\u002Flayout>\n",{"type":20,"tag":157,"props":17217,"children":17218},{"class":159,"line":474},[17219],{"type":20,"tag":157,"props":17220,"children":17221},{},[17222],{"type":25,"value":17223},"    \u003C\u002Fappender>\n",{"type":20,"tag":157,"props":17225,"children":17226},{"class":159,"line":483},[17227],{"type":20,"tag":157,"props":17228,"children":17229},{},[17230],{"type":25,"value":17231},"    \u003Clogger name=\"java.sql\">\n",{"type":20,"tag":157,"props":17233,"children":17234},{"class":159,"line":491},[17235],{"type":20,"tag":157,"props":17236,"children":17237},{},[17238],{"type":25,"value":17239},"        \u003Clevel value=\"debug\"\u002F>\n",{"type":20,"tag":157,"props":17241,"children":17242},{"class":159,"line":499},[17243],{"type":20,"tag":157,"props":17244,"children":17245},{},[17246],{"type":25,"value":17247},"    \u003C\u002Flogger>\n",{"type":20,"tag":157,"props":17249,"children":17250},{"class":159,"line":508},[17251],{"type":20,"tag":157,"props":17252,"children":17253},{},[17254],{"type":25,"value":17255},"    \u003Clogger name=\"org.apache.ibatis\">\n",{"type":20,"tag":157,"props":17257,"children":17258},{"class":159,"line":517},[17259],{"type":20,"tag":157,"props":17260,"children":17261},{},[17262],{"type":25,"value":17263},"        \u003Clevel value=\"info\"\u002F>\n",{"type":20,"tag":157,"props":17265,"children":17266},{"class":159,"line":1499},[17267],{"type":20,"tag":157,"props":17268,"children":17269},{},[17270],{"type":25,"value":17247},{"type":20,"tag":157,"props":17272,"children":17273},{"class":159,"line":1507},[17274],{"type":20,"tag":157,"props":17275,"children":17276},{},[17277],{"type":25,"value":17278},"  \n",{"type":20,"tag":157,"props":17280,"children":17281},{"class":159,"line":1515},[17282],{"type":20,"tag":157,"props":17283,"children":17284},{},[17285],{"type":25,"value":17286},"    \u003Croot>\n",{"type":20,"tag":157,"props":17288,"children":17289},{"class":159,"line":1523},[17290],{"type":20,"tag":157,"props":17291,"children":17292},{},[17293],{"type":25,"value":17239},{"type":20,"tag":157,"props":17295,"children":17296},{"class":159,"line":1532},[17297],{"type":20,"tag":157,"props":17298,"children":17299},{},[17300],{"type":25,"value":17301},"        \u003Cappender-ref ref=\"STDOUT\"\u002F>\n",{"type":20,"tag":157,"props":17303,"children":17304},{"class":159,"line":1541},[17305],{"type":20,"tag":157,"props":17306,"children":17307},{},[17308],{"type":25,"value":17309},"    \u003C\u002Froot>\n",{"type":20,"tag":157,"props":17311,"children":17312},{"class":159,"line":1550},[17313],{"type":20,"tag":157,"props":17314,"children":17315},{},[17316],{"type":25,"value":17278},{"type":20,"tag":157,"props":17318,"children":17319},{"class":159,"line":1558},[17320],{"type":20,"tag":157,"props":17321,"children":17322},{},[17323],{"type":25,"value":17324},"\u003C\u002Flog4j:configuration>\n",{"type":20,"tag":21,"props":17326,"children":17327},{},[17328],{"type":20,"tag":33,"props":17329,"children":17330},{},[17331],{"type":25,"value":17332},"日志的级别：",{"type":20,"tag":6665,"props":17334,"children":17335},{},[17336,17341],{"type":20,"tag":21,"props":17337,"children":17338},{},[17339],{"type":25,"value":17340},"FATAL(致命) > ERROR(错误) > WARN(警告) > INFO(信息) > DEBUG(调试)",{"type":20,"tag":21,"props":17342,"children":17343},{},[17344],{"type":25,"value":17345},"从左到右打印的内容越来越详细",{"type":20,"tag":28,"props":17347,"children":17349},{"id":17348},"_3-核心配置文件",[17350],{"type":25,"value":17351},"3. 核心配置文件",{"type":20,"tag":126,"props":17353,"children":17355},{"className":17052,"code":17354,"language":17054,"meta":8,"style":8},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?> \u003C!DOCTYPE configuration PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Config 3.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-config.dtd\">\n\n\u003C!--设置连接数据库的环境-->\n\u003Cconfiguration>\n    \u003C!--MyBatis核心配置文件中，标签的顺序： properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?,mappers? -->\n\n    \u003C!--1. properties: 引入properties文件，可以用${key}访问value-->\n    \u003Cproperties resource=\"jdbc.properties\"\u002F>\n\n    \u003C!--2. typeAliases: 类型别名-->\n    \u003CtypeAliases>\n        \u003C!-- (1).给单个实体类设置别名 -->\n        \u003C!--\u003CtypeAlias type=\"com.wangkun.mybatis.pojo.User\" alias=\"User\"\u002F>-->\n        \u003C!-- (2).给同一设置别别名，别名默认就是类名-->\n        \u003Cpackage name=\"com.wangkun.mybatis.pojo\"\u002F>\n    \u003C\u002FtypeAliases>\n\n    \u003C!--3. environments：配置多个连接数据库的环境 属性：default：设置默认使用的环境的id -->\n    \u003Cenvironments default=\"development\">\n        \u003Cenvironment id=\"development\">\n            \u003CtransactionManager type=\"JDBC\"\u002F>\n            \u003CdataSource type=\"POOLED\">\n                \u003Cproperty name=\"driver\" value=\"${jdbc.driver}\"\u002F>\n                \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n                \u003Cproperty name=\"username\" value=\"${jdbc.username}\"\u002F>\n                \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n            \u003C\u002FdataSource>\n        \u003C\u002Fenvironment>\n\n    \u003C\u002Fenvironments>\n\n    \u003C!--4. 引入映射文件-->\n    \u003Cmappers>\n        \u003C!--单个引入映射文件-->\n        \u003C!--\u003Cmapper resource=\"mappers\u002FUserMapper.xml\"\u002F>-->\n        \u003C!--\n            以包的形式引入映射文件\n            (1). mapper接口与映射文件所在的包必须一致\n            (2). 接口的名字与与映射文件的名字必须一致\n        -->\n        \u003Cpackage name=\"com.wangkun.mybatis.mapper\"\u002F>\n    \u003C\u002Fmappers>\n\u003C\u002Fconfiguration>\n",[17356],{"type":20,"tag":84,"props":17357,"children":17358},{"__ignoreMap":8},[17359,17366,17373,17380,17387,17394,17402,17409,17417,17425,17432,17440,17448,17456,17464,17472,17480,17488,17495,17503,17510,17517,17524,17531,17539,17547,17555,17563,17570,17577,17584,17591,17598,17606,17613,17621,17629,17637,17645,17653,17661,17669,17677,17684],{"type":20,"tag":157,"props":17360,"children":17361},{"class":159,"line":160},[17362],{"type":20,"tag":157,"props":17363,"children":17364},{},[17365],{"type":25,"value":16237},{"type":20,"tag":157,"props":17367,"children":17368},{"class":159,"line":169},[17369],{"type":20,"tag":157,"props":17370,"children":17371},{},[17372],{"type":25,"value":16245},{"type":20,"tag":157,"props":17374,"children":17375},{"class":159,"line":179},[17376],{"type":20,"tag":157,"props":17377,"children":17378},{"emptyLinePlaceholder":173},[17379],{"type":25,"value":176},{"type":20,"tag":157,"props":17381,"children":17382},{"class":159,"line":188},[17383],{"type":20,"tag":157,"props":17384,"children":17385},{},[17386],{"type":25,"value":16260},{"type":20,"tag":157,"props":17388,"children":17389},{"class":159,"line":196},[17390],{"type":20,"tag":157,"props":17391,"children":17392},{},[17393],{"type":25,"value":16268},{"type":20,"tag":157,"props":17395,"children":17396},{"class":159,"line":204},[17397],{"type":20,"tag":157,"props":17398,"children":17399},{},[17400],{"type":25,"value":17401},"    \u003C!--MyBatis核心配置文件中，标签的顺序： properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?,mappers? -->\n",{"type":20,"tag":157,"props":17403,"children":17404},{"class":159,"line":213},[17405],{"type":20,"tag":157,"props":17406,"children":17407},{"emptyLinePlaceholder":173},[17408],{"type":25,"value":176},{"type":20,"tag":157,"props":17410,"children":17411},{"class":159,"line":222},[17412],{"type":20,"tag":157,"props":17413,"children":17414},{},[17415],{"type":25,"value":17416},"    \u003C!--1. properties: 引入properties文件，可以用${key}访问value-->\n",{"type":20,"tag":157,"props":17418,"children":17419},{"class":159,"line":440},[17420],{"type":20,"tag":157,"props":17421,"children":17422},{},[17423],{"type":25,"value":17424},"    \u003Cproperties resource=\"jdbc.properties\"\u002F>\n",{"type":20,"tag":157,"props":17426,"children":17427},{"class":159,"line":448},[17428],{"type":20,"tag":157,"props":17429,"children":17430},{"emptyLinePlaceholder":173},[17431],{"type":25,"value":176},{"type":20,"tag":157,"props":17433,"children":17434},{"class":159,"line":456},[17435],{"type":20,"tag":157,"props":17436,"children":17437},{},[17438],{"type":25,"value":17439},"    \u003C!--2. typeAliases: 类型别名-->\n",{"type":20,"tag":157,"props":17441,"children":17442},{"class":159,"line":465},[17443],{"type":20,"tag":157,"props":17444,"children":17445},{},[17446],{"type":25,"value":17447},"    \u003CtypeAliases>\n",{"type":20,"tag":157,"props":17449,"children":17450},{"class":159,"line":474},[17451],{"type":20,"tag":157,"props":17452,"children":17453},{},[17454],{"type":25,"value":17455},"        \u003C!-- (1).给单个实体类设置别名 -->\n",{"type":20,"tag":157,"props":17457,"children":17458},{"class":159,"line":483},[17459],{"type":20,"tag":157,"props":17460,"children":17461},{},[17462],{"type":25,"value":17463},"        \u003C!--\u003CtypeAlias type=\"com.wangkun.mybatis.pojo.User\" alias=\"User\"\u002F>-->\n",{"type":20,"tag":157,"props":17465,"children":17466},{"class":159,"line":491},[17467],{"type":20,"tag":157,"props":17468,"children":17469},{},[17470],{"type":25,"value":17471},"        \u003C!-- (2).给同一设置别别名，别名默认就是类名-->\n",{"type":20,"tag":157,"props":17473,"children":17474},{"class":159,"line":499},[17475],{"type":20,"tag":157,"props":17476,"children":17477},{},[17478],{"type":25,"value":17479},"        \u003Cpackage name=\"com.wangkun.mybatis.pojo\"\u002F>\n",{"type":20,"tag":157,"props":17481,"children":17482},{"class":159,"line":508},[17483],{"type":20,"tag":157,"props":17484,"children":17485},{},[17486],{"type":25,"value":17487},"    \u003C\u002FtypeAliases>\n",{"type":20,"tag":157,"props":17489,"children":17490},{"class":159,"line":517},[17491],{"type":20,"tag":157,"props":17492,"children":17493},{"emptyLinePlaceholder":173},[17494],{"type":25,"value":176},{"type":20,"tag":157,"props":17496,"children":17497},{"class":159,"line":1499},[17498],{"type":20,"tag":157,"props":17499,"children":17500},{},[17501],{"type":25,"value":17502},"    \u003C!--3. environments：配置多个连接数据库的环境 属性：default：设置默认使用的环境的id -->\n",{"type":20,"tag":157,"props":17504,"children":17505},{"class":159,"line":1507},[17506],{"type":20,"tag":157,"props":17507,"children":17508},{},[17509],{"type":25,"value":16276},{"type":20,"tag":157,"props":17511,"children":17512},{"class":159,"line":1515},[17513],{"type":20,"tag":157,"props":17514,"children":17515},{},[17516],{"type":25,"value":16284},{"type":20,"tag":157,"props":17518,"children":17519},{"class":159,"line":1523},[17520],{"type":20,"tag":157,"props":17521,"children":17522},{},[17523],{"type":25,"value":16292},{"type":20,"tag":157,"props":17525,"children":17526},{"class":159,"line":1532},[17527],{"type":20,"tag":157,"props":17528,"children":17529},{},[17530],{"type":25,"value":16300},{"type":20,"tag":157,"props":17532,"children":17533},{"class":159,"line":1541},[17534],{"type":20,"tag":157,"props":17535,"children":17536},{},[17537],{"type":25,"value":17538},"                \u003Cproperty name=\"driver\" value=\"${jdbc.driver}\"\u002F>\n",{"type":20,"tag":157,"props":17540,"children":17541},{"class":159,"line":1550},[17542],{"type":20,"tag":157,"props":17543,"children":17544},{},[17545],{"type":25,"value":17546},"                \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n",{"type":20,"tag":157,"props":17548,"children":17549},{"class":159,"line":1558},[17550],{"type":20,"tag":157,"props":17551,"children":17552},{},[17553],{"type":25,"value":17554},"                \u003Cproperty name=\"username\" value=\"${jdbc.username}\"\u002F>\n",{"type":20,"tag":157,"props":17556,"children":17557},{"class":159,"line":1566},[17558],{"type":20,"tag":157,"props":17559,"children":17560},{},[17561],{"type":25,"value":17562},"                \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n",{"type":20,"tag":157,"props":17564,"children":17565},{"class":159,"line":1574},[17566],{"type":20,"tag":157,"props":17567,"children":17568},{},[17569],{"type":25,"value":16340},{"type":20,"tag":157,"props":17571,"children":17572},{"class":159,"line":1582},[17573],{"type":20,"tag":157,"props":17574,"children":17575},{},[17576],{"type":25,"value":16348},{"type":20,"tag":157,"props":17578,"children":17579},{"class":159,"line":1591},[17580],{"type":20,"tag":157,"props":17581,"children":17582},{"emptyLinePlaceholder":173},[17583],{"type":25,"value":176},{"type":20,"tag":157,"props":17585,"children":17586},{"class":159,"line":1599},[17587],{"type":20,"tag":157,"props":17588,"children":17589},{},[17590],{"type":25,"value":16356},{"type":20,"tag":157,"props":17592,"children":17593},{"class":159,"line":1608},[17594],{"type":20,"tag":157,"props":17595,"children":17596},{"emptyLinePlaceholder":173},[17597],{"type":25,"value":176},{"type":20,"tag":157,"props":17599,"children":17600},{"class":159,"line":1617},[17601],{"type":20,"tag":157,"props":17602,"children":17603},{},[17604],{"type":25,"value":17605},"    \u003C!--4. 引入映射文件-->\n",{"type":20,"tag":157,"props":17607,"children":17608},{"class":159,"line":1626},[17609],{"type":20,"tag":157,"props":17610,"children":17611},{},[17612],{"type":25,"value":16379},{"type":20,"tag":157,"props":17614,"children":17615},{"class":159,"line":1634},[17616],{"type":20,"tag":157,"props":17617,"children":17618},{},[17619],{"type":25,"value":17620},"        \u003C!--单个引入映射文件-->\n",{"type":20,"tag":157,"props":17622,"children":17623},{"class":159,"line":1642},[17624],{"type":20,"tag":157,"props":17625,"children":17626},{},[17627],{"type":25,"value":17628},"        \u003C!--\u003Cmapper resource=\"mappers\u002FUserMapper.xml\"\u002F>-->\n",{"type":20,"tag":157,"props":17630,"children":17631},{"class":159,"line":1650},[17632],{"type":20,"tag":157,"props":17633,"children":17634},{},[17635],{"type":25,"value":17636},"        \u003C!--\n",{"type":20,"tag":157,"props":17638,"children":17639},{"class":159,"line":1659},[17640],{"type":20,"tag":157,"props":17641,"children":17642},{},[17643],{"type":25,"value":17644},"            以包的形式引入映射文件\n",{"type":20,"tag":157,"props":17646,"children":17647},{"class":159,"line":1668},[17648],{"type":20,"tag":157,"props":17649,"children":17650},{},[17651],{"type":25,"value":17652},"            (1). mapper接口与映射文件所在的包必须一致\n",{"type":20,"tag":157,"props":17654,"children":17655},{"class":159,"line":1677},[17656],{"type":20,"tag":157,"props":17657,"children":17658},{},[17659],{"type":25,"value":17660},"            (2). 接口的名字与与映射文件的名字必须一致\n",{"type":20,"tag":157,"props":17662,"children":17663},{"class":159,"line":1685},[17664],{"type":20,"tag":157,"props":17665,"children":17666},{},[17667],{"type":25,"value":17668},"        -->\n",{"type":20,"tag":157,"props":17670,"children":17671},{"class":159,"line":1693},[17672],{"type":20,"tag":157,"props":17673,"children":17674},{},[17675],{"type":25,"value":17676},"        \u003Cpackage name=\"com.wangkun.mybatis.mapper\"\u002F>\n",{"type":20,"tag":157,"props":17678,"children":17679},{"class":159,"line":1701},[17680],{"type":20,"tag":157,"props":17681,"children":17682},{},[17683],{"type":25,"value":16395},{"type":20,"tag":157,"props":17685,"children":17686},{"class":159,"line":1710},[17687],{"type":20,"tag":157,"props":17688,"children":17689},{},[17690],{"type":25,"value":16403},{"type":20,"tag":28,"props":17692,"children":17694},{"id":17693},"_4-mybatis获取参数",[17695],{"type":25,"value":17696},"4. Mybatis获取参数",{"type":20,"tag":6665,"props":17698,"children":17699},{},[17700,17719,17742],{"type":20,"tag":21,"props":17701,"children":17702},{},[17703,17705,17711,17713],{"type":25,"value":17704},"两种方式：",{"type":20,"tag":84,"props":17706,"children":17708},{"className":17707},[],[17709],{"type":25,"value":17710},"#{}",{"type":25,"value":17712},"与",{"type":20,"tag":84,"props":17714,"children":17716},{"className":17715},[],[17717],{"type":25,"value":17718},"${}",{"type":20,"tag":44,"props":17720,"children":17721},{},[17722,17732],{"type":20,"tag":48,"props":17723,"children":17724},{},[17725,17730],{"type":20,"tag":84,"props":17726,"children":17728},{"className":17727},[],[17729],{"type":25,"value":17710},{"type":25,"value":17731},"(常用)：本质就是占位符赋值，使用占位符的方式拼接sql，此时为字符串类型或日期类型的字段进行赋值时可以自动添加单引号",{"type":20,"tag":48,"props":17733,"children":17734},{},[17735,17740],{"type":20,"tag":84,"props":17736,"children":17738},{"className":17737},[],[17739],{"type":25,"value":17718},{"type":25,"value":17741},"：本质是字符串拼接sql，若为字符串类型或日期类型的字段进行赋值时，需要手动加单引号",{"type":20,"tag":21,"props":17743,"children":17744},{},[17745],{"type":20,"tag":33,"props":17746,"children":17747},{},[17748],{"type":25,"value":17749},"注：在3.5版本后，使用这两种方式没有太大的区别，只是需不需要加单引号",{"type":20,"tag":11085,"props":17751,"children":17753},{"id":17752},"_41-单个参数",[17754],{"type":25,"value":17755},"4.1 单个参数",{"type":20,"tag":126,"props":17757,"children":17759},{"className":17052,"code":17758,"language":17054,"meta":8,"style":8},"\u003C!--public User getUserByName(String username);-->\n\u003Cselect id=\"getUserByName\" resultType=\"user\">\n    select * from t_user where username = '${username}'\n\u003C\u002Fselect>\n\n\u003Cselect id=\"getUserByName\" resultType=\"user\">\n    \u003C!--这里不需要加单引号包裹变量-->\n    select * from t_user where username = #{username}\n\u003C\u002Fselect>\n",[17760],{"type":20,"tag":84,"props":17761,"children":17762},{"__ignoreMap":8},[17763,17771,17779,17787,17795,17802,17809,17817,17825],{"type":20,"tag":157,"props":17764,"children":17765},{"class":159,"line":160},[17766],{"type":20,"tag":157,"props":17767,"children":17768},{},[17769],{"type":25,"value":17770},"\u003C!--public User getUserByName(String username);-->\n",{"type":20,"tag":157,"props":17772,"children":17773},{"class":159,"line":169},[17774],{"type":20,"tag":157,"props":17775,"children":17776},{},[17777],{"type":25,"value":17778},"\u003Cselect id=\"getUserByName\" resultType=\"user\">\n",{"type":20,"tag":157,"props":17780,"children":17781},{"class":159,"line":179},[17782],{"type":20,"tag":157,"props":17783,"children":17784},{},[17785],{"type":25,"value":17786},"    select * from t_user where username = '${username}'\n",{"type":20,"tag":157,"props":17788,"children":17789},{"class":159,"line":188},[17790],{"type":20,"tag":157,"props":17791,"children":17792},{},[17793],{"type":25,"value":17794},"\u003C\u002Fselect>\n",{"type":20,"tag":157,"props":17796,"children":17797},{"class":159,"line":196},[17798],{"type":20,"tag":157,"props":17799,"children":17800},{"emptyLinePlaceholder":173},[17801],{"type":25,"value":176},{"type":20,"tag":157,"props":17803,"children":17804},{"class":159,"line":204},[17805],{"type":20,"tag":157,"props":17806,"children":17807},{},[17808],{"type":25,"value":17778},{"type":20,"tag":157,"props":17810,"children":17811},{"class":159,"line":213},[17812],{"type":20,"tag":157,"props":17813,"children":17814},{},[17815],{"type":25,"value":17816},"    \u003C!--这里不需要加单引号包裹变量-->\n",{"type":20,"tag":157,"props":17818,"children":17819},{"class":159,"line":222},[17820],{"type":20,"tag":157,"props":17821,"children":17822},{},[17823],{"type":25,"value":17824},"    select * from t_user where username = #{username}\n",{"type":20,"tag":157,"props":17826,"children":17827},{"class":159,"line":440},[17828],{"type":20,"tag":157,"props":17829,"children":17830},{},[17831],{"type":25,"value":17794},{"type":20,"tag":11085,"props":17833,"children":17835},{"id":17834},"_42-多个参数",[17836],{"type":25,"value":17837},"4.2 多个参数",{"type":20,"tag":6665,"props":17839,"children":17840},{},[17841],{"type":20,"tag":21,"props":17842,"children":17843},{},[17844,17846,17851,17853,17858,17860,17865],{"type":25,"value":17845},"MyBatis会自动将这些参数放在一个map集合中，以arg0，arg1...为键，以参数为值；以param1，param2...为键，以参数为值，使用时只需要通过",{"type":20,"tag":84,"props":17847,"children":17849},{"className":17848},[],[17850],{"type":25,"value":17718},{"type":25,"value":17852},"或者",{"type":20,"tag":84,"props":17854,"children":17856},{"className":17855},[],[17857],{"type":25,"value":17710},{"type":25,"value":17859},"访问map集合中的键就可以获取对应的值，注意",{"type":20,"tag":84,"props":17861,"children":17863},{"className":17862},[],[17864],{"type":25,"value":17718},{"type":25,"value":17866},"需要手动加单引号",{"type":20,"tag":126,"props":17868,"children":17870},{"className":17052,"code":17869,"language":17054,"meta":8,"style":8},"\u003C!--public User checkLogin(String username, String password);-->\n\u003Cselect id=\"checkLogin\" resultType=\"user\">\n    select * from t_user where username = #{param1} and password = #{param2}\n\u003C\u002Fselect>\n\n\u003Cselect id=\"checkLogin\" resultType=\"user\">\n    select * from t_user where username = '${arg0}' and password = '${arg1}'\n\u003C\u002Fselect>\n",[17871],{"type":20,"tag":84,"props":17872,"children":17873},{"__ignoreMap":8},[17874,17882,17890,17898,17905,17912,17919,17927],{"type":20,"tag":157,"props":17875,"children":17876},{"class":159,"line":160},[17877],{"type":20,"tag":157,"props":17878,"children":17879},{},[17880],{"type":25,"value":17881},"\u003C!--public User checkLogin(String username, String password);-->\n",{"type":20,"tag":157,"props":17883,"children":17884},{"class":159,"line":169},[17885],{"type":20,"tag":157,"props":17886,"children":17887},{},[17888],{"type":25,"value":17889},"\u003Cselect id=\"checkLogin\" resultType=\"user\">\n",{"type":20,"tag":157,"props":17891,"children":17892},{"class":159,"line":179},[17893],{"type":20,"tag":157,"props":17894,"children":17895},{},[17896],{"type":25,"value":17897},"    select * from t_user where username = #{param1} and password = #{param2}\n",{"type":20,"tag":157,"props":17899,"children":17900},{"class":159,"line":188},[17901],{"type":20,"tag":157,"props":17902,"children":17903},{},[17904],{"type":25,"value":17794},{"type":20,"tag":157,"props":17906,"children":17907},{"class":159,"line":196},[17908],{"type":20,"tag":157,"props":17909,"children":17910},{"emptyLinePlaceholder":173},[17911],{"type":25,"value":176},{"type":20,"tag":157,"props":17913,"children":17914},{"class":159,"line":204},[17915],{"type":20,"tag":157,"props":17916,"children":17917},{},[17918],{"type":25,"value":17889},{"type":20,"tag":157,"props":17920,"children":17921},{"class":159,"line":213},[17922],{"type":20,"tag":157,"props":17923,"children":17924},{},[17925],{"type":25,"value":17926},"    select * from t_user where username = '${arg0}' and password = '${arg1}'\n",{"type":20,"tag":157,"props":17928,"children":17929},{"class":159,"line":222},[17930],{"type":20,"tag":157,"props":17931,"children":17932},{},[17933],{"type":25,"value":17794},{"type":20,"tag":11085,"props":17935,"children":17937},{"id":17936},"_43-map类型参数",[17938],{"type":25,"value":17939},"4.3 Map类型参数",{"type":20,"tag":6665,"props":17941,"children":17942},{},[17943,17948],{"type":20,"tag":21,"props":17944,"children":17945},{},[17946],{"type":25,"value":17947},"当有多个参数的时候，我们可以用Map收集参数，这样我们就可以定义我们自己想用的key",{"type":20,"tag":21,"props":17949,"children":17950},{},[17951],{"type":20,"tag":33,"props":17952,"children":17953},{},[17954],{"type":25,"value":17955},"注：当我们在映射文件中使用不正确的key也不会报错，只是会查不到数据",{"type":20,"tag":21,"props":17957,"children":17958},{},[17959],{"type":20,"tag":33,"props":17960,"children":17961},{},[17962],{"type":25,"value":17963},"测试类：",{"type":20,"tag":126,"props":17965,"children":17967},{"className":16050,"code":17966,"language":16052,"meta":8,"style":8},"@Test\npublic void checkLoginByMap() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    UserMapper mapper = sqlSession.getMapper(UserMapper.class);\n    Map\u003CString, Object> map = new HashMap\u003C>();\n    map.put(\"username\", \"admin\");\n    map.put(\"password\", \"123456\");\n    User user = mapper.checkLoginByMap(map);\n    System.out.println(user);\n}\n",[17968],{"type":20,"tag":84,"props":17969,"children":17970},{"__ignoreMap":8},[17971,17979,17987,17995,18003,18011,18019,18027,18035,18043],{"type":20,"tag":157,"props":17972,"children":17973},{"class":159,"line":160},[17974],{"type":20,"tag":157,"props":17975,"children":17976},{},[17977],{"type":25,"value":17978},"@Test\n",{"type":20,"tag":157,"props":17980,"children":17981},{"class":159,"line":169},[17982],{"type":20,"tag":157,"props":17983,"children":17984},{},[17985],{"type":25,"value":17986},"public void checkLoginByMap() {\n",{"type":20,"tag":157,"props":17988,"children":17989},{"class":159,"line":179},[17990],{"type":20,"tag":157,"props":17991,"children":17992},{},[17993],{"type":25,"value":17994},"    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n",{"type":20,"tag":157,"props":17996,"children":17997},{"class":159,"line":188},[17998],{"type":20,"tag":157,"props":17999,"children":18000},{},[18001],{"type":25,"value":18002},"    UserMapper mapper = sqlSession.getMapper(UserMapper.class);\n",{"type":20,"tag":157,"props":18004,"children":18005},{"class":159,"line":196},[18006],{"type":20,"tag":157,"props":18007,"children":18008},{},[18009],{"type":25,"value":18010},"    Map\u003CString, Object> map = new HashMap\u003C>();\n",{"type":20,"tag":157,"props":18012,"children":18013},{"class":159,"line":204},[18014],{"type":20,"tag":157,"props":18015,"children":18016},{},[18017],{"type":25,"value":18018},"    map.put(\"username\", \"admin\");\n",{"type":20,"tag":157,"props":18020,"children":18021},{"class":159,"line":213},[18022],{"type":20,"tag":157,"props":18023,"children":18024},{},[18025],{"type":25,"value":18026},"    map.put(\"password\", \"123456\");\n",{"type":20,"tag":157,"props":18028,"children":18029},{"class":159,"line":222},[18030],{"type":20,"tag":157,"props":18031,"children":18032},{},[18033],{"type":25,"value":18034},"    User user = mapper.checkLoginByMap(map);\n",{"type":20,"tag":157,"props":18036,"children":18037},{"class":159,"line":440},[18038],{"type":20,"tag":157,"props":18039,"children":18040},{},[18041],{"type":25,"value":18042},"    System.out.println(user);\n",{"type":20,"tag":157,"props":18044,"children":18045},{"class":159,"line":448},[18046],{"type":20,"tag":157,"props":18047,"children":18048},{},[18049],{"type":25,"value":943},{"type":20,"tag":21,"props":18051,"children":18052},{},[18053],{"type":20,"tag":33,"props":18054,"children":18055},{},[18056],{"type":25,"value":18057},"映射文件：",{"type":20,"tag":126,"props":18059,"children":18061},{"className":17052,"code":18060,"language":17054,"meta":8,"style":8},"\u003C!--public User checkLoginByMap(Map\u003CString, Object> map);-->\n\u003Cselect id=\"checkLoginByMap\" resultType=\"user\">\n    select * from t_user where username = #{username} and password = #{password}\n\u003C\u002Fselect>\n",[18062],{"type":20,"tag":84,"props":18063,"children":18064},{"__ignoreMap":8},[18065,18073,18081,18089],{"type":20,"tag":157,"props":18066,"children":18067},{"class":159,"line":160},[18068],{"type":20,"tag":157,"props":18069,"children":18070},{},[18071],{"type":25,"value":18072},"\u003C!--public User checkLoginByMap(Map\u003CString, Object> map);-->\n",{"type":20,"tag":157,"props":18074,"children":18075},{"class":159,"line":169},[18076],{"type":20,"tag":157,"props":18077,"children":18078},{},[18079],{"type":25,"value":18080},"\u003Cselect id=\"checkLoginByMap\" resultType=\"user\">\n",{"type":20,"tag":157,"props":18082,"children":18083},{"class":159,"line":179},[18084],{"type":20,"tag":157,"props":18085,"children":18086},{},[18087],{"type":25,"value":18088},"    select * from t_user where username = #{username} and password = #{password}\n",{"type":20,"tag":157,"props":18090,"children":18091},{"class":159,"line":188},[18092],{"type":20,"tag":157,"props":18093,"children":18094},{},[18095],{"type":25,"value":17794},{"type":20,"tag":11085,"props":18097,"children":18099},{"id":18098},"_44-实体类型参数",[18100],{"type":25,"value":18101},"4.4 实体类型参数",{"type":20,"tag":6665,"props":18103,"children":18104},{},[18105,18123],{"type":20,"tag":21,"props":18106,"children":18107},{},[18108,18110,18115,18116,18121],{"type":25,"value":18109},"只需要用",{"type":20,"tag":84,"props":18111,"children":18113},{"className":18112},[],[18114],{"type":25,"value":17710},{"type":25,"value":17852},{"type":20,"tag":84,"props":18117,"children":18119},{"className":18118},[],[18120],{"type":25,"value":17718},{"type":25,"value":18122},"访问实体类型属性就可以",{"type":20,"tag":21,"props":18124,"children":18125},{},[18126],{"type":25,"value":18127},"如：新增用户信息",{"type":20,"tag":126,"props":18129,"children":18131},{"className":17052,"code":18130,"language":17054,"meta":8,"style":8},"\u003C!--public int insetUser(User user);-->\n\u003Cinsert id=\"insetUser\">\n    insert into t_user\n    values (null, #{username}, #{password}, #{age}, #{gender}, #{email})\n\u003C\u002Finsert>\n",[18132],{"type":20,"tag":84,"props":18133,"children":18134},{"__ignoreMap":8},[18135,18143,18151,18159,18167],{"type":20,"tag":157,"props":18136,"children":18137},{"class":159,"line":160},[18138],{"type":20,"tag":157,"props":18139,"children":18140},{},[18141],{"type":25,"value":18142},"\u003C!--public int insetUser(User user);-->\n",{"type":20,"tag":157,"props":18144,"children":18145},{"class":159,"line":169},[18146],{"type":20,"tag":157,"props":18147,"children":18148},{},[18149],{"type":25,"value":18150},"\u003Cinsert id=\"insetUser\">\n",{"type":20,"tag":157,"props":18152,"children":18153},{"class":159,"line":179},[18154],{"type":20,"tag":157,"props":18155,"children":18156},{},[18157],{"type":25,"value":18158},"    insert into t_user\n",{"type":20,"tag":157,"props":18160,"children":18161},{"class":159,"line":188},[18162],{"type":20,"tag":157,"props":18163,"children":18164},{},[18165],{"type":25,"value":18166},"    values (null, #{username}, #{password}, #{age}, #{gender}, #{email})\n",{"type":20,"tag":157,"props":18168,"children":18169},{"class":159,"line":196},[18170],{"type":20,"tag":157,"props":18171,"children":18172},{},[18173],{"type":25,"value":18174},"\u003C\u002Finsert>\n",{"type":20,"tag":11085,"props":18176,"children":18178},{"id":18177},"_45-param注解参数",[18179],{"type":25,"value":18180},"4.5 @Param注解参数",{"type":20,"tag":21,"props":18182,"children":18183},{},[18184],{"type":20,"tag":33,"props":18185,"children":18186},{},[18187],{"type":25,"value":18188},"mapper接口：",{"type":20,"tag":126,"props":18190,"children":18192},{"className":16050,"code":18191,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据用户名与密码注解获取用户\n * @param username\n * @param password\n * @return\n *\u002F\npublic User checkLoginByParams(@Param(\"username\") String username, @Param(\"password\") String password);\n",[18193],{"type":20,"tag":84,"props":18194,"children":18195},{"__ignoreMap":8},[18196,18204,18212,18220,18228,18236,18244],{"type":20,"tag":157,"props":18197,"children":18198},{"class":159,"line":160},[18199],{"type":20,"tag":157,"props":18200,"children":18201},{},[18202],{"type":25,"value":18203},"\u002F**\n",{"type":20,"tag":157,"props":18205,"children":18206},{"class":159,"line":169},[18207],{"type":20,"tag":157,"props":18208,"children":18209},{},[18210],{"type":25,"value":18211}," * 根据用户名与密码注解获取用户\n",{"type":20,"tag":157,"props":18213,"children":18214},{"class":159,"line":179},[18215],{"type":20,"tag":157,"props":18216,"children":18217},{},[18218],{"type":25,"value":18219}," * @param username\n",{"type":20,"tag":157,"props":18221,"children":18222},{"class":159,"line":188},[18223],{"type":20,"tag":157,"props":18224,"children":18225},{},[18226],{"type":25,"value":18227}," * @param password\n",{"type":20,"tag":157,"props":18229,"children":18230},{"class":159,"line":196},[18231],{"type":20,"tag":157,"props":18232,"children":18233},{},[18234],{"type":25,"value":18235}," * @return\n",{"type":20,"tag":157,"props":18237,"children":18238},{"class":159,"line":204},[18239],{"type":20,"tag":157,"props":18240,"children":18241},{},[18242],{"type":25,"value":18243}," *\u002F\n",{"type":20,"tag":157,"props":18245,"children":18246},{"class":159,"line":213},[18247],{"type":20,"tag":157,"props":18248,"children":18249},{},[18250],{"type":25,"value":18251},"public User checkLoginByParams(@Param(\"username\") String username, @Param(\"password\") String password);\n",{"type":20,"tag":21,"props":18253,"children":18254},{},[18255],{"type":20,"tag":33,"props":18256,"children":18257},{},[18258],{"type":25,"value":18057},{"type":20,"tag":126,"props":18260,"children":18262},{"className":16050,"code":18261,"language":16052,"meta":8,"style":8},"\u003C!--public User checkLoginByParams(@Param(\"username\") String username, @Param(\"password\") String password);-->\n\u003Cselect id=\"checkLoginByParams\" resultType=\"user\">\n    select * from t_user where username = #{username} and password = #{password}\n\u003C\u002Fselect>\n",[18263],{"type":20,"tag":84,"props":18264,"children":18265},{"__ignoreMap":8},[18266,18274,18282,18289],{"type":20,"tag":157,"props":18267,"children":18268},{"class":159,"line":160},[18269],{"type":20,"tag":157,"props":18270,"children":18271},{},[18272],{"type":25,"value":18273},"\u003C!--public User checkLoginByParams(@Param(\"username\") String username, @Param(\"password\") String password);-->\n",{"type":20,"tag":157,"props":18275,"children":18276},{"class":159,"line":169},[18277],{"type":20,"tag":157,"props":18278,"children":18279},{},[18280],{"type":25,"value":18281},"\u003Cselect id=\"checkLoginByParams\" resultType=\"user\">\n",{"type":20,"tag":157,"props":18283,"children":18284},{"class":159,"line":179},[18285],{"type":20,"tag":157,"props":18286,"children":18287},{},[18288],{"type":25,"value":18088},{"type":20,"tag":157,"props":18290,"children":18291},{"class":159,"line":188},[18292],{"type":20,"tag":157,"props":18293,"children":18294},{},[18295],{"type":25,"value":17794},{"type":20,"tag":11085,"props":18297,"children":18298},{"id":10044},[18299],{"type":25,"value":10044},{"type":20,"tag":6665,"props":18301,"children":18302},{},[18303,18308],{"type":20,"tag":21,"props":18304,"children":18305},{},[18306],{"type":25,"value":18307},"以后只用两种方式就可以",{"type":20,"tag":44,"props":18309,"children":18310},{},[18311,18321],{"type":20,"tag":48,"props":18312,"children":18313},{},[18314,18319],{"type":20,"tag":33,"props":18315,"children":18316},{},[18317],{"type":25,"value":18318},"@Param注解形式",{"type":25,"value":18320},"：单个、多个参数",{"type":20,"tag":48,"props":18322,"children":18323},{},[18324,18329],{"type":20,"tag":33,"props":18325,"children":18326},{},[18327],{"type":25,"value":18328},"实体类型参数",{"type":25,"value":18330},"：新增，修改",{"type":20,"tag":28,"props":18332,"children":18334},{"id":18333},"_5-mybatis查询功能",[18335],{"type":25,"value":18336},"5. MyBatis查询功能",{"type":20,"tag":11085,"props":18338,"children":18340},{"id":18339},"_51-查询单条实体对象",[18341],{"type":25,"value":18342},"5.1 查询单条实体对象",{"type":20,"tag":21,"props":18344,"children":18345},{},[18346],{"type":20,"tag":33,"props":18347,"children":18348},{},[18349],{"type":25,"value":18188},{"type":20,"tag":126,"props":18351,"children":18353},{"className":16050,"code":18352,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据id查询用户信息\n * @param id\n * @return\n *\u002F\npublic User getUserById(@Param(\"id\") int id);\n",[18354],{"type":20,"tag":84,"props":18355,"children":18356},{"__ignoreMap":8},[18357,18364,18372,18380,18387,18394],{"type":20,"tag":157,"props":18358,"children":18359},{"class":159,"line":160},[18360],{"type":20,"tag":157,"props":18361,"children":18362},{},[18363],{"type":25,"value":18203},{"type":20,"tag":157,"props":18365,"children":18366},{"class":159,"line":169},[18367],{"type":20,"tag":157,"props":18368,"children":18369},{},[18370],{"type":25,"value":18371}," * 根据id查询用户信息\n",{"type":20,"tag":157,"props":18373,"children":18374},{"class":159,"line":179},[18375],{"type":20,"tag":157,"props":18376,"children":18377},{},[18378],{"type":25,"value":18379}," * @param id\n",{"type":20,"tag":157,"props":18381,"children":18382},{"class":159,"line":188},[18383],{"type":20,"tag":157,"props":18384,"children":18385},{},[18386],{"type":25,"value":18235},{"type":20,"tag":157,"props":18388,"children":18389},{"class":159,"line":196},[18390],{"type":20,"tag":157,"props":18391,"children":18392},{},[18393],{"type":25,"value":18243},{"type":20,"tag":157,"props":18395,"children":18396},{"class":159,"line":204},[18397],{"type":20,"tag":157,"props":18398,"children":18399},{},[18400],{"type":25,"value":18401},"public User getUserById(@Param(\"id\") int id);\n",{"type":20,"tag":21,"props":18403,"children":18404},{},[18405],{"type":20,"tag":33,"props":18406,"children":18407},{},[18408],{"type":25,"value":18057},{"type":20,"tag":126,"props":18410,"children":18412},{"className":17052,"code":18411,"language":17054,"meta":8,"style":8},"\u003C!--public User getUserById(@Param(\"id\") int id);-->\n\u003Cselect id=\"getUserById\" resultType=\"user\">\n    select * from t_user where id = #{id}\n\u003C\u002Fselect>\n",[18413],{"type":20,"tag":84,"props":18414,"children":18415},{"__ignoreMap":8},[18416,18424,18432,18440],{"type":20,"tag":157,"props":18417,"children":18418},{"class":159,"line":160},[18419],{"type":20,"tag":157,"props":18420,"children":18421},{},[18422],{"type":25,"value":18423},"\u003C!--public User getUserById(@Param(\"id\") int id);-->\n",{"type":20,"tag":157,"props":18425,"children":18426},{"class":159,"line":169},[18427],{"type":20,"tag":157,"props":18428,"children":18429},{},[18430],{"type":25,"value":18431},"\u003Cselect id=\"getUserById\" resultType=\"user\">\n",{"type":20,"tag":157,"props":18433,"children":18434},{"class":159,"line":179},[18435],{"type":20,"tag":157,"props":18436,"children":18437},{},[18438],{"type":25,"value":18439},"    select * from t_user where id = #{id}\n",{"type":20,"tag":157,"props":18441,"children":18442},{"class":159,"line":188},[18443],{"type":20,"tag":157,"props":18444,"children":18445},{},[18446],{"type":25,"value":17794},{"type":20,"tag":21,"props":18448,"children":18449},{},[18450],{"type":20,"tag":33,"props":18451,"children":18452},{},[18453],{"type":25,"value":17963},{"type":20,"tag":126,"props":18455,"children":18457},{"className":16050,"code":18456,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据id查询用户信息\n *\u002F\n@Test\npublic void testGetUserById() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);\n    User userById = mapper.getUserById(1);\n    System.out.println(userById);\n}\n",[18458],{"type":20,"tag":84,"props":18459,"children":18460},{"__ignoreMap":8},[18461,18468,18475,18482,18489,18497,18504,18512,18520,18528],{"type":20,"tag":157,"props":18462,"children":18463},{"class":159,"line":160},[18464],{"type":20,"tag":157,"props":18465,"children":18466},{},[18467],{"type":25,"value":18203},{"type":20,"tag":157,"props":18469,"children":18470},{"class":159,"line":169},[18471],{"type":20,"tag":157,"props":18472,"children":18473},{},[18474],{"type":25,"value":18371},{"type":20,"tag":157,"props":18476,"children":18477},{"class":159,"line":179},[18478],{"type":20,"tag":157,"props":18479,"children":18480},{},[18481],{"type":25,"value":18243},{"type":20,"tag":157,"props":18483,"children":18484},{"class":159,"line":188},[18485],{"type":20,"tag":157,"props":18486,"children":18487},{},[18488],{"type":25,"value":17978},{"type":20,"tag":157,"props":18490,"children":18491},{"class":159,"line":196},[18492],{"type":20,"tag":157,"props":18493,"children":18494},{},[18495],{"type":25,"value":18496},"public void testGetUserById() {\n",{"type":20,"tag":157,"props":18498,"children":18499},{"class":159,"line":204},[18500],{"type":20,"tag":157,"props":18501,"children":18502},{},[18503],{"type":25,"value":17994},{"type":20,"tag":157,"props":18505,"children":18506},{"class":159,"line":213},[18507],{"type":20,"tag":157,"props":18508,"children":18509},{},[18510],{"type":25,"value":18511},"    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);\n",{"type":20,"tag":157,"props":18513,"children":18514},{"class":159,"line":222},[18515],{"type":20,"tag":157,"props":18516,"children":18517},{},[18518],{"type":25,"value":18519},"    User userById = mapper.getUserById(1);\n",{"type":20,"tag":157,"props":18521,"children":18522},{"class":159,"line":440},[18523],{"type":20,"tag":157,"props":18524,"children":18525},{},[18526],{"type":25,"value":18527},"    System.out.println(userById);\n",{"type":20,"tag":157,"props":18529,"children":18530},{"class":159,"line":448},[18531],{"type":20,"tag":157,"props":18532,"children":18533},{},[18534],{"type":25,"value":943},{"type":20,"tag":11085,"props":18536,"children":18538},{"id":18537},"_52-查询一个list集合",[18539],{"type":25,"value":18540},"5.2 查询一个List集合",{"type":20,"tag":21,"props":18542,"children":18543},{},[18544],{"type":20,"tag":33,"props":18545,"children":18546},{},[18547],{"type":25,"value":18188},{"type":20,"tag":126,"props":18549,"children":18551},{"className":16050,"code":18550,"language":16052,"meta":8,"style":8},"\u002F**\n * 查询所有用户信息\n * @return\n *\u002F\npublic List\u003CUser> getAllUser();\n",[18552],{"type":20,"tag":84,"props":18553,"children":18554},{"__ignoreMap":8},[18555,18562,18570,18577,18584],{"type":20,"tag":157,"props":18556,"children":18557},{"class":159,"line":160},[18558],{"type":20,"tag":157,"props":18559,"children":18560},{},[18561],{"type":25,"value":18203},{"type":20,"tag":157,"props":18563,"children":18564},{"class":159,"line":169},[18565],{"type":20,"tag":157,"props":18566,"children":18567},{},[18568],{"type":25,"value":18569}," * 查询所有用户信息\n",{"type":20,"tag":157,"props":18571,"children":18572},{"class":159,"line":179},[18573],{"type":20,"tag":157,"props":18574,"children":18575},{},[18576],{"type":25,"value":18235},{"type":20,"tag":157,"props":18578,"children":18579},{"class":159,"line":188},[18580],{"type":20,"tag":157,"props":18581,"children":18582},{},[18583],{"type":25,"value":18243},{"type":20,"tag":157,"props":18585,"children":18586},{"class":159,"line":196},[18587],{"type":20,"tag":157,"props":18588,"children":18589},{},[18590],{"type":25,"value":18591},"public List\u003CUser> getAllUser();\n",{"type":20,"tag":21,"props":18593,"children":18594},{},[18595],{"type":20,"tag":33,"props":18596,"children":18597},{},[18598],{"type":25,"value":18057},{"type":20,"tag":126,"props":18600,"children":18602},{"className":17052,"code":18601,"language":17054,"meta":8,"style":8},"\u003C!--public List\u003CUser> getAllUser();-->\n\u003Cselect id=\"getAllUser\" resultType=\"user\">\n    select * from t_user\n\u003C\u002Fselect>\n",[18603],{"type":20,"tag":84,"props":18604,"children":18605},{"__ignoreMap":8},[18606,18614,18622,18630],{"type":20,"tag":157,"props":18607,"children":18608},{"class":159,"line":160},[18609],{"type":20,"tag":157,"props":18610,"children":18611},{},[18612],{"type":25,"value":18613},"\u003C!--public List\u003CUser> getAllUser();-->\n",{"type":20,"tag":157,"props":18615,"children":18616},{"class":159,"line":169},[18617],{"type":20,"tag":157,"props":18618,"children":18619},{},[18620],{"type":25,"value":18621},"\u003Cselect id=\"getAllUser\" resultType=\"user\">\n",{"type":20,"tag":157,"props":18623,"children":18624},{"class":159,"line":179},[18625],{"type":20,"tag":157,"props":18626,"children":18627},{},[18628],{"type":25,"value":18629},"    select * from t_user\n",{"type":20,"tag":157,"props":18631,"children":18632},{"class":159,"line":188},[18633],{"type":20,"tag":157,"props":18634,"children":18635},{},[18636],{"type":25,"value":17794},{"type":20,"tag":21,"props":18638,"children":18639},{},[18640],{"type":20,"tag":33,"props":18641,"children":18642},{},[18643],{"type":25,"value":17963},{"type":20,"tag":126,"props":18645,"children":18647},{"className":16050,"code":18646,"language":16052,"meta":8,"style":8},"\u002F**\n * 查询所有用户信息\n *\u002F\n@Test\npublic void testGetAllUser() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);\n    List\u003CUser> allUser = mapper.getAllUser();\n    for (User user : allUser) {\n        System.out.println(user);\n    }\n}\n",[18648],{"type":20,"tag":84,"props":18649,"children":18650},{"__ignoreMap":8},[18651,18658,18665,18672,18679,18687,18694,18701,18709,18717,18725,18732],{"type":20,"tag":157,"props":18652,"children":18653},{"class":159,"line":160},[18654],{"type":20,"tag":157,"props":18655,"children":18656},{},[18657],{"type":25,"value":18203},{"type":20,"tag":157,"props":18659,"children":18660},{"class":159,"line":169},[18661],{"type":20,"tag":157,"props":18662,"children":18663},{},[18664],{"type":25,"value":18569},{"type":20,"tag":157,"props":18666,"children":18667},{"class":159,"line":179},[18668],{"type":20,"tag":157,"props":18669,"children":18670},{},[18671],{"type":25,"value":18243},{"type":20,"tag":157,"props":18673,"children":18674},{"class":159,"line":188},[18675],{"type":20,"tag":157,"props":18676,"children":18677},{},[18678],{"type":25,"value":17978},{"type":20,"tag":157,"props":18680,"children":18681},{"class":159,"line":196},[18682],{"type":20,"tag":157,"props":18683,"children":18684},{},[18685],{"type":25,"value":18686},"public void testGetAllUser() {\n",{"type":20,"tag":157,"props":18688,"children":18689},{"class":159,"line":204},[18690],{"type":20,"tag":157,"props":18691,"children":18692},{},[18693],{"type":25,"value":17994},{"type":20,"tag":157,"props":18695,"children":18696},{"class":159,"line":213},[18697],{"type":20,"tag":157,"props":18698,"children":18699},{},[18700],{"type":25,"value":18511},{"type":20,"tag":157,"props":18702,"children":18703},{"class":159,"line":222},[18704],{"type":20,"tag":157,"props":18705,"children":18706},{},[18707],{"type":25,"value":18708},"    List\u003CUser> allUser = mapper.getAllUser();\n",{"type":20,"tag":157,"props":18710,"children":18711},{"class":159,"line":440},[18712],{"type":20,"tag":157,"props":18713,"children":18714},{},[18715],{"type":25,"value":18716},"    for (User user : allUser) {\n",{"type":20,"tag":157,"props":18718,"children":18719},{"class":159,"line":448},[18720],{"type":20,"tag":157,"props":18721,"children":18722},{},[18723],{"type":25,"value":18724},"        System.out.println(user);\n",{"type":20,"tag":157,"props":18726,"children":18727},{"class":159,"line":456},[18728],{"type":20,"tag":157,"props":18729,"children":18730},{},[18731],{"type":25,"value":872},{"type":20,"tag":157,"props":18733,"children":18734},{"class":159,"line":465},[18735],{"type":20,"tag":157,"props":18736,"children":18737},{},[18738],{"type":25,"value":943},{"type":20,"tag":11085,"props":18740,"children":18742},{"id":18741},"_53-查询一条为map集合",[18743],{"type":25,"value":18744},"5.3 查询一条为map集合",{"type":20,"tag":21,"props":18746,"children":18747},{},[18748],{"type":20,"tag":33,"props":18749,"children":18750},{},[18751],{"type":25,"value":18188},{"type":20,"tag":126,"props":18753,"children":18755},{"className":16050,"code":18754,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据id查询用户信息，并以Map类型接收\n * @param id\n * @return\n *\u002F\n Map\u003CString, Object> getUserByIdToMap(@Param(\"id\") int id);\n",[18756],{"type":20,"tag":84,"props":18757,"children":18758},{"__ignoreMap":8},[18759,18766,18774,18781,18788,18795],{"type":20,"tag":157,"props":18760,"children":18761},{"class":159,"line":160},[18762],{"type":20,"tag":157,"props":18763,"children":18764},{},[18765],{"type":25,"value":18203},{"type":20,"tag":157,"props":18767,"children":18768},{"class":159,"line":169},[18769],{"type":20,"tag":157,"props":18770,"children":18771},{},[18772],{"type":25,"value":18773}," * 根据id查询用户信息，并以Map类型接收\n",{"type":20,"tag":157,"props":18775,"children":18776},{"class":159,"line":179},[18777],{"type":20,"tag":157,"props":18778,"children":18779},{},[18780],{"type":25,"value":18379},{"type":20,"tag":157,"props":18782,"children":18783},{"class":159,"line":188},[18784],{"type":20,"tag":157,"props":18785,"children":18786},{},[18787],{"type":25,"value":18235},{"type":20,"tag":157,"props":18789,"children":18790},{"class":159,"line":196},[18791],{"type":20,"tag":157,"props":18792,"children":18793},{},[18794],{"type":25,"value":18243},{"type":20,"tag":157,"props":18796,"children":18797},{"class":159,"line":204},[18798],{"type":20,"tag":157,"props":18799,"children":18800},{},[18801],{"type":25,"value":18802}," Map\u003CString, Object> getUserByIdToMap(@Param(\"id\") int id);\n",{"type":20,"tag":21,"props":18804,"children":18805},{},[18806],{"type":20,"tag":33,"props":18807,"children":18808},{},[18809],{"type":25,"value":18057},{"type":20,"tag":126,"props":18811,"children":18813},{"className":17052,"code":18812,"language":17054,"meta":8,"style":8},"\u003C!--public Map\u003CString, Object> getUserByIdToMap(@Param(\"id\") int id);-->\n\u003Cselect id=\"getUserByIdToMap\" resultType=\"map\">\n    select * from t_user where id = #{id}\n\u003C\u002Fselect>\n",[18814],{"type":20,"tag":84,"props":18815,"children":18816},{"__ignoreMap":8},[18817,18825,18833,18840],{"type":20,"tag":157,"props":18818,"children":18819},{"class":159,"line":160},[18820],{"type":20,"tag":157,"props":18821,"children":18822},{},[18823],{"type":25,"value":18824},"\u003C!--public Map\u003CString, Object> getUserByIdToMap(@Param(\"id\") int id);-->\n",{"type":20,"tag":157,"props":18826,"children":18827},{"class":159,"line":169},[18828],{"type":20,"tag":157,"props":18829,"children":18830},{},[18831],{"type":25,"value":18832},"\u003Cselect id=\"getUserByIdToMap\" resultType=\"map\">\n",{"type":20,"tag":157,"props":18834,"children":18835},{"class":159,"line":179},[18836],{"type":20,"tag":157,"props":18837,"children":18838},{},[18839],{"type":25,"value":18439},{"type":20,"tag":157,"props":18841,"children":18842},{"class":159,"line":188},[18843],{"type":20,"tag":157,"props":18844,"children":18845},{},[18846],{"type":25,"value":17794},{"type":20,"tag":21,"props":18848,"children":18849},{},[18850],{"type":20,"tag":33,"props":18851,"children":18852},{},[18853],{"type":25,"value":17963},{"type":20,"tag":126,"props":18855,"children":18857},{"className":16050,"code":18856,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据id查询用户信息,以Map类型接收结果\n *\u002F\n@Test\npublic void testGetUserByIdToMap() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);\n    Map\u003CString, Object> userByIdToMap = mapper.getUserByIdToMap(1);\n    System.out.println(userByIdToMap);\n}\n",[18858],{"type":20,"tag":84,"props":18859,"children":18860},{"__ignoreMap":8},[18861,18868,18876,18883,18890,18898,18905,18912,18920,18928],{"type":20,"tag":157,"props":18862,"children":18863},{"class":159,"line":160},[18864],{"type":20,"tag":157,"props":18865,"children":18866},{},[18867],{"type":25,"value":18203},{"type":20,"tag":157,"props":18869,"children":18870},{"class":159,"line":169},[18871],{"type":20,"tag":157,"props":18872,"children":18873},{},[18874],{"type":25,"value":18875}," * 根据id查询用户信息,以Map类型接收结果\n",{"type":20,"tag":157,"props":18877,"children":18878},{"class":159,"line":179},[18879],{"type":20,"tag":157,"props":18880,"children":18881},{},[18882],{"type":25,"value":18243},{"type":20,"tag":157,"props":18884,"children":18885},{"class":159,"line":188},[18886],{"type":20,"tag":157,"props":18887,"children":18888},{},[18889],{"type":25,"value":17978},{"type":20,"tag":157,"props":18891,"children":18892},{"class":159,"line":196},[18893],{"type":20,"tag":157,"props":18894,"children":18895},{},[18896],{"type":25,"value":18897},"public void testGetUserByIdToMap() {\n",{"type":20,"tag":157,"props":18899,"children":18900},{"class":159,"line":204},[18901],{"type":20,"tag":157,"props":18902,"children":18903},{},[18904],{"type":25,"value":17994},{"type":20,"tag":157,"props":18906,"children":18907},{"class":159,"line":213},[18908],{"type":20,"tag":157,"props":18909,"children":18910},{},[18911],{"type":25,"value":18511},{"type":20,"tag":157,"props":18913,"children":18914},{"class":159,"line":222},[18915],{"type":20,"tag":157,"props":18916,"children":18917},{},[18918],{"type":25,"value":18919},"    Map\u003CString, Object> userByIdToMap = mapper.getUserByIdToMap(1);\n",{"type":20,"tag":157,"props":18921,"children":18922},{"class":159,"line":440},[18923],{"type":20,"tag":157,"props":18924,"children":18925},{},[18926],{"type":25,"value":18927},"    System.out.println(userByIdToMap);\n",{"type":20,"tag":157,"props":18929,"children":18930},{"class":159,"line":448},[18931],{"type":20,"tag":157,"props":18932,"children":18933},{},[18934],{"type":25,"value":943},{"type":20,"tag":11085,"props":18936,"children":18938},{"id":18937},"_54-查询一条为map集合",[18939],{"type":25,"value":18940},"5.4 查询一条为map集合",{"type":20,"tag":18942,"props":18943,"children":18945},"h5",{"id":18944},"方式一用list集合",[18946],{"type":25,"value":18947},"方式一：用List集合",{"type":20,"tag":6665,"props":18949,"children":18950},{},[18951],{"type":20,"tag":21,"props":18952,"children":18953},{},[18954,18956],{"type":25,"value":18955},"用map类型的list集合来接收结果，",{"type":20,"tag":33,"props":18957,"children":18958},{},[18959],{"type":25,"value":18960},"日常开发常用",{"type":20,"tag":21,"props":18962,"children":18963},{},[18964],{"type":20,"tag":33,"props":18965,"children":18966},{},[18967],{"type":25,"value":18188},{"type":20,"tag":126,"props":18969,"children":18971},{"className":16050,"code":18970,"language":16052,"meta":8,"style":8},"\u002F**\n * 查询所有用户信息,用Map类型List集合来接收结果\n *\u002F\n List\u003CMap\u003CString, Object>> getAllUserToMap();\n",[18972],{"type":20,"tag":84,"props":18973,"children":18974},{"__ignoreMap":8},[18975,18982,18990,18997],{"type":20,"tag":157,"props":18976,"children":18977},{"class":159,"line":160},[18978],{"type":20,"tag":157,"props":18979,"children":18980},{},[18981],{"type":25,"value":18203},{"type":20,"tag":157,"props":18983,"children":18984},{"class":159,"line":169},[18985],{"type":20,"tag":157,"props":18986,"children":18987},{},[18988],{"type":25,"value":18989}," * 查询所有用户信息,用Map类型List集合来接收结果\n",{"type":20,"tag":157,"props":18991,"children":18992},{"class":159,"line":179},[18993],{"type":20,"tag":157,"props":18994,"children":18995},{},[18996],{"type":25,"value":18243},{"type":20,"tag":157,"props":18998,"children":18999},{"class":159,"line":188},[19000],{"type":20,"tag":157,"props":19001,"children":19002},{},[19003],{"type":25,"value":19004}," List\u003CMap\u003CString, Object>> getAllUserToMap();\n",{"type":20,"tag":21,"props":19006,"children":19007},{},[19008],{"type":20,"tag":33,"props":19009,"children":19010},{},[19011],{"type":25,"value":18057},{"type":20,"tag":126,"props":19013,"children":19015},{"className":17052,"code":19014,"language":17054,"meta":8,"style":8},"\u003C!--List\u003CMap\u003CString, Object>> getAllUserToMap();-->\n\u003Cselect id=\"getAllUserToMap\" resultType=\"map\">\n    select * from t_user\n\u003C\u002Fselect>\n",[19016],{"type":20,"tag":84,"props":19017,"children":19018},{"__ignoreMap":8},[19019,19027,19035,19042],{"type":20,"tag":157,"props":19020,"children":19021},{"class":159,"line":160},[19022],{"type":20,"tag":157,"props":19023,"children":19024},{},[19025],{"type":25,"value":19026},"\u003C!--List\u003CMap\u003CString, Object>> getAllUserToMap();-->\n",{"type":20,"tag":157,"props":19028,"children":19029},{"class":159,"line":169},[19030],{"type":20,"tag":157,"props":19031,"children":19032},{},[19033],{"type":25,"value":19034},"\u003Cselect id=\"getAllUserToMap\" resultType=\"map\">\n",{"type":20,"tag":157,"props":19036,"children":19037},{"class":159,"line":179},[19038],{"type":20,"tag":157,"props":19039,"children":19040},{},[19041],{"type":25,"value":18629},{"type":20,"tag":157,"props":19043,"children":19044},{"class":159,"line":188},[19045],{"type":20,"tag":157,"props":19046,"children":19047},{},[19048],{"type":25,"value":17794},{"type":20,"tag":21,"props":19050,"children":19051},{},[19052],{"type":20,"tag":33,"props":19053,"children":19054},{},[19055],{"type":25,"value":17963},{"type":20,"tag":126,"props":19057,"children":19059},{"className":16050,"code":19058,"language":16052,"meta":8,"style":8},"\u002F**\n * 查询所有用户信息,用map类型的list集合接收\n *\u002F\n@Test\npublic void testGetAllUserToMap() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);\n    List\u003CMap\u003CString, Object>> allUserToMap = mapper.getAllUserToMap();\n    for (Map\u003CString, Object> stringObjectMap : allUserToMap) {\n        System.out.println(stringObjectMap);\n    }\n}\n",[19060],{"type":20,"tag":84,"props":19061,"children":19062},{"__ignoreMap":8},[19063,19070,19078,19085,19092,19100,19107,19114,19122,19130,19138,19145],{"type":20,"tag":157,"props":19064,"children":19065},{"class":159,"line":160},[19066],{"type":20,"tag":157,"props":19067,"children":19068},{},[19069],{"type":25,"value":18203},{"type":20,"tag":157,"props":19071,"children":19072},{"class":159,"line":169},[19073],{"type":20,"tag":157,"props":19074,"children":19075},{},[19076],{"type":25,"value":19077}," * 查询所有用户信息,用map类型的list集合接收\n",{"type":20,"tag":157,"props":19079,"children":19080},{"class":159,"line":179},[19081],{"type":20,"tag":157,"props":19082,"children":19083},{},[19084],{"type":25,"value":18243},{"type":20,"tag":157,"props":19086,"children":19087},{"class":159,"line":188},[19088],{"type":20,"tag":157,"props":19089,"children":19090},{},[19091],{"type":25,"value":17978},{"type":20,"tag":157,"props":19093,"children":19094},{"class":159,"line":196},[19095],{"type":20,"tag":157,"props":19096,"children":19097},{},[19098],{"type":25,"value":19099},"public void testGetAllUserToMap() {\n",{"type":20,"tag":157,"props":19101,"children":19102},{"class":159,"line":204},[19103],{"type":20,"tag":157,"props":19104,"children":19105},{},[19106],{"type":25,"value":17994},{"type":20,"tag":157,"props":19108,"children":19109},{"class":159,"line":213},[19110],{"type":20,"tag":157,"props":19111,"children":19112},{},[19113],{"type":25,"value":18511},{"type":20,"tag":157,"props":19115,"children":19116},{"class":159,"line":222},[19117],{"type":20,"tag":157,"props":19118,"children":19119},{},[19120],{"type":25,"value":19121},"    List\u003CMap\u003CString, Object>> allUserToMap = mapper.getAllUserToMap();\n",{"type":20,"tag":157,"props":19123,"children":19124},{"class":159,"line":440},[19125],{"type":20,"tag":157,"props":19126,"children":19127},{},[19128],{"type":25,"value":19129},"    for (Map\u003CString, Object> stringObjectMap : allUserToMap) {\n",{"type":20,"tag":157,"props":19131,"children":19132},{"class":159,"line":448},[19133],{"type":20,"tag":157,"props":19134,"children":19135},{},[19136],{"type":25,"value":19137},"        System.out.println(stringObjectMap);\n",{"type":20,"tag":157,"props":19139,"children":19140},{"class":159,"line":456},[19141],{"type":20,"tag":157,"props":19142,"children":19143},{},[19144],{"type":25,"value":872},{"type":20,"tag":157,"props":19146,"children":19147},{"class":159,"line":465},[19148],{"type":20,"tag":157,"props":19149,"children":19150},{},[19151],{"type":25,"value":943},{"type":20,"tag":18942,"props":19153,"children":19155},{"id":19154},"方式二依旧使用map集合",[19156],{"type":25,"value":19157},"方式二：依旧使用Map集合",{"type":20,"tag":6665,"props":19159,"children":19160},{},[19161],{"type":20,"tag":21,"props":19162,"children":19163},{},[19164],{"type":25,"value":19165},"将每条数据转换的map集合放在一个大map中，但必要要通过**@MapKey注解**，将查询的某个字段的值作为大的map的键·",{"type":20,"tag":21,"props":19167,"children":19168},{},[19169],{"type":20,"tag":33,"props":19170,"children":19171},{},[19172],{"type":25,"value":18188},{"type":20,"tag":126,"props":19174,"children":19176},{"className":16050,"code":19175,"language":16052,"meta":8,"style":8},"@MapKey(\"id\")\nMap\u003CString, Object> getAllUserToMap();\n",[19177],{"type":20,"tag":84,"props":19178,"children":19179},{"__ignoreMap":8},[19180,19188],{"type":20,"tag":157,"props":19181,"children":19182},{"class":159,"line":160},[19183],{"type":20,"tag":157,"props":19184,"children":19185},{},[19186],{"type":25,"value":19187},"@MapKey(\"id\")\n",{"type":20,"tag":157,"props":19189,"children":19190},{"class":159,"line":169},[19191],{"type":20,"tag":157,"props":19192,"children":19193},{},[19194],{"type":25,"value":19195},"Map\u003CString, Object> getAllUserToMap();\n",{"type":20,"tag":21,"props":19197,"children":19198},{},[19199],{"type":20,"tag":33,"props":19200,"children":19201},{},[19202],{"type":25,"value":18057},{"type":20,"tag":126,"props":19204,"children":19206},{"className":17052,"code":19205,"language":17054,"meta":8,"style":8},"\u003Cselect id=\"getAllUserToMap\" resultType=\"map\">\n    select * from t_user\n\u003C\u002Fselect>\n",[19207],{"type":20,"tag":84,"props":19208,"children":19209},{"__ignoreMap":8},[19210,19217,19224],{"type":20,"tag":157,"props":19211,"children":19212},{"class":159,"line":160},[19213],{"type":20,"tag":157,"props":19214,"children":19215},{},[19216],{"type":25,"value":19034},{"type":20,"tag":157,"props":19218,"children":19219},{"class":159,"line":169},[19220],{"type":20,"tag":157,"props":19221,"children":19222},{},[19223],{"type":25,"value":18629},{"type":20,"tag":157,"props":19225,"children":19226},{"class":159,"line":179},[19227],{"type":20,"tag":157,"props":19228,"children":19229},{},[19230],{"type":25,"value":17794},{"type":20,"tag":21,"props":19232,"children":19233},{},[19234],{"type":20,"tag":33,"props":19235,"children":19236},{},[19237],{"type":25,"value":17963},{"type":20,"tag":126,"props":19239,"children":19241},{"className":16050,"code":19240,"language":16052,"meta":8,"style":8},"@Test\npublic void testGetAllUserToMap() {\n\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);\n    Map\u003CString, Object> allUserToMap = mapper.getAllUserToMap();\n    System.out.println(allUserToMap);\n  \n}\n",[19242],{"type":20,"tag":84,"props":19243,"children":19244},{"__ignoreMap":8},[19245,19252,19259,19266,19273,19280,19288,19296,19303],{"type":20,"tag":157,"props":19246,"children":19247},{"class":159,"line":160},[19248],{"type":20,"tag":157,"props":19249,"children":19250},{},[19251],{"type":25,"value":17978},{"type":20,"tag":157,"props":19253,"children":19254},{"class":159,"line":169},[19255],{"type":20,"tag":157,"props":19256,"children":19257},{},[19258],{"type":25,"value":19099},{"type":20,"tag":157,"props":19260,"children":19261},{"class":159,"line":179},[19262],{"type":20,"tag":157,"props":19263,"children":19264},{"emptyLinePlaceholder":173},[19265],{"type":25,"value":176},{"type":20,"tag":157,"props":19267,"children":19268},{"class":159,"line":188},[19269],{"type":20,"tag":157,"props":19270,"children":19271},{},[19272],{"type":25,"value":17994},{"type":20,"tag":157,"props":19274,"children":19275},{"class":159,"line":196},[19276],{"type":20,"tag":157,"props":19277,"children":19278},{},[19279],{"type":25,"value":18511},{"type":20,"tag":157,"props":19281,"children":19282},{"class":159,"line":204},[19283],{"type":20,"tag":157,"props":19284,"children":19285},{},[19286],{"type":25,"value":19287},"    Map\u003CString, Object> allUserToMap = mapper.getAllUserToMap();\n",{"type":20,"tag":157,"props":19289,"children":19290},{"class":159,"line":213},[19291],{"type":20,"tag":157,"props":19292,"children":19293},{},[19294],{"type":25,"value":19295},"    System.out.println(allUserToMap);\n",{"type":20,"tag":157,"props":19297,"children":19298},{"class":159,"line":222},[19299],{"type":20,"tag":157,"props":19300,"children":19301},{},[19302],{"type":25,"value":17278},{"type":20,"tag":157,"props":19304,"children":19305},{"class":159,"line":440},[19306],{"type":20,"tag":157,"props":19307,"children":19308},{},[19309],{"type":25,"value":943},{"type":20,"tag":28,"props":19311,"children":19313},{"id":19312},"_6-特殊的sql执行",[19314],{"type":25,"value":19315},"6. 特殊的SQL执行",{"type":20,"tag":11085,"props":19317,"children":19319},{"id":19318},"_61-模糊查询",[19320],{"type":25,"value":19321},"6.1 模糊查询",{"type":20,"tag":6665,"props":19323,"children":19324},{},[19325],{"type":20,"tag":21,"props":19326,"children":19327},{},[19328],{"type":25,"value":19329},"模糊查询需要使用单引号包括like条件，不能使用#{}，因为#{}本质是占位符?，并且还是在单引号里，?不会被当成占位符，而是字符串",{"type":20,"tag":21,"props":19331,"children":19332},{},[19333],{"type":20,"tag":33,"props":19334,"children":19335},{},[19336],{"type":25,"value":18188},{"type":20,"tag":126,"props":19338,"children":19340},{"className":16050,"code":19339,"language":16052,"meta":8,"style":8},"\u002F**\n * 模糊查询username\n * @param mohu\n * @return\n *\u002F\npublic List\u003CUser> getUserByLike(@Param(\"mohu\") String mohu);\n",[19341],{"type":20,"tag":84,"props":19342,"children":19343},{"__ignoreMap":8},[19344,19351,19359,19367,19374,19381],{"type":20,"tag":157,"props":19345,"children":19346},{"class":159,"line":160},[19347],{"type":20,"tag":157,"props":19348,"children":19349},{},[19350],{"type":25,"value":18203},{"type":20,"tag":157,"props":19352,"children":19353},{"class":159,"line":169},[19354],{"type":20,"tag":157,"props":19355,"children":19356},{},[19357],{"type":25,"value":19358}," * 模糊查询username\n",{"type":20,"tag":157,"props":19360,"children":19361},{"class":159,"line":179},[19362],{"type":20,"tag":157,"props":19363,"children":19364},{},[19365],{"type":25,"value":19366}," * @param mohu\n",{"type":20,"tag":157,"props":19368,"children":19369},{"class":159,"line":188},[19370],{"type":20,"tag":157,"props":19371,"children":19372},{},[19373],{"type":25,"value":18235},{"type":20,"tag":157,"props":19375,"children":19376},{"class":159,"line":196},[19377],{"type":20,"tag":157,"props":19378,"children":19379},{},[19380],{"type":25,"value":18243},{"type":20,"tag":157,"props":19382,"children":19383},{"class":159,"line":204},[19384],{"type":20,"tag":157,"props":19385,"children":19386},{},[19387],{"type":25,"value":19388},"public List\u003CUser> getUserByLike(@Param(\"mohu\") String mohu);\n",{"type":20,"tag":21,"props":19390,"children":19391},{},[19392],{"type":20,"tag":33,"props":19393,"children":19394},{},[19395],{"type":25,"value":18057},{"type":20,"tag":126,"props":19397,"children":19399},{"className":17052,"code":19398,"language":17054,"meta":8,"style":8},"\u003C!--public List\u003CUser> getUserByLike(@Param(\"mohu\") String mohu);-->\n\u003Cselect id=\"getUserByLike\" resultType=\"user\">\n    \u003C!--方式一：-->\n    \u003C!--select * from t_user where username like '%${mohu}%'-->\n    \u003C!--方式二：-->\n    select * from t_user where username like \"%\"#{mohu}\"%\"\n\u003C\u002Fselect>\n",[19400],{"type":20,"tag":84,"props":19401,"children":19402},{"__ignoreMap":8},[19403,19411,19419,19427,19435,19443,19451],{"type":20,"tag":157,"props":19404,"children":19405},{"class":159,"line":160},[19406],{"type":20,"tag":157,"props":19407,"children":19408},{},[19409],{"type":25,"value":19410},"\u003C!--public List\u003CUser> getUserByLike(@Param(\"mohu\") String mohu);-->\n",{"type":20,"tag":157,"props":19412,"children":19413},{"class":159,"line":169},[19414],{"type":20,"tag":157,"props":19415,"children":19416},{},[19417],{"type":25,"value":19418},"\u003Cselect id=\"getUserByLike\" resultType=\"user\">\n",{"type":20,"tag":157,"props":19420,"children":19421},{"class":159,"line":179},[19422],{"type":20,"tag":157,"props":19423,"children":19424},{},[19425],{"type":25,"value":19426},"    \u003C!--方式一：-->\n",{"type":20,"tag":157,"props":19428,"children":19429},{"class":159,"line":188},[19430],{"type":20,"tag":157,"props":19431,"children":19432},{},[19433],{"type":25,"value":19434},"    \u003C!--select * from t_user where username like '%${mohu}%'-->\n",{"type":20,"tag":157,"props":19436,"children":19437},{"class":159,"line":196},[19438],{"type":20,"tag":157,"props":19439,"children":19440},{},[19441],{"type":25,"value":19442},"    \u003C!--方式二：-->\n",{"type":20,"tag":157,"props":19444,"children":19445},{"class":159,"line":204},[19446],{"type":20,"tag":157,"props":19447,"children":19448},{},[19449],{"type":25,"value":19450},"    select * from t_user where username like \"%\"#{mohu}\"%\"\n",{"type":20,"tag":157,"props":19452,"children":19453},{"class":159,"line":213},[19454],{"type":20,"tag":157,"props":19455,"children":19456},{},[19457],{"type":25,"value":17794},{"type":20,"tag":21,"props":19459,"children":19460},{},[19461],{"type":20,"tag":33,"props":19462,"children":19463},{},[19464],{"type":25,"value":17963},{"type":20,"tag":126,"props":19466,"children":19468},{"className":16050,"code":19467,"language":16052,"meta":8,"style":8},"@Test\npublic void getUserByLike() {\n  \n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);\n    List\u003CUser> list = mapper.getUserByLike(\"a\");\n    for (User user : list) {\n        System.out.println(user);\n    }\n}\n",[19469],{"type":20,"tag":84,"props":19470,"children":19471},{"__ignoreMap":8},[19472,19479,19487,19494,19501,19509,19517,19525,19532,19539],{"type":20,"tag":157,"props":19473,"children":19474},{"class":159,"line":160},[19475],{"type":20,"tag":157,"props":19476,"children":19477},{},[19478],{"type":25,"value":17978},{"type":20,"tag":157,"props":19480,"children":19481},{"class":159,"line":169},[19482],{"type":20,"tag":157,"props":19483,"children":19484},{},[19485],{"type":25,"value":19486},"public void getUserByLike() {\n",{"type":20,"tag":157,"props":19488,"children":19489},{"class":159,"line":179},[19490],{"type":20,"tag":157,"props":19491,"children":19492},{},[19493],{"type":25,"value":17278},{"type":20,"tag":157,"props":19495,"children":19496},{"class":159,"line":188},[19497],{"type":20,"tag":157,"props":19498,"children":19499},{},[19500],{"type":25,"value":17994},{"type":20,"tag":157,"props":19502,"children":19503},{"class":159,"line":196},[19504],{"type":20,"tag":157,"props":19505,"children":19506},{},[19507],{"type":25,"value":19508},"    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);\n",{"type":20,"tag":157,"props":19510,"children":19511},{"class":159,"line":204},[19512],{"type":20,"tag":157,"props":19513,"children":19514},{},[19515],{"type":25,"value":19516},"    List\u003CUser> list = mapper.getUserByLike(\"a\");\n",{"type":20,"tag":157,"props":19518,"children":19519},{"class":159,"line":213},[19520],{"type":20,"tag":157,"props":19521,"children":19522},{},[19523],{"type":25,"value":19524},"    for (User user : list) {\n",{"type":20,"tag":157,"props":19526,"children":19527},{"class":159,"line":222},[19528],{"type":20,"tag":157,"props":19529,"children":19530},{},[19531],{"type":25,"value":18724},{"type":20,"tag":157,"props":19533,"children":19534},{"class":159,"line":440},[19535],{"type":20,"tag":157,"props":19536,"children":19537},{},[19538],{"type":25,"value":872},{"type":20,"tag":157,"props":19540,"children":19541},{"class":159,"line":448},[19542],{"type":20,"tag":157,"props":19543,"children":19544},{},[19545],{"type":25,"value":943},{"type":20,"tag":11085,"props":19547,"children":19549},{"id":19548},"_62-批量删除",[19550],{"type":25,"value":19551},"6.2 批量删除",{"type":20,"tag":21,"props":19553,"children":19554},{},[19555],{"type":20,"tag":33,"props":19556,"children":19557},{},[19558],{"type":25,"value":18188},{"type":20,"tag":126,"props":19560,"children":19562},{"className":16050,"code":19561,"language":16052,"meta":8,"style":8},"\u002F**\n * 批量删除用户信息\n * @param ids\n *\u002F\npublic void delUserByIds(@Param(\"ids\") String ids);\n",[19563],{"type":20,"tag":84,"props":19564,"children":19565},{"__ignoreMap":8},[19566,19573,19581,19589,19596],{"type":20,"tag":157,"props":19567,"children":19568},{"class":159,"line":160},[19569],{"type":20,"tag":157,"props":19570,"children":19571},{},[19572],{"type":25,"value":18203},{"type":20,"tag":157,"props":19574,"children":19575},{"class":159,"line":169},[19576],{"type":20,"tag":157,"props":19577,"children":19578},{},[19579],{"type":25,"value":19580}," * 批量删除用户信息\n",{"type":20,"tag":157,"props":19582,"children":19583},{"class":159,"line":179},[19584],{"type":20,"tag":157,"props":19585,"children":19586},{},[19587],{"type":25,"value":19588}," * @param ids\n",{"type":20,"tag":157,"props":19590,"children":19591},{"class":159,"line":188},[19592],{"type":20,"tag":157,"props":19593,"children":19594},{},[19595],{"type":25,"value":18243},{"type":20,"tag":157,"props":19597,"children":19598},{"class":159,"line":196},[19599],{"type":20,"tag":157,"props":19600,"children":19601},{},[19602],{"type":25,"value":19603},"public void delUserByIds(@Param(\"ids\") String ids);\n",{"type":20,"tag":21,"props":19605,"children":19606},{},[19607],{"type":20,"tag":33,"props":19608,"children":19609},{},[19610],{"type":25,"value":18057},{"type":20,"tag":126,"props":19612,"children":19614},{"className":17052,"code":19613,"language":17054,"meta":8,"style":8},"\u003C!--public void delUserByIds(@Param(\"ids\") String ids);-->\n\u003Cdelete id=\"delUserByIds\">\n    delete from t_user where id in(${ids})\n\u003C\u002Fdelete>\n",[19615],{"type":20,"tag":84,"props":19616,"children":19617},{"__ignoreMap":8},[19618,19626,19634,19642],{"type":20,"tag":157,"props":19619,"children":19620},{"class":159,"line":160},[19621],{"type":20,"tag":157,"props":19622,"children":19623},{},[19624],{"type":25,"value":19625},"\u003C!--public void delUserByIds(@Param(\"ids\") String ids);-->\n",{"type":20,"tag":157,"props":19627,"children":19628},{"class":159,"line":169},[19629],{"type":20,"tag":157,"props":19630,"children":19631},{},[19632],{"type":25,"value":19633},"\u003Cdelete id=\"delUserByIds\">\n",{"type":20,"tag":157,"props":19635,"children":19636},{"class":159,"line":179},[19637],{"type":20,"tag":157,"props":19638,"children":19639},{},[19640],{"type":25,"value":19641},"    delete from t_user where id in(${ids})\n",{"type":20,"tag":157,"props":19643,"children":19644},{"class":159,"line":188},[19645],{"type":20,"tag":157,"props":19646,"children":19647},{},[19648],{"type":25,"value":19649},"\u003C\u002Fdelete>\n",{"type":20,"tag":21,"props":19651,"children":19652},{},[19653],{"type":20,"tag":33,"props":19654,"children":19655},{},[19656],{"type":25,"value":17963},{"type":20,"tag":126,"props":19658,"children":19660},{"className":16050,"code":19659,"language":16052,"meta":8,"style":8},"\u002F**\n * 批量删除\n *\u002F\n@Test\npublic void delUserByIds() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);\n    mapper.delUserByIds(\"4,5\");\n}\n",[19661],{"type":20,"tag":84,"props":19662,"children":19663},{"__ignoreMap":8},[19664,19671,19679,19686,19693,19701,19708,19715,19723],{"type":20,"tag":157,"props":19665,"children":19666},{"class":159,"line":160},[19667],{"type":20,"tag":157,"props":19668,"children":19669},{},[19670],{"type":25,"value":18203},{"type":20,"tag":157,"props":19672,"children":19673},{"class":159,"line":169},[19674],{"type":20,"tag":157,"props":19675,"children":19676},{},[19677],{"type":25,"value":19678}," * 批量删除\n",{"type":20,"tag":157,"props":19680,"children":19681},{"class":159,"line":179},[19682],{"type":20,"tag":157,"props":19683,"children":19684},{},[19685],{"type":25,"value":18243},{"type":20,"tag":157,"props":19687,"children":19688},{"class":159,"line":188},[19689],{"type":20,"tag":157,"props":19690,"children":19691},{},[19692],{"type":25,"value":17978},{"type":20,"tag":157,"props":19694,"children":19695},{"class":159,"line":196},[19696],{"type":20,"tag":157,"props":19697,"children":19698},{},[19699],{"type":25,"value":19700},"public void delUserByIds() {\n",{"type":20,"tag":157,"props":19702,"children":19703},{"class":159,"line":204},[19704],{"type":20,"tag":157,"props":19705,"children":19706},{},[19707],{"type":25,"value":17994},{"type":20,"tag":157,"props":19709,"children":19710},{"class":159,"line":213},[19711],{"type":20,"tag":157,"props":19712,"children":19713},{},[19714],{"type":25,"value":19508},{"type":20,"tag":157,"props":19716,"children":19717},{"class":159,"line":222},[19718],{"type":20,"tag":157,"props":19719,"children":19720},{},[19721],{"type":25,"value":19722},"    mapper.delUserByIds(\"4,5\");\n",{"type":20,"tag":157,"props":19724,"children":19725},{"class":159,"line":440},[19726],{"type":20,"tag":157,"props":19727,"children":19728},{},[19729],{"type":25,"value":943},{"type":20,"tag":11085,"props":19731,"children":19733},{"id":19732},"_63-动态设置表名",[19734],{"type":25,"value":19735},"6.3 动态设置表名",{"type":20,"tag":21,"props":19737,"children":19738},{},[19739],{"type":20,"tag":33,"props":19740,"children":19741},{},[19742],{"type":25,"value":18188},{"type":20,"tag":126,"props":19744,"children":19746},{"className":16050,"code":19745,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据表名获取所有用户信息\n * @param tableName\n *\u002F\npublic List\u003CUser> getAllUserByTableName(@Param(\"tableName\") String tableName);\n",[19747],{"type":20,"tag":84,"props":19748,"children":19749},{"__ignoreMap":8},[19750,19757,19765,19773,19780],{"type":20,"tag":157,"props":19751,"children":19752},{"class":159,"line":160},[19753],{"type":20,"tag":157,"props":19754,"children":19755},{},[19756],{"type":25,"value":18203},{"type":20,"tag":157,"props":19758,"children":19759},{"class":159,"line":169},[19760],{"type":20,"tag":157,"props":19761,"children":19762},{},[19763],{"type":25,"value":19764}," * 根据表名获取所有用户信息\n",{"type":20,"tag":157,"props":19766,"children":19767},{"class":159,"line":179},[19768],{"type":20,"tag":157,"props":19769,"children":19770},{},[19771],{"type":25,"value":19772}," * @param tableName\n",{"type":20,"tag":157,"props":19774,"children":19775},{"class":159,"line":188},[19776],{"type":20,"tag":157,"props":19777,"children":19778},{},[19779],{"type":25,"value":18243},{"type":20,"tag":157,"props":19781,"children":19782},{"class":159,"line":196},[19783],{"type":20,"tag":157,"props":19784,"children":19785},{},[19786],{"type":25,"value":19787},"public List\u003CUser> getAllUserByTableName(@Param(\"tableName\") String tableName);\n",{"type":20,"tag":21,"props":19789,"children":19790},{},[19791],{"type":20,"tag":33,"props":19792,"children":19793},{},[19794],{"type":25,"value":18057},{"type":20,"tag":126,"props":19796,"children":19798},{"className":17052,"code":19797,"language":17054,"meta":8,"style":8},"\u003C!--public List\u003CUser> getAllUserByTableName(@Param(\"tableName\") String tableName);-->\n\u003Cselect id=\"getAllUserByTableName\" resultType=\"user\">\n    select * from ${tableName}\n\u003C\u002Fselect>\n",[19799],{"type":20,"tag":84,"props":19800,"children":19801},{"__ignoreMap":8},[19802,19810,19818,19826],{"type":20,"tag":157,"props":19803,"children":19804},{"class":159,"line":160},[19805],{"type":20,"tag":157,"props":19806,"children":19807},{},[19808],{"type":25,"value":19809},"\u003C!--public List\u003CUser> getAllUserByTableName(@Param(\"tableName\") String tableName);-->\n",{"type":20,"tag":157,"props":19811,"children":19812},{"class":159,"line":169},[19813],{"type":20,"tag":157,"props":19814,"children":19815},{},[19816],{"type":25,"value":19817},"\u003Cselect id=\"getAllUserByTableName\" resultType=\"user\">\n",{"type":20,"tag":157,"props":19819,"children":19820},{"class":159,"line":179},[19821],{"type":20,"tag":157,"props":19822,"children":19823},{},[19824],{"type":25,"value":19825},"    select * from ${tableName}\n",{"type":20,"tag":157,"props":19827,"children":19828},{"class":159,"line":188},[19829],{"type":20,"tag":157,"props":19830,"children":19831},{},[19832],{"type":25,"value":17794},{"type":20,"tag":21,"props":19834,"children":19835},{},[19836],{"type":20,"tag":33,"props":19837,"children":19838},{},[19839],{"type":25,"value":17963},{"type":20,"tag":126,"props":19841,"children":19843},{"className":16050,"code":19842,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据表名查询所有用户信息\n *\u002F\n@Test\npublic void getAllUserByTableName() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);\n\n    List\u003CUser> t_user = mapper.getAllUserByTableName(\"t_user\");\n    t_user.forEach(System.out::println);\n}\n",[19844],{"type":20,"tag":84,"props":19845,"children":19846},{"__ignoreMap":8},[19847,19854,19862,19869,19876,19884,19891,19898,19905,19913,19921],{"type":20,"tag":157,"props":19848,"children":19849},{"class":159,"line":160},[19850],{"type":20,"tag":157,"props":19851,"children":19852},{},[19853],{"type":25,"value":18203},{"type":20,"tag":157,"props":19855,"children":19856},{"class":159,"line":169},[19857],{"type":20,"tag":157,"props":19858,"children":19859},{},[19860],{"type":25,"value":19861}," * 根据表名查询所有用户信息\n",{"type":20,"tag":157,"props":19863,"children":19864},{"class":159,"line":179},[19865],{"type":20,"tag":157,"props":19866,"children":19867},{},[19868],{"type":25,"value":18243},{"type":20,"tag":157,"props":19870,"children":19871},{"class":159,"line":188},[19872],{"type":20,"tag":157,"props":19873,"children":19874},{},[19875],{"type":25,"value":17978},{"type":20,"tag":157,"props":19877,"children":19878},{"class":159,"line":196},[19879],{"type":20,"tag":157,"props":19880,"children":19881},{},[19882],{"type":25,"value":19883},"public void getAllUserByTableName() {\n",{"type":20,"tag":157,"props":19885,"children":19886},{"class":159,"line":204},[19887],{"type":20,"tag":157,"props":19888,"children":19889},{},[19890],{"type":25,"value":17994},{"type":20,"tag":157,"props":19892,"children":19893},{"class":159,"line":213},[19894],{"type":20,"tag":157,"props":19895,"children":19896},{},[19897],{"type":25,"value":19508},{"type":20,"tag":157,"props":19899,"children":19900},{"class":159,"line":222},[19901],{"type":20,"tag":157,"props":19902,"children":19903},{"emptyLinePlaceholder":173},[19904],{"type":25,"value":176},{"type":20,"tag":157,"props":19906,"children":19907},{"class":159,"line":440},[19908],{"type":20,"tag":157,"props":19909,"children":19910},{},[19911],{"type":25,"value":19912},"    List\u003CUser> t_user = mapper.getAllUserByTableName(\"t_user\");\n",{"type":20,"tag":157,"props":19914,"children":19915},{"class":159,"line":448},[19916],{"type":20,"tag":157,"props":19917,"children":19918},{},[19919],{"type":25,"value":19920},"    t_user.forEach(System.out::println);\n",{"type":20,"tag":157,"props":19922,"children":19923},{"class":159,"line":456},[19924],{"type":20,"tag":157,"props":19925,"children":19926},{},[19927],{"type":25,"value":943},{"type":20,"tag":11085,"props":19929,"children":19931},{"id":19930},"_64-获取自增主键",[19932],{"type":25,"value":19933},"6.4 获取自增主键",{"type":20,"tag":21,"props":19935,"children":19936},{},[19937],{"type":20,"tag":33,"props":19938,"children":19939},{},[19940],{"type":25,"value":18188},{"type":20,"tag":126,"props":19942,"children":19944},{"className":16050,"code":19943,"language":16052,"meta":8,"style":8},"\u002F**\n * 新增用户信息，并获取主键\n * @param user\n *\u002F\npublic int insertUser(User user);\n",[19945],{"type":20,"tag":84,"props":19946,"children":19947},{"__ignoreMap":8},[19948,19955,19963,19971,19978],{"type":20,"tag":157,"props":19949,"children":19950},{"class":159,"line":160},[19951],{"type":20,"tag":157,"props":19952,"children":19953},{},[19954],{"type":25,"value":18203},{"type":20,"tag":157,"props":19956,"children":19957},{"class":159,"line":169},[19958],{"type":20,"tag":157,"props":19959,"children":19960},{},[19961],{"type":25,"value":19962}," * 新增用户信息，并获取主键\n",{"type":20,"tag":157,"props":19964,"children":19965},{"class":159,"line":179},[19966],{"type":20,"tag":157,"props":19967,"children":19968},{},[19969],{"type":25,"value":19970}," * @param user\n",{"type":20,"tag":157,"props":19972,"children":19973},{"class":159,"line":188},[19974],{"type":20,"tag":157,"props":19975,"children":19976},{},[19977],{"type":25,"value":18243},{"type":20,"tag":157,"props":19979,"children":19980},{"class":159,"line":196},[19981],{"type":20,"tag":157,"props":19982,"children":19983},{},[19984],{"type":25,"value":19985},"public int insertUser(User user);\n",{"type":20,"tag":21,"props":19987,"children":19988},{},[19989],{"type":20,"tag":33,"props":19990,"children":19991},{},[19992],{"type":25,"value":18057},{"type":20,"tag":126,"props":19994,"children":19996},{"className":17052,"code":19995,"language":17054,"meta":8,"style":8},"\u003C!--public int insertUser(User user);-->\n\u003C!--\n        useGeneratedKeys: 表示当前添加功能使用自增主键\n        keyProperty: 将添加数据的自增主键为实体类类型的参数的数据赋值\n-->\n\u003Cinsert id=\"insertUser\" useGeneratedKeys=\"true\" keyProperty=\"id\">\n    insert into t_user values (null, #{username}, #{password}, #{age}, #{gender}, #{email})\n\u003C\u002Finsert>\n",[19997],{"type":20,"tag":84,"props":19998,"children":19999},{"__ignoreMap":8},[20000,20008,20016,20024,20032,20040,20048,20056],{"type":20,"tag":157,"props":20001,"children":20002},{"class":159,"line":160},[20003],{"type":20,"tag":157,"props":20004,"children":20005},{},[20006],{"type":25,"value":20007},"\u003C!--public int insertUser(User user);-->\n",{"type":20,"tag":157,"props":20009,"children":20010},{"class":159,"line":169},[20011],{"type":20,"tag":157,"props":20012,"children":20013},{},[20014],{"type":25,"value":20015},"\u003C!--\n",{"type":20,"tag":157,"props":20017,"children":20018},{"class":159,"line":179},[20019],{"type":20,"tag":157,"props":20020,"children":20021},{},[20022],{"type":25,"value":20023},"        useGeneratedKeys: 表示当前添加功能使用自增主键\n",{"type":20,"tag":157,"props":20025,"children":20026},{"class":159,"line":188},[20027],{"type":20,"tag":157,"props":20028,"children":20029},{},[20030],{"type":25,"value":20031},"        keyProperty: 将添加数据的自增主键为实体类类型的参数的数据赋值\n",{"type":20,"tag":157,"props":20033,"children":20034},{"class":159,"line":196},[20035],{"type":20,"tag":157,"props":20036,"children":20037},{},[20038],{"type":25,"value":20039},"-->\n",{"type":20,"tag":157,"props":20041,"children":20042},{"class":159,"line":204},[20043],{"type":20,"tag":157,"props":20044,"children":20045},{},[20046],{"type":25,"value":20047},"\u003Cinsert id=\"insertUser\" useGeneratedKeys=\"true\" keyProperty=\"id\">\n",{"type":20,"tag":157,"props":20049,"children":20050},{"class":159,"line":213},[20051],{"type":20,"tag":157,"props":20052,"children":20053},{},[20054],{"type":25,"value":20055},"    insert into t_user values (null, #{username}, #{password}, #{age}, #{gender}, #{email})\n",{"type":20,"tag":157,"props":20057,"children":20058},{"class":159,"line":222},[20059],{"type":20,"tag":157,"props":20060,"children":20061},{},[20062],{"type":25,"value":18174},{"type":20,"tag":21,"props":20064,"children":20065},{},[20066],{"type":20,"tag":33,"props":20067,"children":20068},{},[20069],{"type":25,"value":17963},{"type":20,"tag":126,"props":20071,"children":20073},{"className":16050,"code":20072,"language":16052,"meta":8,"style":8},"\u002F**\n * 新增用户信息，并获取自增主键\n *\u002F\n@Test\npublic void testInsertUser() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);\n    User user = new User(null, \"xiaoming\", \"12312312\", 24, \"男\", \"123qq.com\");\n    int i = mapper.insertUser(user);\n    System.out.println(user);\n}\n",[20074],{"type":20,"tag":84,"props":20075,"children":20076},{"__ignoreMap":8},[20077,20084,20092,20099,20106,20114,20121,20128,20136,20144,20151],{"type":20,"tag":157,"props":20078,"children":20079},{"class":159,"line":160},[20080],{"type":20,"tag":157,"props":20081,"children":20082},{},[20083],{"type":25,"value":18203},{"type":20,"tag":157,"props":20085,"children":20086},{"class":159,"line":169},[20087],{"type":20,"tag":157,"props":20088,"children":20089},{},[20090],{"type":25,"value":20091}," * 新增用户信息，并获取自增主键\n",{"type":20,"tag":157,"props":20093,"children":20094},{"class":159,"line":179},[20095],{"type":20,"tag":157,"props":20096,"children":20097},{},[20098],{"type":25,"value":18243},{"type":20,"tag":157,"props":20100,"children":20101},{"class":159,"line":188},[20102],{"type":20,"tag":157,"props":20103,"children":20104},{},[20105],{"type":25,"value":17978},{"type":20,"tag":157,"props":20107,"children":20108},{"class":159,"line":196},[20109],{"type":20,"tag":157,"props":20110,"children":20111},{},[20112],{"type":25,"value":20113},"public void testInsertUser() {\n",{"type":20,"tag":157,"props":20115,"children":20116},{"class":159,"line":204},[20117],{"type":20,"tag":157,"props":20118,"children":20119},{},[20120],{"type":25,"value":17994},{"type":20,"tag":157,"props":20122,"children":20123},{"class":159,"line":213},[20124],{"type":20,"tag":157,"props":20125,"children":20126},{},[20127],{"type":25,"value":19508},{"type":20,"tag":157,"props":20129,"children":20130},{"class":159,"line":222},[20131],{"type":20,"tag":157,"props":20132,"children":20133},{},[20134],{"type":25,"value":20135},"    User user = new User(null, \"xiaoming\", \"12312312\", 24, \"男\", \"123qq.com\");\n",{"type":20,"tag":157,"props":20137,"children":20138},{"class":159,"line":440},[20139],{"type":20,"tag":157,"props":20140,"children":20141},{},[20142],{"type":25,"value":20143},"    int i = mapper.insertUser(user);\n",{"type":20,"tag":157,"props":20145,"children":20146},{"class":159,"line":448},[20147],{"type":20,"tag":157,"props":20148,"children":20149},{},[20150],{"type":25,"value":18042},{"type":20,"tag":157,"props":20152,"children":20153},{"class":159,"line":456},[20154],{"type":20,"tag":157,"props":20155,"children":20156},{},[20157],{"type":25,"value":943},{"type":20,"tag":11085,"props":20159,"children":20161},{"id":20160},"总结-1",[20162],{"type":25,"value":20163},"总结：",{"type":20,"tag":21,"props":20165,"children":20166},{},[20167],{"type":25,"value":20168},"有分号参与的语句，不用#{}",{"type":20,"tag":28,"props":20170,"children":20172},{"id":20171},"_7-自定义映射resultmap",[20173],{"type":25,"value":20174},"7. 自定义映射resultMap",{"type":20,"tag":11085,"props":20176,"children":20178},{"id":20177},"_71-resultmap处理字段和属性的映射关系",[20179],{"type":25,"value":20180},"7.1 resultMap处理字段和属性的映射关系",{"type":20,"tag":6665,"props":20182,"children":20183},{},[20184],{"type":20,"tag":21,"props":20185,"children":20186},{},[20187],{"type":25,"value":20188},"当实体类字段与数据库字段不一致时，直接查询无法返回正确结果，可以通过一下两种方式解决",{"type":20,"tag":5719,"props":20190,"children":20191},{},[20192],{"type":20,"tag":48,"props":20193,"children":20194},{},[20195],{"type":25,"value":20196},"在Mybatis配置文件中设置setting ==> mapUnderscoreToCamelCase",{"type":20,"tag":126,"props":20198,"children":20200},{"className":17052,"code":20199,"language":17054,"meta":8,"style":8},"\u003Csettings>\n    \u003Csetting name=\"mapUnderscoreToCamelCase\" value=\"true\"\u002F>\n\u003C\u002Fsettings>\n",[20201],{"type":20,"tag":84,"props":20202,"children":20203},{"__ignoreMap":8},[20204,20212,20220],{"type":20,"tag":157,"props":20205,"children":20206},{"class":159,"line":160},[20207],{"type":20,"tag":157,"props":20208,"children":20209},{},[20210],{"type":25,"value":20211},"\u003Csettings>\n",{"type":20,"tag":157,"props":20213,"children":20214},{"class":159,"line":169},[20215],{"type":20,"tag":157,"props":20216,"children":20217},{},[20218],{"type":25,"value":20219},"    \u003Csetting name=\"mapUnderscoreToCamelCase\" value=\"true\"\u002F>\n",{"type":20,"tag":157,"props":20221,"children":20222},{"class":159,"line":179},[20223],{"type":20,"tag":157,"props":20224,"children":20225},{},[20226],{"type":25,"value":20227},"\u003C\u002Fsettings>\n",{"type":20,"tag":5719,"props":20229,"children":20230},{"start":169},[20231],{"type":20,"tag":48,"props":20232,"children":20233},{},[20234],{"type":25,"value":20235},"在映射文件中设置resultMap",{"type":20,"tag":6665,"props":20237,"children":20238},{},[20239,20244,20257,20262],{"type":20,"tag":21,"props":20240,"children":20241},{},[20242],{"type":25,"value":20243},"resultMap：设置自定义的映射关系",{"type":20,"tag":44,"props":20245,"children":20246},{},[20247,20252],{"type":20,"tag":48,"props":20248,"children":20249},{},[20250],{"type":25,"value":20251},"id： 唯一标识",{"type":20,"tag":48,"props":20253,"children":20254},{},[20255],{"type":25,"value":20256},"type：处理映射关系的实体类的类型",{"type":20,"tag":21,"props":20258,"children":20259},{},[20260],{"type":25,"value":20261},"常用的标签：",{"type":20,"tag":44,"props":20263,"children":20264},{},[20265,20270],{"type":20,"tag":48,"props":20266,"children":20267},{},[20268],{"type":25,"value":20269},"id：处理主键与实体类中属性的映射关系",{"type":20,"tag":48,"props":20271,"children":20272},{},[20273,20275],{"type":25,"value":20274},"result：处理普通字段与实体类中属性的映射关系\n",{"type":20,"tag":44,"props":20276,"children":20277},{},[20278,20283],{"type":20,"tag":48,"props":20279,"children":20280},{},[20281],{"type":25,"value":20282},"column：设置映射关系中的字段名，必须是数据库中对应的字段",{"type":20,"tag":48,"props":20284,"children":20285},{},[20286],{"type":25,"value":20287},"property：设置映射关系中属性的属性名，必须是实体类中对应的属性名",{"type":20,"tag":18942,"props":20289,"children":20291},{"id":20290},"实例",[20292],{"type":25,"value":20290},{"type":20,"tag":20294,"props":20295,"children":20297},"h6",{"id":20296},"方式一配置mybatis配置文件",[20298],{"type":20,"tag":33,"props":20299,"children":20300},{},[20301],{"type":25,"value":20302},"方式一：配置MyBatis配置文件",{"type":20,"tag":21,"props":20304,"children":20305},{},[20306],{"type":20,"tag":33,"props":20307,"children":20308},{},[20309],{"type":25,"value":20310},"MyBatis配置文件：",{"type":20,"tag":126,"props":20312,"children":20314},{"className":17052,"code":20313,"language":17054,"meta":8,"style":8},"\u003Cproperties resource=\"jdbc.properties\"\u002F>\n\n\u003Csettings>\n    \u003Csetting name=\"mapUnderscoreToCamelCase\" value=\"true\"\u002F>\n\u003C\u002Fsettings>\n\n\u003CtypeAliases>\n    \u003Cpackage name=\"com.wangkun.mybatis.pojo\"\u002F>\n\u003C\u002FtypeAliases>\n",[20315],{"type":20,"tag":84,"props":20316,"children":20317},{"__ignoreMap":8},[20318,20326,20333,20340,20347,20354,20361,20369,20377],{"type":20,"tag":157,"props":20319,"children":20320},{"class":159,"line":160},[20321],{"type":20,"tag":157,"props":20322,"children":20323},{},[20324],{"type":25,"value":20325},"\u003Cproperties resource=\"jdbc.properties\"\u002F>\n",{"type":20,"tag":157,"props":20327,"children":20328},{"class":159,"line":169},[20329],{"type":20,"tag":157,"props":20330,"children":20331},{"emptyLinePlaceholder":173},[20332],{"type":25,"value":176},{"type":20,"tag":157,"props":20334,"children":20335},{"class":159,"line":179},[20336],{"type":20,"tag":157,"props":20337,"children":20338},{},[20339],{"type":25,"value":20211},{"type":20,"tag":157,"props":20341,"children":20342},{"class":159,"line":188},[20343],{"type":20,"tag":157,"props":20344,"children":20345},{},[20346],{"type":25,"value":20219},{"type":20,"tag":157,"props":20348,"children":20349},{"class":159,"line":196},[20350],{"type":20,"tag":157,"props":20351,"children":20352},{},[20353],{"type":25,"value":20227},{"type":20,"tag":157,"props":20355,"children":20356},{"class":159,"line":204},[20357],{"type":20,"tag":157,"props":20358,"children":20359},{"emptyLinePlaceholder":173},[20360],{"type":25,"value":176},{"type":20,"tag":157,"props":20362,"children":20363},{"class":159,"line":213},[20364],{"type":20,"tag":157,"props":20365,"children":20366},{},[20367],{"type":25,"value":20368},"\u003CtypeAliases>\n",{"type":20,"tag":157,"props":20370,"children":20371},{"class":159,"line":222},[20372],{"type":20,"tag":157,"props":20373,"children":20374},{},[20375],{"type":25,"value":20376},"    \u003Cpackage name=\"com.wangkun.mybatis.pojo\"\u002F>\n",{"type":20,"tag":157,"props":20378,"children":20379},{"class":159,"line":440},[20380],{"type":20,"tag":157,"props":20381,"children":20382},{},[20383],{"type":25,"value":20384},"\u003C\u002FtypeAliases>\n",{"type":20,"tag":21,"props":20386,"children":20387},{},[20388],{"type":20,"tag":33,"props":20389,"children":20390},{},[20391],{"type":25,"value":20392},"mapper：",{"type":20,"tag":126,"props":20394,"children":20396},{"className":16050,"code":20395,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据id查询员工信息\n *\u002F\nEmp getEmpById(@Param(\"empId\") int empId);\n",[20397],{"type":20,"tag":84,"props":20398,"children":20399},{"__ignoreMap":8},[20400,20407,20415,20422],{"type":20,"tag":157,"props":20401,"children":20402},{"class":159,"line":160},[20403],{"type":20,"tag":157,"props":20404,"children":20405},{},[20406],{"type":25,"value":18203},{"type":20,"tag":157,"props":20408,"children":20409},{"class":159,"line":169},[20410],{"type":20,"tag":157,"props":20411,"children":20412},{},[20413],{"type":25,"value":20414}," * 根据id查询员工信息\n",{"type":20,"tag":157,"props":20416,"children":20417},{"class":159,"line":179},[20418],{"type":20,"tag":157,"props":20419,"children":20420},{},[20421],{"type":25,"value":18243},{"type":20,"tag":157,"props":20423,"children":20424},{"class":159,"line":188},[20425],{"type":20,"tag":157,"props":20426,"children":20427},{},[20428],{"type":25,"value":20429},"Emp getEmpById(@Param(\"empId\") int empId);\n",{"type":20,"tag":21,"props":20431,"children":20432},{},[20433],{"type":20,"tag":33,"props":20434,"children":20435},{},[20436],{"type":25,"value":18057},{"type":20,"tag":126,"props":20438,"children":20440},{"className":17052,"code":20439,"language":17054,"meta":8,"style":8},"\u003Cselect id=\"getEmpById\" resultType=\"emp\">\n    select * from t_emp where emp_id = #{empId}\n\u003C\u002Fselect>\n",[20441],{"type":20,"tag":84,"props":20442,"children":20443},{"__ignoreMap":8},[20444,20452,20460],{"type":20,"tag":157,"props":20445,"children":20446},{"class":159,"line":160},[20447],{"type":20,"tag":157,"props":20448,"children":20449},{},[20450],{"type":25,"value":20451},"\u003Cselect id=\"getEmpById\" resultType=\"emp\">\n",{"type":20,"tag":157,"props":20453,"children":20454},{"class":159,"line":169},[20455],{"type":20,"tag":157,"props":20456,"children":20457},{},[20458],{"type":25,"value":20459},"    select * from t_emp where emp_id = #{empId}\n",{"type":20,"tag":157,"props":20461,"children":20462},{"class":159,"line":179},[20463],{"type":20,"tag":157,"props":20464,"children":20465},{},[20466],{"type":25,"value":17794},{"type":20,"tag":21,"props":20468,"children":20469},{},[20470],{"type":20,"tag":33,"props":20471,"children":20472},{},[20473],{"type":25,"value":17963},{"type":20,"tag":126,"props":20475,"children":20477},{"className":16050,"code":20476,"language":16052,"meta":8,"style":8},"@Test\npublic void testGetEmpById() {\n\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n    Emp empById = mapper.getEmpById(1);\n    System.out.println(empById);\n\n}\n",[20478],{"type":20,"tag":84,"props":20479,"children":20480},{"__ignoreMap":8},[20481,20488,20496,20503,20510,20518,20526,20534,20541],{"type":20,"tag":157,"props":20482,"children":20483},{"class":159,"line":160},[20484],{"type":20,"tag":157,"props":20485,"children":20486},{},[20487],{"type":25,"value":17978},{"type":20,"tag":157,"props":20489,"children":20490},{"class":159,"line":169},[20491],{"type":20,"tag":157,"props":20492,"children":20493},{},[20494],{"type":25,"value":20495},"public void testGetEmpById() {\n",{"type":20,"tag":157,"props":20497,"children":20498},{"class":159,"line":179},[20499],{"type":20,"tag":157,"props":20500,"children":20501},{"emptyLinePlaceholder":173},[20502],{"type":25,"value":176},{"type":20,"tag":157,"props":20504,"children":20505},{"class":159,"line":188},[20506],{"type":20,"tag":157,"props":20507,"children":20508},{},[20509],{"type":25,"value":17994},{"type":20,"tag":157,"props":20511,"children":20512},{"class":159,"line":196},[20513],{"type":20,"tag":157,"props":20514,"children":20515},{},[20516],{"type":25,"value":20517},"    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n",{"type":20,"tag":157,"props":20519,"children":20520},{"class":159,"line":204},[20521],{"type":20,"tag":157,"props":20522,"children":20523},{},[20524],{"type":25,"value":20525},"    Emp empById = mapper.getEmpById(1);\n",{"type":20,"tag":157,"props":20527,"children":20528},{"class":159,"line":213},[20529],{"type":20,"tag":157,"props":20530,"children":20531},{},[20532],{"type":25,"value":20533},"    System.out.println(empById);\n",{"type":20,"tag":157,"props":20535,"children":20536},{"class":159,"line":222},[20537],{"type":20,"tag":157,"props":20538,"children":20539},{"emptyLinePlaceholder":173},[20540],{"type":25,"value":176},{"type":20,"tag":157,"props":20542,"children":20543},{"class":159,"line":440},[20544],{"type":20,"tag":157,"props":20545,"children":20546},{},[20547],{"type":25,"value":943},{"type":20,"tag":20294,"props":20549,"children":20551},{"id":20550},"方式二配置映射文件",[20552],{"type":20,"tag":33,"props":20553,"children":20554},{},[20555],{"type":25,"value":20556},"方式二：配置映射文件",{"type":20,"tag":21,"props":20558,"children":20559},{},[20560],{"type":20,"tag":33,"props":20561,"children":20562},{},[20563],{"type":25,"value":18057},{"type":20,"tag":126,"props":20565,"children":20567},{"className":17052,"code":20566,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"empResultMap\" type=\"emp\">\n    \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n    \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n    \u003Cresult column=\"age\" property=\"age\"\u002F>\n    \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n    \u003Cresult column=\"dept_id\" property=\"deptId\"\u002F>\n\u003C\u002FresultMap>\n\n\u003C!--Emp getEmpById(@Param(\"empId\") int empId);-->\n\u003Cselect id=\"getEmpById\" resultMap=\"empResultMap\">\n    select * from t_emp where emp_id = #{empId}\n\u003C\u002Fselect>\n",[20568],{"type":20,"tag":84,"props":20569,"children":20570},{"__ignoreMap":8},[20571,20579,20587,20595,20603,20611,20619,20627,20634,20642,20650,20657],{"type":20,"tag":157,"props":20572,"children":20573},{"class":159,"line":160},[20574],{"type":20,"tag":157,"props":20575,"children":20576},{},[20577],{"type":25,"value":20578},"\u003CresultMap id=\"empResultMap\" type=\"emp\">\n",{"type":20,"tag":157,"props":20580,"children":20581},{"class":159,"line":169},[20582],{"type":20,"tag":157,"props":20583,"children":20584},{},[20585],{"type":25,"value":20586},"    \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n",{"type":20,"tag":157,"props":20588,"children":20589},{"class":159,"line":179},[20590],{"type":20,"tag":157,"props":20591,"children":20592},{},[20593],{"type":25,"value":20594},"    \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n",{"type":20,"tag":157,"props":20596,"children":20597},{"class":159,"line":188},[20598],{"type":20,"tag":157,"props":20599,"children":20600},{},[20601],{"type":25,"value":20602},"    \u003Cresult column=\"age\" property=\"age\"\u002F>\n",{"type":20,"tag":157,"props":20604,"children":20605},{"class":159,"line":196},[20606],{"type":20,"tag":157,"props":20607,"children":20608},{},[20609],{"type":25,"value":20610},"    \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n",{"type":20,"tag":157,"props":20612,"children":20613},{"class":159,"line":204},[20614],{"type":20,"tag":157,"props":20615,"children":20616},{},[20617],{"type":25,"value":20618},"    \u003Cresult column=\"dept_id\" property=\"deptId\"\u002F>\n",{"type":20,"tag":157,"props":20620,"children":20621},{"class":159,"line":213},[20622],{"type":20,"tag":157,"props":20623,"children":20624},{},[20625],{"type":25,"value":20626},"\u003C\u002FresultMap>\n",{"type":20,"tag":157,"props":20628,"children":20629},{"class":159,"line":222},[20630],{"type":20,"tag":157,"props":20631,"children":20632},{"emptyLinePlaceholder":173},[20633],{"type":25,"value":176},{"type":20,"tag":157,"props":20635,"children":20636},{"class":159,"line":440},[20637],{"type":20,"tag":157,"props":20638,"children":20639},{},[20640],{"type":25,"value":20641},"\u003C!--Emp getEmpById(@Param(\"empId\") int empId);-->\n",{"type":20,"tag":157,"props":20643,"children":20644},{"class":159,"line":448},[20645],{"type":20,"tag":157,"props":20646,"children":20647},{},[20648],{"type":25,"value":20649},"\u003Cselect id=\"getEmpById\" resultMap=\"empResultMap\">\n",{"type":20,"tag":157,"props":20651,"children":20652},{"class":159,"line":456},[20653],{"type":20,"tag":157,"props":20654,"children":20655},{},[20656],{"type":25,"value":20459},{"type":20,"tag":157,"props":20658,"children":20659},{"class":159,"line":465},[20660],{"type":20,"tag":157,"props":20661,"children":20662},{},[20663],{"type":25,"value":17794},{"type":20,"tag":11085,"props":20665,"children":20667},{"id":20666},"_72-多对一映射关系",[20668],{"type":25,"value":20669},"7.2 多对一映射关系",{"type":20,"tag":6665,"props":20671,"children":20672},{},[20673,20678],{"type":20,"tag":21,"props":20674,"children":20675},{},[20676],{"type":25,"value":20677},"多个员工对应一个部门",{"type":20,"tag":21,"props":20679,"children":20680},{},[20681],{"type":25,"value":20682},"二次查询之后是一个对象",{"type":20,"tag":21,"props":20684,"children":20685},{},[20686,20688,20693],{"type":25,"value":20687},"以",{"type":20,"tag":33,"props":20689,"children":20690},{},[20691],{"type":25,"value":20692},"查询员工信息以及员工对应的部门信息",{"type":25,"value":20694},"为例，使用三种方法实现",{"type":20,"tag":18942,"props":20696,"children":20698},{"id":20697},"_721-级联方式处理映射关系",[20699],{"type":25,"value":20700},"7.2.1 级联方式处理映射关系",{"type":20,"tag":21,"props":20702,"children":20703},{},[20704],{"type":20,"tag":33,"props":20705,"children":20706},{},[20707],{"type":25,"value":20392},{"type":20,"tag":126,"props":20709,"children":20711},{"className":16050,"code":20710,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据empId查询员工信息与部门信息\n * @param empId\n * @return\n *\u002F\nEmp getEmpAndDeptByEmpId(@Param(\"empId\") int empId);\n",[20712],{"type":20,"tag":84,"props":20713,"children":20714},{"__ignoreMap":8},[20715,20722,20730,20738,20745,20752],{"type":20,"tag":157,"props":20716,"children":20717},{"class":159,"line":160},[20718],{"type":20,"tag":157,"props":20719,"children":20720},{},[20721],{"type":25,"value":18203},{"type":20,"tag":157,"props":20723,"children":20724},{"class":159,"line":169},[20725],{"type":20,"tag":157,"props":20726,"children":20727},{},[20728],{"type":25,"value":20729}," * 根据empId查询员工信息与部门信息\n",{"type":20,"tag":157,"props":20731,"children":20732},{"class":159,"line":179},[20733],{"type":20,"tag":157,"props":20734,"children":20735},{},[20736],{"type":25,"value":20737}," * @param empId\n",{"type":20,"tag":157,"props":20739,"children":20740},{"class":159,"line":188},[20741],{"type":20,"tag":157,"props":20742,"children":20743},{},[20744],{"type":25,"value":18235},{"type":20,"tag":157,"props":20746,"children":20747},{"class":159,"line":196},[20748],{"type":20,"tag":157,"props":20749,"children":20750},{},[20751],{"type":25,"value":18243},{"type":20,"tag":157,"props":20753,"children":20754},{"class":159,"line":204},[20755],{"type":20,"tag":157,"props":20756,"children":20757},{},[20758],{"type":25,"value":20759},"Emp getEmpAndDeptByEmpId(@Param(\"empId\") int empId);\n",{"type":20,"tag":21,"props":20761,"children":20762},{},[20763],{"type":20,"tag":33,"props":20764,"children":20765},{},[20766],{"type":25,"value":20767},"映射文件(重点)：",{"type":20,"tag":126,"props":20769,"children":20771},{"className":17052,"code":20770,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"empAndDeptResultMap\" type=\"emp\">\n    \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n    \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n    \u003Cresult column=\"age\" property=\"age\"\u002F>\n    \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n    \u003C!--这里解决了实体类的一个属性对sql中多个字段的问题-->\n    \u003Cresult column=\"dept_id\" property=\"dept.deptId\"\u002F>\n    \u003Cresult column=\"dept_name\" property=\"dept.deptName\"\u002F>\n\u003C\u002FresultMap>\n\n\u003C!--Emp getEmpAndDeptByEmpId(@Param(\"empId\") int empId);-->\n\u003Cselect id=\"getEmpAndDeptByEmpId\" resultMap=\"empAndDeptResultMap\">\n    select t_emp.*, t_dept.*\n    from t_emp\n             left join t_dept on t_emp.dept_id = t_dept.dept_id\n    where t_emp.emp_id = #{empId}\n\u003C\u002Fselect>\n",[20772],{"type":20,"tag":84,"props":20773,"children":20774},{"__ignoreMap":8},[20775,20783,20790,20797,20804,20811,20819,20827,20835,20842,20849,20857,20865,20873,20881,20889,20897],{"type":20,"tag":157,"props":20776,"children":20777},{"class":159,"line":160},[20778],{"type":20,"tag":157,"props":20779,"children":20780},{},[20781],{"type":25,"value":20782},"\u003CresultMap id=\"empAndDeptResultMap\" type=\"emp\">\n",{"type":20,"tag":157,"props":20784,"children":20785},{"class":159,"line":169},[20786],{"type":20,"tag":157,"props":20787,"children":20788},{},[20789],{"type":25,"value":20586},{"type":20,"tag":157,"props":20791,"children":20792},{"class":159,"line":179},[20793],{"type":20,"tag":157,"props":20794,"children":20795},{},[20796],{"type":25,"value":20594},{"type":20,"tag":157,"props":20798,"children":20799},{"class":159,"line":188},[20800],{"type":20,"tag":157,"props":20801,"children":20802},{},[20803],{"type":25,"value":20602},{"type":20,"tag":157,"props":20805,"children":20806},{"class":159,"line":196},[20807],{"type":20,"tag":157,"props":20808,"children":20809},{},[20810],{"type":25,"value":20610},{"type":20,"tag":157,"props":20812,"children":20813},{"class":159,"line":204},[20814],{"type":20,"tag":157,"props":20815,"children":20816},{},[20817],{"type":25,"value":20818},"    \u003C!--这里解决了实体类的一个属性对sql中多个字段的问题-->\n",{"type":20,"tag":157,"props":20820,"children":20821},{"class":159,"line":213},[20822],{"type":20,"tag":157,"props":20823,"children":20824},{},[20825],{"type":25,"value":20826},"    \u003Cresult column=\"dept_id\" property=\"dept.deptId\"\u002F>\n",{"type":20,"tag":157,"props":20828,"children":20829},{"class":159,"line":222},[20830],{"type":20,"tag":157,"props":20831,"children":20832},{},[20833],{"type":25,"value":20834},"    \u003Cresult column=\"dept_name\" property=\"dept.deptName\"\u002F>\n",{"type":20,"tag":157,"props":20836,"children":20837},{"class":159,"line":440},[20838],{"type":20,"tag":157,"props":20839,"children":20840},{},[20841],{"type":25,"value":20626},{"type":20,"tag":157,"props":20843,"children":20844},{"class":159,"line":448},[20845],{"type":20,"tag":157,"props":20846,"children":20847},{"emptyLinePlaceholder":173},[20848],{"type":25,"value":176},{"type":20,"tag":157,"props":20850,"children":20851},{"class":159,"line":456},[20852],{"type":20,"tag":157,"props":20853,"children":20854},{},[20855],{"type":25,"value":20856},"\u003C!--Emp getEmpAndDeptByEmpId(@Param(\"empId\") int empId);-->\n",{"type":20,"tag":157,"props":20858,"children":20859},{"class":159,"line":465},[20860],{"type":20,"tag":157,"props":20861,"children":20862},{},[20863],{"type":25,"value":20864},"\u003Cselect id=\"getEmpAndDeptByEmpId\" resultMap=\"empAndDeptResultMap\">\n",{"type":20,"tag":157,"props":20866,"children":20867},{"class":159,"line":474},[20868],{"type":20,"tag":157,"props":20869,"children":20870},{},[20871],{"type":25,"value":20872},"    select t_emp.*, t_dept.*\n",{"type":20,"tag":157,"props":20874,"children":20875},{"class":159,"line":483},[20876],{"type":20,"tag":157,"props":20877,"children":20878},{},[20879],{"type":25,"value":20880},"    from t_emp\n",{"type":20,"tag":157,"props":20882,"children":20883},{"class":159,"line":491},[20884],{"type":20,"tag":157,"props":20885,"children":20886},{},[20887],{"type":25,"value":20888},"             left join t_dept on t_emp.dept_id = t_dept.dept_id\n",{"type":20,"tag":157,"props":20890,"children":20891},{"class":159,"line":499},[20892],{"type":20,"tag":157,"props":20893,"children":20894},{},[20895],{"type":25,"value":20896},"    where t_emp.emp_id = #{empId}\n",{"type":20,"tag":157,"props":20898,"children":20899},{"class":159,"line":508},[20900],{"type":20,"tag":157,"props":20901,"children":20902},{},[20903],{"type":25,"value":17794},{"type":20,"tag":18942,"props":20905,"children":20907},{"id":20906},"_722-使用association处理映射关系",[20908],{"type":25,"value":20909},"7.2.2 使用association处理映射关系",{"type":20,"tag":6665,"props":20911,"children":20912},{},[20913],{"type":20,"tag":44,"props":20914,"children":20915},{},[20916],{"type":20,"tag":48,"props":20917,"children":20918},{},[20919,20921],{"type":25,"value":20920},"association：处理多对一的映射关系（处理实体类属性的属性）\n",{"type":20,"tag":44,"props":20922,"children":20923},{},[20924,20929],{"type":20,"tag":48,"props":20925,"children":20926},{},[20927],{"type":25,"value":20928},"property：设置需要处理映射关系的属性的属性名",{"type":20,"tag":48,"props":20930,"children":20931},{},[20932],{"type":25,"value":20933},"javaType：设置要处理的属性的类型",{"type":20,"tag":21,"props":20935,"children":20936},{},[20937],{"type":20,"tag":33,"props":20938,"children":20939},{},[20940],{"type":25,"value":18057},{"type":20,"tag":126,"props":20942,"children":20944},{"className":17052,"code":20943,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"empAndDeptResultMap\" type=\"emp\">\n    \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n    \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n    \u003Cresult column=\"age\" property=\"age\"\u002F>\n    \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n    \u003Cassociation property=\"dept\" javaType=\"Dept\">\n        \u003Cid column=\"dept_id\" property=\"deptId\"\u002F>\n        \u003Cresult column=\"dept_name\" property=\"deptName\"\u002F>\n    \u003C\u002Fassociation>\n\u003C\u002FresultMap>\n\n\u003C!--Emp getEmpAndDeptByEmpId(@Param(\"empId\") int empId);-->\n\u003Cselect id=\"getEmpAndDeptByEmpId\" resultMap=\"empAndDeptResultMap\">\n    select t_emp.*, t_dept.*\n    from t_emp\n             left join t_dept on t_emp.dept_id = t_dept.dept_id\n    where t_emp.emp_id = #{empId}\n\u003C\u002Fselect>\n",[20945],{"type":20,"tag":84,"props":20946,"children":20947},{"__ignoreMap":8},[20948,20955,20962,20969,20976,20983,20991,20999,21007,21015,21022,21029,21036,21043,21050,21057,21064,21071],{"type":20,"tag":157,"props":20949,"children":20950},{"class":159,"line":160},[20951],{"type":20,"tag":157,"props":20952,"children":20953},{},[20954],{"type":25,"value":20782},{"type":20,"tag":157,"props":20956,"children":20957},{"class":159,"line":169},[20958],{"type":20,"tag":157,"props":20959,"children":20960},{},[20961],{"type":25,"value":20586},{"type":20,"tag":157,"props":20963,"children":20964},{"class":159,"line":179},[20965],{"type":20,"tag":157,"props":20966,"children":20967},{},[20968],{"type":25,"value":20594},{"type":20,"tag":157,"props":20970,"children":20971},{"class":159,"line":188},[20972],{"type":20,"tag":157,"props":20973,"children":20974},{},[20975],{"type":25,"value":20602},{"type":20,"tag":157,"props":20977,"children":20978},{"class":159,"line":196},[20979],{"type":20,"tag":157,"props":20980,"children":20981},{},[20982],{"type":25,"value":20610},{"type":20,"tag":157,"props":20984,"children":20985},{"class":159,"line":204},[20986],{"type":20,"tag":157,"props":20987,"children":20988},{},[20989],{"type":25,"value":20990},"    \u003Cassociation property=\"dept\" javaType=\"Dept\">\n",{"type":20,"tag":157,"props":20992,"children":20993},{"class":159,"line":213},[20994],{"type":20,"tag":157,"props":20995,"children":20996},{},[20997],{"type":25,"value":20998},"        \u003Cid column=\"dept_id\" property=\"deptId\"\u002F>\n",{"type":20,"tag":157,"props":21000,"children":21001},{"class":159,"line":222},[21002],{"type":20,"tag":157,"props":21003,"children":21004},{},[21005],{"type":25,"value":21006},"        \u003Cresult column=\"dept_name\" property=\"deptName\"\u002F>\n",{"type":20,"tag":157,"props":21008,"children":21009},{"class":159,"line":440},[21010],{"type":20,"tag":157,"props":21011,"children":21012},{},[21013],{"type":25,"value":21014},"    \u003C\u002Fassociation>\n",{"type":20,"tag":157,"props":21016,"children":21017},{"class":159,"line":448},[21018],{"type":20,"tag":157,"props":21019,"children":21020},{},[21021],{"type":25,"value":20626},{"type":20,"tag":157,"props":21023,"children":21024},{"class":159,"line":456},[21025],{"type":20,"tag":157,"props":21026,"children":21027},{"emptyLinePlaceholder":173},[21028],{"type":25,"value":176},{"type":20,"tag":157,"props":21030,"children":21031},{"class":159,"line":465},[21032],{"type":20,"tag":157,"props":21033,"children":21034},{},[21035],{"type":25,"value":20856},{"type":20,"tag":157,"props":21037,"children":21038},{"class":159,"line":474},[21039],{"type":20,"tag":157,"props":21040,"children":21041},{},[21042],{"type":25,"value":20864},{"type":20,"tag":157,"props":21044,"children":21045},{"class":159,"line":483},[21046],{"type":20,"tag":157,"props":21047,"children":21048},{},[21049],{"type":25,"value":20872},{"type":20,"tag":157,"props":21051,"children":21052},{"class":159,"line":491},[21053],{"type":20,"tag":157,"props":21054,"children":21055},{},[21056],{"type":25,"value":20880},{"type":20,"tag":157,"props":21058,"children":21059},{"class":159,"line":499},[21060],{"type":20,"tag":157,"props":21061,"children":21062},{},[21063],{"type":25,"value":20888},{"type":20,"tag":157,"props":21065,"children":21066},{"class":159,"line":508},[21067],{"type":20,"tag":157,"props":21068,"children":21069},{},[21070],{"type":25,"value":20896},{"type":20,"tag":157,"props":21072,"children":21073},{"class":159,"line":517},[21074],{"type":20,"tag":157,"props":21075,"children":21076},{},[21077],{"type":25,"value":17794},{"type":20,"tag":18942,"props":21079,"children":21081},{"id":21080},"_723-分布查询",[21082],{"type":25,"value":21083},"7.2.3 分布查询",{"type":20,"tag":20294,"props":21085,"children":21087},{"id":21086},"第一步",[21088],{"type":25,"value":21086},{"type":20,"tag":6665,"props":21090,"children":21091},{},[21092],{"type":20,"tag":21,"props":21093,"children":21094},{},[21095],{"type":25,"value":21096},"根据emp_id查询出员工信息",{"type":20,"tag":21,"props":21098,"children":21099},{},[21100],{"type":20,"tag":33,"props":21101,"children":21102},{},[21103],{"type":25,"value":21104},"mapper（EmpMapper）：",{"type":20,"tag":126,"props":21106,"children":21108},{"className":16050,"code":21107,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据empId查询员工信息与部门信息,分步查询\n *\n * @return\n *\u002F\nEmp getEmpAndDeptByStepOne(@Param(\"empId\") int empId);\n",[21109],{"type":20,"tag":84,"props":21110,"children":21111},{"__ignoreMap":8},[21112,21119,21127,21135,21142,21149],{"type":20,"tag":157,"props":21113,"children":21114},{"class":159,"line":160},[21115],{"type":20,"tag":157,"props":21116,"children":21117},{},[21118],{"type":25,"value":18203},{"type":20,"tag":157,"props":21120,"children":21121},{"class":159,"line":169},[21122],{"type":20,"tag":157,"props":21123,"children":21124},{},[21125],{"type":25,"value":21126}," * 根据empId查询员工信息与部门信息,分步查询\n",{"type":20,"tag":157,"props":21128,"children":21129},{"class":159,"line":179},[21130],{"type":20,"tag":157,"props":21131,"children":21132},{},[21133],{"type":25,"value":21134}," *\n",{"type":20,"tag":157,"props":21136,"children":21137},{"class":159,"line":188},[21138],{"type":20,"tag":157,"props":21139,"children":21140},{},[21141],{"type":25,"value":18235},{"type":20,"tag":157,"props":21143,"children":21144},{"class":159,"line":196},[21145],{"type":20,"tag":157,"props":21146,"children":21147},{},[21148],{"type":25,"value":18243},{"type":20,"tag":157,"props":21150,"children":21151},{"class":159,"line":204},[21152],{"type":20,"tag":157,"props":21153,"children":21154},{},[21155],{"type":25,"value":21156},"Emp getEmpAndDeptByStepOne(@Param(\"empId\") int empId);\n",{"type":20,"tag":21,"props":21158,"children":21159},{},[21160],{"type":20,"tag":33,"props":21161,"children":21162},{},[21163],{"type":25,"value":21164},"映射文件（EmpMapper.xml）",{"type":20,"tag":126,"props":21166,"children":21168},{"className":17052,"code":21167,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"empAndDeptByStepResultMap\" type=\"emp\">\n    \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n    \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n    \u003Cresult column=\"age\" property=\"age\"\u002F>\n    \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n    \u003C!-- 将查询出的dept_id的值作为参数传给并调用getEmpAndDeptByStepTwo，再讲第二步的查询结果映射到实体类的dept属性 -->\n    \u003Cassociation\n            property=\"dept\"\n            column=\"dept_id\"\n            select=\"com.wangkun.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo\"\n    >\n    \u003C\u002Fassociation>\n\u003C\u002FresultMap>\n\u003C!--Emp getEmpAndDeptByStepOne(@Param(\"empId\") int empId);-->\n\u003Cselect id=\"getEmpAndDeptByStepOne\" resultMap=\"empAndDeptByStepResultMap\">\n    select * from t_emp  where emp_id = #{empId}\n\u003C\u002Fselect>\n",[21169],{"type":20,"tag":84,"props":21170,"children":21171},{"__ignoreMap":8},[21172,21180,21187,21194,21201,21208,21216,21224,21232,21240,21248,21256,21263,21270,21278,21286,21294],{"type":20,"tag":157,"props":21173,"children":21174},{"class":159,"line":160},[21175],{"type":20,"tag":157,"props":21176,"children":21177},{},[21178],{"type":25,"value":21179},"\u003CresultMap id=\"empAndDeptByStepResultMap\" type=\"emp\">\n",{"type":20,"tag":157,"props":21181,"children":21182},{"class":159,"line":169},[21183],{"type":20,"tag":157,"props":21184,"children":21185},{},[21186],{"type":25,"value":20586},{"type":20,"tag":157,"props":21188,"children":21189},{"class":159,"line":179},[21190],{"type":20,"tag":157,"props":21191,"children":21192},{},[21193],{"type":25,"value":20594},{"type":20,"tag":157,"props":21195,"children":21196},{"class":159,"line":188},[21197],{"type":20,"tag":157,"props":21198,"children":21199},{},[21200],{"type":25,"value":20602},{"type":20,"tag":157,"props":21202,"children":21203},{"class":159,"line":196},[21204],{"type":20,"tag":157,"props":21205,"children":21206},{},[21207],{"type":25,"value":20610},{"type":20,"tag":157,"props":21209,"children":21210},{"class":159,"line":204},[21211],{"type":20,"tag":157,"props":21212,"children":21213},{},[21214],{"type":25,"value":21215},"    \u003C!-- 将查询出的dept_id的值作为参数传给并调用getEmpAndDeptByStepTwo，再讲第二步的查询结果映射到实体类的dept属性 -->\n",{"type":20,"tag":157,"props":21217,"children":21218},{"class":159,"line":213},[21219],{"type":20,"tag":157,"props":21220,"children":21221},{},[21222],{"type":25,"value":21223},"    \u003Cassociation\n",{"type":20,"tag":157,"props":21225,"children":21226},{"class":159,"line":222},[21227],{"type":20,"tag":157,"props":21228,"children":21229},{},[21230],{"type":25,"value":21231},"            property=\"dept\"\n",{"type":20,"tag":157,"props":21233,"children":21234},{"class":159,"line":440},[21235],{"type":20,"tag":157,"props":21236,"children":21237},{},[21238],{"type":25,"value":21239},"            column=\"dept_id\"\n",{"type":20,"tag":157,"props":21241,"children":21242},{"class":159,"line":448},[21243],{"type":20,"tag":157,"props":21244,"children":21245},{},[21246],{"type":25,"value":21247},"            select=\"com.wangkun.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo\"\n",{"type":20,"tag":157,"props":21249,"children":21250},{"class":159,"line":456},[21251],{"type":20,"tag":157,"props":21252,"children":21253},{},[21254],{"type":25,"value":21255},"    >\n",{"type":20,"tag":157,"props":21257,"children":21258},{"class":159,"line":465},[21259],{"type":20,"tag":157,"props":21260,"children":21261},{},[21262],{"type":25,"value":21014},{"type":20,"tag":157,"props":21264,"children":21265},{"class":159,"line":474},[21266],{"type":20,"tag":157,"props":21267,"children":21268},{},[21269],{"type":25,"value":20626},{"type":20,"tag":157,"props":21271,"children":21272},{"class":159,"line":483},[21273],{"type":20,"tag":157,"props":21274,"children":21275},{},[21276],{"type":25,"value":21277},"\u003C!--Emp getEmpAndDeptByStepOne(@Param(\"empId\") int empId);-->\n",{"type":20,"tag":157,"props":21279,"children":21280},{"class":159,"line":491},[21281],{"type":20,"tag":157,"props":21282,"children":21283},{},[21284],{"type":25,"value":21285},"\u003Cselect id=\"getEmpAndDeptByStepOne\" resultMap=\"empAndDeptByStepResultMap\">\n",{"type":20,"tag":157,"props":21287,"children":21288},{"class":159,"line":499},[21289],{"type":20,"tag":157,"props":21290,"children":21291},{},[21292],{"type":25,"value":21293},"    select * from t_emp  where emp_id = #{empId}\n",{"type":20,"tag":157,"props":21295,"children":21296},{"class":159,"line":508},[21297],{"type":20,"tag":157,"props":21298,"children":21299},{},[21300],{"type":25,"value":17794},{"type":20,"tag":20294,"props":21302,"children":21304},{"id":21303},"第二步",[21305],{"type":25,"value":21303},{"type":20,"tag":6665,"props":21307,"children":21308},{},[21309],{"type":20,"tag":21,"props":21310,"children":21311},{},[21312],{"type":25,"value":21313},"根据dept_id查询出部门信息",{"type":20,"tag":21,"props":21315,"children":21316},{},[21317],{"type":20,"tag":33,"props":21318,"children":21319},{},[21320],{"type":25,"value":21321},"mapper（DeptMapper）：",{"type":20,"tag":126,"props":21323,"children":21325},{"className":16050,"code":21324,"language":16052,"meta":8,"style":8},"\u002F**\n * 分布查询二\n *\u002F\nDept getEmpAndDeptByStepTwo(@Param(\"deptId\") int deptId);\n",[21326],{"type":20,"tag":84,"props":21327,"children":21328},{"__ignoreMap":8},[21329,21336,21344,21351],{"type":20,"tag":157,"props":21330,"children":21331},{"class":159,"line":160},[21332],{"type":20,"tag":157,"props":21333,"children":21334},{},[21335],{"type":25,"value":18203},{"type":20,"tag":157,"props":21337,"children":21338},{"class":159,"line":169},[21339],{"type":20,"tag":157,"props":21340,"children":21341},{},[21342],{"type":25,"value":21343}," * 分布查询二\n",{"type":20,"tag":157,"props":21345,"children":21346},{"class":159,"line":179},[21347],{"type":20,"tag":157,"props":21348,"children":21349},{},[21350],{"type":25,"value":18243},{"type":20,"tag":157,"props":21352,"children":21353},{"class":159,"line":188},[21354],{"type":20,"tag":157,"props":21355,"children":21356},{},[21357],{"type":25,"value":21358},"Dept getEmpAndDeptByStepTwo(@Param(\"deptId\") int deptId);\n",{"type":20,"tag":21,"props":21360,"children":21361},{},[21362],{"type":20,"tag":33,"props":21363,"children":21364},{},[21365],{"type":25,"value":21366},"映射文件（DeptMapper.xml）：",{"type":20,"tag":126,"props":21368,"children":21370},{"className":17052,"code":21369,"language":17054,"meta":8,"style":8},"\u003C!--Dept getEmpAndDeptByStepTwo(@Param(\"deptId\") int deptId);-->\n\u003Cselect id=\"getEmpAndDeptByStepTwo\" resultType=\"dept\">\n    select * from t_dept where dept_id = #{deptId}\n\u003C\u002Fselect>\n",[21371],{"type":20,"tag":84,"props":21372,"children":21373},{"__ignoreMap":8},[21374,21382,21390,21398],{"type":20,"tag":157,"props":21375,"children":21376},{"class":159,"line":160},[21377],{"type":20,"tag":157,"props":21378,"children":21379},{},[21380],{"type":25,"value":21381},"\u003C!--Dept getEmpAndDeptByStepTwo(@Param(\"deptId\") int deptId);-->\n",{"type":20,"tag":157,"props":21383,"children":21384},{"class":159,"line":169},[21385],{"type":20,"tag":157,"props":21386,"children":21387},{},[21388],{"type":25,"value":21389},"\u003Cselect id=\"getEmpAndDeptByStepTwo\" resultType=\"dept\">\n",{"type":20,"tag":157,"props":21391,"children":21392},{"class":159,"line":179},[21393],{"type":20,"tag":157,"props":21394,"children":21395},{},[21396],{"type":25,"value":21397},"    select * from t_dept where dept_id = #{deptId}\n",{"type":20,"tag":157,"props":21399,"children":21400},{"class":159,"line":188},[21401],{"type":20,"tag":157,"props":21402,"children":21403},{},[21404],{"type":25,"value":17794},{"type":20,"tag":21,"props":21406,"children":21407},{},[21408],{"type":20,"tag":33,"props":21409,"children":21410},{},[21411],{"type":25,"value":17963},{"type":20,"tag":126,"props":21413,"children":21415},{"className":16050,"code":21414,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据id查询员工与部门信息，分步查询\n *\u002F\n@Test\npublic void testGetEmpAndDeptByStep() {\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n    Emp empAndDeptByStepOne = mapper.getEmpAndDeptByStepOne(2);\n    System.out.println(empAndDeptByStepOne);\n}\n",[21416],{"type":20,"tag":84,"props":21417,"children":21418},{"__ignoreMap":8},[21419,21426,21434,21441,21448,21456,21463,21470,21478,21486],{"type":20,"tag":157,"props":21420,"children":21421},{"class":159,"line":160},[21422],{"type":20,"tag":157,"props":21423,"children":21424},{},[21425],{"type":25,"value":18203},{"type":20,"tag":157,"props":21427,"children":21428},{"class":159,"line":169},[21429],{"type":20,"tag":157,"props":21430,"children":21431},{},[21432],{"type":25,"value":21433}," * 根据id查询员工与部门信息，分步查询\n",{"type":20,"tag":157,"props":21435,"children":21436},{"class":159,"line":179},[21437],{"type":20,"tag":157,"props":21438,"children":21439},{},[21440],{"type":25,"value":18243},{"type":20,"tag":157,"props":21442,"children":21443},{"class":159,"line":188},[21444],{"type":20,"tag":157,"props":21445,"children":21446},{},[21447],{"type":25,"value":17978},{"type":20,"tag":157,"props":21449,"children":21450},{"class":159,"line":196},[21451],{"type":20,"tag":157,"props":21452,"children":21453},{},[21454],{"type":25,"value":21455},"public void testGetEmpAndDeptByStep() {\n",{"type":20,"tag":157,"props":21457,"children":21458},{"class":159,"line":204},[21459],{"type":20,"tag":157,"props":21460,"children":21461},{},[21462],{"type":25,"value":17994},{"type":20,"tag":157,"props":21464,"children":21465},{"class":159,"line":213},[21466],{"type":20,"tag":157,"props":21467,"children":21468},{},[21469],{"type":25,"value":20517},{"type":20,"tag":157,"props":21471,"children":21472},{"class":159,"line":222},[21473],{"type":20,"tag":157,"props":21474,"children":21475},{},[21476],{"type":25,"value":21477},"    Emp empAndDeptByStepOne = mapper.getEmpAndDeptByStepOne(2);\n",{"type":20,"tag":157,"props":21479,"children":21480},{"class":159,"line":440},[21481],{"type":20,"tag":157,"props":21482,"children":21483},{},[21484],{"type":25,"value":21485},"    System.out.println(empAndDeptByStepOne);\n",{"type":20,"tag":157,"props":21487,"children":21488},{"class":159,"line":448},[21489],{"type":20,"tag":157,"props":21490,"children":21491},{},[21492],{"type":25,"value":943},{"type":20,"tag":18942,"props":21494,"children":21496},{"id":21495},"_724-分布查询的优势",[21497],{"type":25,"value":21498},"7.2.4 分布查询的优势",{"type":20,"tag":21,"props":21500,"children":21501},{},[21502],{"type":25,"value":21503},"可以实现延迟加载，但我们没有用到第二步查询的结果时，Mybatis不会执行第二步的sql语句",{"type":20,"tag":21,"props":21505,"children":21506},{},[21507],{"type":20,"tag":33,"props":21508,"children":21509},{},[21510],{"type":25,"value":21511},"全局配置：",{"type":20,"tag":6665,"props":21513,"children":21514},{},[21515],{"type":20,"tag":21,"props":21516,"children":21517},{},[21518],{"type":25,"value":21519},"在Mybatis全局配置文件中加入配置",{"type":20,"tag":126,"props":21521,"children":21523},{"className":17052,"code":21522,"language":17054,"meta":8,"style":8},"\u003Cproperties resource=\"jdbc.properties\"\u002F>\n\n\u003Csettings>\n    \u003C!--将下划线映射为驼驼峰-->\n    \u003Csetting name=\"mapUnderscoreToCamelCase\" value=\"true\"\u002F>\n    \u003C!--开启延迟加载-->\n    \u003Csetting name=\"lazyLoadingEnabled\" value=\"true\"\u002F>\n    \u003C!--按需加载-->\n    \u003Csetting name=\"aggressiveLazyLoading\" value=\"false\"\u002F>\n\u003C\u002Fsettings>\n",[21524],{"type":20,"tag":84,"props":21525,"children":21526},{"__ignoreMap":8},[21527,21534,21541,21548,21556,21563,21571,21579,21587,21595],{"type":20,"tag":157,"props":21528,"children":21529},{"class":159,"line":160},[21530],{"type":20,"tag":157,"props":21531,"children":21532},{},[21533],{"type":25,"value":20325},{"type":20,"tag":157,"props":21535,"children":21536},{"class":159,"line":169},[21537],{"type":20,"tag":157,"props":21538,"children":21539},{"emptyLinePlaceholder":173},[21540],{"type":25,"value":176},{"type":20,"tag":157,"props":21542,"children":21543},{"class":159,"line":179},[21544],{"type":20,"tag":157,"props":21545,"children":21546},{},[21547],{"type":25,"value":20211},{"type":20,"tag":157,"props":21549,"children":21550},{"class":159,"line":188},[21551],{"type":20,"tag":157,"props":21552,"children":21553},{},[21554],{"type":25,"value":21555},"    \u003C!--将下划线映射为驼驼峰-->\n",{"type":20,"tag":157,"props":21557,"children":21558},{"class":159,"line":196},[21559],{"type":20,"tag":157,"props":21560,"children":21561},{},[21562],{"type":25,"value":20219},{"type":20,"tag":157,"props":21564,"children":21565},{"class":159,"line":204},[21566],{"type":20,"tag":157,"props":21567,"children":21568},{},[21569],{"type":25,"value":21570},"    \u003C!--开启延迟加载-->\n",{"type":20,"tag":157,"props":21572,"children":21573},{"class":159,"line":213},[21574],{"type":20,"tag":157,"props":21575,"children":21576},{},[21577],{"type":25,"value":21578},"    \u003Csetting name=\"lazyLoadingEnabled\" value=\"true\"\u002F>\n",{"type":20,"tag":157,"props":21580,"children":21581},{"class":159,"line":222},[21582],{"type":20,"tag":157,"props":21583,"children":21584},{},[21585],{"type":25,"value":21586},"    \u003C!--按需加载-->\n",{"type":20,"tag":157,"props":21588,"children":21589},{"class":159,"line":440},[21590],{"type":20,"tag":157,"props":21591,"children":21592},{},[21593],{"type":25,"value":21594},"    \u003Csetting name=\"aggressiveLazyLoading\" value=\"false\"\u002F>\n",{"type":20,"tag":157,"props":21596,"children":21597},{"class":159,"line":448},[21598],{"type":20,"tag":157,"props":21599,"children":21600},{},[21601],{"type":25,"value":20227},{"type":20,"tag":21,"props":21603,"children":21604},{},[21605],{"type":20,"tag":33,"props":21606,"children":21607},{},[21608],{"type":25,"value":21609},"局部配置：",{"type":20,"tag":6665,"props":21611,"children":21612},{},[21613],{"type":20,"tag":21,"props":21614,"children":21615},{},[21616],{"type":25,"value":21617},"在映射文件中配置",{"type":20,"tag":126,"props":21619,"children":21621},{"className":17052,"code":21620,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"empAndDeptByStepResultMap\" type=\"emp\">\n    \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n    \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n    \u003Cresult column=\"age\" property=\"age\"\u002F>\n    \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n    \u003C!--fetchType：在开启了延迟加载的环境中，该属性可以设置当前的分布查询是否使用延迟加载-->\n    \u003C!--fetchType=\"eager(立即加载)|lazy(延迟加载)\"-->\n  \n    \u003Cassociation\n            fetchType=\"eager\"\n            property=\"dept\"\n            column=\"dept_id\"\n            select=\"com.wangkun.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo\"\n    >\n    \u003C\u002Fassociation>\n\u003C\u002FresultMap>\n",[21622],{"type":20,"tag":84,"props":21623,"children":21624},{"__ignoreMap":8},[21625,21632,21639,21646,21653,21660,21668,21676,21683,21690,21698,21705,21712,21719,21726,21733],{"type":20,"tag":157,"props":21626,"children":21627},{"class":159,"line":160},[21628],{"type":20,"tag":157,"props":21629,"children":21630},{},[21631],{"type":25,"value":21179},{"type":20,"tag":157,"props":21633,"children":21634},{"class":159,"line":169},[21635],{"type":20,"tag":157,"props":21636,"children":21637},{},[21638],{"type":25,"value":20586},{"type":20,"tag":157,"props":21640,"children":21641},{"class":159,"line":179},[21642],{"type":20,"tag":157,"props":21643,"children":21644},{},[21645],{"type":25,"value":20594},{"type":20,"tag":157,"props":21647,"children":21648},{"class":159,"line":188},[21649],{"type":20,"tag":157,"props":21650,"children":21651},{},[21652],{"type":25,"value":20602},{"type":20,"tag":157,"props":21654,"children":21655},{"class":159,"line":196},[21656],{"type":20,"tag":157,"props":21657,"children":21658},{},[21659],{"type":25,"value":20610},{"type":20,"tag":157,"props":21661,"children":21662},{"class":159,"line":204},[21663],{"type":20,"tag":157,"props":21664,"children":21665},{},[21666],{"type":25,"value":21667},"    \u003C!--fetchType：在开启了延迟加载的环境中，该属性可以设置当前的分布查询是否使用延迟加载-->\n",{"type":20,"tag":157,"props":21669,"children":21670},{"class":159,"line":213},[21671],{"type":20,"tag":157,"props":21672,"children":21673},{},[21674],{"type":25,"value":21675},"    \u003C!--fetchType=\"eager(立即加载)|lazy(延迟加载)\"-->\n",{"type":20,"tag":157,"props":21677,"children":21678},{"class":159,"line":222},[21679],{"type":20,"tag":157,"props":21680,"children":21681},{},[21682],{"type":25,"value":17278},{"type":20,"tag":157,"props":21684,"children":21685},{"class":159,"line":440},[21686],{"type":20,"tag":157,"props":21687,"children":21688},{},[21689],{"type":25,"value":21223},{"type":20,"tag":157,"props":21691,"children":21692},{"class":159,"line":448},[21693],{"type":20,"tag":157,"props":21694,"children":21695},{},[21696],{"type":25,"value":21697},"            fetchType=\"eager\"\n",{"type":20,"tag":157,"props":21699,"children":21700},{"class":159,"line":456},[21701],{"type":20,"tag":157,"props":21702,"children":21703},{},[21704],{"type":25,"value":21231},{"type":20,"tag":157,"props":21706,"children":21707},{"class":159,"line":465},[21708],{"type":20,"tag":157,"props":21709,"children":21710},{},[21711],{"type":25,"value":21239},{"type":20,"tag":157,"props":21713,"children":21714},{"class":159,"line":474},[21715],{"type":20,"tag":157,"props":21716,"children":21717},{},[21718],{"type":25,"value":21247},{"type":20,"tag":157,"props":21720,"children":21721},{"class":159,"line":483},[21722],{"type":20,"tag":157,"props":21723,"children":21724},{},[21725],{"type":25,"value":21255},{"type":20,"tag":157,"props":21727,"children":21728},{"class":159,"line":491},[21729],{"type":20,"tag":157,"props":21730,"children":21731},{},[21732],{"type":25,"value":21014},{"type":20,"tag":157,"props":21734,"children":21735},{"class":159,"line":499},[21736],{"type":20,"tag":157,"props":21737,"children":21738},{},[21739],{"type":25,"value":20626},{"type":20,"tag":11085,"props":21741,"children":21743},{"id":21742},"_73-一对多映射关系",[21744],{"type":25,"value":21745},"7.3 一对多映射关系",{"type":20,"tag":6665,"props":21747,"children":21748},{},[21749,21754],{"type":20,"tag":21,"props":21750,"children":21751},{},[21752],{"type":25,"value":21753},"一个实体类属性对应多个sql字段",{"type":20,"tag":21,"props":21755,"children":21756},{},[21757],{"type":25,"value":21758},"一个部门对应多个员工",{"type":20,"tag":18942,"props":21760,"children":21762},{"id":21761},"_731-collection",[21763],{"type":25,"value":21764},"7.3.1 collection",{"type":20,"tag":21,"props":21766,"children":21767},{},[21768],{"type":20,"tag":33,"props":21769,"children":21770},{},[21771],{"type":25,"value":20392},{"type":20,"tag":126,"props":21773,"children":21775},{"className":16050,"code":21774,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据部门id查询部门与员工信息，一个部门可以有多个员工\n *\u002F\nDept getDeptAndEmpByDeptId(@Param(\"deptId\") int deptId);\n",[21776],{"type":20,"tag":84,"props":21777,"children":21778},{"__ignoreMap":8},[21779,21786,21794,21801],{"type":20,"tag":157,"props":21780,"children":21781},{"class":159,"line":160},[21782],{"type":20,"tag":157,"props":21783,"children":21784},{},[21785],{"type":25,"value":18203},{"type":20,"tag":157,"props":21787,"children":21788},{"class":159,"line":169},[21789],{"type":20,"tag":157,"props":21790,"children":21791},{},[21792],{"type":25,"value":21793}," * 根据部门id查询部门与员工信息，一个部门可以有多个员工\n",{"type":20,"tag":157,"props":21795,"children":21796},{"class":159,"line":179},[21797],{"type":20,"tag":157,"props":21798,"children":21799},{},[21800],{"type":25,"value":18243},{"type":20,"tag":157,"props":21802,"children":21803},{"class":159,"line":188},[21804],{"type":20,"tag":157,"props":21805,"children":21806},{},[21807],{"type":25,"value":21808},"Dept getDeptAndEmpByDeptId(@Param(\"deptId\") int deptId);\n",{"type":20,"tag":21,"props":21810,"children":21811},{},[21812],{"type":20,"tag":33,"props":21813,"children":21814},{},[21815],{"type":25,"value":18057},{"type":20,"tag":126,"props":21817,"children":21819},{"className":17052,"code":21818,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"deptAndEmpByDeptIdResultMap\" type=\"dept\">\n    \u003Cid column=\"dept_id\" property=\"deptId\"\u002F>\n    \u003Cresult column=\"dept_name\" property=\"deptName\"\u002F>\n    \u003Ccollection property=\"empList\" ofType=\"emp\">\n        \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n        \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n        \u003Cresult column=\"age\" property=\"age\"\u002F>\n        \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n    \u003C\u002Fcollection>\n\u003C\u002FresultMap>\n\u003C!--Dept getDeptAndEmpByDeptId(@Param(\"deptId\") int deptId);-->\n\u003Cselect id=\"getDeptAndEmpByDeptId\" resultMap=\"deptAndEmpByDeptIdResultMap\">\n    select *\n    from t_dept\n             left join t_emp on t_emp.dept_id = t_dept.dept_id\n    where t_dept.dept_id = #{deptId}\n\u003C\u002Fselect>\n",[21820],{"type":20,"tag":84,"props":21821,"children":21822},{"__ignoreMap":8},[21823,21831,21839,21847,21855,21863,21871,21879,21887,21895,21902,21910,21918,21926,21934,21942,21950],{"type":20,"tag":157,"props":21824,"children":21825},{"class":159,"line":160},[21826],{"type":20,"tag":157,"props":21827,"children":21828},{},[21829],{"type":25,"value":21830},"\u003CresultMap id=\"deptAndEmpByDeptIdResultMap\" type=\"dept\">\n",{"type":20,"tag":157,"props":21832,"children":21833},{"class":159,"line":169},[21834],{"type":20,"tag":157,"props":21835,"children":21836},{},[21837],{"type":25,"value":21838},"    \u003Cid column=\"dept_id\" property=\"deptId\"\u002F>\n",{"type":20,"tag":157,"props":21840,"children":21841},{"class":159,"line":179},[21842],{"type":20,"tag":157,"props":21843,"children":21844},{},[21845],{"type":25,"value":21846},"    \u003Cresult column=\"dept_name\" property=\"deptName\"\u002F>\n",{"type":20,"tag":157,"props":21848,"children":21849},{"class":159,"line":188},[21850],{"type":20,"tag":157,"props":21851,"children":21852},{},[21853],{"type":25,"value":21854},"    \u003Ccollection property=\"empList\" ofType=\"emp\">\n",{"type":20,"tag":157,"props":21856,"children":21857},{"class":159,"line":196},[21858],{"type":20,"tag":157,"props":21859,"children":21860},{},[21861],{"type":25,"value":21862},"        \u003Cid column=\"emp_id\" property=\"empId\"\u002F>\n",{"type":20,"tag":157,"props":21864,"children":21865},{"class":159,"line":204},[21866],{"type":20,"tag":157,"props":21867,"children":21868},{},[21869],{"type":25,"value":21870},"        \u003Cresult column=\"emp_name\" property=\"empName\"\u002F>\n",{"type":20,"tag":157,"props":21872,"children":21873},{"class":159,"line":213},[21874],{"type":20,"tag":157,"props":21875,"children":21876},{},[21877],{"type":25,"value":21878},"        \u003Cresult column=\"age\" property=\"age\"\u002F>\n",{"type":20,"tag":157,"props":21880,"children":21881},{"class":159,"line":222},[21882],{"type":20,"tag":157,"props":21883,"children":21884},{},[21885],{"type":25,"value":21886},"        \u003Cresult column=\"gender\" property=\"gender\"\u002F>\n",{"type":20,"tag":157,"props":21888,"children":21889},{"class":159,"line":440},[21890],{"type":20,"tag":157,"props":21891,"children":21892},{},[21893],{"type":25,"value":21894},"    \u003C\u002Fcollection>\n",{"type":20,"tag":157,"props":21896,"children":21897},{"class":159,"line":448},[21898],{"type":20,"tag":157,"props":21899,"children":21900},{},[21901],{"type":25,"value":20626},{"type":20,"tag":157,"props":21903,"children":21904},{"class":159,"line":456},[21905],{"type":20,"tag":157,"props":21906,"children":21907},{},[21908],{"type":25,"value":21909},"\u003C!--Dept getDeptAndEmpByDeptId(@Param(\"deptId\") int deptId);-->\n",{"type":20,"tag":157,"props":21911,"children":21912},{"class":159,"line":465},[21913],{"type":20,"tag":157,"props":21914,"children":21915},{},[21916],{"type":25,"value":21917},"\u003Cselect id=\"getDeptAndEmpByDeptId\" resultMap=\"deptAndEmpByDeptIdResultMap\">\n",{"type":20,"tag":157,"props":21919,"children":21920},{"class":159,"line":474},[21921],{"type":20,"tag":157,"props":21922,"children":21923},{},[21924],{"type":25,"value":21925},"    select *\n",{"type":20,"tag":157,"props":21927,"children":21928},{"class":159,"line":483},[21929],{"type":20,"tag":157,"props":21930,"children":21931},{},[21932],{"type":25,"value":21933},"    from t_dept\n",{"type":20,"tag":157,"props":21935,"children":21936},{"class":159,"line":491},[21937],{"type":20,"tag":157,"props":21938,"children":21939},{},[21940],{"type":25,"value":21941},"             left join t_emp on t_emp.dept_id = t_dept.dept_id\n",{"type":20,"tag":157,"props":21943,"children":21944},{"class":159,"line":499},[21945],{"type":20,"tag":157,"props":21946,"children":21947},{},[21948],{"type":25,"value":21949},"    where t_dept.dept_id = #{deptId}\n",{"type":20,"tag":157,"props":21951,"children":21952},{"class":159,"line":508},[21953],{"type":20,"tag":157,"props":21954,"children":21955},{},[21956],{"type":25,"value":17794},{"type":20,"tag":21,"props":21958,"children":21959},{},[21960],{"type":20,"tag":33,"props":21961,"children":21962},{},[21963],{"type":25,"value":17963},{"type":20,"tag":126,"props":21965,"children":21967},{"className":16050,"code":21966,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据部门id查询部门信息以及部门中的公园\n *\u002F\n@Test\npublic void testGetDeptAndEmpByDeptId() {\n  \n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);\n    Dept deptAndEmpByDeptId = mapper.getDeptAndEmpByDeptId(1);\n    System.out.println(deptAndEmpByDeptId);\n\n}\n",[21968],{"type":20,"tag":84,"props":21969,"children":21970},{"__ignoreMap":8},[21971,21978,21986,21993,22000,22008,22015,22022,22030,22038,22046,22053],{"type":20,"tag":157,"props":21972,"children":21973},{"class":159,"line":160},[21974],{"type":20,"tag":157,"props":21975,"children":21976},{},[21977],{"type":25,"value":18203},{"type":20,"tag":157,"props":21979,"children":21980},{"class":159,"line":169},[21981],{"type":20,"tag":157,"props":21982,"children":21983},{},[21984],{"type":25,"value":21985}," * 根据部门id查询部门信息以及部门中的公园\n",{"type":20,"tag":157,"props":21987,"children":21988},{"class":159,"line":179},[21989],{"type":20,"tag":157,"props":21990,"children":21991},{},[21992],{"type":25,"value":18243},{"type":20,"tag":157,"props":21994,"children":21995},{"class":159,"line":188},[21996],{"type":20,"tag":157,"props":21997,"children":21998},{},[21999],{"type":25,"value":17978},{"type":20,"tag":157,"props":22001,"children":22002},{"class":159,"line":196},[22003],{"type":20,"tag":157,"props":22004,"children":22005},{},[22006],{"type":25,"value":22007},"public void testGetDeptAndEmpByDeptId() {\n",{"type":20,"tag":157,"props":22009,"children":22010},{"class":159,"line":204},[22011],{"type":20,"tag":157,"props":22012,"children":22013},{},[22014],{"type":25,"value":17278},{"type":20,"tag":157,"props":22016,"children":22017},{"class":159,"line":213},[22018],{"type":20,"tag":157,"props":22019,"children":22020},{},[22021],{"type":25,"value":17994},{"type":20,"tag":157,"props":22023,"children":22024},{"class":159,"line":222},[22025],{"type":20,"tag":157,"props":22026,"children":22027},{},[22028],{"type":25,"value":22029},"    DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);\n",{"type":20,"tag":157,"props":22031,"children":22032},{"class":159,"line":440},[22033],{"type":20,"tag":157,"props":22034,"children":22035},{},[22036],{"type":25,"value":22037},"    Dept deptAndEmpByDeptId = mapper.getDeptAndEmpByDeptId(1);\n",{"type":20,"tag":157,"props":22039,"children":22040},{"class":159,"line":448},[22041],{"type":20,"tag":157,"props":22042,"children":22043},{},[22044],{"type":25,"value":22045},"    System.out.println(deptAndEmpByDeptId);\n",{"type":20,"tag":157,"props":22047,"children":22048},{"class":159,"line":456},[22049],{"type":20,"tag":157,"props":22050,"children":22051},{"emptyLinePlaceholder":173},[22052],{"type":25,"value":176},{"type":20,"tag":157,"props":22054,"children":22055},{"class":159,"line":465},[22056],{"type":20,"tag":157,"props":22057,"children":22058},{},[22059],{"type":25,"value":943},{"type":20,"tag":18942,"props":22061,"children":22063},{"id":22062},"_732-分步查询",[22064],{"type":25,"value":22065},"7.3.2 分步查询",{"type":20,"tag":20294,"props":22067,"children":22069},{"id":22068},"第一步-1",[22070],{"type":25,"value":22071},"第一步：",{"type":20,"tag":21,"props":22073,"children":22074},{},[22075],{"type":20,"tag":33,"props":22076,"children":22077},{},[22078],{"type":25,"value":21321},{"type":20,"tag":126,"props":22080,"children":22082},{"className":16050,"code":22081,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据部门id查询部门信息与部门中员工信息，分步查询\n *\u002F\nDept getDeptAndEmpByStepOne(@Param(\"deptId\") int deptId);\n",[22083],{"type":20,"tag":84,"props":22084,"children":22085},{"__ignoreMap":8},[22086,22093,22101,22108],{"type":20,"tag":157,"props":22087,"children":22088},{"class":159,"line":160},[22089],{"type":20,"tag":157,"props":22090,"children":22091},{},[22092],{"type":25,"value":18203},{"type":20,"tag":157,"props":22094,"children":22095},{"class":159,"line":169},[22096],{"type":20,"tag":157,"props":22097,"children":22098},{},[22099],{"type":25,"value":22100}," * 根据部门id查询部门信息与部门中员工信息，分步查询\n",{"type":20,"tag":157,"props":22102,"children":22103},{"class":159,"line":179},[22104],{"type":20,"tag":157,"props":22105,"children":22106},{},[22107],{"type":25,"value":18243},{"type":20,"tag":157,"props":22109,"children":22110},{"class":159,"line":188},[22111],{"type":20,"tag":157,"props":22112,"children":22113},{},[22114],{"type":25,"value":22115},"Dept getDeptAndEmpByStepOne(@Param(\"deptId\") int deptId);\n",{"type":20,"tag":21,"props":22117,"children":22118},{},[22119],{"type":20,"tag":33,"props":22120,"children":22121},{},[22122],{"type":25,"value":21366},{"type":20,"tag":126,"props":22124,"children":22126},{"className":17052,"code":22125,"language":17054,"meta":8,"style":8},"\u003CresultMap id=\"DeptAndEmpByStepOneResultMap\" type=\"dept\">\n    \u003Cid column=\"dept_id\" property=\"deptId\"\u002F>\n    \u003Cresult column=\"dept_name\" property=\"deptName\"\u002F>\n    \u003Ccollection\n            property=\"empList\"\n            column=\"dept_id\"\n            select=\"com.wangkun.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo\"\n    \u002F>\n\u003C\u002FresultMap>\n\u003C!--Dept getDeptAndEmpByStepOne(@Param(\"deptId\") int deptId);-->\n\u003Cselect id=\"getDeptAndEmpByStepOne\" resultMap=\"DeptAndEmpByStepOneResultMap\">\n    select *\n    from t_dept\n    where dept_id = #{deptId}\n\u003C\u002Fselect>\n",[22127],{"type":20,"tag":84,"props":22128,"children":22129},{"__ignoreMap":8},[22130,22138,22145,22152,22160,22168,22175,22183,22191,22198,22206,22214,22221,22228,22236],{"type":20,"tag":157,"props":22131,"children":22132},{"class":159,"line":160},[22133],{"type":20,"tag":157,"props":22134,"children":22135},{},[22136],{"type":25,"value":22137},"\u003CresultMap id=\"DeptAndEmpByStepOneResultMap\" type=\"dept\">\n",{"type":20,"tag":157,"props":22139,"children":22140},{"class":159,"line":169},[22141],{"type":20,"tag":157,"props":22142,"children":22143},{},[22144],{"type":25,"value":21838},{"type":20,"tag":157,"props":22146,"children":22147},{"class":159,"line":179},[22148],{"type":20,"tag":157,"props":22149,"children":22150},{},[22151],{"type":25,"value":21846},{"type":20,"tag":157,"props":22153,"children":22154},{"class":159,"line":188},[22155],{"type":20,"tag":157,"props":22156,"children":22157},{},[22158],{"type":25,"value":22159},"    \u003Ccollection\n",{"type":20,"tag":157,"props":22161,"children":22162},{"class":159,"line":196},[22163],{"type":20,"tag":157,"props":22164,"children":22165},{},[22166],{"type":25,"value":22167},"            property=\"empList\"\n",{"type":20,"tag":157,"props":22169,"children":22170},{"class":159,"line":204},[22171],{"type":20,"tag":157,"props":22172,"children":22173},{},[22174],{"type":25,"value":21239},{"type":20,"tag":157,"props":22176,"children":22177},{"class":159,"line":213},[22178],{"type":20,"tag":157,"props":22179,"children":22180},{},[22181],{"type":25,"value":22182},"            select=\"com.wangkun.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo\"\n",{"type":20,"tag":157,"props":22184,"children":22185},{"class":159,"line":222},[22186],{"type":20,"tag":157,"props":22187,"children":22188},{},[22189],{"type":25,"value":22190},"    \u002F>\n",{"type":20,"tag":157,"props":22192,"children":22193},{"class":159,"line":440},[22194],{"type":20,"tag":157,"props":22195,"children":22196},{},[22197],{"type":25,"value":20626},{"type":20,"tag":157,"props":22199,"children":22200},{"class":159,"line":448},[22201],{"type":20,"tag":157,"props":22202,"children":22203},{},[22204],{"type":25,"value":22205},"\u003C!--Dept getDeptAndEmpByStepOne(@Param(\"deptId\") int deptId);-->\n",{"type":20,"tag":157,"props":22207,"children":22208},{"class":159,"line":456},[22209],{"type":20,"tag":157,"props":22210,"children":22211},{},[22212],{"type":25,"value":22213},"\u003Cselect id=\"getDeptAndEmpByStepOne\" resultMap=\"DeptAndEmpByStepOneResultMap\">\n",{"type":20,"tag":157,"props":22215,"children":22216},{"class":159,"line":465},[22217],{"type":20,"tag":157,"props":22218,"children":22219},{},[22220],{"type":25,"value":21925},{"type":20,"tag":157,"props":22222,"children":22223},{"class":159,"line":474},[22224],{"type":20,"tag":157,"props":22225,"children":22226},{},[22227],{"type":25,"value":21933},{"type":20,"tag":157,"props":22229,"children":22230},{"class":159,"line":483},[22231],{"type":20,"tag":157,"props":22232,"children":22233},{},[22234],{"type":25,"value":22235},"    where dept_id = #{deptId}\n",{"type":20,"tag":157,"props":22237,"children":22238},{"class":159,"line":491},[22239],{"type":20,"tag":157,"props":22240,"children":22241},{},[22242],{"type":25,"value":17794},{"type":20,"tag":20294,"props":22244,"children":22246},{"id":22245},"第二步-1",[22247],{"type":25,"value":22248},"第二步：",{"type":20,"tag":21,"props":22250,"children":22251},{},[22252],{"type":20,"tag":33,"props":22253,"children":22254},{},[22255],{"type":25,"value":21104},{"type":20,"tag":126,"props":22257,"children":22259},{"className":16050,"code":22258,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据dept_id查询部门信息与部门中员工的信息\n *\u002F\nList\u003CEmp> getDeptAndEmpByStepTwo(@Param(\"deptId\") int deptId);\n",[22260],{"type":20,"tag":84,"props":22261,"children":22262},{"__ignoreMap":8},[22263,22270,22278,22285],{"type":20,"tag":157,"props":22264,"children":22265},{"class":159,"line":160},[22266],{"type":20,"tag":157,"props":22267,"children":22268},{},[22269],{"type":25,"value":18203},{"type":20,"tag":157,"props":22271,"children":22272},{"class":159,"line":169},[22273],{"type":20,"tag":157,"props":22274,"children":22275},{},[22276],{"type":25,"value":22277}," * 根据dept_id查询部门信息与部门中员工的信息\n",{"type":20,"tag":157,"props":22279,"children":22280},{"class":159,"line":179},[22281],{"type":20,"tag":157,"props":22282,"children":22283},{},[22284],{"type":25,"value":18243},{"type":20,"tag":157,"props":22286,"children":22287},{"class":159,"line":188},[22288],{"type":20,"tag":157,"props":22289,"children":22290},{},[22291],{"type":25,"value":22292},"List\u003CEmp> getDeptAndEmpByStepTwo(@Param(\"deptId\") int deptId);\n",{"type":20,"tag":21,"props":22294,"children":22295},{},[22296],{"type":20,"tag":33,"props":22297,"children":22298},{},[22299],{"type":25,"value":22300},"映射文件（EmpMapper.xml）：",{"type":20,"tag":126,"props":22302,"children":22304},{"className":17052,"code":22303,"language":17054,"meta":8,"style":8},"\u003C!--List\u003CEmp> getDeptAndEmpByStepTwo(@Param(\"deptId\") int deptId);-->\n\u003Cselect id=\"getDeptAndEmpByStepTwo\" resultType=\"emp\">\n    select * from t_emp where dept_id = #{deptId}\n\u003C\u002Fselect>\n",[22305],{"type":20,"tag":84,"props":22306,"children":22307},{"__ignoreMap":8},[22308,22316,22324,22332],{"type":20,"tag":157,"props":22309,"children":22310},{"class":159,"line":160},[22311],{"type":20,"tag":157,"props":22312,"children":22313},{},[22314],{"type":25,"value":22315},"\u003C!--List\u003CEmp> getDeptAndEmpByStepTwo(@Param(\"deptId\") int deptId);-->\n",{"type":20,"tag":157,"props":22317,"children":22318},{"class":159,"line":169},[22319],{"type":20,"tag":157,"props":22320,"children":22321},{},[22322],{"type":25,"value":22323},"\u003Cselect id=\"getDeptAndEmpByStepTwo\" resultType=\"emp\">\n",{"type":20,"tag":157,"props":22325,"children":22326},{"class":159,"line":179},[22327],{"type":20,"tag":157,"props":22328,"children":22329},{},[22330],{"type":25,"value":22331},"    select * from t_emp where dept_id = #{deptId}\n",{"type":20,"tag":157,"props":22333,"children":22334},{"class":159,"line":188},[22335],{"type":20,"tag":157,"props":22336,"children":22337},{},[22338],{"type":25,"value":17794},{"type":20,"tag":21,"props":22340,"children":22341},{},[22342],{"type":20,"tag":33,"props":22343,"children":22344},{},[22345],{"type":25,"value":17963},{"type":20,"tag":126,"props":22347,"children":22349},{"className":16050,"code":22348,"language":16052,"meta":8,"style":8},"\u002F**\n * 根据部门id查询部门信息与员工信息，分步查询\n *\u002F\n@Test\npublic void testGetDeptAndEmpByStep(){\n    SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n    DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);\n    Dept deptAndEmpByStepOne = mapper.getDeptAndEmpByStepOne(1);\n    System.out.println(deptAndEmpByStepOne);\n}\n",[22350],{"type":20,"tag":84,"props":22351,"children":22352},{"__ignoreMap":8},[22353,22360,22368,22375,22382,22390,22397,22404,22412,22420],{"type":20,"tag":157,"props":22354,"children":22355},{"class":159,"line":160},[22356],{"type":20,"tag":157,"props":22357,"children":22358},{},[22359],{"type":25,"value":18203},{"type":20,"tag":157,"props":22361,"children":22362},{"class":159,"line":169},[22363],{"type":20,"tag":157,"props":22364,"children":22365},{},[22366],{"type":25,"value":22367}," * 根据部门id查询部门信息与员工信息，分步查询\n",{"type":20,"tag":157,"props":22369,"children":22370},{"class":159,"line":179},[22371],{"type":20,"tag":157,"props":22372,"children":22373},{},[22374],{"type":25,"value":18243},{"type":20,"tag":157,"props":22376,"children":22377},{"class":159,"line":188},[22378],{"type":20,"tag":157,"props":22379,"children":22380},{},[22381],{"type":25,"value":17978},{"type":20,"tag":157,"props":22383,"children":22384},{"class":159,"line":196},[22385],{"type":20,"tag":157,"props":22386,"children":22387},{},[22388],{"type":25,"value":22389},"public void testGetDeptAndEmpByStep(){\n",{"type":20,"tag":157,"props":22391,"children":22392},{"class":159,"line":204},[22393],{"type":20,"tag":157,"props":22394,"children":22395},{},[22396],{"type":25,"value":17994},{"type":20,"tag":157,"props":22398,"children":22399},{"class":159,"line":213},[22400],{"type":20,"tag":157,"props":22401,"children":22402},{},[22403],{"type":25,"value":22029},{"type":20,"tag":157,"props":22405,"children":22406},{"class":159,"line":222},[22407],{"type":20,"tag":157,"props":22408,"children":22409},{},[22410],{"type":25,"value":22411},"    Dept deptAndEmpByStepOne = mapper.getDeptAndEmpByStepOne(1);\n",{"type":20,"tag":157,"props":22413,"children":22414},{"class":159,"line":440},[22415],{"type":20,"tag":157,"props":22416,"children":22417},{},[22418],{"type":25,"value":22419},"    System.out.println(deptAndEmpByStepOne);\n",{"type":20,"tag":157,"props":22421,"children":22422},{"class":159,"line":448},[22423],{"type":20,"tag":157,"props":22424,"children":22425},{},[22426],{"type":25,"value":943},{"type":20,"tag":11085,"props":22428,"children":22430},{"id":22429},"_74-总结",[22431],{"type":25,"value":22432},"7.4 总结",{"type":20,"tag":44,"props":22434,"children":22435},{},[22436,22441,22446],{"type":20,"tag":48,"props":22437,"children":22438},{},[22439],{"type":25,"value":22440},"对一 对应对象，对多 对应集合",{"type":20,"tag":48,"props":22442,"children":22443},{},[22444],{"type":25,"value":22445},"二次查询结果为对象，用association",{"type":20,"tag":48,"props":22447,"children":22448},{},[22449],{"type":25,"value":22450},"二次查询结果为集合，用collection",{"type":20,"tag":28,"props":22452,"children":22454},{"id":22453},"_8-动态sql",[22455],{"type":25,"value":22456},"8 动态SQL",{"type":20,"tag":6665,"props":22458,"children":22459},{},[22460],{"type":20,"tag":21,"props":22461,"children":22462},{},[22463],{"type":25,"value":22464},"MyBatis框架的动态SQl技术是一种根据特定条件动态拼接SQL语句的功能，他存在的意义是为了解决拼接SQL语句字符串时的痛点问题",{"type":20,"tag":11085,"props":22466,"children":22468},{"id":22467},"_81-if-标签",[22469],{"type":25,"value":22470},"8.1 if 标签",{"type":20,"tag":6665,"props":22472,"children":22473},{},[22474],{"type":20,"tag":21,"props":22475,"children":22476},{},[22477],{"type":25,"value":22478},"根据test属性判断是否将if标签内部的sql语句进行拼接",{"type":20,"tag":126,"props":22480,"children":22482},{"className":17052,"code":22481,"language":17054,"meta":8,"style":8},"\u003C!--List\u003CEmp> getEmpByCondition(Emp emp);-->\n\u003Cselect id=\"getEmpByCondition\" resultType=\"emp\">\n    select * from t_emp where \n    \u003Cif test=\"empName != null and empName != ''\">\n        emp_name = #{empName}\n    \u003C\u002Fif>\n    \u003Cif test=\"age != null and age != ''\">\n        and age = #{age}\n    \u003C\u002Fif>\n    \u003Cif test=\"gender != null and gender != ''\">\n        and gender = #{gender}\n    \u003C\u002Fif>\n\u003C\u002Fselect>\n",[22483],{"type":20,"tag":84,"props":22484,"children":22485},{"__ignoreMap":8},[22486,22494,22502,22510,22518,22526,22534,22542,22550,22557,22565,22573,22580],{"type":20,"tag":157,"props":22487,"children":22488},{"class":159,"line":160},[22489],{"type":20,"tag":157,"props":22490,"children":22491},{},[22492],{"type":25,"value":22493},"\u003C!--List\u003CEmp> getEmpByCondition(Emp emp);-->\n",{"type":20,"tag":157,"props":22495,"children":22496},{"class":159,"line":169},[22497],{"type":20,"tag":157,"props":22498,"children":22499},{},[22500],{"type":25,"value":22501},"\u003Cselect id=\"getEmpByCondition\" resultType=\"emp\">\n",{"type":20,"tag":157,"props":22503,"children":22504},{"class":159,"line":179},[22505],{"type":20,"tag":157,"props":22506,"children":22507},{},[22508],{"type":25,"value":22509},"    select * from t_emp where \n",{"type":20,"tag":157,"props":22511,"children":22512},{"class":159,"line":188},[22513],{"type":20,"tag":157,"props":22514,"children":22515},{},[22516],{"type":25,"value":22517},"    \u003Cif test=\"empName != null and empName != ''\">\n",{"type":20,"tag":157,"props":22519,"children":22520},{"class":159,"line":196},[22521],{"type":20,"tag":157,"props":22522,"children":22523},{},[22524],{"type":25,"value":22525},"        emp_name = #{empName}\n",{"type":20,"tag":157,"props":22527,"children":22528},{"class":159,"line":204},[22529],{"type":20,"tag":157,"props":22530,"children":22531},{},[22532],{"type":25,"value":22533},"    \u003C\u002Fif>\n",{"type":20,"tag":157,"props":22535,"children":22536},{"class":159,"line":213},[22537],{"type":20,"tag":157,"props":22538,"children":22539},{},[22540],{"type":25,"value":22541},"    \u003Cif test=\"age != null and age != ''\">\n",{"type":20,"tag":157,"props":22543,"children":22544},{"class":159,"line":222},[22545],{"type":20,"tag":157,"props":22546,"children":22547},{},[22548],{"type":25,"value":22549},"        and age = #{age}\n",{"type":20,"tag":157,"props":22551,"children":22552},{"class":159,"line":440},[22553],{"type":20,"tag":157,"props":22554,"children":22555},{},[22556],{"type":25,"value":22533},{"type":20,"tag":157,"props":22558,"children":22559},{"class":159,"line":448},[22560],{"type":20,"tag":157,"props":22561,"children":22562},{},[22563],{"type":25,"value":22564},"    \u003Cif test=\"gender != null and gender != ''\">\n",{"type":20,"tag":157,"props":22566,"children":22567},{"class":159,"line":456},[22568],{"type":20,"tag":157,"props":22569,"children":22570},{},[22571],{"type":25,"value":22572},"        and gender = #{gender}\n",{"type":20,"tag":157,"props":22574,"children":22575},{"class":159,"line":465},[22576],{"type":20,"tag":157,"props":22577,"children":22578},{},[22579],{"type":25,"value":22533},{"type":20,"tag":157,"props":22581,"children":22582},{"class":159,"line":474},[22583],{"type":20,"tag":157,"props":22584,"children":22585},{},[22586],{"type":25,"value":17794},{"type":20,"tag":11085,"props":22588,"children":22590},{"id":22589},"_82-where标签",[22591],{"type":25,"value":22592},"8.2 where标签",{"type":20,"tag":6665,"props":22594,"children":22595},{},[22596],{"type":20,"tag":5719,"props":22597,"children":22598},{},[22599,22604,22609],{"type":20,"tag":48,"props":22600,"children":22601},{},[22602],{"type":25,"value":22603},"若where标签中有成立的条件，则自动生成where关键字",{"type":20,"tag":48,"props":22605,"children":22606},{},[22607],{"type":25,"value":22608},"会自动将where标签中多余的and去掉",{"type":20,"tag":48,"props":22610,"children":22611},{},[22612],{"type":25,"value":22613},"若where标签中没有任何一个条件成立，则会自动删除where关键字",{"type":20,"tag":126,"props":22615,"children":22617},{"className":17052,"code":22616,"language":17054,"meta":8,"style":8},"\u003C!--List\u003CEmp> getEmpByCondition(Emp emp);-->\n\u003Cselect id=\"getEmpByCondition\" resultType=\"emp\">\n    select * from t_emp\n    \u003Cwhere>\n        \u003Cif test=\"empName != null and empName != ''\">\n            emp_name = #{empName}\n        \u003C\u002Fif>\n        \u003Cif test=\"age != null and age != ''\">\n            and age = #{age}\n        \u003C\u002Fif>\n        \u003Cif test=\"gender != null and gender != ''\">\n            and gender = #{gender}\n        \u003C\u002Fif>\n    \u003C\u002Fwhere>\n\u003C\u002Fselect>\n",[22618],{"type":20,"tag":84,"props":22619,"children":22620},{"__ignoreMap":8},[22621,22628,22635,22643,22651,22659,22667,22675,22683,22691,22698,22706,22714,22721,22729],{"type":20,"tag":157,"props":22622,"children":22623},{"class":159,"line":160},[22624],{"type":20,"tag":157,"props":22625,"children":22626},{},[22627],{"type":25,"value":22493},{"type":20,"tag":157,"props":22629,"children":22630},{"class":159,"line":169},[22631],{"type":20,"tag":157,"props":22632,"children":22633},{},[22634],{"type":25,"value":22501},{"type":20,"tag":157,"props":22636,"children":22637},{"class":159,"line":179},[22638],{"type":20,"tag":157,"props":22639,"children":22640},{},[22641],{"type":25,"value":22642},"    select * from t_emp\n",{"type":20,"tag":157,"props":22644,"children":22645},{"class":159,"line":188},[22646],{"type":20,"tag":157,"props":22647,"children":22648},{},[22649],{"type":25,"value":22650},"    \u003Cwhere>\n",{"type":20,"tag":157,"props":22652,"children":22653},{"class":159,"line":196},[22654],{"type":20,"tag":157,"props":22655,"children":22656},{},[22657],{"type":25,"value":22658},"        \u003Cif test=\"empName != null and empName != ''\">\n",{"type":20,"tag":157,"props":22660,"children":22661},{"class":159,"line":204},[22662],{"type":20,"tag":157,"props":22663,"children":22664},{},[22665],{"type":25,"value":22666},"            emp_name = #{empName}\n",{"type":20,"tag":157,"props":22668,"children":22669},{"class":159,"line":213},[22670],{"type":20,"tag":157,"props":22671,"children":22672},{},[22673],{"type":25,"value":22674},"        \u003C\u002Fif>\n",{"type":20,"tag":157,"props":22676,"children":22677},{"class":159,"line":222},[22678],{"type":20,"tag":157,"props":22679,"children":22680},{},[22681],{"type":25,"value":22682},"        \u003Cif test=\"age != null and age != ''\">\n",{"type":20,"tag":157,"props":22684,"children":22685},{"class":159,"line":440},[22686],{"type":20,"tag":157,"props":22687,"children":22688},{},[22689],{"type":25,"value":22690},"            and age = #{age}\n",{"type":20,"tag":157,"props":22692,"children":22693},{"class":159,"line":448},[22694],{"type":20,"tag":157,"props":22695,"children":22696},{},[22697],{"type":25,"value":22674},{"type":20,"tag":157,"props":22699,"children":22700},{"class":159,"line":456},[22701],{"type":20,"tag":157,"props":22702,"children":22703},{},[22704],{"type":25,"value":22705},"        \u003Cif test=\"gender != null and gender != ''\">\n",{"type":20,"tag":157,"props":22707,"children":22708},{"class":159,"line":465},[22709],{"type":20,"tag":157,"props":22710,"children":22711},{},[22712],{"type":25,"value":22713},"            and gender = #{gender}\n",{"type":20,"tag":157,"props":22715,"children":22716},{"class":159,"line":474},[22717],{"type":20,"tag":157,"props":22718,"children":22719},{},[22720],{"type":25,"value":22674},{"type":20,"tag":157,"props":22722,"children":22723},{"class":159,"line":483},[22724],{"type":20,"tag":157,"props":22725,"children":22726},{},[22727],{"type":25,"value":22728},"    \u003C\u002Fwhere>\n",{"type":20,"tag":157,"props":22730,"children":22731},{"class":159,"line":491},[22732],{"type":20,"tag":157,"props":22733,"children":22734},{},[22735],{"type":25,"value":17794},{"type":20,"tag":11085,"props":22737,"children":22739},{"id":22738},"_83-trim标签",[22740],{"type":25,"value":22741},"8.3  trim标签",{"type":20,"tag":6665,"props":22743,"children":22744},{},[22745],{"type":20,"tag":5719,"props":22746,"children":22747},{},[22748,22753],{"type":20,"tag":48,"props":22749,"children":22750},{},[22751],{"type":25,"value":22752},"prefix、suffix：在标签前面或后面添加指定内容",{"type":20,"tag":48,"props":22754,"children":22755},{},[22756],{"type":25,"value":22757},"prefixOverrides、suffixOverrides：在标签中内容前面或后面去掉指定内容",{"type":20,"tag":126,"props":22759,"children":22761},{"className":17052,"code":22760,"language":17054,"meta":8,"style":8},"\u003C!--List\u003CEmp> getEmpByCondition(Emp emp);-->\n\u003Cselect id=\"getEmpByCondition\" resultType=\"emp\">\n    select * from t_emp\n    \u003Ctrim prefix=\"where\" suffixOverrides=\"and\">\n        \u003Cif test=\"empName != null and empName != ''\">\n            emp_name = #{empName} and\n        \u003C\u002Fif>\n        \u003Cif test=\"age != null and age != ''\">\n            age = #{age} and\n        \u003C\u002Fif>\n        \u003Cif test=\"gender != null and gender != ''\">\n            gender = #{gender}\n        \u003C\u002Fif>\n    \u003C\u002Ftrim>\n\u003C\u002Fselect>\n",[22762],{"type":20,"tag":84,"props":22763,"children":22764},{"__ignoreMap":8},[22765,22772,22779,22786,22794,22801,22809,22816,22823,22831,22838,22845,22853,22860,22868],{"type":20,"tag":157,"props":22766,"children":22767},{"class":159,"line":160},[22768],{"type":20,"tag":157,"props":22769,"children":22770},{},[22771],{"type":25,"value":22493},{"type":20,"tag":157,"props":22773,"children":22774},{"class":159,"line":169},[22775],{"type":20,"tag":157,"props":22776,"children":22777},{},[22778],{"type":25,"value":22501},{"type":20,"tag":157,"props":22780,"children":22781},{"class":159,"line":179},[22782],{"type":20,"tag":157,"props":22783,"children":22784},{},[22785],{"type":25,"value":22642},{"type":20,"tag":157,"props":22787,"children":22788},{"class":159,"line":188},[22789],{"type":20,"tag":157,"props":22790,"children":22791},{},[22792],{"type":25,"value":22793},"    \u003Ctrim prefix=\"where\" suffixOverrides=\"and\">\n",{"type":20,"tag":157,"props":22795,"children":22796},{"class":159,"line":196},[22797],{"type":20,"tag":157,"props":22798,"children":22799},{},[22800],{"type":25,"value":22658},{"type":20,"tag":157,"props":22802,"children":22803},{"class":159,"line":204},[22804],{"type":20,"tag":157,"props":22805,"children":22806},{},[22807],{"type":25,"value":22808},"            emp_name = #{empName} and\n",{"type":20,"tag":157,"props":22810,"children":22811},{"class":159,"line":213},[22812],{"type":20,"tag":157,"props":22813,"children":22814},{},[22815],{"type":25,"value":22674},{"type":20,"tag":157,"props":22817,"children":22818},{"class":159,"line":222},[22819],{"type":20,"tag":157,"props":22820,"children":22821},{},[22822],{"type":25,"value":22682},{"type":20,"tag":157,"props":22824,"children":22825},{"class":159,"line":440},[22826],{"type":20,"tag":157,"props":22827,"children":22828},{},[22829],{"type":25,"value":22830},"            age = #{age} and\n",{"type":20,"tag":157,"props":22832,"children":22833},{"class":159,"line":448},[22834],{"type":20,"tag":157,"props":22835,"children":22836},{},[22837],{"type":25,"value":22674},{"type":20,"tag":157,"props":22839,"children":22840},{"class":159,"line":456},[22841],{"type":20,"tag":157,"props":22842,"children":22843},{},[22844],{"type":25,"value":22705},{"type":20,"tag":157,"props":22846,"children":22847},{"class":159,"line":465},[22848],{"type":20,"tag":157,"props":22849,"children":22850},{},[22851],{"type":25,"value":22852},"            gender = #{gender}\n",{"type":20,"tag":157,"props":22854,"children":22855},{"class":159,"line":474},[22856],{"type":20,"tag":157,"props":22857,"children":22858},{},[22859],{"type":25,"value":22674},{"type":20,"tag":157,"props":22861,"children":22862},{"class":159,"line":483},[22863],{"type":20,"tag":157,"props":22864,"children":22865},{},[22866],{"type":25,"value":22867},"    \u003C\u002Ftrim>\n",{"type":20,"tag":157,"props":22869,"children":22870},{"class":159,"line":491},[22871],{"type":20,"tag":157,"props":22872,"children":22873},{},[22874],{"type":25,"value":17794},{"type":20,"tag":11085,"props":22876,"children":22878},{"id":22877},"_84-choose-when-otherwise",[22879],{"type":25,"value":22880},"8.4  choose when otherwise",{"type":20,"tag":6665,"props":22882,"children":22883},{},[22884,22889],{"type":20,"tag":21,"props":22885,"children":22886},{},[22887],{"type":25,"value":22888},"相当于if else if",{"type":20,"tag":21,"props":22890,"children":22891},{},[22892],{"type":25,"value":22893},"前面一旦有条件通过了，后面就不会继续执行拼接了",{"type":20,"tag":126,"props":22895,"children":22897},{"className":17052,"code":22896,"language":17054,"meta":8,"style":8},"\u003C!--List\u003CEmp> getEmpByChoose(Emp emp);-->\n\u003Cselect id=\"getEmpByChoose\" resultType=\"emp\">\n    select * from t_emp\n    \u003Cwhere>\n        \u003Cchoose>\n            \u003Cwhen test=\"empName != null and empName != ''\">\n                emp_name = #{empName}\n            \u003C\u002Fwhen>\n            \u003Cwhen test=\"age != null and age != ''\">\n                age = #{age}\n            \u003C\u002Fwhen>\n            \u003Cwhen test=\"gender != null and gender != ''\">\n                gender = #{gender}\n            \u003C\u002Fwhen>\n        \u003C\u002Fchoose>\n    \u003C\u002Fwhere>\n\u003C\u002Fselect>\n",[22898],{"type":20,"tag":84,"props":22899,"children":22900},{"__ignoreMap":8},[22901,22909,22917,22924,22931,22939,22947,22955,22963,22971,22979,22986,22994,23002,23009,23017,23024],{"type":20,"tag":157,"props":22902,"children":22903},{"class":159,"line":160},[22904],{"type":20,"tag":157,"props":22905,"children":22906},{},[22907],{"type":25,"value":22908},"\u003C!--List\u003CEmp> getEmpByChoose(Emp emp);-->\n",{"type":20,"tag":157,"props":22910,"children":22911},{"class":159,"line":169},[22912],{"type":20,"tag":157,"props":22913,"children":22914},{},[22915],{"type":25,"value":22916},"\u003Cselect id=\"getEmpByChoose\" resultType=\"emp\">\n",{"type":20,"tag":157,"props":22918,"children":22919},{"class":159,"line":179},[22920],{"type":20,"tag":157,"props":22921,"children":22922},{},[22923],{"type":25,"value":22642},{"type":20,"tag":157,"props":22925,"children":22926},{"class":159,"line":188},[22927],{"type":20,"tag":157,"props":22928,"children":22929},{},[22930],{"type":25,"value":22650},{"type":20,"tag":157,"props":22932,"children":22933},{"class":159,"line":196},[22934],{"type":20,"tag":157,"props":22935,"children":22936},{},[22937],{"type":25,"value":22938},"        \u003Cchoose>\n",{"type":20,"tag":157,"props":22940,"children":22941},{"class":159,"line":204},[22942],{"type":20,"tag":157,"props":22943,"children":22944},{},[22945],{"type":25,"value":22946},"            \u003Cwhen test=\"empName != null and empName != ''\">\n",{"type":20,"tag":157,"props":22948,"children":22949},{"class":159,"line":213},[22950],{"type":20,"tag":157,"props":22951,"children":22952},{},[22953],{"type":25,"value":22954},"                emp_name = #{empName}\n",{"type":20,"tag":157,"props":22956,"children":22957},{"class":159,"line":222},[22958],{"type":20,"tag":157,"props":22959,"children":22960},{},[22961],{"type":25,"value":22962},"            \u003C\u002Fwhen>\n",{"type":20,"tag":157,"props":22964,"children":22965},{"class":159,"line":440},[22966],{"type":20,"tag":157,"props":22967,"children":22968},{},[22969],{"type":25,"value":22970},"            \u003Cwhen test=\"age != null and age != ''\">\n",{"type":20,"tag":157,"props":22972,"children":22973},{"class":159,"line":448},[22974],{"type":20,"tag":157,"props":22975,"children":22976},{},[22977],{"type":25,"value":22978},"                age = #{age}\n",{"type":20,"tag":157,"props":22980,"children":22981},{"class":159,"line":456},[22982],{"type":20,"tag":157,"props":22983,"children":22984},{},[22985],{"type":25,"value":22962},{"type":20,"tag":157,"props":22987,"children":22988},{"class":159,"line":465},[22989],{"type":20,"tag":157,"props":22990,"children":22991},{},[22992],{"type":25,"value":22993},"            \u003Cwhen test=\"gender != null and gender != ''\">\n",{"type":20,"tag":157,"props":22995,"children":22996},{"class":159,"line":474},[22997],{"type":20,"tag":157,"props":22998,"children":22999},{},[23000],{"type":25,"value":23001},"                gender = #{gender}\n",{"type":20,"tag":157,"props":23003,"children":23004},{"class":159,"line":483},[23005],{"type":20,"tag":157,"props":23006,"children":23007},{},[23008],{"type":25,"value":22962},{"type":20,"tag":157,"props":23010,"children":23011},{"class":159,"line":491},[23012],{"type":20,"tag":157,"props":23013,"children":23014},{},[23015],{"type":25,"value":23016},"        \u003C\u002Fchoose>\n",{"type":20,"tag":157,"props":23018,"children":23019},{"class":159,"line":499},[23020],{"type":20,"tag":157,"props":23021,"children":23022},{},[23023],{"type":25,"value":22728},{"type":20,"tag":157,"props":23025,"children":23026},{"class":159,"line":508},[23027],{"type":20,"tag":157,"props":23028,"children":23029},{},[23030],{"type":25,"value":17794},{"type":20,"tag":11085,"props":23032,"children":23034},{"id":23033},"_85-foreach标签",[23035],{"type":25,"value":23036},"8.5 foreach标签",{"type":20,"tag":6665,"props":23038,"children":23039},{},[23040,23045,23050,23055,23060],{"type":20,"tag":21,"props":23041,"children":23042},{},[23043],{"type":25,"value":23044},"collection：设置要循环的数组或集合",{"type":20,"tag":21,"props":23046,"children":23047},{},[23048],{"type":25,"value":23049},"item：用一个字符串表示数组或集合中的每一个数据",{"type":20,"tag":21,"props":23051,"children":23052},{},[23053],{"type":25,"value":23054},"separator：设置每次循环的数据之间的分隔符",{"type":20,"tag":21,"props":23056,"children":23057},{},[23058],{"type":25,"value":23059},"open：循环的内容以什么开始",{"type":20,"tag":21,"props":23061,"children":23062},{},[23063],{"type":25,"value":23064},"close：循环的内容以什么结束",{"type":20,"tag":18942,"props":23066,"children":23068},{"id":23067},"新增多个员工信息",[23069],{"type":25,"value":23067},{"type":20,"tag":21,"props":23071,"children":23072},{},[23073],{"type":20,"tag":33,"props":23074,"children":23075},{},[23076],{"type":25,"value":18057},{"type":20,"tag":126,"props":23078,"children":23080},{"className":17052,"code":23079,"language":17054,"meta":8,"style":8},"\u003C!--void insertManyEmp(@Param(\"emps\") List\u003CEmp> emps);-->\n\u003Cinsert id=\"insertManyEmp\">\n    insert into t_emp values\n    \u003Cforeach collection=\"emps\" item=\"emp\" separator=\",\">\n        (null, #{emp.empName}, #{emp.age}, #{emp.gender}, null)\n    \u003C\u002Fforeach>\n\u003C\u002Finsert>\n",[23081],{"type":20,"tag":84,"props":23082,"children":23083},{"__ignoreMap":8},[23084,23092,23100,23108,23116,23124,23132],{"type":20,"tag":157,"props":23085,"children":23086},{"class":159,"line":160},[23087],{"type":20,"tag":157,"props":23088,"children":23089},{},[23090],{"type":25,"value":23091},"\u003C!--void insertManyEmp(@Param(\"emps\") List\u003CEmp> emps);-->\n",{"type":20,"tag":157,"props":23093,"children":23094},{"class":159,"line":169},[23095],{"type":20,"tag":157,"props":23096,"children":23097},{},[23098],{"type":25,"value":23099},"\u003Cinsert id=\"insertManyEmp\">\n",{"type":20,"tag":157,"props":23101,"children":23102},{"class":159,"line":179},[23103],{"type":20,"tag":157,"props":23104,"children":23105},{},[23106],{"type":25,"value":23107},"    insert into t_emp values\n",{"type":20,"tag":157,"props":23109,"children":23110},{"class":159,"line":188},[23111],{"type":20,"tag":157,"props":23112,"children":23113},{},[23114],{"type":25,"value":23115},"    \u003Cforeach collection=\"emps\" item=\"emp\" separator=\",\">\n",{"type":20,"tag":157,"props":23117,"children":23118},{"class":159,"line":196},[23119],{"type":20,"tag":157,"props":23120,"children":23121},{},[23122],{"type":25,"value":23123},"        (null, #{emp.empName}, #{emp.age}, #{emp.gender}, null)\n",{"type":20,"tag":157,"props":23125,"children":23126},{"class":159,"line":204},[23127],{"type":20,"tag":157,"props":23128,"children":23129},{},[23130],{"type":25,"value":23131},"    \u003C\u002Fforeach>\n",{"type":20,"tag":157,"props":23133,"children":23134},{"class":159,"line":213},[23135],{"type":20,"tag":157,"props":23136,"children":23137},{},[23138],{"type":25,"value":18174},{"type":20,"tag":18942,"props":23140,"children":23142},{"id":23141},"删除多个员工信息",[23143],{"type":25,"value":23141},{"type":20,"tag":21,"props":23145,"children":23146},{},[23147],{"type":20,"tag":33,"props":23148,"children":23149},{},[23150],{"type":25,"value":20392},{"type":20,"tag":126,"props":23152,"children":23154},{"className":17052,"code":23153,"language":17054,"meta":8,"style":8},"\u003C!--void delManyEmp(@Param(\"empIds\") Integer[] empIds);-->\n\u003Cdelete id=\"delManyEmp\">\n    delete from t_emp where\n    \u003Cforeach collection=\"empIds\" item=\"empId\" separator=\"or\">\n        emp_id = #{empId}\n    \u003C\u002Fforeach>\n\u003C\u002Fdelete>\n",[23155],{"type":20,"tag":84,"props":23156,"children":23157},{"__ignoreMap":8},[23158,23166,23174,23182,23190,23198,23205],{"type":20,"tag":157,"props":23159,"children":23160},{"class":159,"line":160},[23161],{"type":20,"tag":157,"props":23162,"children":23163},{},[23164],{"type":25,"value":23165},"\u003C!--void delManyEmp(@Param(\"empIds\") Integer[] empIds);-->\n",{"type":20,"tag":157,"props":23167,"children":23168},{"class":159,"line":169},[23169],{"type":20,"tag":157,"props":23170,"children":23171},{},[23172],{"type":25,"value":23173},"\u003Cdelete id=\"delManyEmp\">\n",{"type":20,"tag":157,"props":23175,"children":23176},{"class":159,"line":179},[23177],{"type":20,"tag":157,"props":23178,"children":23179},{},[23180],{"type":25,"value":23181},"    delete from t_emp where\n",{"type":20,"tag":157,"props":23183,"children":23184},{"class":159,"line":188},[23185],{"type":20,"tag":157,"props":23186,"children":23187},{},[23188],{"type":25,"value":23189},"    \u003Cforeach collection=\"empIds\" item=\"empId\" separator=\"or\">\n",{"type":20,"tag":157,"props":23191,"children":23192},{"class":159,"line":196},[23193],{"type":20,"tag":157,"props":23194,"children":23195},{},[23196],{"type":25,"value":23197},"        emp_id = #{empId}\n",{"type":20,"tag":157,"props":23199,"children":23200},{"class":159,"line":204},[23201],{"type":20,"tag":157,"props":23202,"children":23203},{},[23204],{"type":25,"value":23131},{"type":20,"tag":157,"props":23206,"children":23207},{"class":159,"line":213},[23208],{"type":20,"tag":157,"props":23209,"children":23210},{},[23211],{"type":25,"value":19649},{"type":20,"tag":11085,"props":23213,"children":23215},{"id":23214},"sql-标签",[23216],{"type":25,"value":23217},"sql 标签",{"type":20,"tag":6665,"props":23219,"children":23220},{},[23221],{"type":20,"tag":21,"props":23222,"children":23223},{},[23224],{"type":25,"value":23225},"可以记录一段sql，在需要的地方使用include标签进行引用",{"type":20,"tag":126,"props":23227,"children":23229},{"className":17052,"code":23228,"language":17054,"meta":8,"style":8},"\u003Csql id=\"empColumns\">\n    emp_id\n    ,emp_name, age, gender\n\u003C\u002Fsql>\n\u003C!--List\u003CEmp> getEmpByChoose(Emp emp);-->\n\u003Cselect id=\"getEmpByChoose\" resultType=\"emp\">\n    select\n    \u003Cinclude refid=\"empColumns\"\u002F>\n    from t_emp\n    \u003Cwhere>\n        \u003Cchoose>\n            \u003Cwhen test=\"empName != null and empName != ''\">\n                emp_name = #{empName}\n            \u003C\u002Fwhen>\n            \u003Cwhen test=\"age != null and age != ''\">\n                age = #{age}\n            \u003C\u002Fwhen>\n            \u003Cwhen test=\"gender != null and gender != ''\">\n                gender = #{gender}\n            \u003C\u002Fwhen>\n        \u003C\u002Fchoose>\n    \u003C\u002Fwhere>\n\u003C\u002Fselect>\n",[23230],{"type":20,"tag":84,"props":23231,"children":23232},{"__ignoreMap":8},[23233,23241,23249,23257,23265,23272,23279,23287,23295,23302,23309,23316,23323,23330,23337,23344,23351,23358,23365,23372,23379,23386,23393],{"type":20,"tag":157,"props":23234,"children":23235},{"class":159,"line":160},[23236],{"type":20,"tag":157,"props":23237,"children":23238},{},[23239],{"type":25,"value":23240},"\u003Csql id=\"empColumns\">\n",{"type":20,"tag":157,"props":23242,"children":23243},{"class":159,"line":169},[23244],{"type":20,"tag":157,"props":23245,"children":23246},{},[23247],{"type":25,"value":23248},"    emp_id\n",{"type":20,"tag":157,"props":23250,"children":23251},{"class":159,"line":179},[23252],{"type":20,"tag":157,"props":23253,"children":23254},{},[23255],{"type":25,"value":23256},"    ,emp_name, age, gender\n",{"type":20,"tag":157,"props":23258,"children":23259},{"class":159,"line":188},[23260],{"type":20,"tag":157,"props":23261,"children":23262},{},[23263],{"type":25,"value":23264},"\u003C\u002Fsql>\n",{"type":20,"tag":157,"props":23266,"children":23267},{"class":159,"line":196},[23268],{"type":20,"tag":157,"props":23269,"children":23270},{},[23271],{"type":25,"value":22908},{"type":20,"tag":157,"props":23273,"children":23274},{"class":159,"line":204},[23275],{"type":20,"tag":157,"props":23276,"children":23277},{},[23278],{"type":25,"value":22916},{"type":20,"tag":157,"props":23280,"children":23281},{"class":159,"line":213},[23282],{"type":20,"tag":157,"props":23283,"children":23284},{},[23285],{"type":25,"value":23286},"    select\n",{"type":20,"tag":157,"props":23288,"children":23289},{"class":159,"line":222},[23290],{"type":20,"tag":157,"props":23291,"children":23292},{},[23293],{"type":25,"value":23294},"    \u003Cinclude refid=\"empColumns\"\u002F>\n",{"type":20,"tag":157,"props":23296,"children":23297},{"class":159,"line":440},[23298],{"type":20,"tag":157,"props":23299,"children":23300},{},[23301],{"type":25,"value":20880},{"type":20,"tag":157,"props":23303,"children":23304},{"class":159,"line":448},[23305],{"type":20,"tag":157,"props":23306,"children":23307},{},[23308],{"type":25,"value":22650},{"type":20,"tag":157,"props":23310,"children":23311},{"class":159,"line":456},[23312],{"type":20,"tag":157,"props":23313,"children":23314},{},[23315],{"type":25,"value":22938},{"type":20,"tag":157,"props":23317,"children":23318},{"class":159,"line":465},[23319],{"type":20,"tag":157,"props":23320,"children":23321},{},[23322],{"type":25,"value":22946},{"type":20,"tag":157,"props":23324,"children":23325},{"class":159,"line":474},[23326],{"type":20,"tag":157,"props":23327,"children":23328},{},[23329],{"type":25,"value":22954},{"type":20,"tag":157,"props":23331,"children":23332},{"class":159,"line":483},[23333],{"type":20,"tag":157,"props":23334,"children":23335},{},[23336],{"type":25,"value":22962},{"type":20,"tag":157,"props":23338,"children":23339},{"class":159,"line":491},[23340],{"type":20,"tag":157,"props":23341,"children":23342},{},[23343],{"type":25,"value":22970},{"type":20,"tag":157,"props":23345,"children":23346},{"class":159,"line":499},[23347],{"type":20,"tag":157,"props":23348,"children":23349},{},[23350],{"type":25,"value":22978},{"type":20,"tag":157,"props":23352,"children":23353},{"class":159,"line":508},[23354],{"type":20,"tag":157,"props":23355,"children":23356},{},[23357],{"type":25,"value":22962},{"type":20,"tag":157,"props":23359,"children":23360},{"class":159,"line":517},[23361],{"type":20,"tag":157,"props":23362,"children":23363},{},[23364],{"type":25,"value":22993},{"type":20,"tag":157,"props":23366,"children":23367},{"class":159,"line":1499},[23368],{"type":20,"tag":157,"props":23369,"children":23370},{},[23371],{"type":25,"value":23001},{"type":20,"tag":157,"props":23373,"children":23374},{"class":159,"line":1507},[23375],{"type":20,"tag":157,"props":23376,"children":23377},{},[23378],{"type":25,"value":22962},{"type":20,"tag":157,"props":23380,"children":23381},{"class":159,"line":1515},[23382],{"type":20,"tag":157,"props":23383,"children":23384},{},[23385],{"type":25,"value":23016},{"type":20,"tag":157,"props":23387,"children":23388},{"class":159,"line":1523},[23389],{"type":20,"tag":157,"props":23390,"children":23391},{},[23392],{"type":25,"value":22728},{"type":20,"tag":157,"props":23394,"children":23395},{"class":159,"line":1532},[23396],{"type":20,"tag":157,"props":23397,"children":23398},{},[23399],{"type":25,"value":17794},{"type":20,"tag":28,"props":23401,"children":23403},{"id":23402},"_9-mybatis缓存",[23404],{"type":25,"value":23405},"9 MyBatis缓存",{"type":20,"tag":11085,"props":23407,"children":23409},{"id":23408},"_91-一级缓存",[23410],{"type":25,"value":23411},"9.1 一级缓存",{"type":20,"tag":6665,"props":23413,"children":23414},{},[23415],{"type":20,"tag":21,"props":23416,"children":23417},{},[23418],{"type":25,"value":23419},"一级缓存是SqlSession级别的，通过同一个SqlSession查询的数据会被缓存，下次查询相同的数据，就会从缓存中获取，不用在执行一遍sql语句去数据库获取",{"type":20,"tag":21,"props":23421,"children":23422},{},[23423],{"type":25,"value":23424},"**开启条件：**默认开启",{"type":20,"tag":21,"props":23426,"children":23427},{},[23428],{"type":20,"tag":33,"props":23429,"children":23430},{},[23431],{"type":25,"value":23432},"一级缓存失效的四种情况",{"type":20,"tag":5719,"props":23434,"children":23435},{},[23436,23441,23446,23451],{"type":20,"tag":48,"props":23437,"children":23438},{},[23439],{"type":25,"value":23440},"不同的SqlSession对应不同的一级缓存",{"type":20,"tag":48,"props":23442,"children":23443},{},[23444],{"type":25,"value":23445},"同一个SqlSession但查询条件不同",{"type":20,"tag":48,"props":23447,"children":23448},{},[23449],{"type":25,"value":23450},"同一个SqlSession但两次查询期间执行了任何crud操作",{"type":20,"tag":48,"props":23452,"children":23453},{},[23454,23456],{"type":25,"value":23455},"同一个SqlSession但两次查询期间手动清空缓存：",{"type":20,"tag":84,"props":23457,"children":23459},{"className":23458},[],[23460],{"type":25,"value":23461},"sqlSession.clearCache();",{"type":20,"tag":11085,"props":23463,"children":23465},{"id":23464},"_92-二级缓存",[23466],{"type":25,"value":23467},"9.2 二级缓存",{"type":20,"tag":6665,"props":23469,"children":23470},{},[23471],{"type":20,"tag":21,"props":23472,"children":23473},{},[23474],{"type":25,"value":23475},"二级缓存是SqlSessionFactory级别的，通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存；伺候若再次执行相同的查询语句，结果会从缓存中获取",{"type":20,"tag":21,"props":23477,"children":23478},{},[23479],{"type":20,"tag":33,"props":23480,"children":23481},{},[23482],{"type":25,"value":23483},"开启条件：",{"type":20,"tag":44,"props":23485,"children":23486},{},[23487,23500,23511,23516],{"type":20,"tag":48,"props":23488,"children":23489},{},[23490,23492,23498],{"type":25,"value":23491},"在核心配置文件中，设置全局配置属性",{"type":20,"tag":84,"props":23493,"children":23495},{"className":23494},[],[23496],{"type":25,"value":23497},"cacheEnabled=\"true\"",{"type":25,"value":23499},"，默认为true，不需要配置",{"type":20,"tag":48,"props":23501,"children":23502},{},[23503,23505],{"type":25,"value":23504},"在映射文件中设置标签",{"type":20,"tag":84,"props":23506,"children":23508},{"className":23507},[],[23509],{"type":25,"value":23510},"\u003Ccache\u002F>",{"type":20,"tag":48,"props":23512,"children":23513},{},[23514],{"type":25,"value":23515},"二级缓存中必须在SqlSession关闭或提交之后有效",{"type":20,"tag":48,"props":23517,"children":23518},{},[23519],{"type":25,"value":23520},"查询的数据所转换的实体类类型必须实现序列化接口",{"type":20,"tag":21,"props":23522,"children":23523},{},[23524],{"type":20,"tag":33,"props":23525,"children":23526},{},[23527],{"type":25,"value":23528},"二级缓存失效的一种情况：",{"type":20,"tag":21,"props":23530,"children":23531},{},[23532],{"type":25,"value":23533},"两次查询之间执行了任意的增改，会使一级和二级缓存同时失效",{"type":20,"tag":11085,"props":23535,"children":23537},{"id":23536},"_93-mybatis缓存查询的顺序",[23538],{"type":25,"value":23539},"9.3 MyBatis缓存查询的顺序",{"type":20,"tag":6665,"props":23541,"children":23542},{},[23543],{"type":20,"tag":21,"props":23544,"children":23545},{},[23546],{"type":25,"value":23547},"先找范围大的，再找范围小的",{"type":20,"tag":21,"props":23549,"children":23550},{},[23551],{"type":25,"value":23552},"先查询二级缓存，二级缓存中可能有其他程序已经查出来的数据，可以拿来直接使用",{"type":20,"tag":21,"props":23554,"children":23555},{},[23556],{"type":25,"value":23557},"二级缓存没有命中，在查询一级缓存",{"type":20,"tag":21,"props":23559,"children":23560},{},[23561],{"type":25,"value":23562},"一级缓存没有命中，再去查找数据库",{"type":20,"tag":21,"props":23564,"children":23565},{},[23566],{"type":25,"value":23567},"SqlSession关闭之后，一级缓存中的数据会写入二级缓存",{"type":20,"tag":11085,"props":23569,"children":23571},{"id":23570},"_94-mybatis可以整合第三方缓存",[23572],{"type":25,"value":23573},"9.4 MyBatis可以整合第三方缓存",{"type":20,"tag":21,"props":23575,"children":23576},{},[23577],{"type":25,"value":23578},"略。。。。。。",{"type":20,"tag":28,"props":23580,"children":23582},{"id":23581},"_10-mybatis的逆向工程",[23583],{"type":25,"value":23584},"10 MyBatis的逆向工程",{"type":20,"tag":6665,"props":23586,"children":23587},{},[23588,23593,23598],{"type":20,"tag":21,"props":23589,"children":23590},{},[23591],{"type":25,"value":23592},"**正向工程：**先创建Java实体类，由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的",{"type":20,"tag":21,"props":23594,"children":23595},{},[23596],{"type":25,"value":23597},"**逆向工程：**先创建数据库表，由框架负责根据数据库表，反向生成",{"type":20,"tag":44,"props":23599,"children":23600},{},[23601,23606,23611],{"type":20,"tag":48,"props":23602,"children":23603},{},[23604],{"type":25,"value":23605},"Java实体类",{"type":20,"tag":48,"props":23607,"children":23608},{},[23609],{"type":25,"value":23610},"Mapper接口",{"type":20,"tag":48,"props":23612,"children":23613},{},[23614],{"type":25,"value":23615},"Mapper映射文件",{"type":20,"tag":21,"props":23617,"children":23618},{},[23619],{"type":20,"tag":33,"props":23620,"children":23621},{},[23622],{"type":25,"value":23623},"pom.xml：",{"type":20,"tag":126,"props":23625,"children":23627},{"className":17052,"code":23626,"language":17054,"meta":8,"style":8},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>com.wangkun.mybatis\u003C\u002FgroupId>\n    \u003CartifactId>mybatis_mbg\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n    \u003Cpackaging>jar\u003C\u002Fpackaging>\n\n    \u003Cproperties>\n        \u003Cmaven.compiler.source>8\u003C\u002Fmaven.compiler.source>\n        \u003Cmaven.compiler.target>8\u003C\u002Fmaven.compiler.target>\n        \u003Cproject.build.sourceEncoding>UTF-8\u003C\u002Fproject.build.sourceEncoding>\n    \u003C\u002Fproperties>\n\n    \u003Cdependencies>\n        \u003Cdependency>\n            \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n            \u003CartifactId>mybatis\u003C\u002FartifactId>\n            \u003Cversion>3.5.7\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003C!-- junit测试 -->\n        \u003Cdependency>\n            \u003CgroupId>junit\u003C\u002FgroupId>\n            \u003CartifactId>junit\u003C\u002FartifactId>\n            \u003Cversion>4.12\u003C\u002Fversion>\n            \u003Cscope>test\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n        \u003C!-- log4j日志 -->\n        \u003Cdependency>\n            \u003CgroupId>log4j\u003C\u002FgroupId>\n            \u003CartifactId>log4j\u003C\u002FartifactId>\n            \u003Cversion>1.2.17\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>mysql\u003C\u002FgroupId>\n            \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n            \u003Cversion>8.0.16\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n    \u003C!-- 构建过程中用到的插件 -->\n    \u003Cbuild>\n        \u003C!-- 具体插件，逆向工程的操作是以构建过程中插件形式出现的 -->\n        \u003Cplugins>\n            \u003Cplugin>\n                \u003CgroupId>org.mybatis.generator\u003C\u002FgroupId>\n                \u003CartifactId>mybatis-generator-maven-plugin\u003C\u002FartifactId>\n                \u003Cversion>1.3.0\u003C\u002Fversion>\n                \u003C!--插件的依赖-->\n                \u003Cdependencies>\n                    \u003C!--逆向工程的核心依赖-->\n                    \u003Cdependency>\n                        \u003CgroupId>org.mybatis.generator\u003C\u002FgroupId>\n                        \u003CartifactId>mybatis-generator-core\u003C\u002FartifactId>\n                        \u003Cversion>1.3.2\u003C\u002Fversion>\n                    \u003C\u002Fdependency>\n                    \u003C!--MySQL驱动-->\n                    \u003Cdependency>\n                        \u003CgroupId>mysql\u003C\u002FgroupId>\n                        \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n                        \u003Cversion>8.0.16\u003C\u002Fversion>\n                    \u003C\u002Fdependency>\n                \u003C\u002Fdependencies>\n            \u003C\u002Fplugin>\n        \u003C\u002Fplugins>\n    \u003C\u002Fbuild>\n\u003C\u002Fproject>\n",[23628],{"type":20,"tag":84,"props":23629,"children":23630},{"__ignoreMap":8},[23631,23639,23647,23655,23663,23671,23678,23686,23694,23702,23710,23717,23725,23733,23741,23749,23757,23764,23772,23780,23788,23796,23804,23812,23820,23827,23835,23843,23851,23859,23866,23874,23881,23889,23897,23905,23912,23919,23927,23935,23943,23950,23958,23966,23974,23983,23992,24001,24010,24019,24028,24037,24046,24055,24064,24073,24082,24091,24100,24109,24117,24126,24135,24144,24152,24161,24170,24179,24188],{"type":20,"tag":157,"props":23632,"children":23633},{"class":159,"line":160},[23634],{"type":20,"tag":157,"props":23635,"children":23636},{},[23637],{"type":25,"value":23638},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",{"type":20,"tag":157,"props":23640,"children":23641},{"class":159,"line":169},[23642],{"type":20,"tag":157,"props":23643,"children":23644},{},[23645],{"type":25,"value":23646},"\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n",{"type":20,"tag":157,"props":23648,"children":23649},{"class":159,"line":179},[23650],{"type":20,"tag":157,"props":23651,"children":23652},{},[23653],{"type":25,"value":23654},"         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n",{"type":20,"tag":157,"props":23656,"children":23657},{"class":159,"line":188},[23658],{"type":20,"tag":157,"props":23659,"children":23660},{},[23661],{"type":25,"value":23662},"         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n",{"type":20,"tag":157,"props":23664,"children":23665},{"class":159,"line":196},[23666],{"type":20,"tag":157,"props":23667,"children":23668},{},[23669],{"type":25,"value":23670},"    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n",{"type":20,"tag":157,"props":23672,"children":23673},{"class":159,"line":204},[23674],{"type":20,"tag":157,"props":23675,"children":23676},{"emptyLinePlaceholder":173},[23677],{"type":25,"value":176},{"type":20,"tag":157,"props":23679,"children":23680},{"class":159,"line":213},[23681],{"type":20,"tag":157,"props":23682,"children":23683},{},[23684],{"type":25,"value":23685},"    \u003CgroupId>com.wangkun.mybatis\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":23687,"children":23688},{"class":159,"line":222},[23689],{"type":20,"tag":157,"props":23690,"children":23691},{},[23692],{"type":25,"value":23693},"    \u003CartifactId>mybatis_mbg\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":23695,"children":23696},{"class":159,"line":440},[23697],{"type":20,"tag":157,"props":23698,"children":23699},{},[23700],{"type":25,"value":23701},"    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":23703,"children":23704},{"class":159,"line":448},[23705],{"type":20,"tag":157,"props":23706,"children":23707},{},[23708],{"type":25,"value":23709},"    \u003Cpackaging>jar\u003C\u002Fpackaging>\n",{"type":20,"tag":157,"props":23711,"children":23712},{"class":159,"line":456},[23713],{"type":20,"tag":157,"props":23714,"children":23715},{"emptyLinePlaceholder":173},[23716],{"type":25,"value":176},{"type":20,"tag":157,"props":23718,"children":23719},{"class":159,"line":465},[23720],{"type":20,"tag":157,"props":23721,"children":23722},{},[23723],{"type":25,"value":23724},"    \u003Cproperties>\n",{"type":20,"tag":157,"props":23726,"children":23727},{"class":159,"line":474},[23728],{"type":20,"tag":157,"props":23729,"children":23730},{},[23731],{"type":25,"value":23732},"        \u003Cmaven.compiler.source>8\u003C\u002Fmaven.compiler.source>\n",{"type":20,"tag":157,"props":23734,"children":23735},{"class":159,"line":483},[23736],{"type":20,"tag":157,"props":23737,"children":23738},{},[23739],{"type":25,"value":23740},"        \u003Cmaven.compiler.target>8\u003C\u002Fmaven.compiler.target>\n",{"type":20,"tag":157,"props":23742,"children":23743},{"class":159,"line":491},[23744],{"type":20,"tag":157,"props":23745,"children":23746},{},[23747],{"type":25,"value":23748},"        \u003Cproject.build.sourceEncoding>UTF-8\u003C\u002Fproject.build.sourceEncoding>\n",{"type":20,"tag":157,"props":23750,"children":23751},{"class":159,"line":499},[23752],{"type":20,"tag":157,"props":23753,"children":23754},{},[23755],{"type":25,"value":23756},"    \u003C\u002Fproperties>\n",{"type":20,"tag":157,"props":23758,"children":23759},{"class":159,"line":508},[23760],{"type":20,"tag":157,"props":23761,"children":23762},{"emptyLinePlaceholder":173},[23763],{"type":25,"value":176},{"type":20,"tag":157,"props":23765,"children":23766},{"class":159,"line":517},[23767],{"type":20,"tag":157,"props":23768,"children":23769},{},[23770],{"type":25,"value":23771},"    \u003Cdependencies>\n",{"type":20,"tag":157,"props":23773,"children":23774},{"class":159,"line":1499},[23775],{"type":20,"tag":157,"props":23776,"children":23777},{},[23778],{"type":25,"value":23779},"        \u003Cdependency>\n",{"type":20,"tag":157,"props":23781,"children":23782},{"class":159,"line":1507},[23783],{"type":20,"tag":157,"props":23784,"children":23785},{},[23786],{"type":25,"value":23787},"            \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":23789,"children":23790},{"class":159,"line":1515},[23791],{"type":20,"tag":157,"props":23792,"children":23793},{},[23794],{"type":25,"value":23795},"            \u003CartifactId>mybatis\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":23797,"children":23798},{"class":159,"line":1523},[23799],{"type":20,"tag":157,"props":23800,"children":23801},{},[23802],{"type":25,"value":23803},"            \u003Cversion>3.5.7\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":23805,"children":23806},{"class":159,"line":1532},[23807],{"type":20,"tag":157,"props":23808,"children":23809},{},[23810],{"type":25,"value":23811},"        \u003C\u002Fdependency>\n",{"type":20,"tag":157,"props":23813,"children":23814},{"class":159,"line":1541},[23815],{"type":20,"tag":157,"props":23816,"children":23817},{},[23818],{"type":25,"value":23819},"        \u003C!-- junit测试 -->\n",{"type":20,"tag":157,"props":23821,"children":23822},{"class":159,"line":1550},[23823],{"type":20,"tag":157,"props":23824,"children":23825},{},[23826],{"type":25,"value":23779},{"type":20,"tag":157,"props":23828,"children":23829},{"class":159,"line":1558},[23830],{"type":20,"tag":157,"props":23831,"children":23832},{},[23833],{"type":25,"value":23834},"            \u003CgroupId>junit\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":23836,"children":23837},{"class":159,"line":1566},[23838],{"type":20,"tag":157,"props":23839,"children":23840},{},[23841],{"type":25,"value":23842},"            \u003CartifactId>junit\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":23844,"children":23845},{"class":159,"line":1574},[23846],{"type":20,"tag":157,"props":23847,"children":23848},{},[23849],{"type":25,"value":23850},"            \u003Cversion>4.12\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":23852,"children":23853},{"class":159,"line":1582},[23854],{"type":20,"tag":157,"props":23855,"children":23856},{},[23857],{"type":25,"value":23858},"            \u003Cscope>test\u003C\u002Fscope>\n",{"type":20,"tag":157,"props":23860,"children":23861},{"class":159,"line":1591},[23862],{"type":20,"tag":157,"props":23863,"children":23864},{},[23865],{"type":25,"value":23811},{"type":20,"tag":157,"props":23867,"children":23868},{"class":159,"line":1599},[23869],{"type":20,"tag":157,"props":23870,"children":23871},{},[23872],{"type":25,"value":23873},"        \u003C!-- log4j日志 -->\n",{"type":20,"tag":157,"props":23875,"children":23876},{"class":159,"line":1608},[23877],{"type":20,"tag":157,"props":23878,"children":23879},{},[23880],{"type":25,"value":23779},{"type":20,"tag":157,"props":23882,"children":23883},{"class":159,"line":1617},[23884],{"type":20,"tag":157,"props":23885,"children":23886},{},[23887],{"type":25,"value":23888},"            \u003CgroupId>log4j\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":23890,"children":23891},{"class":159,"line":1626},[23892],{"type":20,"tag":157,"props":23893,"children":23894},{},[23895],{"type":25,"value":23896},"            \u003CartifactId>log4j\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":23898,"children":23899},{"class":159,"line":1634},[23900],{"type":20,"tag":157,"props":23901,"children":23902},{},[23903],{"type":25,"value":23904},"            \u003Cversion>1.2.17\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":23906,"children":23907},{"class":159,"line":1642},[23908],{"type":20,"tag":157,"props":23909,"children":23910},{},[23911],{"type":25,"value":23811},{"type":20,"tag":157,"props":23913,"children":23914},{"class":159,"line":1650},[23915],{"type":20,"tag":157,"props":23916,"children":23917},{},[23918],{"type":25,"value":23779},{"type":20,"tag":157,"props":23920,"children":23921},{"class":159,"line":1659},[23922],{"type":20,"tag":157,"props":23923,"children":23924},{},[23925],{"type":25,"value":23926},"            \u003CgroupId>mysql\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":23928,"children":23929},{"class":159,"line":1668},[23930],{"type":20,"tag":157,"props":23931,"children":23932},{},[23933],{"type":25,"value":23934},"            \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":23936,"children":23937},{"class":159,"line":1677},[23938],{"type":20,"tag":157,"props":23939,"children":23940},{},[23941],{"type":25,"value":23942},"            \u003Cversion>8.0.16\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":23944,"children":23945},{"class":159,"line":1685},[23946],{"type":20,"tag":157,"props":23947,"children":23948},{},[23949],{"type":25,"value":23811},{"type":20,"tag":157,"props":23951,"children":23952},{"class":159,"line":1693},[23953],{"type":20,"tag":157,"props":23954,"children":23955},{},[23956],{"type":25,"value":23957},"    \u003C\u002Fdependencies>\n",{"type":20,"tag":157,"props":23959,"children":23960},{"class":159,"line":1701},[23961],{"type":20,"tag":157,"props":23962,"children":23963},{},[23964],{"type":25,"value":23965},"    \u003C!-- 构建过程中用到的插件 -->\n",{"type":20,"tag":157,"props":23967,"children":23968},{"class":159,"line":1710},[23969],{"type":20,"tag":157,"props":23970,"children":23971},{},[23972],{"type":25,"value":23973},"    \u003Cbuild>\n",{"type":20,"tag":157,"props":23975,"children":23977},{"class":159,"line":23976},45,[23978],{"type":20,"tag":157,"props":23979,"children":23980},{},[23981],{"type":25,"value":23982},"        \u003C!-- 具体插件，逆向工程的操作是以构建过程中插件形式出现的 -->\n",{"type":20,"tag":157,"props":23984,"children":23986},{"class":159,"line":23985},46,[23987],{"type":20,"tag":157,"props":23988,"children":23989},{},[23990],{"type":25,"value":23991},"        \u003Cplugins>\n",{"type":20,"tag":157,"props":23993,"children":23995},{"class":159,"line":23994},47,[23996],{"type":20,"tag":157,"props":23997,"children":23998},{},[23999],{"type":25,"value":24000},"            \u003Cplugin>\n",{"type":20,"tag":157,"props":24002,"children":24004},{"class":159,"line":24003},48,[24005],{"type":20,"tag":157,"props":24006,"children":24007},{},[24008],{"type":25,"value":24009},"                \u003CgroupId>org.mybatis.generator\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":24011,"children":24013},{"class":159,"line":24012},49,[24014],{"type":20,"tag":157,"props":24015,"children":24016},{},[24017],{"type":25,"value":24018},"                \u003CartifactId>mybatis-generator-maven-plugin\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":24020,"children":24022},{"class":159,"line":24021},50,[24023],{"type":20,"tag":157,"props":24024,"children":24025},{},[24026],{"type":25,"value":24027},"                \u003Cversion>1.3.0\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":24029,"children":24031},{"class":159,"line":24030},51,[24032],{"type":20,"tag":157,"props":24033,"children":24034},{},[24035],{"type":25,"value":24036},"                \u003C!--插件的依赖-->\n",{"type":20,"tag":157,"props":24038,"children":24040},{"class":159,"line":24039},52,[24041],{"type":20,"tag":157,"props":24042,"children":24043},{},[24044],{"type":25,"value":24045},"                \u003Cdependencies>\n",{"type":20,"tag":157,"props":24047,"children":24049},{"class":159,"line":24048},53,[24050],{"type":20,"tag":157,"props":24051,"children":24052},{},[24053],{"type":25,"value":24054},"                    \u003C!--逆向工程的核心依赖-->\n",{"type":20,"tag":157,"props":24056,"children":24058},{"class":159,"line":24057},54,[24059],{"type":20,"tag":157,"props":24060,"children":24061},{},[24062],{"type":25,"value":24063},"                    \u003Cdependency>\n",{"type":20,"tag":157,"props":24065,"children":24067},{"class":159,"line":24066},55,[24068],{"type":20,"tag":157,"props":24069,"children":24070},{},[24071],{"type":25,"value":24072},"                        \u003CgroupId>org.mybatis.generator\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":24074,"children":24076},{"class":159,"line":24075},56,[24077],{"type":20,"tag":157,"props":24078,"children":24079},{},[24080],{"type":25,"value":24081},"                        \u003CartifactId>mybatis-generator-core\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":24083,"children":24085},{"class":159,"line":24084},57,[24086],{"type":20,"tag":157,"props":24087,"children":24088},{},[24089],{"type":25,"value":24090},"                        \u003Cversion>1.3.2\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":24092,"children":24094},{"class":159,"line":24093},58,[24095],{"type":20,"tag":157,"props":24096,"children":24097},{},[24098],{"type":25,"value":24099},"                    \u003C\u002Fdependency>\n",{"type":20,"tag":157,"props":24101,"children":24103},{"class":159,"line":24102},59,[24104],{"type":20,"tag":157,"props":24105,"children":24106},{},[24107],{"type":25,"value":24108},"                    \u003C!--MySQL驱动-->\n",{"type":20,"tag":157,"props":24110,"children":24112},{"class":159,"line":24111},60,[24113],{"type":20,"tag":157,"props":24114,"children":24115},{},[24116],{"type":25,"value":24063},{"type":20,"tag":157,"props":24118,"children":24120},{"class":159,"line":24119},61,[24121],{"type":20,"tag":157,"props":24122,"children":24123},{},[24124],{"type":25,"value":24125},"                        \u003CgroupId>mysql\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":24127,"children":24129},{"class":159,"line":24128},62,[24130],{"type":20,"tag":157,"props":24131,"children":24132},{},[24133],{"type":25,"value":24134},"                        \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":24136,"children":24138},{"class":159,"line":24137},63,[24139],{"type":20,"tag":157,"props":24140,"children":24141},{},[24142],{"type":25,"value":24143},"                        \u003Cversion>8.0.16\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":24145,"children":24147},{"class":159,"line":24146},64,[24148],{"type":20,"tag":157,"props":24149,"children":24150},{},[24151],{"type":25,"value":24099},{"type":20,"tag":157,"props":24153,"children":24155},{"class":159,"line":24154},65,[24156],{"type":20,"tag":157,"props":24157,"children":24158},{},[24159],{"type":25,"value":24160},"                \u003C\u002Fdependencies>\n",{"type":20,"tag":157,"props":24162,"children":24164},{"class":159,"line":24163},66,[24165],{"type":20,"tag":157,"props":24166,"children":24167},{},[24168],{"type":25,"value":24169},"            \u003C\u002Fplugin>\n",{"type":20,"tag":157,"props":24171,"children":24173},{"class":159,"line":24172},67,[24174],{"type":20,"tag":157,"props":24175,"children":24176},{},[24177],{"type":25,"value":24178},"        \u003C\u002Fplugins>\n",{"type":20,"tag":157,"props":24180,"children":24182},{"class":159,"line":24181},68,[24183],{"type":20,"tag":157,"props":24184,"children":24185},{},[24186],{"type":25,"value":24187},"    \u003C\u002Fbuild>\n",{"type":20,"tag":157,"props":24189,"children":24191},{"class":159,"line":24190},69,[24192],{"type":20,"tag":157,"props":24193,"children":24194},{},[24195],{"type":25,"value":24196},"\u003C\u002Fproject>\n",{"type":20,"tag":21,"props":24198,"children":24199},{},[24200],{"type":20,"tag":33,"props":24201,"children":24202},{},[24203],{"type":25,"value":24204},"resources\u002FgeneratorConfig.xml",{"type":20,"tag":126,"props":24206,"children":24208},{"className":17052,"code":24207,"language":17054,"meta":8,"style":8},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE generatorConfiguration PUBLIC\n        \"-\u002F\u002Fmybatis.org\u002F\u002FDTD MyBatis Generator Configuration 1.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-generator-config_1_0.dtd\">\n\u003CgeneratorConfiguration>\n    \u003C!-- targetRuntime: 执行生成的逆向工程的版本\n                MyBatis3Simple: 生成基本的CRUD（清新简洁版）\n                MyBatis3: 生成带条件的CRUD（奢华尊享版） -->\n    \u003Ccontext id=\"DB2Tables\" targetRuntime=\"MyBatis3\">\n        \u003C!-- 数据库的连接信息 -->\n        \u003CjdbcConnection\n                driverClass=\"com.mysql.cj.jdbc.Driver\"\n                connectionURL=\"jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fatguigu?serverTimezone=UTC\"\n                userId=\"root\"\n                password=\"wangkun1\"\n        \u002F>\n        \u003C!-- javaBean的生成策略-->\n        \u003CjavaModelGenerator targetPackage=\"com.wangkun.mybatis.pojo\" targetProject=\".\u002Fsrc\u002Fmain\u002Fjava\">\n            \u003Cproperty name=\"enableSubPackages\" value=\"true\"\u002F>\n            \u003Cproperty name=\"trimStrings\" value=\"true\"\u002F>\n        \u003C\u002FjavaModelGenerator>\n        \u003C!-- SQL映射文件的生成策略 -->\n        \u003CsqlMapGenerator targetPackage=\"com.wangkun.mybatis.mapper\" targetProject=\".\u002Fsrc\u002Fmain\u002Fresources\">\n            \u003Cproperty name=\"enableSubPackages\" value=\"true\"\u002F>\n        \u003C\u002FsqlMapGenerator>\n        \u003C!-- Mapper接口的生成策略 -->\n        \u003CjavaClientGenerator\n                type=\"XMLMAPPER\"\n                targetPackage=\"com.wangkun.mybatis.mapper\"\n                targetProject=\".\u002Fsrc\u002Fmain\u002Fjava\">\n\n            \u003Cproperty name=\"enableSubPackages\" value=\"true\"\u002F>\n        \u003C\u002FjavaClientGenerator>\n        \u003C!-- 逆向分析的表 --> \u003C!-- tableName设置为*号，可以对应所有表，此时不写domainObjectName -->\n        \u003C!-- domainObjectName属性指定生成出来的实体类的类名 -->\n        \u003Ctable tableName=\"t_emp\" domainObjectName=\"Emp\"\u002F>\n        \u003Ctable tableName=\"t_dept\" domainObjectName=\"Dept\"\u002F>\n    \u003C\u002Fcontext>\n\u003C\u002FgeneratorConfiguration>\n",[24209],{"type":20,"tag":84,"props":24210,"children":24211},{"__ignoreMap":8},[24212,24219,24227,24235,24243,24251,24259,24267,24275,24283,24291,24299,24307,24315,24323,24331,24339,24347,24355,24363,24371,24379,24387,24395,24402,24410,24418,24426,24434,24442,24450,24457,24464,24472,24480,24488,24496,24504,24512],{"type":20,"tag":157,"props":24213,"children":24214},{"class":159,"line":160},[24215],{"type":20,"tag":157,"props":24216,"children":24217},{},[24218],{"type":25,"value":23638},{"type":20,"tag":157,"props":24220,"children":24221},{"class":159,"line":169},[24222],{"type":20,"tag":157,"props":24223,"children":24224},{},[24225],{"type":25,"value":24226},"\u003C!DOCTYPE generatorConfiguration PUBLIC\n",{"type":20,"tag":157,"props":24228,"children":24229},{"class":159,"line":179},[24230],{"type":20,"tag":157,"props":24231,"children":24232},{},[24233],{"type":25,"value":24234},"        \"-\u002F\u002Fmybatis.org\u002F\u002FDTD MyBatis Generator Configuration 1.0\u002F\u002FEN\"\n",{"type":20,"tag":157,"props":24236,"children":24237},{"class":159,"line":188},[24238],{"type":20,"tag":157,"props":24239,"children":24240},{},[24241],{"type":25,"value":24242},"        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-generator-config_1_0.dtd\">\n",{"type":20,"tag":157,"props":24244,"children":24245},{"class":159,"line":196},[24246],{"type":20,"tag":157,"props":24247,"children":24248},{},[24249],{"type":25,"value":24250},"\u003CgeneratorConfiguration>\n",{"type":20,"tag":157,"props":24252,"children":24253},{"class":159,"line":204},[24254],{"type":20,"tag":157,"props":24255,"children":24256},{},[24257],{"type":25,"value":24258},"    \u003C!-- targetRuntime: 执行生成的逆向工程的版本\n",{"type":20,"tag":157,"props":24260,"children":24261},{"class":159,"line":213},[24262],{"type":20,"tag":157,"props":24263,"children":24264},{},[24265],{"type":25,"value":24266},"                MyBatis3Simple: 生成基本的CRUD（清新简洁版）\n",{"type":20,"tag":157,"props":24268,"children":24269},{"class":159,"line":222},[24270],{"type":20,"tag":157,"props":24271,"children":24272},{},[24273],{"type":25,"value":24274},"                MyBatis3: 生成带条件的CRUD（奢华尊享版） -->\n",{"type":20,"tag":157,"props":24276,"children":24277},{"class":159,"line":440},[24278],{"type":20,"tag":157,"props":24279,"children":24280},{},[24281],{"type":25,"value":24282},"    \u003Ccontext id=\"DB2Tables\" targetRuntime=\"MyBatis3\">\n",{"type":20,"tag":157,"props":24284,"children":24285},{"class":159,"line":448},[24286],{"type":20,"tag":157,"props":24287,"children":24288},{},[24289],{"type":25,"value":24290},"        \u003C!-- 数据库的连接信息 -->\n",{"type":20,"tag":157,"props":24292,"children":24293},{"class":159,"line":456},[24294],{"type":20,"tag":157,"props":24295,"children":24296},{},[24297],{"type":25,"value":24298},"        \u003CjdbcConnection\n",{"type":20,"tag":157,"props":24300,"children":24301},{"class":159,"line":465},[24302],{"type":20,"tag":157,"props":24303,"children":24304},{},[24305],{"type":25,"value":24306},"                driverClass=\"com.mysql.cj.jdbc.Driver\"\n",{"type":20,"tag":157,"props":24308,"children":24309},{"class":159,"line":474},[24310],{"type":20,"tag":157,"props":24311,"children":24312},{},[24313],{"type":25,"value":24314},"                connectionURL=\"jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fatguigu?serverTimezone=UTC\"\n",{"type":20,"tag":157,"props":24316,"children":24317},{"class":159,"line":483},[24318],{"type":20,"tag":157,"props":24319,"children":24320},{},[24321],{"type":25,"value":24322},"                userId=\"root\"\n",{"type":20,"tag":157,"props":24324,"children":24325},{"class":159,"line":491},[24326],{"type":20,"tag":157,"props":24327,"children":24328},{},[24329],{"type":25,"value":24330},"                password=\"wangkun1\"\n",{"type":20,"tag":157,"props":24332,"children":24333},{"class":159,"line":499},[24334],{"type":20,"tag":157,"props":24335,"children":24336},{},[24337],{"type":25,"value":24338},"        \u002F>\n",{"type":20,"tag":157,"props":24340,"children":24341},{"class":159,"line":508},[24342],{"type":20,"tag":157,"props":24343,"children":24344},{},[24345],{"type":25,"value":24346},"        \u003C!-- javaBean的生成策略-->\n",{"type":20,"tag":157,"props":24348,"children":24349},{"class":159,"line":517},[24350],{"type":20,"tag":157,"props":24351,"children":24352},{},[24353],{"type":25,"value":24354},"        \u003CjavaModelGenerator targetPackage=\"com.wangkun.mybatis.pojo\" targetProject=\".\u002Fsrc\u002Fmain\u002Fjava\">\n",{"type":20,"tag":157,"props":24356,"children":24357},{"class":159,"line":1499},[24358],{"type":20,"tag":157,"props":24359,"children":24360},{},[24361],{"type":25,"value":24362},"            \u003Cproperty name=\"enableSubPackages\" value=\"true\"\u002F>\n",{"type":20,"tag":157,"props":24364,"children":24365},{"class":159,"line":1507},[24366],{"type":20,"tag":157,"props":24367,"children":24368},{},[24369],{"type":25,"value":24370},"            \u003Cproperty name=\"trimStrings\" value=\"true\"\u002F>\n",{"type":20,"tag":157,"props":24372,"children":24373},{"class":159,"line":1515},[24374],{"type":20,"tag":157,"props":24375,"children":24376},{},[24377],{"type":25,"value":24378},"        \u003C\u002FjavaModelGenerator>\n",{"type":20,"tag":157,"props":24380,"children":24381},{"class":159,"line":1523},[24382],{"type":20,"tag":157,"props":24383,"children":24384},{},[24385],{"type":25,"value":24386},"        \u003C!-- SQL映射文件的生成策略 -->\n",{"type":20,"tag":157,"props":24388,"children":24389},{"class":159,"line":1532},[24390],{"type":20,"tag":157,"props":24391,"children":24392},{},[24393],{"type":25,"value":24394},"        \u003CsqlMapGenerator targetPackage=\"com.wangkun.mybatis.mapper\" targetProject=\".\u002Fsrc\u002Fmain\u002Fresources\">\n",{"type":20,"tag":157,"props":24396,"children":24397},{"class":159,"line":1541},[24398],{"type":20,"tag":157,"props":24399,"children":24400},{},[24401],{"type":25,"value":24362},{"type":20,"tag":157,"props":24403,"children":24404},{"class":159,"line":1550},[24405],{"type":20,"tag":157,"props":24406,"children":24407},{},[24408],{"type":25,"value":24409},"        \u003C\u002FsqlMapGenerator>\n",{"type":20,"tag":157,"props":24411,"children":24412},{"class":159,"line":1558},[24413],{"type":20,"tag":157,"props":24414,"children":24415},{},[24416],{"type":25,"value":24417},"        \u003C!-- Mapper接口的生成策略 -->\n",{"type":20,"tag":157,"props":24419,"children":24420},{"class":159,"line":1566},[24421],{"type":20,"tag":157,"props":24422,"children":24423},{},[24424],{"type":25,"value":24425},"        \u003CjavaClientGenerator\n",{"type":20,"tag":157,"props":24427,"children":24428},{"class":159,"line":1574},[24429],{"type":20,"tag":157,"props":24430,"children":24431},{},[24432],{"type":25,"value":24433},"                type=\"XMLMAPPER\"\n",{"type":20,"tag":157,"props":24435,"children":24436},{"class":159,"line":1582},[24437],{"type":20,"tag":157,"props":24438,"children":24439},{},[24440],{"type":25,"value":24441},"                targetPackage=\"com.wangkun.mybatis.mapper\"\n",{"type":20,"tag":157,"props":24443,"children":24444},{"class":159,"line":1591},[24445],{"type":20,"tag":157,"props":24446,"children":24447},{},[24448],{"type":25,"value":24449},"                targetProject=\".\u002Fsrc\u002Fmain\u002Fjava\">\n",{"type":20,"tag":157,"props":24451,"children":24452},{"class":159,"line":1599},[24453],{"type":20,"tag":157,"props":24454,"children":24455},{"emptyLinePlaceholder":173},[24456],{"type":25,"value":176},{"type":20,"tag":157,"props":24458,"children":24459},{"class":159,"line":1608},[24460],{"type":20,"tag":157,"props":24461,"children":24462},{},[24463],{"type":25,"value":24362},{"type":20,"tag":157,"props":24465,"children":24466},{"class":159,"line":1617},[24467],{"type":20,"tag":157,"props":24468,"children":24469},{},[24470],{"type":25,"value":24471},"        \u003C\u002FjavaClientGenerator>\n",{"type":20,"tag":157,"props":24473,"children":24474},{"class":159,"line":1626},[24475],{"type":20,"tag":157,"props":24476,"children":24477},{},[24478],{"type":25,"value":24479},"        \u003C!-- 逆向分析的表 --> \u003C!-- tableName设置为*号，可以对应所有表，此时不写domainObjectName -->\n",{"type":20,"tag":157,"props":24481,"children":24482},{"class":159,"line":1634},[24483],{"type":20,"tag":157,"props":24484,"children":24485},{},[24486],{"type":25,"value":24487},"        \u003C!-- domainObjectName属性指定生成出来的实体类的类名 -->\n",{"type":20,"tag":157,"props":24489,"children":24490},{"class":159,"line":1642},[24491],{"type":20,"tag":157,"props":24492,"children":24493},{},[24494],{"type":25,"value":24495},"        \u003Ctable tableName=\"t_emp\" domainObjectName=\"Emp\"\u002F>\n",{"type":20,"tag":157,"props":24497,"children":24498},{"class":159,"line":1650},[24499],{"type":20,"tag":157,"props":24500,"children":24501},{},[24502],{"type":25,"value":24503},"        \u003Ctable tableName=\"t_dept\" domainObjectName=\"Dept\"\u002F>\n",{"type":20,"tag":157,"props":24505,"children":24506},{"class":159,"line":1659},[24507],{"type":20,"tag":157,"props":24508,"children":24509},{},[24510],{"type":25,"value":24511},"    \u003C\u002Fcontext>\n",{"type":20,"tag":157,"props":24513,"children":24514},{"class":159,"line":1668},[24515],{"type":20,"tag":157,"props":24516,"children":24517},{},[24518],{"type":25,"value":24519},"\u003C\u002FgeneratorConfiguration>\n",{"type":20,"tag":21,"props":24521,"children":24522},{},[24523],{"type":20,"tag":33,"props":24524,"children":24525},{},[24526],{"type":25,"value":24527},"生成文件：",{"type":20,"tag":21,"props":24529,"children":24530},{},[24531],{"type":25,"value":24532},"![image-20230317160201578](\u002FUsers\u002Fwangkun\u002FLibrary\u002FApplication Support\u002Ftypora-user-images\u002Fimage-20230317160201578.png)",{"type":20,"tag":21,"props":24534,"children":24535},{},[24536],{"type":20,"tag":33,"props":24537,"children":24538},{},[24539],{"type":25,"value":24540},"使用：",{"type":20,"tag":126,"props":24542,"children":24544},{"className":16050,"code":24543,"language":16052,"meta":8,"style":8},"import com.wangkun.mybatis.mapper.EmpMapper;\nimport com.wangkun.mybatis.pojo.Emp;\nimport com.wangkun.mybatis.pojo.EmpExample;\nimport com.wangkun.mybatis.utils.SqlSessionUtil;\nimport org.apache.ibatis.session.SqlSession;\nimport org.junit.Test;\n\nimport java.util.List;\n\npublic class TestMbg {\n\n    \u002F**\n     * 根据主键id查询员工信息\n     *\u002F\n    @Test\n    public void testGetEmpByExample1() {\n\n        SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n        \u002F\u002F 根据id查询员工信息\n        Emp emp = mapper.selectByPrimaryKey(1);\n        System.out.println(emp);\n\n    }\n\n    \u002F**\n     * 查询所有员工\n     *\u002F\n    @Test\n    public void testGetEmpByExample2() {\n        SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n        List\u003CEmp> emps = mapper.selectByExample(null);\n        for (Emp emp : emps) {\n            System.out.println(emp);\n        }\n\n    }\n\n    \u002F**\n     * 根据条件查询员工\n     *\u002F\n    @Test\n    public void testGetEmpByExample3() {\n        SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n        \u002F\u002F 创建实例\n        EmpExample empExample = new EmpExample();\n        \u002F\u002F 添加条件\n        empExample.createCriteria().andEmpNameEqualTo(\"张三\").andGenderEqualTo(\"女\");\n        empExample.or().andAgeLessThan(20);\n\n        List\u003CEmp> emps = mapper.selectByExample(empExample);\n        for (Emp item : emps) {\n            System.out.println(item);\n        }\n    }\n\n    \u002F**\n     * 修改员工信息\n     *\u002F\n    @Test\n    public void testGetEmpByExample4() {\n        SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n        \u002F\u002F 创建实例\n        Emp emp = new Emp(1, \"小白\", 12, \"女\");\n        \u002F\u002F 1. 修改\n        int i1 = mapper.updateByPrimaryKey(emp);\n        \u002F\u002F 2. 选择性修改，不赋值或者为null的字段不会修改数据库\n        \u002F\u002F int i = mapper.updateByPrimaryKeySelective(emp);\n\n    }\n\n}\n",[24545],{"type":20,"tag":84,"props":24546,"children":24547},{"__ignoreMap":8},[24548,24556,24564,24572,24580,24587,24594,24601,24609,24616,24624,24631,24639,24647,24655,24662,24670,24677,24685,24693,24701,24709,24717,24724,24731,24738,24745,24753,24760,24767,24775,24782,24789,24797,24805,24813,24821,24828,24835,24842,24849,24857,24864,24871,24879,24886,24893,24901,24909,24917,24925,24933,24940,24948,24956,24964,24971,24978,24985,24992,25000,25007,25014,25022,25029,25036,25043,25051,25059,25067,25076,25085,25093,25101,25109],{"type":20,"tag":157,"props":24549,"children":24550},{"class":159,"line":160},[24551],{"type":20,"tag":157,"props":24552,"children":24553},{},[24554],{"type":25,"value":24555},"import com.wangkun.mybatis.mapper.EmpMapper;\n",{"type":20,"tag":157,"props":24557,"children":24558},{"class":159,"line":169},[24559],{"type":20,"tag":157,"props":24560,"children":24561},{},[24562],{"type":25,"value":24563},"import com.wangkun.mybatis.pojo.Emp;\n",{"type":20,"tag":157,"props":24565,"children":24566},{"class":159,"line":179},[24567],{"type":20,"tag":157,"props":24568,"children":24569},{},[24570],{"type":25,"value":24571},"import com.wangkun.mybatis.pojo.EmpExample;\n",{"type":20,"tag":157,"props":24573,"children":24574},{"class":159,"line":188},[24575],{"type":20,"tag":157,"props":24576,"children":24577},{},[24578],{"type":25,"value":24579},"import com.wangkun.mybatis.utils.SqlSessionUtil;\n",{"type":20,"tag":157,"props":24581,"children":24582},{"class":159,"line":196},[24583],{"type":20,"tag":157,"props":24584,"children":24585},{},[24586],{"type":25,"value":16771},{"type":20,"tag":157,"props":24588,"children":24589},{"class":159,"line":204},[24590],{"type":20,"tag":157,"props":24591,"children":24592},{},[24593],{"type":25,"value":16795},{"type":20,"tag":157,"props":24595,"children":24596},{"class":159,"line":213},[24597],{"type":20,"tag":157,"props":24598,"children":24599},{"emptyLinePlaceholder":173},[24600],{"type":25,"value":176},{"type":20,"tag":157,"props":24602,"children":24603},{"class":159,"line":222},[24604],{"type":20,"tag":157,"props":24605,"children":24606},{},[24607],{"type":25,"value":24608},"import java.util.List;\n",{"type":20,"tag":157,"props":24610,"children":24611},{"class":159,"line":440},[24612],{"type":20,"tag":157,"props":24613,"children":24614},{"emptyLinePlaceholder":173},[24615],{"type":25,"value":176},{"type":20,"tag":157,"props":24617,"children":24618},{"class":159,"line":448},[24619],{"type":20,"tag":157,"props":24620,"children":24621},{},[24622],{"type":25,"value":24623},"public class TestMbg {\n",{"type":20,"tag":157,"props":24625,"children":24626},{"class":159,"line":456},[24627],{"type":20,"tag":157,"props":24628,"children":24629},{"emptyLinePlaceholder":173},[24630],{"type":25,"value":176},{"type":20,"tag":157,"props":24632,"children":24633},{"class":159,"line":465},[24634],{"type":20,"tag":157,"props":24635,"children":24636},{},[24637],{"type":25,"value":24638},"    \u002F**\n",{"type":20,"tag":157,"props":24640,"children":24641},{"class":159,"line":474},[24642],{"type":20,"tag":157,"props":24643,"children":24644},{},[24645],{"type":25,"value":24646},"     * 根据主键id查询员工信息\n",{"type":20,"tag":157,"props":24648,"children":24649},{"class":159,"line":483},[24650],{"type":20,"tag":157,"props":24651,"children":24652},{},[24653],{"type":25,"value":24654},"     *\u002F\n",{"type":20,"tag":157,"props":24656,"children":24657},{"class":159,"line":491},[24658],{"type":20,"tag":157,"props":24659,"children":24660},{},[24661],{"type":25,"value":16841},{"type":20,"tag":157,"props":24663,"children":24664},{"class":159,"line":499},[24665],{"type":20,"tag":157,"props":24666,"children":24667},{},[24668],{"type":25,"value":24669},"    public void testGetEmpByExample1() {\n",{"type":20,"tag":157,"props":24671,"children":24672},{"class":159,"line":508},[24673],{"type":20,"tag":157,"props":24674,"children":24675},{"emptyLinePlaceholder":173},[24676],{"type":25,"value":176},{"type":20,"tag":157,"props":24678,"children":24679},{"class":159,"line":517},[24680],{"type":20,"tag":157,"props":24681,"children":24682},{},[24683],{"type":25,"value":24684},"        SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n",{"type":20,"tag":157,"props":24686,"children":24687},{"class":159,"line":1499},[24688],{"type":20,"tag":157,"props":24689,"children":24690},{},[24691],{"type":25,"value":24692},"        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n",{"type":20,"tag":157,"props":24694,"children":24695},{"class":159,"line":1507},[24696],{"type":20,"tag":157,"props":24697,"children":24698},{},[24699],{"type":25,"value":24700},"        \u002F\u002F 根据id查询员工信息\n",{"type":20,"tag":157,"props":24702,"children":24703},{"class":159,"line":1515},[24704],{"type":20,"tag":157,"props":24705,"children":24706},{},[24707],{"type":25,"value":24708},"        Emp emp = mapper.selectByPrimaryKey(1);\n",{"type":20,"tag":157,"props":24710,"children":24711},{"class":159,"line":1523},[24712],{"type":20,"tag":157,"props":24713,"children":24714},{},[24715],{"type":25,"value":24716},"        System.out.println(emp);\n",{"type":20,"tag":157,"props":24718,"children":24719},{"class":159,"line":1532},[24720],{"type":20,"tag":157,"props":24721,"children":24722},{"emptyLinePlaceholder":173},[24723],{"type":25,"value":176},{"type":20,"tag":157,"props":24725,"children":24726},{"class":159,"line":1541},[24727],{"type":20,"tag":157,"props":24728,"children":24729},{},[24730],{"type":25,"value":872},{"type":20,"tag":157,"props":24732,"children":24733},{"class":159,"line":1550},[24734],{"type":20,"tag":157,"props":24735,"children":24736},{"emptyLinePlaceholder":173},[24737],{"type":25,"value":176},{"type":20,"tag":157,"props":24739,"children":24740},{"class":159,"line":1558},[24741],{"type":20,"tag":157,"props":24742,"children":24743},{},[24744],{"type":25,"value":24638},{"type":20,"tag":157,"props":24746,"children":24747},{"class":159,"line":1566},[24748],{"type":20,"tag":157,"props":24749,"children":24750},{},[24751],{"type":25,"value":24752},"     * 查询所有员工\n",{"type":20,"tag":157,"props":24754,"children":24755},{"class":159,"line":1574},[24756],{"type":20,"tag":157,"props":24757,"children":24758},{},[24759],{"type":25,"value":24654},{"type":20,"tag":157,"props":24761,"children":24762},{"class":159,"line":1582},[24763],{"type":20,"tag":157,"props":24764,"children":24765},{},[24766],{"type":25,"value":16841},{"type":20,"tag":157,"props":24768,"children":24769},{"class":159,"line":1591},[24770],{"type":20,"tag":157,"props":24771,"children":24772},{},[24773],{"type":25,"value":24774},"    public void testGetEmpByExample2() {\n",{"type":20,"tag":157,"props":24776,"children":24777},{"class":159,"line":1599},[24778],{"type":20,"tag":157,"props":24779,"children":24780},{},[24781],{"type":25,"value":24684},{"type":20,"tag":157,"props":24783,"children":24784},{"class":159,"line":1608},[24785],{"type":20,"tag":157,"props":24786,"children":24787},{},[24788],{"type":25,"value":24692},{"type":20,"tag":157,"props":24790,"children":24791},{"class":159,"line":1617},[24792],{"type":20,"tag":157,"props":24793,"children":24794},{},[24795],{"type":25,"value":24796},"        List\u003CEmp> emps = mapper.selectByExample(null);\n",{"type":20,"tag":157,"props":24798,"children":24799},{"class":159,"line":1626},[24800],{"type":20,"tag":157,"props":24801,"children":24802},{},[24803],{"type":25,"value":24804},"        for (Emp emp : emps) {\n",{"type":20,"tag":157,"props":24806,"children":24807},{"class":159,"line":1634},[24808],{"type":20,"tag":157,"props":24809,"children":24810},{},[24811],{"type":25,"value":24812},"            System.out.println(emp);\n",{"type":20,"tag":157,"props":24814,"children":24815},{"class":159,"line":1642},[24816],{"type":20,"tag":157,"props":24817,"children":24818},{},[24819],{"type":25,"value":24820},"        }\n",{"type":20,"tag":157,"props":24822,"children":24823},{"class":159,"line":1650},[24824],{"type":20,"tag":157,"props":24825,"children":24826},{"emptyLinePlaceholder":173},[24827],{"type":25,"value":176},{"type":20,"tag":157,"props":24829,"children":24830},{"class":159,"line":1659},[24831],{"type":20,"tag":157,"props":24832,"children":24833},{},[24834],{"type":25,"value":872},{"type":20,"tag":157,"props":24836,"children":24837},{"class":159,"line":1668},[24838],{"type":20,"tag":157,"props":24839,"children":24840},{"emptyLinePlaceholder":173},[24841],{"type":25,"value":176},{"type":20,"tag":157,"props":24843,"children":24844},{"class":159,"line":1677},[24845],{"type":20,"tag":157,"props":24846,"children":24847},{},[24848],{"type":25,"value":24638},{"type":20,"tag":157,"props":24850,"children":24851},{"class":159,"line":1685},[24852],{"type":20,"tag":157,"props":24853,"children":24854},{},[24855],{"type":25,"value":24856},"     * 根据条件查询员工\n",{"type":20,"tag":157,"props":24858,"children":24859},{"class":159,"line":1693},[24860],{"type":20,"tag":157,"props":24861,"children":24862},{},[24863],{"type":25,"value":24654},{"type":20,"tag":157,"props":24865,"children":24866},{"class":159,"line":1701},[24867],{"type":20,"tag":157,"props":24868,"children":24869},{},[24870],{"type":25,"value":16841},{"type":20,"tag":157,"props":24872,"children":24873},{"class":159,"line":1710},[24874],{"type":20,"tag":157,"props":24875,"children":24876},{},[24877],{"type":25,"value":24878},"    public void testGetEmpByExample3() {\n",{"type":20,"tag":157,"props":24880,"children":24881},{"class":159,"line":23976},[24882],{"type":20,"tag":157,"props":24883,"children":24884},{},[24885],{"type":25,"value":24684},{"type":20,"tag":157,"props":24887,"children":24888},{"class":159,"line":23985},[24889],{"type":20,"tag":157,"props":24890,"children":24891},{},[24892],{"type":25,"value":24692},{"type":20,"tag":157,"props":24894,"children":24895},{"class":159,"line":23994},[24896],{"type":20,"tag":157,"props":24897,"children":24898},{},[24899],{"type":25,"value":24900},"        \u002F\u002F 创建实例\n",{"type":20,"tag":157,"props":24902,"children":24903},{"class":159,"line":24003},[24904],{"type":20,"tag":157,"props":24905,"children":24906},{},[24907],{"type":25,"value":24908},"        EmpExample empExample = new EmpExample();\n",{"type":20,"tag":157,"props":24910,"children":24911},{"class":159,"line":24012},[24912],{"type":20,"tag":157,"props":24913,"children":24914},{},[24915],{"type":25,"value":24916},"        \u002F\u002F 添加条件\n",{"type":20,"tag":157,"props":24918,"children":24919},{"class":159,"line":24021},[24920],{"type":20,"tag":157,"props":24921,"children":24922},{},[24923],{"type":25,"value":24924},"        empExample.createCriteria().andEmpNameEqualTo(\"张三\").andGenderEqualTo(\"女\");\n",{"type":20,"tag":157,"props":24926,"children":24927},{"class":159,"line":24030},[24928],{"type":20,"tag":157,"props":24929,"children":24930},{},[24931],{"type":25,"value":24932},"        empExample.or().andAgeLessThan(20);\n",{"type":20,"tag":157,"props":24934,"children":24935},{"class":159,"line":24039},[24936],{"type":20,"tag":157,"props":24937,"children":24938},{"emptyLinePlaceholder":173},[24939],{"type":25,"value":176},{"type":20,"tag":157,"props":24941,"children":24942},{"class":159,"line":24048},[24943],{"type":20,"tag":157,"props":24944,"children":24945},{},[24946],{"type":25,"value":24947},"        List\u003CEmp> emps = mapper.selectByExample(empExample);\n",{"type":20,"tag":157,"props":24949,"children":24950},{"class":159,"line":24057},[24951],{"type":20,"tag":157,"props":24952,"children":24953},{},[24954],{"type":25,"value":24955},"        for (Emp item : emps) {\n",{"type":20,"tag":157,"props":24957,"children":24958},{"class":159,"line":24066},[24959],{"type":20,"tag":157,"props":24960,"children":24961},{},[24962],{"type":25,"value":24963},"            System.out.println(item);\n",{"type":20,"tag":157,"props":24965,"children":24966},{"class":159,"line":24075},[24967],{"type":20,"tag":157,"props":24968,"children":24969},{},[24970],{"type":25,"value":24820},{"type":20,"tag":157,"props":24972,"children":24973},{"class":159,"line":24084},[24974],{"type":20,"tag":157,"props":24975,"children":24976},{},[24977],{"type":25,"value":872},{"type":20,"tag":157,"props":24979,"children":24980},{"class":159,"line":24093},[24981],{"type":20,"tag":157,"props":24982,"children":24983},{"emptyLinePlaceholder":173},[24984],{"type":25,"value":176},{"type":20,"tag":157,"props":24986,"children":24987},{"class":159,"line":24102},[24988],{"type":20,"tag":157,"props":24989,"children":24990},{},[24991],{"type":25,"value":24638},{"type":20,"tag":157,"props":24993,"children":24994},{"class":159,"line":24111},[24995],{"type":20,"tag":157,"props":24996,"children":24997},{},[24998],{"type":25,"value":24999},"     * 修改员工信息\n",{"type":20,"tag":157,"props":25001,"children":25002},{"class":159,"line":24119},[25003],{"type":20,"tag":157,"props":25004,"children":25005},{},[25006],{"type":25,"value":24654},{"type":20,"tag":157,"props":25008,"children":25009},{"class":159,"line":24128},[25010],{"type":20,"tag":157,"props":25011,"children":25012},{},[25013],{"type":25,"value":16841},{"type":20,"tag":157,"props":25015,"children":25016},{"class":159,"line":24137},[25017],{"type":20,"tag":157,"props":25018,"children":25019},{},[25020],{"type":25,"value":25021},"    public void testGetEmpByExample4() {\n",{"type":20,"tag":157,"props":25023,"children":25024},{"class":159,"line":24146},[25025],{"type":20,"tag":157,"props":25026,"children":25027},{},[25028],{"type":25,"value":24684},{"type":20,"tag":157,"props":25030,"children":25031},{"class":159,"line":24154},[25032],{"type":20,"tag":157,"props":25033,"children":25034},{},[25035],{"type":25,"value":24692},{"type":20,"tag":157,"props":25037,"children":25038},{"class":159,"line":24163},[25039],{"type":20,"tag":157,"props":25040,"children":25041},{},[25042],{"type":25,"value":24900},{"type":20,"tag":157,"props":25044,"children":25045},{"class":159,"line":24172},[25046],{"type":20,"tag":157,"props":25047,"children":25048},{},[25049],{"type":25,"value":25050},"        Emp emp = new Emp(1, \"小白\", 12, \"女\");\n",{"type":20,"tag":157,"props":25052,"children":25053},{"class":159,"line":24181},[25054],{"type":20,"tag":157,"props":25055,"children":25056},{},[25057],{"type":25,"value":25058},"        \u002F\u002F 1. 修改\n",{"type":20,"tag":157,"props":25060,"children":25061},{"class":159,"line":24190},[25062],{"type":20,"tag":157,"props":25063,"children":25064},{},[25065],{"type":25,"value":25066},"        int i1 = mapper.updateByPrimaryKey(emp);\n",{"type":20,"tag":157,"props":25068,"children":25070},{"class":159,"line":25069},70,[25071],{"type":20,"tag":157,"props":25072,"children":25073},{},[25074],{"type":25,"value":25075},"        \u002F\u002F 2. 选择性修改，不赋值或者为null的字段不会修改数据库\n",{"type":20,"tag":157,"props":25077,"children":25079},{"class":159,"line":25078},71,[25080],{"type":20,"tag":157,"props":25081,"children":25082},{},[25083],{"type":25,"value":25084},"        \u002F\u002F int i = mapper.updateByPrimaryKeySelective(emp);\n",{"type":20,"tag":157,"props":25086,"children":25088},{"class":159,"line":25087},72,[25089],{"type":20,"tag":157,"props":25090,"children":25091},{"emptyLinePlaceholder":173},[25092],{"type":25,"value":176},{"type":20,"tag":157,"props":25094,"children":25096},{"class":159,"line":25095},73,[25097],{"type":20,"tag":157,"props":25098,"children":25099},{},[25100],{"type":25,"value":872},{"type":20,"tag":157,"props":25102,"children":25104},{"class":159,"line":25103},74,[25105],{"type":20,"tag":157,"props":25106,"children":25107},{"emptyLinePlaceholder":173},[25108],{"type":25,"value":176},{"type":20,"tag":157,"props":25110,"children":25112},{"class":159,"line":25111},75,[25113],{"type":20,"tag":157,"props":25114,"children":25115},{},[25116],{"type":25,"value":943},{"type":20,"tag":11085,"props":25118,"children":25120},{"id":25119},"注意点",[25121],{"type":25,"value":25122},"注意点：",{"type":20,"tag":44,"props":25124,"children":25125},{},[25126],{"type":20,"tag":48,"props":25127,"children":25128},{},[25129],{"type":25,"value":25130},"逆向工程生成的实体类没有重写toString方法，直接打印会返回地址值",{"type":20,"tag":28,"props":25132,"children":25134},{"id":25133},"_11-分页插件",[25135],{"type":25,"value":25136},"11 分页插件",{"type":20,"tag":11085,"props":25138,"children":25140},{"id":25139},"_111-简介",[25141],{"type":25,"value":25142},"11.1 简介",{"type":20,"tag":21,"props":25144,"children":25145},{},[25146],{"type":20,"tag":33,"props":25147,"children":25148},{},[25149],{"type":25,"value":25150},"几个关键的属性：",{"type":20,"tag":21,"props":25152,"children":25153},{},[25154],{"type":25,"value":25155},"limit：sql语句中用于截取数据的关键字",{"type":20,"tag":21,"props":25157,"children":25158},{},[25159],{"type":25,"value":25160},"pageSize：每页显示的条数",{"type":20,"tag":21,"props":25162,"children":25163},{},[25164],{"type":25,"value":25165},"pageNum：当前页的页码",{"type":20,"tag":21,"props":25167,"children":25168},{},[25169],{"type":25,"value":25170},"index：当前也的起始索引，index=(pageNum - 1) * pageSize",{"type":20,"tag":21,"props":25172,"children":25173},{},[25174],{"type":25,"value":25175},"count:  总条数",{"type":20,"tag":21,"props":25177,"children":25178},{},[25179],{"type":25,"value":25180},"totalPage：总页数",{"type":20,"tag":21,"props":25182,"children":25183},{},[25184],{"type":25,"value":25185},"pageSize=4, pageNum=1, index=0, limit 0, 4",{"type":20,"tag":21,"props":25187,"children":25188},{},[25189],{"type":25,"value":25190},"pageSize=4, pageNum=3, index=8, limit 8, 4",{"type":20,"tag":21,"props":25192,"children":25193},{},[25194],{"type":25,"value":25195},"pageSize=4, pageNum=6, index=20, limil 20, 4",{"type":20,"tag":11085,"props":25197,"children":25199},{"id":25198},"_112-安装与配置分页插件",[25200],{"type":25,"value":25201},"11.2 安装与配置分页插件",{"type":20,"tag":44,"props":25203,"children":25204},{},[25205],{"type":20,"tag":48,"props":25206,"children":25207},{},[],{"type":20,"tag":18942,"props":25209,"children":25211},{"id":25210},"添加依赖",[25212],{"type":25,"value":25213},"添加依赖：",{"type":20,"tag":44,"props":25215,"children":25216},{},[25217],{"type":20,"tag":48,"props":25218,"children":25219},{},[],{"type":20,"tag":126,"props":25221,"children":25223},{"className":17052,"code":25222,"language":17054,"meta":8,"style":8},"\u003Cdependency>\n    \u003CgroupId>com.github.pagehelper\u003C\u002FgroupId>\n    \u003CartifactId>pagehelper\u003C\u002FartifactId>\n    \u003Cversion>5.2.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n",[25224],{"type":20,"tag":84,"props":25225,"children":25226},{"__ignoreMap":8},[25227,25234,25242,25250,25258],{"type":20,"tag":157,"props":25228,"children":25229},{"class":159,"line":160},[25230],{"type":20,"tag":157,"props":25231,"children":25232},{},[25233],{"type":25,"value":17074},{"type":20,"tag":157,"props":25235,"children":25236},{"class":159,"line":169},[25237],{"type":20,"tag":157,"props":25238,"children":25239},{},[25240],{"type":25,"value":25241},"    \u003CgroupId>com.github.pagehelper\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":25243,"children":25244},{"class":159,"line":179},[25245],{"type":20,"tag":157,"props":25246,"children":25247},{},[25248],{"type":25,"value":25249},"    \u003CartifactId>pagehelper\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":25251,"children":25252},{"class":159,"line":188},[25253],{"type":20,"tag":157,"props":25254,"children":25255},{},[25256],{"type":25,"value":25257},"    \u003Cversion>5.2.0\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":25259,"children":25260},{"class":159,"line":196},[25261],{"type":20,"tag":157,"props":25262,"children":25263},{},[25264],{"type":25,"value":17106},{"type":20,"tag":44,"props":25266,"children":25267},{},[25268],{"type":20,"tag":48,"props":25269,"children":25270},{},[25271],{"type":25,"value":25272},"在MyBatis中加入配置",{"type":20,"tag":126,"props":25274,"children":25276},{"className":17052,"code":25275,"language":17054,"meta":8,"style":8},"\u003CtypeAliases>\n    \u003Cpackage name=\"com.wangkun.mybatis.pojo\"\u002F>\n\u003C\u002FtypeAliases>\n\n\u003Cplugins>\n    \u003C!--设置分页插件-->\n    \u003Cplugin interceptor=\"com.github.pagehelper.PageInterceptor\">\u003C\u002Fplugin>\n\u003C\u002Fplugins>\n",[25277],{"type":20,"tag":84,"props":25278,"children":25279},{"__ignoreMap":8},[25280,25287,25294,25301,25308,25316,25324,25332],{"type":20,"tag":157,"props":25281,"children":25282},{"class":159,"line":160},[25283],{"type":20,"tag":157,"props":25284,"children":25285},{},[25286],{"type":25,"value":20368},{"type":20,"tag":157,"props":25288,"children":25289},{"class":159,"line":169},[25290],{"type":20,"tag":157,"props":25291,"children":25292},{},[25293],{"type":25,"value":20376},{"type":20,"tag":157,"props":25295,"children":25296},{"class":159,"line":179},[25297],{"type":20,"tag":157,"props":25298,"children":25299},{},[25300],{"type":25,"value":20384},{"type":20,"tag":157,"props":25302,"children":25303},{"class":159,"line":188},[25304],{"type":20,"tag":157,"props":25305,"children":25306},{"emptyLinePlaceholder":173},[25307],{"type":25,"value":176},{"type":20,"tag":157,"props":25309,"children":25310},{"class":159,"line":196},[25311],{"type":20,"tag":157,"props":25312,"children":25313},{},[25314],{"type":25,"value":25315},"\u003Cplugins>\n",{"type":20,"tag":157,"props":25317,"children":25318},{"class":159,"line":204},[25319],{"type":20,"tag":157,"props":25320,"children":25321},{},[25322],{"type":25,"value":25323},"    \u003C!--设置分页插件-->\n",{"type":20,"tag":157,"props":25325,"children":25326},{"class":159,"line":213},[25327],{"type":20,"tag":157,"props":25328,"children":25329},{},[25330],{"type":25,"value":25331},"    \u003Cplugin interceptor=\"com.github.pagehelper.PageInterceptor\">\u003C\u002Fplugin>\n",{"type":20,"tag":157,"props":25333,"children":25334},{"class":159,"line":222},[25335],{"type":20,"tag":157,"props":25336,"children":25337},{},[25338],{"type":25,"value":25339},"\u003C\u002Fplugins>\n",{"type":20,"tag":11085,"props":25341,"children":25343},{"id":25342},"_113-使用",[25344],{"type":25,"value":25345},"11.3 使用",{"type":20,"tag":126,"props":25347,"children":25349},{"className":16050,"code":25348,"language":16052,"meta":8,"style":8},"public class TestPage {\n    @Test\n    public void testPage() {\n        SqlSession sqlSession = SqlSessionUtil.getSqlSession();\n        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);\n        \u002F\u002F 设置页码数与每页显示多少条，同时返回分页相关的数据\n        Page\u003CObject> objects = PageHelper.startPage(1, 4);\n        List\u003CEmp> emps = mapper.selectByExample(null);\n        \u002F\u002F 查询功能之后可以再获取分页相关的所有数据（比上面的objects更加详细）\n        PageInfo\u003CEmp> empPageInfo = new PageInfo\u003C>(emps, 1);\n        for (Emp emp : emps) {\n            System.out.println(emp);\n        }\n        System.out.println(objects);\n    }\n}\n",[25350],{"type":20,"tag":84,"props":25351,"children":25352},{"__ignoreMap":8},[25353,25361,25368,25376,25383,25390,25398,25406,25413,25421,25429,25436,25443,25450,25458,25465],{"type":20,"tag":157,"props":25354,"children":25355},{"class":159,"line":160},[25356],{"type":20,"tag":157,"props":25357,"children":25358},{},[25359],{"type":25,"value":25360},"public class TestPage {\n",{"type":20,"tag":157,"props":25362,"children":25363},{"class":159,"line":169},[25364],{"type":20,"tag":157,"props":25365,"children":25366},{},[25367],{"type":25,"value":16841},{"type":20,"tag":157,"props":25369,"children":25370},{"class":159,"line":179},[25371],{"type":20,"tag":157,"props":25372,"children":25373},{},[25374],{"type":25,"value":25375},"    public void testPage() {\n",{"type":20,"tag":157,"props":25377,"children":25378},{"class":159,"line":188},[25379],{"type":20,"tag":157,"props":25380,"children":25381},{},[25382],{"type":25,"value":24684},{"type":20,"tag":157,"props":25384,"children":25385},{"class":159,"line":196},[25386],{"type":20,"tag":157,"props":25387,"children":25388},{},[25389],{"type":25,"value":24692},{"type":20,"tag":157,"props":25391,"children":25392},{"class":159,"line":204},[25393],{"type":20,"tag":157,"props":25394,"children":25395},{},[25396],{"type":25,"value":25397},"        \u002F\u002F 设置页码数与每页显示多少条，同时返回分页相关的数据\n",{"type":20,"tag":157,"props":25399,"children":25400},{"class":159,"line":213},[25401],{"type":20,"tag":157,"props":25402,"children":25403},{},[25404],{"type":25,"value":25405},"        Page\u003CObject> objects = PageHelper.startPage(1, 4);\n",{"type":20,"tag":157,"props":25407,"children":25408},{"class":159,"line":222},[25409],{"type":20,"tag":157,"props":25410,"children":25411},{},[25412],{"type":25,"value":24796},{"type":20,"tag":157,"props":25414,"children":25415},{"class":159,"line":440},[25416],{"type":20,"tag":157,"props":25417,"children":25418},{},[25419],{"type":25,"value":25420},"        \u002F\u002F 查询功能之后可以再获取分页相关的所有数据（比上面的objects更加详细）\n",{"type":20,"tag":157,"props":25422,"children":25423},{"class":159,"line":448},[25424],{"type":20,"tag":157,"props":25425,"children":25426},{},[25427],{"type":25,"value":25428},"        PageInfo\u003CEmp> empPageInfo = new PageInfo\u003C>(emps, 1);\n",{"type":20,"tag":157,"props":25430,"children":25431},{"class":159,"line":456},[25432],{"type":20,"tag":157,"props":25433,"children":25434},{},[25435],{"type":25,"value":24804},{"type":20,"tag":157,"props":25437,"children":25438},{"class":159,"line":465},[25439],{"type":20,"tag":157,"props":25440,"children":25441},{},[25442],{"type":25,"value":24812},{"type":20,"tag":157,"props":25444,"children":25445},{"class":159,"line":474},[25446],{"type":20,"tag":157,"props":25447,"children":25448},{},[25449],{"type":25,"value":24820},{"type":20,"tag":157,"props":25451,"children":25452},{"class":159,"line":483},[25453],{"type":20,"tag":157,"props":25454,"children":25455},{},[25456],{"type":25,"value":25457},"        System.out.println(objects);\n",{"type":20,"tag":157,"props":25459,"children":25460},{"class":159,"line":491},[25461],{"type":20,"tag":157,"props":25462,"children":25463},{},[25464],{"type":25,"value":872},{"type":20,"tag":157,"props":25466,"children":25467},{"class":159,"line":499},[25468],{"type":20,"tag":157,"props":25469,"children":25470},{},[25471],{"type":25,"value":943},{"type":20,"tag":1863,"props":25473,"children":25475},{"id":25474},"spring",[25476],{"type":25,"value":25477},"Spring",{"type":20,"tag":28,"props":25479,"children":25481},{"id":25480},"_1-简述",[25482],{"type":25,"value":25483},"1. 简述",{"type":20,"tag":11085,"props":25485,"children":25487},{"id":25486},"_11-spring概述",[25488],{"type":25,"value":25489},"1.1 Spring概述",{"type":20,"tag":44,"props":25491,"children":25492},{},[25493,25498,25503,25508],{"type":20,"tag":48,"props":25494,"children":25495},{},[25496],{"type":25,"value":25497},"Spring 是最受欢迎的企业级 Java 应用程序开发框架，数以百万的来自世界各地的开发人员使用Spring 框架来创建性能好、易于测试、可重用的代码。",{"type":20,"tag":48,"props":25499,"children":25500},{},[25501],{"type":25,"value":25502},"Spring 框架是一个开源的 Java 平台，它最初是由 Rod Johnson 编写的，并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。",{"type":20,"tag":48,"props":25504,"children":25505},{},[25506],{"type":25,"value":25507},"Spring 是轻量级的框架，其基础版本只有 2 MB 左右的大小。",{"type":20,"tag":48,"props":25509,"children":25510},{},[25511],{"type":25,"value":25512},"Spring 框架的核心特性是可以用于开发任何 Java 应用程序，但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用，通过启用基于 POJO编程模型来促进良好的编程实践。",{"type":20,"tag":11085,"props":25514,"children":25516},{"id":25515},"_12-spring-framework",[25517],{"type":25,"value":25518},"1.2 Spring Framework",{"type":20,"tag":6665,"props":25520,"children":25521},{},[25522],{"type":20,"tag":21,"props":25523,"children":25524},{},[25525],{"type":25,"value":25526},"Spring 的基础框架，可以视为 Spring 基础设施，基本上任何其他 Spring 项目都是以 Spring Framework为基础的。",{"type":20,"tag":18942,"props":25528,"children":25530},{"id":25529},"_121-特性",[25531],{"type":25,"value":25532},"1.2.1 特性",{"type":20,"tag":44,"props":25534,"children":25535},{},[25536,25541,25546,25551,25556,25561],{"type":20,"tag":48,"props":25537,"children":25538},{},[25539],{"type":25,"value":25540},"非侵入式：使用 Spring Framework 开发应用程序时，Spring 对应用程序本身的结构影响非常小。对领域模型可以做到零污染；对功能性组件也只需要使用几个简单的注解进行标记，完全不会破坏原有结构，反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序时结构清晰、简洁优雅。",{"type":20,"tag":48,"props":25542,"children":25543},{},[25544],{"type":25,"value":25545},"控制反转：IOC——Inversion of Control，翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好，我们享受资源注入。面向切面编程：AOP——Aspect Oriented Programming，在不修改源代码的基础上增强代码功能。",{"type":20,"tag":48,"props":25547,"children":25548},{},[25549],{"type":25,"value":25550},"容器：Spring IOC 是一个容器，因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理，替程序员屏蔽了组件创建过程中的大量细节，极大的降低了使用门槛，大幅度提高了开发效率。",{"type":20,"tag":48,"props":25552,"children":25553},{},[25554],{"type":25,"value":25555},"组件化：Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。",{"type":20,"tag":48,"props":25557,"children":25558},{},[25559],{"type":25,"value":25560},"声明式：很多以前需要编写代码才能实现的功能，现在只需要声明需求即可由框架代为实现。",{"type":20,"tag":48,"props":25562,"children":25563},{},[25564],{"type":25,"value":25565},"一站式：在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且Spring 旗下的项目已经覆盖了广泛领域，很多方面的功能性需求可以在 Spring Framework 的基础上全部使用 Spring 来实现。",{"type":20,"tag":18942,"props":25567,"children":25569},{"id":25568},"_122-spring-framework五大功能模块",[25570],{"type":25,"value":25571},"1.2.2 Spring Framework五大功能模块",{"type":20,"tag":1902,"props":25573,"children":25574},{},[25575,25591],{"type":20,"tag":1906,"props":25576,"children":25577},{},[25578],{"type":20,"tag":1910,"props":25579,"children":25580},{},[25581,25586],{"type":20,"tag":1914,"props":25582,"children":25583},{},[25584],{"type":25,"value":25585},"功能模块",{"type":20,"tag":1914,"props":25587,"children":25588},{},[25589],{"type":25,"value":25590},"功能介绍",{"type":20,"tag":1930,"props":25592,"children":25593},{},[25594,25607,25620,25633,25646],{"type":20,"tag":1910,"props":25595,"children":25596},{},[25597,25602],{"type":20,"tag":1937,"props":25598,"children":25599},{},[25600],{"type":25,"value":25601},"Core Container",{"type":20,"tag":1937,"props":25603,"children":25604},{},[25605],{"type":25,"value":25606},"核心容器，在Spring环境下使用任何功能都必须基于IOC容器",{"type":20,"tag":1910,"props":25608,"children":25609},{},[25610,25615],{"type":20,"tag":1937,"props":25611,"children":25612},{},[25613],{"type":25,"value":25614},"AOP&Aspects",{"type":20,"tag":1937,"props":25616,"children":25617},{},[25618],{"type":25,"value":25619},"面向切面编程",{"type":20,"tag":1910,"props":25621,"children":25622},{},[25623,25628],{"type":20,"tag":1937,"props":25624,"children":25625},{},[25626],{"type":25,"value":25627},"Testing",{"type":20,"tag":1937,"props":25629,"children":25630},{},[25631],{"type":25,"value":25632},"提供了对junit或TestNG测试框架的整合",{"type":20,"tag":1910,"props":25634,"children":25635},{},[25636,25641],{"type":20,"tag":1937,"props":25637,"children":25638},{},[25639],{"type":25,"value":25640},"Data Access\u002FIntegration",{"type":20,"tag":1937,"props":25642,"children":25643},{},[25644],{"type":25,"value":25645},"提供了对数据访问\u002F集成的功能",{"type":20,"tag":1910,"props":25647,"children":25648},{},[25649,25654],{"type":20,"tag":1937,"props":25650,"children":25651},{},[25652],{"type":25,"value":25653},"Spring MVC",{"type":20,"tag":1937,"props":25655,"children":25656},{},[25657],{"type":25,"value":25658},"提供了面向Web应用程序的集成功能",{"type":20,"tag":28,"props":25660,"children":25662},{"id":25661},"_2-ioc",[25663],{"type":25,"value":25664},"2. IOC",{"type":20,"tag":11085,"props":25666,"children":25668},{"id":25667},"_21-ioc容器",[25669],{"type":25,"value":25670},"2.1 IOC容器",{"type":20,"tag":18942,"props":25672,"children":25674},{"id":25673},"_211-ioc思想",[25675],{"type":25,"value":25676},"2.1.1 IOC思想",{"type":20,"tag":6665,"props":25678,"children":25679},{},[25680,25685],{"type":20,"tag":21,"props":25681,"children":25682},{},[25683],{"type":25,"value":25684},"IOC，即控制反转，是指把对象的创建、初始化、销毁交给 Spring 来管理，而不是由开发者控制，实现控制反转。IOC 思想基于 IOC 容器完成，IOC 容器底层就是对象工厂（BeanFactory 接口）。",{"type":20,"tag":21,"props":25686,"children":25687},{},[25688],{"type":25,"value":25689},"Spring 通过 IOC 容器来管理所有 Java 对象的实例化和初始化，控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean。",{"type":20,"tag":44,"props":25691,"children":25692},{},[25693,25723,25748],{"type":20,"tag":48,"props":25694,"children":25695},{},[25696,25701,25704,25706,25709,25711,25714,25716,25721],{"type":20,"tag":33,"props":25697,"children":25698},{},[25699],{"type":25,"value":25700},"获取资源的传统方式",{"type":20,"tag":9908,"props":25702,"children":25703},{},[],{"type":25,"value":25705},"\n自己做饭：买菜、洗菜、择菜、改刀、炒菜，全过程参与，费时费力，必须清楚了解资源创建整个过程",{"type":20,"tag":9908,"props":25707,"children":25708},{},[],{"type":25,"value":25710},"\n中的全部细节且熟练掌握。",{"type":20,"tag":9908,"props":25712,"children":25713},{},[],{"type":25,"value":25715},"\n在应用程序中的组件需要获取资源时，传统的方式是组件",{"type":20,"tag":33,"props":25717,"children":25718},{},[25719],{"type":25,"value":25720},"主动",{"type":25,"value":25722},"的从容器中获取所需要的资源，在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式，增加了学习成本，同时降低了开发效率。",{"type":20,"tag":48,"props":25724,"children":25725},{},[25726,25731,25734,25736,25739,25741,25746],{"type":20,"tag":33,"props":25727,"children":25728},{},[25729],{"type":25,"value":25730},"反转控制方式获取资源",{"type":20,"tag":9908,"props":25732,"children":25733},{},[],{"type":25,"value":25735},"\n点外卖：下单、等、吃，省时省力，不必关心资源创建过程的所有细节。",{"type":20,"tag":9908,"props":25737,"children":25738},{},[],{"type":25,"value":25740},"\n反转控制的思想完全颠覆了应用程序组件获取资源的传统方式：反转了资源的获取方向——改由容器主动的将资源推送给需要的组件，开发人员不需要知道容器是如何创建资源对象的，只需要提供接收资源的方式即可，极大的降低了学习成本，提高了开发的效率。这种行为也称为查找的",{"type":20,"tag":33,"props":25742,"children":25743},{},[25744],{"type":25,"value":25745},"被动",{"type":25,"value":25747},"形式。",{"type":20,"tag":48,"props":25749,"children":25750},{},[25751,25756,25759,25761,25766,25767,25770],{"type":20,"tag":33,"props":25752,"children":25753},{},[25754],{"type":25,"value":25755},"DI",{"type":20,"tag":9908,"props":25757,"children":25758},{},[],{"type":25,"value":25760},"\nDI：Dependency Injection，翻译过来是",{"type":20,"tag":33,"props":25762,"children":25763},{},[25764],{"type":25,"value":25765},"依赖注入",{"type":25,"value":110},{"type":20,"tag":9908,"props":25768,"children":25769},{},[],{"type":25,"value":25771},"\nDI 是 IOC 的另一种表述方式：即组件以一些预先定义好的方式（例如：setter 方法）接受来自于容器的资源注入。相对于IOC而言，这种表述更直接。",{"type":20,"tag":21,"props":25773,"children":25774},{},[25775],{"type":20,"tag":33,"props":25776,"children":25777},{},[25778],{"type":25,"value":25779},"结论：IOC 就是一种反转控制的思想， 而 DI 是对 IOC 的一种具体实现。",{"type":20,"tag":18942,"props":25781,"children":25783},{"id":25782},"_212-ioc容器在spring中的实现",[25784],{"type":25,"value":25785},"2.1.2 IOC容器在Spring中的实现",{"type":20,"tag":21,"props":25787,"children":25788},{},[25789],{"type":25,"value":25790},"Spring的IOC容器就是IOC思想的一个落地的产品实现、IOC容器中管理的组件也叫做bean。在创建bean之前，首先需要创建IOC容器。Spring提供了IOC容器的两种实现方式：",{"type":20,"tag":44,"props":25792,"children":25793},{},[25794,25804,25814],{"type":20,"tag":48,"props":25795,"children":25796},{},[25797,25799,25802],{"type":25,"value":25798},"BeanFactory",{"type":20,"tag":9908,"props":25800,"children":25801},{},[],{"type":25,"value":25803},"\n这是IOC容器的基本实现，是Spring内部使用的接口。面向Spring本身，不提供给开发人员使用",{"type":20,"tag":48,"props":25805,"children":25806},{},[25807,25809,25812],{"type":25,"value":25808},"ApplicationContext",{"type":20,"tag":9908,"props":25810,"children":25811},{},[],{"type":25,"value":25813},"\nBeanFactory的子接口，提供了更多的高级特性。面向Spring的使用者，几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。",{"type":20,"tag":48,"props":25815,"children":25816},{},[25817,25819,25822],{"type":25,"value":25818},"ApplicationContext的主要实现类",{"type":20,"tag":9908,"props":25820,"children":25821},{},[],{"type":25,"value":25823},"\n![image-20230318151145483](\u002FUsers\u002Fwangkun\u002FLibrary\u002FApplication Support\u002Ftypora-user-images\u002Fimage-20230318151145483.png)",{"type":20,"tag":1902,"props":25825,"children":25826},{},[25827,25843],{"type":20,"tag":1906,"props":25828,"children":25829},{},[25830],{"type":20,"tag":1910,"props":25831,"children":25832},{},[25833,25838],{"type":20,"tag":1914,"props":25834,"children":25835},{},[25836],{"type":25,"value":25837},"类型名",{"type":20,"tag":1914,"props":25839,"children":25840},{},[25841],{"type":25,"value":25842},"简介",{"type":20,"tag":1930,"props":25844,"children":25845},{},[25846,25859,25872,25885],{"type":20,"tag":1910,"props":25847,"children":25848},{},[25849,25854],{"type":20,"tag":1937,"props":25850,"children":25851},{},[25852],{"type":25,"value":25853},"ClassPathXmlApplicationContext",{"type":20,"tag":1937,"props":25855,"children":25856},{},[25857],{"type":25,"value":25858},"通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象",{"type":20,"tag":1910,"props":25860,"children":25861},{},[25862,25867],{"type":20,"tag":1937,"props":25863,"children":25864},{},[25865],{"type":25,"value":25866},"FileSystemXmlApplicationContext",{"type":20,"tag":1937,"props":25868,"children":25869},{},[25870],{"type":25,"value":25871},"通过文件系统路径读取XML格式的配置文件创建IOC容器对象",{"type":20,"tag":1910,"props":25873,"children":25874},{},[25875,25880],{"type":20,"tag":1937,"props":25876,"children":25877},{},[25878],{"type":25,"value":25879},"ConfigurableApplicationContext",{"type":20,"tag":1937,"props":25881,"children":25882},{},[25883],{"type":25,"value":25884},"ApplicationContext 的子接口，包含一些扩展方法refresh() 和 close() ，让 ApplicationContext 具有启动、关闭和刷新上下文的能力。",{"type":20,"tag":1910,"props":25886,"children":25887},{},[25888,25893],{"type":20,"tag":1937,"props":25889,"children":25890},{},[25891],{"type":25,"value":25892},"WebApplicationContext",{"type":20,"tag":1937,"props":25894,"children":25895},{},[25896],{"type":25,"value":25897},"专门为 Web 应用准备，基于 Web 环境创建 IOC 容器对象，并将对象引入存入 ServletContext 域中。",{"type":20,"tag":44,"props":25899,"children":25900},{},[25901],{"type":20,"tag":48,"props":25902,"children":25903},{},[],{"type":20,"tag":11085,"props":25905,"children":25907},{"id":25906},"_22-基于xml管理bean",[25908],{"type":25,"value":25909},"2.2 基于XML管理bean",{"type":20,"tag":18942,"props":25911,"children":25913},{"id":25912},"_221-实验一入门案例",[25914],{"type":25,"value":25915},"2.2.1 实验一：入门案例",{"type":20,"tag":6665,"props":25917,"children":25918},{},[25919,25924],{"type":20,"tag":21,"props":25920,"children":25921},{},[25922],{"type":25,"value":25923},"spring管理的对象我们称为组件或者bean",{"type":20,"tag":21,"props":25925,"children":25926},{},[25927],{"type":25,"value":25928},"Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象，这一点需要注意。如果在需要无参构造器时，没有无参构造器，会抛出异常",{"type":20,"tag":5719,"props":25930,"children":25931},{},[25932],{"type":20,"tag":48,"props":25933,"children":25934},{},[25935],{"type":25,"value":16047},{"type":20,"tag":126,"props":25937,"children":25939},{"className":17052,"code":25938,"language":17054,"meta":8,"style":8},"\u003Cdependencies>\n    \u003C!-- 基于Maven依赖传递性，导入spring-context依赖即可导入当前所需所有jar包 -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-context\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- junit测试 -->\n    \u003Cdependency>\n        \u003CgroupId>junit\u003C\u002FgroupId>\n        \u003CartifactId>junit\u003C\u002FartifactId>\n        \u003Cversion>4.12\u003C\u002Fversion>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n",[25940],{"type":20,"tag":84,"props":25941,"children":25942},{"__ignoreMap":8},[25943,25951,25959,25966,25974,25982,25990,25997,26005,26012,26019,26026,26033,26040,26047],{"type":20,"tag":157,"props":25944,"children":25945},{"class":159,"line":160},[25946],{"type":20,"tag":157,"props":25947,"children":25948},{},[25949],{"type":25,"value":25950},"\u003Cdependencies>\n",{"type":20,"tag":157,"props":25952,"children":25953},{"class":159,"line":169},[25954],{"type":20,"tag":157,"props":25955,"children":25956},{},[25957],{"type":25,"value":25958},"    \u003C!-- 基于Maven依赖传递性，导入spring-context依赖即可导入当前所需所有jar包 -->\n",{"type":20,"tag":157,"props":25960,"children":25961},{"class":159,"line":179},[25962],{"type":20,"tag":157,"props":25963,"children":25964},{},[25965],{"type":25,"value":16072},{"type":20,"tag":157,"props":25967,"children":25968},{"class":159,"line":188},[25969],{"type":20,"tag":157,"props":25970,"children":25971},{},[25972],{"type":25,"value":25973},"        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":25975,"children":25976},{"class":159,"line":196},[25977],{"type":20,"tag":157,"props":25978,"children":25979},{},[25980],{"type":25,"value":25981},"        \u003CartifactId>spring-context\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":25983,"children":25984},{"class":159,"line":204},[25985],{"type":20,"tag":157,"props":25986,"children":25987},{},[25988],{"type":25,"value":25989},"        \u003Cversion>5.3.1\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":25991,"children":25992},{"class":159,"line":213},[25993],{"type":20,"tag":157,"props":25994,"children":25995},{},[25996],{"type":25,"value":16190},{"type":20,"tag":157,"props":25998,"children":25999},{"class":159,"line":222},[26000],{"type":20,"tag":157,"props":26001,"children":26002},{},[26003],{"type":25,"value":26004},"    \u003C!-- junit测试 -->\n",{"type":20,"tag":157,"props":26006,"children":26007},{"class":159,"line":440},[26008],{"type":20,"tag":157,"props":26009,"children":26010},{},[26011],{"type":25,"value":16072},{"type":20,"tag":157,"props":26013,"children":26014},{"class":159,"line":448},[26015],{"type":20,"tag":157,"props":26016,"children":26017},{},[26018],{"type":25,"value":16119},{"type":20,"tag":157,"props":26020,"children":26021},{"class":159,"line":456},[26022],{"type":20,"tag":157,"props":26023,"children":26024},{},[26025],{"type":25,"value":16127},{"type":20,"tag":157,"props":26027,"children":26028},{"class":159,"line":465},[26029],{"type":20,"tag":157,"props":26030,"children":26031},{},[26032],{"type":25,"value":16135},{"type":20,"tag":157,"props":26034,"children":26035},{"class":159,"line":474},[26036],{"type":20,"tag":157,"props":26037,"children":26038},{},[26039],{"type":25,"value":16143},{"type":20,"tag":157,"props":26041,"children":26042},{"class":159,"line":483},[26043],{"type":20,"tag":157,"props":26044,"children":26045},{},[26046],{"type":25,"value":16190},{"type":20,"tag":157,"props":26048,"children":26049},{"class":159,"line":491},[26050],{"type":20,"tag":157,"props":26051,"children":26052},{},[26053],{"type":25,"value":16198},{"type":20,"tag":5719,"props":26055,"children":26056},{"start":169},[26057],{"type":20,"tag":48,"props":26058,"children":26059},{},[26060],{"type":25,"value":26061},"创建类组件",{"type":20,"tag":126,"props":26063,"children":26065},{"className":16050,"code":26064,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.pojo;\n\npublic class HelloWorld {\n\n    public void sayHello() {\n\n        System.out.println(\"hello，spring\");\n\n    }\n}\n",[26066],{"type":20,"tag":84,"props":26067,"children":26068},{"__ignoreMap":8},[26069,26077,26084,26092,26099,26107,26114,26122,26129,26136],{"type":20,"tag":157,"props":26070,"children":26071},{"class":159,"line":160},[26072],{"type":20,"tag":157,"props":26073,"children":26074},{},[26075],{"type":25,"value":26076},"package com.wangkun.spring.pojo;\n",{"type":20,"tag":157,"props":26078,"children":26079},{"class":159,"line":169},[26080],{"type":20,"tag":157,"props":26081,"children":26082},{"emptyLinePlaceholder":173},[26083],{"type":25,"value":176},{"type":20,"tag":157,"props":26085,"children":26086},{"class":159,"line":179},[26087],{"type":20,"tag":157,"props":26088,"children":26089},{},[26090],{"type":25,"value":26091},"public class HelloWorld {\n",{"type":20,"tag":157,"props":26093,"children":26094},{"class":159,"line":188},[26095],{"type":20,"tag":157,"props":26096,"children":26097},{"emptyLinePlaceholder":173},[26098],{"type":25,"value":176},{"type":20,"tag":157,"props":26100,"children":26101},{"class":159,"line":196},[26102],{"type":20,"tag":157,"props":26103,"children":26104},{},[26105],{"type":25,"value":26106},"    public void sayHello() {\n",{"type":20,"tag":157,"props":26108,"children":26109},{"class":159,"line":204},[26110],{"type":20,"tag":157,"props":26111,"children":26112},{"emptyLinePlaceholder":173},[26113],{"type":25,"value":176},{"type":20,"tag":157,"props":26115,"children":26116},{"class":159,"line":213},[26117],{"type":20,"tag":157,"props":26118,"children":26119},{},[26120],{"type":25,"value":26121},"        System.out.println(\"hello，spring\");\n",{"type":20,"tag":157,"props":26123,"children":26124},{"class":159,"line":222},[26125],{"type":20,"tag":157,"props":26126,"children":26127},{"emptyLinePlaceholder":173},[26128],{"type":25,"value":176},{"type":20,"tag":157,"props":26130,"children":26131},{"class":159,"line":440},[26132],{"type":20,"tag":157,"props":26133,"children":26134},{},[26135],{"type":25,"value":872},{"type":20,"tag":157,"props":26137,"children":26138},{"class":159,"line":448},[26139],{"type":20,"tag":157,"props":26140,"children":26141},{},[26142],{"type":25,"value":943},{"type":20,"tag":5719,"props":26144,"children":26145},{"start":179},[26146,26156],{"type":20,"tag":48,"props":26147,"children":26148},{},[26149,26151,26154],{"type":25,"value":26150},"创建spring配置文件",{"type":20,"tag":9908,"props":26152,"children":26153},{},[],{"type":25,"value":26155},"\n![image-20230318161923722](\u002FUsers\u002Fwangkun\u002FLibrary\u002FApplication Support\u002Ftypora-user-images\u002Fimage-20230318161923722.png)",{"type":20,"tag":48,"props":26157,"children":26158},{},[26159],{"type":25,"value":26160},"在spring配置文件中配置bean",{"type":20,"tag":126,"props":26162,"children":26164},{"className":17052,"code":26163,"language":17054,"meta":8,"style":8},"\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       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n\n    \u003C!--\n        bean：配置一个bean对象，将对象交给IOC容器管理\n        属性：\n        id：bean的唯一标识，不能重复\n        class：设置bean对象所对应的类型\n    -->\n    \u003Cbean id=\"helloWorld\" class=\"com.wangkun.spring.pojo.HelloWorld\"\u002F>\n\n\u003C\u002Fbeans>\n",[26165],{"type":20,"tag":84,"props":26166,"children":26167},{"__ignoreMap":8},[26168,26175,26183,26191,26199,26206,26214,26222,26230,26238,26246,26254,26262,26269],{"type":20,"tag":157,"props":26169,"children":26170},{"class":159,"line":160},[26171],{"type":20,"tag":157,"props":26172,"children":26173},{},[26174],{"type":25,"value":23638},{"type":20,"tag":157,"props":26176,"children":26177},{"class":159,"line":169},[26178],{"type":20,"tag":157,"props":26179,"children":26180},{},[26181],{"type":25,"value":26182},"\u003Cbeans xmlns=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\"\n",{"type":20,"tag":157,"props":26184,"children":26185},{"class":159,"line":179},[26186],{"type":20,"tag":157,"props":26187,"children":26188},{},[26189],{"type":25,"value":26190},"       xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n",{"type":20,"tag":157,"props":26192,"children":26193},{"class":159,"line":188},[26194],{"type":20,"tag":157,"props":26195,"children":26196},{},[26197],{"type":25,"value":26198},"       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n",{"type":20,"tag":157,"props":26200,"children":26201},{"class":159,"line":196},[26202],{"type":20,"tag":157,"props":26203,"children":26204},{"emptyLinePlaceholder":173},[26205],{"type":25,"value":176},{"type":20,"tag":157,"props":26207,"children":26208},{"class":159,"line":204},[26209],{"type":20,"tag":157,"props":26210,"children":26211},{},[26212],{"type":25,"value":26213},"    \u003C!--\n",{"type":20,"tag":157,"props":26215,"children":26216},{"class":159,"line":213},[26217],{"type":20,"tag":157,"props":26218,"children":26219},{},[26220],{"type":25,"value":26221},"        bean：配置一个bean对象，将对象交给IOC容器管理\n",{"type":20,"tag":157,"props":26223,"children":26224},{"class":159,"line":222},[26225],{"type":20,"tag":157,"props":26226,"children":26227},{},[26228],{"type":25,"value":26229},"        属性：\n",{"type":20,"tag":157,"props":26231,"children":26232},{"class":159,"line":440},[26233],{"type":20,"tag":157,"props":26234,"children":26235},{},[26236],{"type":25,"value":26237},"        id：bean的唯一标识，不能重复\n",{"type":20,"tag":157,"props":26239,"children":26240},{"class":159,"line":448},[26241],{"type":20,"tag":157,"props":26242,"children":26243},{},[26244],{"type":25,"value":26245},"        class：设置bean对象所对应的类型\n",{"type":20,"tag":157,"props":26247,"children":26248},{"class":159,"line":456},[26249],{"type":20,"tag":157,"props":26250,"children":26251},{},[26252],{"type":25,"value":26253},"    -->\n",{"type":20,"tag":157,"props":26255,"children":26256},{"class":159,"line":465},[26257],{"type":20,"tag":157,"props":26258,"children":26259},{},[26260],{"type":25,"value":26261},"    \u003Cbean id=\"helloWorld\" class=\"com.wangkun.spring.pojo.HelloWorld\"\u002F>\n",{"type":20,"tag":157,"props":26263,"children":26264},{"class":159,"line":474},[26265],{"type":20,"tag":157,"props":26266,"children":26267},{"emptyLinePlaceholder":173},[26268],{"type":25,"value":176},{"type":20,"tag":157,"props":26270,"children":26271},{"class":159,"line":483},[26272],{"type":20,"tag":157,"props":26273,"children":26274},{},[26275],{"type":25,"value":26276},"\u003C\u002Fbeans>\n",{"type":20,"tag":5719,"props":26278,"children":26279},{"start":196},[26280],{"type":20,"tag":48,"props":26281,"children":26282},{},[26283],{"type":25,"value":26284},"创建测试类测试",{"type":20,"tag":126,"props":26286,"children":26288},{"className":16050,"code":26287,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.test;\n\nimport com.wangkun.spring.pojo.HelloWorld;\nimport org.junit.Test;\nimport org.springframework.context.annotation.ClassPathBeanDefinitionScanner;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\npublic class TestHelloWorld {\n    @Test\n    public void test() {\n        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n\n        HelloWorld helloWorld = (HelloWorld) ioc.getBean(\"helloWorld\");\n        helloWorld.sayHello();\n    }\n}\n",[26289],{"type":20,"tag":84,"props":26290,"children":26291},{"__ignoreMap":8},[26292,26300,26307,26315,26322,26330,26338,26345,26353,26360,26368,26376,26383,26391,26399,26406],{"type":20,"tag":157,"props":26293,"children":26294},{"class":159,"line":160},[26295],{"type":20,"tag":157,"props":26296,"children":26297},{},[26298],{"type":25,"value":26299},"package com.wangkun.spring.test;\n",{"type":20,"tag":157,"props":26301,"children":26302},{"class":159,"line":169},[26303],{"type":20,"tag":157,"props":26304,"children":26305},{"emptyLinePlaceholder":173},[26306],{"type":25,"value":176},{"type":20,"tag":157,"props":26308,"children":26309},{"class":159,"line":179},[26310],{"type":20,"tag":157,"props":26311,"children":26312},{},[26313],{"type":25,"value":26314},"import com.wangkun.spring.pojo.HelloWorld;\n",{"type":20,"tag":157,"props":26316,"children":26317},{"class":159,"line":188},[26318],{"type":20,"tag":157,"props":26319,"children":26320},{},[26321],{"type":25,"value":16795},{"type":20,"tag":157,"props":26323,"children":26324},{"class":159,"line":196},[26325],{"type":20,"tag":157,"props":26326,"children":26327},{},[26328],{"type":25,"value":26329},"import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;\n",{"type":20,"tag":157,"props":26331,"children":26332},{"class":159,"line":204},[26333],{"type":20,"tag":157,"props":26334,"children":26335},{},[26336],{"type":25,"value":26337},"import org.springframework.context.support.ClassPathXmlApplicationContext;\n",{"type":20,"tag":157,"props":26339,"children":26340},{"class":159,"line":213},[26341],{"type":20,"tag":157,"props":26342,"children":26343},{"emptyLinePlaceholder":173},[26344],{"type":25,"value":176},{"type":20,"tag":157,"props":26346,"children":26347},{"class":159,"line":222},[26348],{"type":20,"tag":157,"props":26349,"children":26350},{},[26351],{"type":25,"value":26352},"public class TestHelloWorld {\n",{"type":20,"tag":157,"props":26354,"children":26355},{"class":159,"line":440},[26356],{"type":20,"tag":157,"props":26357,"children":26358},{},[26359],{"type":25,"value":16841},{"type":20,"tag":157,"props":26361,"children":26362},{"class":159,"line":448},[26363],{"type":20,"tag":157,"props":26364,"children":26365},{},[26366],{"type":25,"value":26367},"    public void test() {\n",{"type":20,"tag":157,"props":26369,"children":26370},{"class":159,"line":456},[26371],{"type":20,"tag":157,"props":26372,"children":26373},{},[26374],{"type":25,"value":26375},"        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n",{"type":20,"tag":157,"props":26377,"children":26378},{"class":159,"line":465},[26379],{"type":20,"tag":157,"props":26380,"children":26381},{"emptyLinePlaceholder":173},[26382],{"type":25,"value":176},{"type":20,"tag":157,"props":26384,"children":26385},{"class":159,"line":474},[26386],{"type":20,"tag":157,"props":26387,"children":26388},{},[26389],{"type":25,"value":26390},"        HelloWorld helloWorld = (HelloWorld) ioc.getBean(\"helloWorld\");\n",{"type":20,"tag":157,"props":26392,"children":26393},{"class":159,"line":483},[26394],{"type":20,"tag":157,"props":26395,"children":26396},{},[26397],{"type":25,"value":26398},"        helloWorld.sayHello();\n",{"type":20,"tag":157,"props":26400,"children":26401},{"class":159,"line":491},[26402],{"type":20,"tag":157,"props":26403,"children":26404},{},[26405],{"type":25,"value":872},{"type":20,"tag":157,"props":26407,"children":26408},{"class":159,"line":499},[26409],{"type":20,"tag":157,"props":26410,"children":26411},{},[26412],{"type":25,"value":943},{"type":20,"tag":18942,"props":26414,"children":26416},{"id":26415},"_222-获取bean的三种方式",[26417],{"type":25,"value":26418},"2.2.2 获取bean的三种方式",{"type":20,"tag":5719,"props":26420,"children":26421},{},[26422,26427,26432],{"type":20,"tag":48,"props":26423,"children":26424},{},[26425],{"type":25,"value":26426},"根据id获取",{"type":20,"tag":48,"props":26428,"children":26429},{},[26430],{"type":25,"value":26431},"根据类型获取（最常用）",{"type":20,"tag":48,"props":26433,"children":26434},{},[26435],{"type":25,"value":26436},"根据类型和id获取",{"type":20,"tag":126,"props":26438,"children":26440},{"className":16050,"code":26439,"language":16052,"meta":8,"style":8},"@Test\npublic void test() {\n    ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n\n    \u002F*获取bean的三种方式*\u002F\n    \u002F\u002F 1. 根据id获取\n    \u002F\u002F Student studentOne = (Student) ioc.getBean(\"studentOne\");\n\n    \u002F\u002F 2. 根据类型获取 最常用\n    \u002F\u002F Student bean = ioc.getBean(Student.class);\n\n    \u002F\u002F 3. 根据类型和id获取\n    Student bean = ioc.getBean(\"studentOne\", Student.class);\n\n    System.out.println(bean);\n}\n",[26441],{"type":20,"tag":84,"props":26442,"children":26443},{"__ignoreMap":8},[26444,26451,26459,26467,26474,26482,26490,26498,26505,26513,26521,26528,26536,26544,26551,26559],{"type":20,"tag":157,"props":26445,"children":26446},{"class":159,"line":160},[26447],{"type":20,"tag":157,"props":26448,"children":26449},{},[26450],{"type":25,"value":17978},{"type":20,"tag":157,"props":26452,"children":26453},{"class":159,"line":169},[26454],{"type":20,"tag":157,"props":26455,"children":26456},{},[26457],{"type":25,"value":26458},"public void test() {\n",{"type":20,"tag":157,"props":26460,"children":26461},{"class":159,"line":179},[26462],{"type":20,"tag":157,"props":26463,"children":26464},{},[26465],{"type":25,"value":26466},"    ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n",{"type":20,"tag":157,"props":26468,"children":26469},{"class":159,"line":188},[26470],{"type":20,"tag":157,"props":26471,"children":26472},{"emptyLinePlaceholder":173},[26473],{"type":25,"value":176},{"type":20,"tag":157,"props":26475,"children":26476},{"class":159,"line":196},[26477],{"type":20,"tag":157,"props":26478,"children":26479},{},[26480],{"type":25,"value":26481},"    \u002F*获取bean的三种方式*\u002F\n",{"type":20,"tag":157,"props":26483,"children":26484},{"class":159,"line":204},[26485],{"type":20,"tag":157,"props":26486,"children":26487},{},[26488],{"type":25,"value":26489},"    \u002F\u002F 1. 根据id获取\n",{"type":20,"tag":157,"props":26491,"children":26492},{"class":159,"line":213},[26493],{"type":20,"tag":157,"props":26494,"children":26495},{},[26496],{"type":25,"value":26497},"    \u002F\u002F Student studentOne = (Student) ioc.getBean(\"studentOne\");\n",{"type":20,"tag":157,"props":26499,"children":26500},{"class":159,"line":222},[26501],{"type":20,"tag":157,"props":26502,"children":26503},{"emptyLinePlaceholder":173},[26504],{"type":25,"value":176},{"type":20,"tag":157,"props":26506,"children":26507},{"class":159,"line":440},[26508],{"type":20,"tag":157,"props":26509,"children":26510},{},[26511],{"type":25,"value":26512},"    \u002F\u002F 2. 根据类型获取 最常用\n",{"type":20,"tag":157,"props":26514,"children":26515},{"class":159,"line":448},[26516],{"type":20,"tag":157,"props":26517,"children":26518},{},[26519],{"type":25,"value":26520},"    \u002F\u002F Student bean = ioc.getBean(Student.class);\n",{"type":20,"tag":157,"props":26522,"children":26523},{"class":159,"line":456},[26524],{"type":20,"tag":157,"props":26525,"children":26526},{"emptyLinePlaceholder":173},[26527],{"type":25,"value":176},{"type":20,"tag":157,"props":26529,"children":26530},{"class":159,"line":465},[26531],{"type":20,"tag":157,"props":26532,"children":26533},{},[26534],{"type":25,"value":26535},"    \u002F\u002F 3. 根据类型和id获取\n",{"type":20,"tag":157,"props":26537,"children":26538},{"class":159,"line":474},[26539],{"type":20,"tag":157,"props":26540,"children":26541},{},[26542],{"type":25,"value":26543},"    Student bean = ioc.getBean(\"studentOne\", Student.class);\n",{"type":20,"tag":157,"props":26545,"children":26546},{"class":159,"line":483},[26547],{"type":20,"tag":157,"props":26548,"children":26549},{"emptyLinePlaceholder":173},[26550],{"type":25,"value":176},{"type":20,"tag":157,"props":26552,"children":26553},{"class":159,"line":491},[26554],{"type":20,"tag":157,"props":26555,"children":26556},{},[26557],{"type":25,"value":26558},"    System.out.println(bean);\n",{"type":20,"tag":157,"props":26560,"children":26561},{"class":159,"line":499},[26562],{"type":20,"tag":157,"props":26563,"children":26564},{},[26565],{"type":25,"value":943},{"type":20,"tag":21,"props":26567,"children":26568},{},[26569],{"type":20,"tag":33,"props":26570,"children":26571},{},[26572],{"type":25,"value":26573},"注意：",{"type":20,"tag":44,"props":26575,"children":26576},{},[26577,26582],{"type":20,"tag":48,"props":26578,"children":26579},{},[26580],{"type":25,"value":26581},"当根据类型获取bean时，要IOC容器中指定的类型的bean有且只能有一个",{"type":20,"tag":48,"props":26583,"children":26584},{},[26585],{"type":25,"value":26586},"如果组件类实现了接口，根据接口类型可以获取到bean，但前提是有且只一个类实现了这个接口",{"type":20,"tag":21,"props":26588,"children":26589},{},[26590],{"type":20,"tag":33,"props":26591,"children":26592},{},[26593],{"type":25,"value":26594},"结论：",{"type":20,"tag":21,"props":26596,"children":26597},{},[26598,26600,26605],{"type":25,"value":26599},"根据类型来获取bean时，在满足bean唯一性的前提下，其实只是看：「对象 ",{"type":20,"tag":33,"props":26601,"children":26602},{},[26603],{"type":25,"value":26604},"instanceof",{"type":25,"value":26606}," 指定的类型」的返回的结果，只要返回的是true就可以认定为和类型匹配，就能够获取到",{"type":20,"tag":11085,"props":26608,"children":26610},{"id":26609},"_23-依赖注入",[26611],{"type":25,"value":26612},"2.3 依赖注入",{"type":20,"tag":6665,"props":26614,"children":26615},{},[26616],{"type":20,"tag":21,"props":26617,"children":26618},{},[26619],{"type":25,"value":26620},"就是给类组件中的属性赋值。",{"type":20,"tag":21,"props":26622,"children":26623},{},[26624],{"type":20,"tag":33,"props":26625,"children":26626},{},[26627],{"type":25,"value":26628},"较完整的xml头部标签",{"type":20,"tag":126,"props":26630,"children":26632},{"className":17052,"code":26631,"language":17054,"meta":8,"style":8},"\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=\"\n         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  \u003C\u002Fbeans>\n",[26633],{"type":20,"tag":84,"props":26634,"children":26635},{"__ignoreMap":8},[26636,26643,26651,26658,26666,26674,26682,26690,26698,26706],{"type":20,"tag":157,"props":26637,"children":26638},{"class":159,"line":160},[26639],{"type":20,"tag":157,"props":26640,"children":26641},{},[26642],{"type":25,"value":23638},{"type":20,"tag":157,"props":26644,"children":26645},{"class":159,"line":169},[26646],{"type":20,"tag":157,"props":26647,"children":26648},{},[26649],{"type":25,"value":26650},"  \u003Cbeans xmlns=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\"\n",{"type":20,"tag":157,"props":26652,"children":26653},{"class":159,"line":179},[26654],{"type":20,"tag":157,"props":26655,"children":26656},{},[26657],{"type":25,"value":23654},{"type":20,"tag":157,"props":26659,"children":26660},{"class":159,"line":188},[26661],{"type":20,"tag":157,"props":26662,"children":26663},{},[26664],{"type":25,"value":26665},"         xmlns:context=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\"\n",{"type":20,"tag":157,"props":26667,"children":26668},{"class":159,"line":196},[26669],{"type":20,"tag":157,"props":26670,"children":26671},{},[26672],{"type":25,"value":26673},"         xsi:schemaLocation=\"\n",{"type":20,"tag":157,"props":26675,"children":26676},{"class":159,"line":204},[26677],{"type":20,"tag":157,"props":26678,"children":26679},{},[26680],{"type":25,"value":26681},"         http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n",{"type":20,"tag":157,"props":26683,"children":26684},{"class":159,"line":213},[26685],{"type":20,"tag":157,"props":26686,"children":26687},{},[26688],{"type":25,"value":26689},"         http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\n",{"type":20,"tag":157,"props":26691,"children":26692},{"class":159,"line":222},[26693],{"type":20,"tag":157,"props":26694,"children":26695},{},[26696],{"type":25,"value":26697},"         http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\n",{"type":20,"tag":157,"props":26699,"children":26700},{"class":159,"line":440},[26701],{"type":20,"tag":157,"props":26702,"children":26703},{},[26704],{"type":25,"value":26705},"         http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n",{"type":20,"tag":157,"props":26707,"children":26708},{"class":159,"line":448},[26709],{"type":20,"tag":157,"props":26710,"children":26711},{},[26712],{"type":25,"value":26713},"  \u003C\u002Fbeans>\n",{"type":20,"tag":18942,"props":26715,"children":26717},{"id":26716},"_231-setting注入",[26718],{"type":25,"value":26719},"2.3.1 setting注入",{"type":20,"tag":126,"props":26721,"children":26723},{"className":17052,"code":26722,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentTwo\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"张三\"\u002F>\n    \u003Cproperty name=\"age\" value=\"12\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n\u003C\u002Fbean>\n",[26724],{"type":20,"tag":84,"props":26725,"children":26726},{"__ignoreMap":8},[26727,26735,26743,26751,26759,26767],{"type":20,"tag":157,"props":26728,"children":26729},{"class":159,"line":160},[26730],{"type":20,"tag":157,"props":26731,"children":26732},{},[26733],{"type":25,"value":26734},"\u003Cbean id=\"studentTwo\" class=\"com.wangkun.spring.pojo.Student\">\n",{"type":20,"tag":157,"props":26736,"children":26737},{"class":159,"line":169},[26738],{"type":20,"tag":157,"props":26739,"children":26740},{},[26741],{"type":25,"value":26742},"    \u003Cproperty name=\"SId\" value=\"1\"\u002F>\n",{"type":20,"tag":157,"props":26744,"children":26745},{"class":159,"line":179},[26746],{"type":20,"tag":157,"props":26747,"children":26748},{},[26749],{"type":25,"value":26750},"    \u003Cproperty name=\"SName\" value=\"张三\"\u002F>\n",{"type":20,"tag":157,"props":26752,"children":26753},{"class":159,"line":188},[26754],{"type":20,"tag":157,"props":26755,"children":26756},{},[26757],{"type":25,"value":26758},"    \u003Cproperty name=\"age\" value=\"12\"\u002F>\n",{"type":20,"tag":157,"props":26760,"children":26761},{"class":159,"line":196},[26762],{"type":20,"tag":157,"props":26763,"children":26764},{},[26765],{"type":25,"value":26766},"    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n",{"type":20,"tag":157,"props":26768,"children":26769},{"class":159,"line":204},[26770],{"type":20,"tag":157,"props":26771,"children":26772},{},[26773],{"type":25,"value":26774},"\u003C\u002Fbean>\n",{"type":20,"tag":18942,"props":26776,"children":26778},{"id":26777},"_232-构造器注入",[26779],{"type":25,"value":26780},"2.3.2 构造器注入",{"type":20,"tag":126,"props":26782,"children":26784},{"className":17052,"code":26783,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cconstructor-arg value=\"10001\"\u002F>\n    \u003Cconstructor-arg value=\"李四\"\u002F>\n    \u003Cconstructor-arg value=\"女\"\u002F>\n    \u003C!--可以通过nane指定给那个属性赋值-->\n    \u003Cconstructor-arg value=\"12\" name=\"age\"\u002F>\n\u003C\u002Fbean>\n",[26785],{"type":20,"tag":84,"props":26786,"children":26787},{"__ignoreMap":8},[26788,26796,26804,26812,26820,26828,26836],{"type":20,"tag":157,"props":26789,"children":26790},{"class":159,"line":160},[26791],{"type":20,"tag":157,"props":26792,"children":26793},{},[26794],{"type":25,"value":26795},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n",{"type":20,"tag":157,"props":26797,"children":26798},{"class":159,"line":169},[26799],{"type":20,"tag":157,"props":26800,"children":26801},{},[26802],{"type":25,"value":26803},"    \u003Cconstructor-arg value=\"10001\"\u002F>\n",{"type":20,"tag":157,"props":26805,"children":26806},{"class":159,"line":179},[26807],{"type":20,"tag":157,"props":26808,"children":26809},{},[26810],{"type":25,"value":26811},"    \u003Cconstructor-arg value=\"李四\"\u002F>\n",{"type":20,"tag":157,"props":26813,"children":26814},{"class":159,"line":188},[26815],{"type":20,"tag":157,"props":26816,"children":26817},{},[26818],{"type":25,"value":26819},"    \u003Cconstructor-arg value=\"女\"\u002F>\n",{"type":20,"tag":157,"props":26821,"children":26822},{"class":159,"line":196},[26823],{"type":20,"tag":157,"props":26824,"children":26825},{},[26826],{"type":25,"value":26827},"    \u003C!--可以通过nane指定给那个属性赋值-->\n",{"type":20,"tag":157,"props":26829,"children":26830},{"class":159,"line":204},[26831],{"type":20,"tag":157,"props":26832,"children":26833},{},[26834],{"type":25,"value":26835},"    \u003Cconstructor-arg value=\"12\" name=\"age\"\u002F>\n",{"type":20,"tag":157,"props":26837,"children":26838},{"class":159,"line":213},[26839],{"type":20,"tag":157,"props":26840,"children":26841},{},[26842],{"type":25,"value":26774},{"type":20,"tag":18942,"props":26844,"children":26846},{"id":26845},"_233-特殊值处理",[26847],{"type":25,"value":26848},"2.3.3 特殊值处理",{"type":20,"tag":44,"props":26850,"children":26851},{},[26852],{"type":20,"tag":48,"props":26853,"children":26854},{},[26855],{"type":25,"value":26856},"null",{"type":20,"tag":126,"props":26858,"children":26860},{"className":17052,"code":26859,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentTwo\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"张三\"\u002F>\n    \u003Cproperty name=\"age\" value=\"12\"\u002F>\n    \u003Cproperty name=\"gender\">\n        \u003Cnull\u002F>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"score\" value=\"24.1\"\u002F>\n\u003C\u002Fbean>\n",[26861],{"type":20,"tag":84,"props":26862,"children":26863},{"__ignoreMap":8},[26864,26871,26878,26885,26892,26900,26908,26916,26924],{"type":20,"tag":157,"props":26865,"children":26866},{"class":159,"line":160},[26867],{"type":20,"tag":157,"props":26868,"children":26869},{},[26870],{"type":25,"value":26734},{"type":20,"tag":157,"props":26872,"children":26873},{"class":159,"line":169},[26874],{"type":20,"tag":157,"props":26875,"children":26876},{},[26877],{"type":25,"value":26742},{"type":20,"tag":157,"props":26879,"children":26880},{"class":159,"line":179},[26881],{"type":20,"tag":157,"props":26882,"children":26883},{},[26884],{"type":25,"value":26750},{"type":20,"tag":157,"props":26886,"children":26887},{"class":159,"line":188},[26888],{"type":20,"tag":157,"props":26889,"children":26890},{},[26891],{"type":25,"value":26758},{"type":20,"tag":157,"props":26893,"children":26894},{"class":159,"line":196},[26895],{"type":20,"tag":157,"props":26896,"children":26897},{},[26898],{"type":25,"value":26899},"    \u003Cproperty name=\"gender\">\n",{"type":20,"tag":157,"props":26901,"children":26902},{"class":159,"line":204},[26903],{"type":20,"tag":157,"props":26904,"children":26905},{},[26906],{"type":25,"value":26907},"        \u003Cnull\u002F>\n",{"type":20,"tag":157,"props":26909,"children":26910},{"class":159,"line":213},[26911],{"type":20,"tag":157,"props":26912,"children":26913},{},[26914],{"type":25,"value":26915},"    \u003C\u002Fproperty>\n",{"type":20,"tag":157,"props":26917,"children":26918},{"class":159,"line":222},[26919],{"type":20,"tag":157,"props":26920,"children":26921},{},[26922],{"type":25,"value":26923},"    \u003Cproperty name=\"score\" value=\"24.1\"\u002F>\n",{"type":20,"tag":157,"props":26925,"children":26926},{"class":159,"line":440},[26927],{"type":20,"tag":157,"props":26928,"children":26929},{},[26930],{"type":25,"value":26774},{"type":20,"tag":44,"props":26932,"children":26933},{},[26934],{"type":20,"tag":48,"props":26935,"children":26936},{},[26937],{"type":25,"value":26938},"xml实体",{"type":20,"tag":126,"props":26940,"children":26942},{"className":17052,"code":26941,"language":17054,"meta":8,"style":8},"\u003C!-- 小于号在XML文档中用来定义标签的开始，不能随便使用 --> \n\u003C!-- 解决方案一：使用XML实体来代替 --> \n\u003Cproperty name=\"expression\" value=\"a &lt; b\"\u002F>\n",[26943],{"type":20,"tag":84,"props":26944,"children":26945},{"__ignoreMap":8},[26946,26954,26962],{"type":20,"tag":157,"props":26947,"children":26948},{"class":159,"line":160},[26949],{"type":20,"tag":157,"props":26950,"children":26951},{},[26952],{"type":25,"value":26953},"\u003C!-- 小于号在XML文档中用来定义标签的开始，不能随便使用 --> \n",{"type":20,"tag":157,"props":26955,"children":26956},{"class":159,"line":169},[26957],{"type":20,"tag":157,"props":26958,"children":26959},{},[26960],{"type":25,"value":26961},"\u003C!-- 解决方案一：使用XML实体来代替 --> \n",{"type":20,"tag":157,"props":26963,"children":26964},{"class":159,"line":179},[26965],{"type":20,"tag":157,"props":26966,"children":26967},{},[26968],{"type":25,"value":26969},"\u003Cproperty name=\"expression\" value=\"a &lt; b\"\u002F>\n",{"type":20,"tag":44,"props":26971,"children":26972},{},[26973],{"type":20,"tag":48,"props":26974,"children":26975},{},[26976],{"type":25,"value":26977},"CDATA节",{"type":20,"tag":126,"props":26979,"children":26981},{"className":17052,"code":26980,"language":17054,"meta":8,"style":8},"\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",[26982],{"type":20,"tag":84,"props":26983,"children":26984},{"__ignoreMap":8},[26985,26993,27001,27009,27017,27025,27033],{"type":20,"tag":157,"props":26986,"children":26987},{"class":159,"line":160},[26988],{"type":20,"tag":157,"props":26989,"children":26990},{},[26991],{"type":25,"value":26992},"\u003Cproperty name=\"expression\"> \n",{"type":20,"tag":157,"props":26994,"children":26995},{"class":159,"line":169},[26996],{"type":20,"tag":157,"props":26997,"children":26998},{},[26999],{"type":25,"value":27000},"\u003C!-- 解决方案二：使用CDATA节 --> \n",{"type":20,"tag":157,"props":27002,"children":27003},{"class":159,"line":179},[27004],{"type":20,"tag":157,"props":27005,"children":27006},{},[27007],{"type":25,"value":27008},"\u003C!-- CDATA中的C代表Character，是文本、字符的含义，CDATA就表示纯文本数据 --> \n",{"type":20,"tag":157,"props":27010,"children":27011},{"class":159,"line":188},[27012],{"type":20,"tag":157,"props":27013,"children":27014},{},[27015],{"type":25,"value":27016},"\u003C!-- XML解析器看到CDATA节就知道这里是纯文本，就不会当作XML标签或属性来解析 -->\n",{"type":20,"tag":157,"props":27018,"children":27019},{"class":159,"line":196},[27020],{"type":20,"tag":157,"props":27021,"children":27022},{},[27023],{"type":25,"value":27024},"\u003C!-- 所以CDATA节中写什么符号都随意 --> \n",{"type":20,"tag":157,"props":27026,"children":27027},{"class":159,"line":204},[27028],{"type":20,"tag":157,"props":27029,"children":27030},{},[27031],{"type":25,"value":27032},"        \u003Cvalue>\u003C![CDATA[a \u003C b]]>\u003C\u002Fvalue> \n",{"type":20,"tag":157,"props":27034,"children":27035},{"class":159,"line":213},[27036],{"type":20,"tag":157,"props":27037,"children":27038},{},[27039],{"type":25,"value":27040},"\u003C\u002Fproperty>\n",{"type":20,"tag":18942,"props":27042,"children":27044},{"id":27043},"_234-为类类型赋值",[27045],{"type":25,"value":27046},"2.3.4 为类类型赋值",{"type":20,"tag":21,"props":27048,"children":27049},{},[27050],{"type":20,"tag":33,"props":27051,"children":27052},{},[27053],{"type":25,"value":27054},"创建实体类：",{"type":20,"tag":126,"props":27056,"children":27058},{"className":16050,"code":27057,"language":16052,"meta":8,"style":8},"\u002F\u002F Student\npublic class Student {\n    private int sId;\n\n    private String sName;\n\n    private int age;\n\n    private String gender;\n\n    private double score;\n\n    private Clazz clazz;\n}\n\n\u002F\u002F Clazz\npublic class Clazz {\n    private Integer cid;\n\n    private String cname;\n}\n",[27059],{"type":20,"tag":84,"props":27060,"children":27061},{"__ignoreMap":8},[27062,27070,27078,27086,27093,27101,27108,27116,27123,27131,27138,27146,27153,27161,27168,27175,27183,27191,27199,27206,27214],{"type":20,"tag":157,"props":27063,"children":27064},{"class":159,"line":160},[27065],{"type":20,"tag":157,"props":27066,"children":27067},{},[27068],{"type":25,"value":27069},"\u002F\u002F Student\n",{"type":20,"tag":157,"props":27071,"children":27072},{"class":159,"line":169},[27073],{"type":20,"tag":157,"props":27074,"children":27075},{},[27076],{"type":25,"value":27077},"public class Student {\n",{"type":20,"tag":157,"props":27079,"children":27080},{"class":159,"line":179},[27081],{"type":20,"tag":157,"props":27082,"children":27083},{},[27084],{"type":25,"value":27085},"    private int sId;\n",{"type":20,"tag":157,"props":27087,"children":27088},{"class":159,"line":188},[27089],{"type":20,"tag":157,"props":27090,"children":27091},{"emptyLinePlaceholder":173},[27092],{"type":25,"value":176},{"type":20,"tag":157,"props":27094,"children":27095},{"class":159,"line":196},[27096],{"type":20,"tag":157,"props":27097,"children":27098},{},[27099],{"type":25,"value":27100},"    private String sName;\n",{"type":20,"tag":157,"props":27102,"children":27103},{"class":159,"line":204},[27104],{"type":20,"tag":157,"props":27105,"children":27106},{"emptyLinePlaceholder":173},[27107],{"type":25,"value":176},{"type":20,"tag":157,"props":27109,"children":27110},{"class":159,"line":213},[27111],{"type":20,"tag":157,"props":27112,"children":27113},{},[27114],{"type":25,"value":27115},"    private int age;\n",{"type":20,"tag":157,"props":27117,"children":27118},{"class":159,"line":222},[27119],{"type":20,"tag":157,"props":27120,"children":27121},{"emptyLinePlaceholder":173},[27122],{"type":25,"value":176},{"type":20,"tag":157,"props":27124,"children":27125},{"class":159,"line":440},[27126],{"type":20,"tag":157,"props":27127,"children":27128},{},[27129],{"type":25,"value":27130},"    private String gender;\n",{"type":20,"tag":157,"props":27132,"children":27133},{"class":159,"line":448},[27134],{"type":20,"tag":157,"props":27135,"children":27136},{"emptyLinePlaceholder":173},[27137],{"type":25,"value":176},{"type":20,"tag":157,"props":27139,"children":27140},{"class":159,"line":456},[27141],{"type":20,"tag":157,"props":27142,"children":27143},{},[27144],{"type":25,"value":27145},"    private double score;\n",{"type":20,"tag":157,"props":27147,"children":27148},{"class":159,"line":465},[27149],{"type":20,"tag":157,"props":27150,"children":27151},{"emptyLinePlaceholder":173},[27152],{"type":25,"value":176},{"type":20,"tag":157,"props":27154,"children":27155},{"class":159,"line":474},[27156],{"type":20,"tag":157,"props":27157,"children":27158},{},[27159],{"type":25,"value":27160},"    private Clazz clazz;\n",{"type":20,"tag":157,"props":27162,"children":27163},{"class":159,"line":483},[27164],{"type":20,"tag":157,"props":27165,"children":27166},{},[27167],{"type":25,"value":943},{"type":20,"tag":157,"props":27169,"children":27170},{"class":159,"line":491},[27171],{"type":20,"tag":157,"props":27172,"children":27173},{"emptyLinePlaceholder":173},[27174],{"type":25,"value":176},{"type":20,"tag":157,"props":27176,"children":27177},{"class":159,"line":499},[27178],{"type":20,"tag":157,"props":27179,"children":27180},{},[27181],{"type":25,"value":27182},"\u002F\u002F Clazz\n",{"type":20,"tag":157,"props":27184,"children":27185},{"class":159,"line":508},[27186],{"type":20,"tag":157,"props":27187,"children":27188},{},[27189],{"type":25,"value":27190},"public class Clazz {\n",{"type":20,"tag":157,"props":27192,"children":27193},{"class":159,"line":517},[27194],{"type":20,"tag":157,"props":27195,"children":27196},{},[27197],{"type":25,"value":27198},"    private Integer cid;\n",{"type":20,"tag":157,"props":27200,"children":27201},{"class":159,"line":1499},[27202],{"type":20,"tag":157,"props":27203,"children":27204},{"emptyLinePlaceholder":173},[27205],{"type":25,"value":176},{"type":20,"tag":157,"props":27207,"children":27208},{"class":159,"line":1507},[27209],{"type":20,"tag":157,"props":27210,"children":27211},{},[27212],{"type":25,"value":27213},"    private String cname;\n",{"type":20,"tag":157,"props":27215,"children":27216},{"class":159,"line":1515},[27217],{"type":20,"tag":157,"props":27218,"children":27219},{},[27220],{"type":25,"value":943},{"type":20,"tag":21,"props":27222,"children":27223},{},[27224],{"type":20,"tag":33,"props":27225,"children":27226},{},[27227],{"type":25,"value":27228},"方式一：引用外部声明的bean",{"type":20,"tag":126,"props":27230,"children":27232},{"className":17052,"code":27231,"language":17054,"meta":8,"style":8},"\u003C!--为类属性赋值-->\n\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n\u003C\u002Fbean>\n\n\u003Cbean id=\"clazzOne\" class=\"com.wangkun.spring.pojo.Clazz\">\n    \u003Cproperty name=\"cid\" value=\"1001\"\u002F>\n    \u003Cproperty name=\"cname\" value=\"年入百万班\"\u002F>\n\u003C\u002Fbean>\n",[27233],{"type":20,"tag":84,"props":27234,"children":27235},{"__ignoreMap":8},[27236,27244,27251,27259,27267,27275,27282,27290,27297,27304,27312,27320,27328],{"type":20,"tag":157,"props":27237,"children":27238},{"class":159,"line":160},[27239],{"type":20,"tag":157,"props":27240,"children":27241},{},[27242],{"type":25,"value":27243},"\u003C!--为类属性赋值-->\n",{"type":20,"tag":157,"props":27245,"children":27246},{"class":159,"line":169},[27247],{"type":20,"tag":157,"props":27248,"children":27249},{},[27250],{"type":25,"value":26795},{"type":20,"tag":157,"props":27252,"children":27253},{"class":159,"line":179},[27254],{"type":20,"tag":157,"props":27255,"children":27256},{},[27257],{"type":25,"value":27258},"    \u003Cproperty name=\"SId\" value=\"1111\"\u002F>\n",{"type":20,"tag":157,"props":27260,"children":27261},{"class":159,"line":188},[27262],{"type":20,"tag":157,"props":27263,"children":27264},{},[27265],{"type":25,"value":27266},"    \u003Cproperty name=\"SName\" value=\"程浩\"\u002F>\n",{"type":20,"tag":157,"props":27268,"children":27269},{"class":159,"line":196},[27270],{"type":20,"tag":157,"props":27271,"children":27272},{},[27273],{"type":25,"value":27274},"    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n",{"type":20,"tag":157,"props":27276,"children":27277},{"class":159,"line":204},[27278],{"type":20,"tag":157,"props":27279,"children":27280},{},[27281],{"type":25,"value":26766},{"type":20,"tag":157,"props":27283,"children":27284},{"class":159,"line":213},[27285],{"type":20,"tag":157,"props":27286,"children":27287},{},[27288],{"type":25,"value":27289},"    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n",{"type":20,"tag":157,"props":27291,"children":27292},{"class":159,"line":222},[27293],{"type":20,"tag":157,"props":27294,"children":27295},{},[27296],{"type":25,"value":26774},{"type":20,"tag":157,"props":27298,"children":27299},{"class":159,"line":440},[27300],{"type":20,"tag":157,"props":27301,"children":27302},{"emptyLinePlaceholder":173},[27303],{"type":25,"value":176},{"type":20,"tag":157,"props":27305,"children":27306},{"class":159,"line":448},[27307],{"type":20,"tag":157,"props":27308,"children":27309},{},[27310],{"type":25,"value":27311},"\u003Cbean id=\"clazzOne\" class=\"com.wangkun.spring.pojo.Clazz\">\n",{"type":20,"tag":157,"props":27313,"children":27314},{"class":159,"line":456},[27315],{"type":20,"tag":157,"props":27316,"children":27317},{},[27318],{"type":25,"value":27319},"    \u003Cproperty name=\"cid\" value=\"1001\"\u002F>\n",{"type":20,"tag":157,"props":27321,"children":27322},{"class":159,"line":465},[27323],{"type":20,"tag":157,"props":27324,"children":27325},{},[27326],{"type":25,"value":27327},"    \u003Cproperty name=\"cname\" value=\"年入百万班\"\u002F>\n",{"type":20,"tag":157,"props":27329,"children":27330},{"class":159,"line":474},[27331],{"type":20,"tag":157,"props":27332,"children":27333},{},[27334],{"type":25,"value":26774},{"type":20,"tag":21,"props":27336,"children":27337},{},[27338],{"type":20,"tag":33,"props":27339,"children":27340},{},[27341],{"type":25,"value":27342},"方式二：内部bean",{"type":20,"tag":6665,"props":27344,"children":27345},{},[27346],{"type":20,"tag":21,"props":27347,"children":27348},{},[27349],{"type":25,"value":27350},"内部bean，只能在当前bean的内部使用，无法通过ioc容器获取，所以设置内部bean的id也没有用",{"type":20,"tag":126,"props":27352,"children":27354},{"className":17052,"code":27353,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n    \u003Cproperty name=\"clazz\">\n        \u003Cbean class=\"com.wangkun.spring.pojo.Clazz\">\n            \u003Cproperty name=\"cid\" value=\"1002\"\u002F>\n            \u003Cproperty name=\"cname\" value=\"键盘敲碎班\"\u002F>\n        \u003C\u002Fbean>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[27355],{"type":20,"tag":84,"props":27356,"children":27357},{"__ignoreMap":8},[27358,27365,27372,27379,27386,27393,27401,27409,27417,27425,27433,27440],{"type":20,"tag":157,"props":27359,"children":27360},{"class":159,"line":160},[27361],{"type":20,"tag":157,"props":27362,"children":27363},{},[27364],{"type":25,"value":26795},{"type":20,"tag":157,"props":27366,"children":27367},{"class":159,"line":169},[27368],{"type":20,"tag":157,"props":27369,"children":27370},{},[27371],{"type":25,"value":27258},{"type":20,"tag":157,"props":27373,"children":27374},{"class":159,"line":179},[27375],{"type":20,"tag":157,"props":27376,"children":27377},{},[27378],{"type":25,"value":27266},{"type":20,"tag":157,"props":27380,"children":27381},{"class":159,"line":188},[27382],{"type":20,"tag":157,"props":27383,"children":27384},{},[27385],{"type":25,"value":27274},{"type":20,"tag":157,"props":27387,"children":27388},{"class":159,"line":196},[27389],{"type":20,"tag":157,"props":27390,"children":27391},{},[27392],{"type":25,"value":26766},{"type":20,"tag":157,"props":27394,"children":27395},{"class":159,"line":204},[27396],{"type":20,"tag":157,"props":27397,"children":27398},{},[27399],{"type":25,"value":27400},"    \u003Cproperty name=\"clazz\">\n",{"type":20,"tag":157,"props":27402,"children":27403},{"class":159,"line":213},[27404],{"type":20,"tag":157,"props":27405,"children":27406},{},[27407],{"type":25,"value":27408},"        \u003Cbean class=\"com.wangkun.spring.pojo.Clazz\">\n",{"type":20,"tag":157,"props":27410,"children":27411},{"class":159,"line":222},[27412],{"type":20,"tag":157,"props":27413,"children":27414},{},[27415],{"type":25,"value":27416},"            \u003Cproperty name=\"cid\" value=\"1002\"\u002F>\n",{"type":20,"tag":157,"props":27418,"children":27419},{"class":159,"line":440},[27420],{"type":20,"tag":157,"props":27421,"children":27422},{},[27423],{"type":25,"value":27424},"            \u003Cproperty name=\"cname\" value=\"键盘敲碎班\"\u002F>\n",{"type":20,"tag":157,"props":27426,"children":27427},{"class":159,"line":448},[27428],{"type":20,"tag":157,"props":27429,"children":27430},{},[27431],{"type":25,"value":27432},"        \u003C\u002Fbean>\n",{"type":20,"tag":157,"props":27434,"children":27435},{"class":159,"line":456},[27436],{"type":20,"tag":157,"props":27437,"children":27438},{},[27439],{"type":25,"value":26915},{"type":20,"tag":157,"props":27441,"children":27442},{"class":159,"line":465},[27443],{"type":20,"tag":157,"props":27444,"children":27445},{},[27446],{"type":25,"value":26774},{"type":20,"tag":21,"props":27448,"children":27449},{},[27450],{"type":20,"tag":33,"props":27451,"children":27452},{},[27453],{"type":25,"value":27454},"方式三：级联",{"type":20,"tag":6665,"props":27456,"children":27457},{},[27458],{"type":20,"tag":21,"props":27459,"children":27460},{},[27461],{"type":25,"value":27462},"级联的方式，要保证提前为clazz属性赋值或者实例化",{"type":20,"tag":126,"props":27464,"children":27466},{"className":16050,"code":27465,"language":16052,"meta":8,"style":8},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n    \u003Cproperty name=\"clazz\" ref=\"clazzOne\"\u002F>\n    \u003Cproperty name=\"clazz.cid\" value=\"1002\"\u002F>\n    \u003Cproperty name=\"clazz.cname\" value=\"前程无忧\"\u002F>\n\u003C\u002Fbean>\n\n\u003Cbean id=\"clazzOne\" class=\"com.wangkun.spring.pojo.Clazz\">\n    \u003Cproperty name=\"cid\" value=\"1001\"\u002F>\n    \u003Cproperty name=\"cname\" value=\"年入百万班\"\u002F>\n\u003C\u002Fbean>\n",[27467],{"type":20,"tag":84,"props":27468,"children":27469},{"__ignoreMap":8},[27470,27477,27484,27491,27498,27505,27512,27520,27528,27535,27542,27549,27556,27563],{"type":20,"tag":157,"props":27471,"children":27472},{"class":159,"line":160},[27473],{"type":20,"tag":157,"props":27474,"children":27475},{},[27476],{"type":25,"value":26795},{"type":20,"tag":157,"props":27478,"children":27479},{"class":159,"line":169},[27480],{"type":20,"tag":157,"props":27481,"children":27482},{},[27483],{"type":25,"value":27258},{"type":20,"tag":157,"props":27485,"children":27486},{"class":159,"line":179},[27487],{"type":20,"tag":157,"props":27488,"children":27489},{},[27490],{"type":25,"value":27266},{"type":20,"tag":157,"props":27492,"children":27493},{"class":159,"line":188},[27494],{"type":20,"tag":157,"props":27495,"children":27496},{},[27497],{"type":25,"value":27274},{"type":20,"tag":157,"props":27499,"children":27500},{"class":159,"line":196},[27501],{"type":20,"tag":157,"props":27502,"children":27503},{},[27504],{"type":25,"value":26766},{"type":20,"tag":157,"props":27506,"children":27507},{"class":159,"line":204},[27508],{"type":20,"tag":157,"props":27509,"children":27510},{},[27511],{"type":25,"value":27289},{"type":20,"tag":157,"props":27513,"children":27514},{"class":159,"line":213},[27515],{"type":20,"tag":157,"props":27516,"children":27517},{},[27518],{"type":25,"value":27519},"    \u003Cproperty name=\"clazz.cid\" value=\"1002\"\u002F>\n",{"type":20,"tag":157,"props":27521,"children":27522},{"class":159,"line":222},[27523],{"type":20,"tag":157,"props":27524,"children":27525},{},[27526],{"type":25,"value":27527},"    \u003Cproperty name=\"clazz.cname\" value=\"前程无忧\"\u002F>\n",{"type":20,"tag":157,"props":27529,"children":27530},{"class":159,"line":440},[27531],{"type":20,"tag":157,"props":27532,"children":27533},{},[27534],{"type":25,"value":26774},{"type":20,"tag":157,"props":27536,"children":27537},{"class":159,"line":448},[27538],{"type":20,"tag":157,"props":27539,"children":27540},{"emptyLinePlaceholder":173},[27541],{"type":25,"value":176},{"type":20,"tag":157,"props":27543,"children":27544},{"class":159,"line":456},[27545],{"type":20,"tag":157,"props":27546,"children":27547},{},[27548],{"type":25,"value":27311},{"type":20,"tag":157,"props":27550,"children":27551},{"class":159,"line":465},[27552],{"type":20,"tag":157,"props":27553,"children":27554},{},[27555],{"type":25,"value":27319},{"type":20,"tag":157,"props":27557,"children":27558},{"class":159,"line":474},[27559],{"type":20,"tag":157,"props":27560,"children":27561},{},[27562],{"type":25,"value":27327},{"type":20,"tag":157,"props":27564,"children":27565},{"class":159,"line":483},[27566],{"type":20,"tag":157,"props":27567,"children":27568},{},[27569],{"type":25,"value":26774},{"type":20,"tag":18942,"props":27571,"children":27573},{"id":27572},"_235-为数组类型赋值",[27574],{"type":25,"value":27575},"2.3.5 为数组类型赋值",{"type":20,"tag":21,"props":27577,"children":27578},{},[27579],{"type":20,"tag":33,"props":27580,"children":27581},{},[27582],{"type":25,"value":27583},"实体类：",{"type":20,"tag":126,"props":27585,"children":27587},{"className":16050,"code":27586,"language":16052,"meta":8,"style":8},"public class Student {\n    private int sId;\n\n    private String sName;\n\n    private int age;\n\n    private String gender;\n\n    private double score;\n\n    private Clazz clazz;\n\n    private String[] hobby;\n\n}\n",[27588],{"type":20,"tag":84,"props":27589,"children":27590},{"__ignoreMap":8},[27591,27598,27605,27612,27619,27626,27633,27640,27647,27654,27661,27668,27675,27682,27690,27697],{"type":20,"tag":157,"props":27592,"children":27593},{"class":159,"line":160},[27594],{"type":20,"tag":157,"props":27595,"children":27596},{},[27597],{"type":25,"value":27077},{"type":20,"tag":157,"props":27599,"children":27600},{"class":159,"line":169},[27601],{"type":20,"tag":157,"props":27602,"children":27603},{},[27604],{"type":25,"value":27085},{"type":20,"tag":157,"props":27606,"children":27607},{"class":159,"line":179},[27608],{"type":20,"tag":157,"props":27609,"children":27610},{"emptyLinePlaceholder":173},[27611],{"type":25,"value":176},{"type":20,"tag":157,"props":27613,"children":27614},{"class":159,"line":188},[27615],{"type":20,"tag":157,"props":27616,"children":27617},{},[27618],{"type":25,"value":27100},{"type":20,"tag":157,"props":27620,"children":27621},{"class":159,"line":196},[27622],{"type":20,"tag":157,"props":27623,"children":27624},{"emptyLinePlaceholder":173},[27625],{"type":25,"value":176},{"type":20,"tag":157,"props":27627,"children":27628},{"class":159,"line":204},[27629],{"type":20,"tag":157,"props":27630,"children":27631},{},[27632],{"type":25,"value":27115},{"type":20,"tag":157,"props":27634,"children":27635},{"class":159,"line":213},[27636],{"type":20,"tag":157,"props":27637,"children":27638},{"emptyLinePlaceholder":173},[27639],{"type":25,"value":176},{"type":20,"tag":157,"props":27641,"children":27642},{"class":159,"line":222},[27643],{"type":20,"tag":157,"props":27644,"children":27645},{},[27646],{"type":25,"value":27130},{"type":20,"tag":157,"props":27648,"children":27649},{"class":159,"line":440},[27650],{"type":20,"tag":157,"props":27651,"children":27652},{"emptyLinePlaceholder":173},[27653],{"type":25,"value":176},{"type":20,"tag":157,"props":27655,"children":27656},{"class":159,"line":448},[27657],{"type":20,"tag":157,"props":27658,"children":27659},{},[27660],{"type":25,"value":27145},{"type":20,"tag":157,"props":27662,"children":27663},{"class":159,"line":456},[27664],{"type":20,"tag":157,"props":27665,"children":27666},{"emptyLinePlaceholder":173},[27667],{"type":25,"value":176},{"type":20,"tag":157,"props":27669,"children":27670},{"class":159,"line":465},[27671],{"type":20,"tag":157,"props":27672,"children":27673},{},[27674],{"type":25,"value":27160},{"type":20,"tag":157,"props":27676,"children":27677},{"class":159,"line":474},[27678],{"type":20,"tag":157,"props":27679,"children":27680},{"emptyLinePlaceholder":173},[27681],{"type":25,"value":176},{"type":20,"tag":157,"props":27683,"children":27684},{"class":159,"line":483},[27685],{"type":20,"tag":157,"props":27686,"children":27687},{},[27688],{"type":25,"value":27689},"    private String[] hobby;\n",{"type":20,"tag":157,"props":27691,"children":27692},{"class":159,"line":491},[27693],{"type":20,"tag":157,"props":27694,"children":27695},{"emptyLinePlaceholder":173},[27696],{"type":25,"value":176},{"type":20,"tag":157,"props":27698,"children":27699},{"class":159,"line":499},[27700],{"type":20,"tag":157,"props":27701,"children":27702},{},[27703],{"type":25,"value":943},{"type":20,"tag":21,"props":27705,"children":27706},{},[27707],{"type":20,"tag":33,"props":27708,"children":27709},{},[27710],{"type":25,"value":27711},"配置bean：",{"type":20,"tag":126,"props":27713,"children":27715},{"className":17052,"code":27714,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n    \u003Cproperty name=\"clazz\">\n        \u003Cbean class=\"com.wangkun.spring.pojo.Clazz\">\n            \u003Cproperty name=\"cid\" value=\"1002\"\u002F>\n            \u003Cproperty name=\"cname\" value=\"键盘敲碎班\"\u002F>\n        \u003C\u002Fbean>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"hobby\">\n        \u003Carray>\n            \u003Cvalue>抽烟\u003C\u002Fvalue>\n            \u003Cvalue>喝酒\u003C\u002Fvalue>\n            \u003Cvalue>烫头\u003C\u002Fvalue>\n        \u003C\u002Farray>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[27716],{"type":20,"tag":84,"props":27717,"children":27718},{"__ignoreMap":8},[27719,27726,27733,27740,27747,27754,27761,27768,27775,27782,27789,27796,27804,27812,27820,27828,27836,27844,27851],{"type":20,"tag":157,"props":27720,"children":27721},{"class":159,"line":160},[27722],{"type":20,"tag":157,"props":27723,"children":27724},{},[27725],{"type":25,"value":26795},{"type":20,"tag":157,"props":27727,"children":27728},{"class":159,"line":169},[27729],{"type":20,"tag":157,"props":27730,"children":27731},{},[27732],{"type":25,"value":27258},{"type":20,"tag":157,"props":27734,"children":27735},{"class":159,"line":179},[27736],{"type":20,"tag":157,"props":27737,"children":27738},{},[27739],{"type":25,"value":27266},{"type":20,"tag":157,"props":27741,"children":27742},{"class":159,"line":188},[27743],{"type":20,"tag":157,"props":27744,"children":27745},{},[27746],{"type":25,"value":27274},{"type":20,"tag":157,"props":27748,"children":27749},{"class":159,"line":196},[27750],{"type":20,"tag":157,"props":27751,"children":27752},{},[27753],{"type":25,"value":26766},{"type":20,"tag":157,"props":27755,"children":27756},{"class":159,"line":204},[27757],{"type":20,"tag":157,"props":27758,"children":27759},{},[27760],{"type":25,"value":27400},{"type":20,"tag":157,"props":27762,"children":27763},{"class":159,"line":213},[27764],{"type":20,"tag":157,"props":27765,"children":27766},{},[27767],{"type":25,"value":27408},{"type":20,"tag":157,"props":27769,"children":27770},{"class":159,"line":222},[27771],{"type":20,"tag":157,"props":27772,"children":27773},{},[27774],{"type":25,"value":27416},{"type":20,"tag":157,"props":27776,"children":27777},{"class":159,"line":440},[27778],{"type":20,"tag":157,"props":27779,"children":27780},{},[27781],{"type":25,"value":27424},{"type":20,"tag":157,"props":27783,"children":27784},{"class":159,"line":448},[27785],{"type":20,"tag":157,"props":27786,"children":27787},{},[27788],{"type":25,"value":27432},{"type":20,"tag":157,"props":27790,"children":27791},{"class":159,"line":456},[27792],{"type":20,"tag":157,"props":27793,"children":27794},{},[27795],{"type":25,"value":26915},{"type":20,"tag":157,"props":27797,"children":27798},{"class":159,"line":465},[27799],{"type":20,"tag":157,"props":27800,"children":27801},{},[27802],{"type":25,"value":27803},"    \u003Cproperty name=\"hobby\">\n",{"type":20,"tag":157,"props":27805,"children":27806},{"class":159,"line":474},[27807],{"type":20,"tag":157,"props":27808,"children":27809},{},[27810],{"type":25,"value":27811},"        \u003Carray>\n",{"type":20,"tag":157,"props":27813,"children":27814},{"class":159,"line":483},[27815],{"type":20,"tag":157,"props":27816,"children":27817},{},[27818],{"type":25,"value":27819},"            \u003Cvalue>抽烟\u003C\u002Fvalue>\n",{"type":20,"tag":157,"props":27821,"children":27822},{"class":159,"line":491},[27823],{"type":20,"tag":157,"props":27824,"children":27825},{},[27826],{"type":25,"value":27827},"            \u003Cvalue>喝酒\u003C\u002Fvalue>\n",{"type":20,"tag":157,"props":27829,"children":27830},{"class":159,"line":499},[27831],{"type":20,"tag":157,"props":27832,"children":27833},{},[27834],{"type":25,"value":27835},"            \u003Cvalue>烫头\u003C\u002Fvalue>\n",{"type":20,"tag":157,"props":27837,"children":27838},{"class":159,"line":508},[27839],{"type":20,"tag":157,"props":27840,"children":27841},{},[27842],{"type":25,"value":27843},"        \u003C\u002Farray>\n",{"type":20,"tag":157,"props":27845,"children":27846},{"class":159,"line":517},[27847],{"type":20,"tag":157,"props":27848,"children":27849},{},[27850],{"type":25,"value":26915},{"type":20,"tag":157,"props":27852,"children":27853},{"class":159,"line":1499},[27854],{"type":20,"tag":157,"props":27855,"children":27856},{},[27857],{"type":25,"value":26774},{"type":20,"tag":18942,"props":27859,"children":27861},{"id":27860},"_236-为集合类型赋值",[27862],{"type":25,"value":27863},"2.3.6 为集合类型赋值",{"type":20,"tag":21,"props":27865,"children":27866},{},[27867],{"type":20,"tag":33,"props":27868,"children":27869},{},[27870],{"type":25,"value":27583},{"type":20,"tag":126,"props":27872,"children":27874},{"className":16050,"code":27873,"language":16052,"meta":8,"style":8},"public class Clazz {\n    private Integer cid;\n\n    private String cname;\n\n    private List\u003CStudent> students;\n}\n",[27875],{"type":20,"tag":84,"props":27876,"children":27877},{"__ignoreMap":8},[27878,27885,27892,27899,27906,27913,27921],{"type":20,"tag":157,"props":27879,"children":27880},{"class":159,"line":160},[27881],{"type":20,"tag":157,"props":27882,"children":27883},{},[27884],{"type":25,"value":27190},{"type":20,"tag":157,"props":27886,"children":27887},{"class":159,"line":169},[27888],{"type":20,"tag":157,"props":27889,"children":27890},{},[27891],{"type":25,"value":27198},{"type":20,"tag":157,"props":27893,"children":27894},{"class":159,"line":179},[27895],{"type":20,"tag":157,"props":27896,"children":27897},{"emptyLinePlaceholder":173},[27898],{"type":25,"value":176},{"type":20,"tag":157,"props":27900,"children":27901},{"class":159,"line":188},[27902],{"type":20,"tag":157,"props":27903,"children":27904},{},[27905],{"type":25,"value":27213},{"type":20,"tag":157,"props":27907,"children":27908},{"class":159,"line":196},[27909],{"type":20,"tag":157,"props":27910,"children":27911},{"emptyLinePlaceholder":173},[27912],{"type":25,"value":176},{"type":20,"tag":157,"props":27914,"children":27915},{"class":159,"line":204},[27916],{"type":20,"tag":157,"props":27917,"children":27918},{},[27919],{"type":25,"value":27920},"    private List\u003CStudent> students;\n",{"type":20,"tag":157,"props":27922,"children":27923},{"class":159,"line":213},[27924],{"type":20,"tag":157,"props":27925,"children":27926},{},[27927],{"type":25,"value":943},{"type":20,"tag":21,"props":27929,"children":27930},{},[27931],{"type":20,"tag":33,"props":27932,"children":27933},{},[27934],{"type":25,"value":27935},"方式一：内部list标签",{"type":20,"tag":126,"props":27937,"children":27939},{"className":17052,"code":27938,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentTwo\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"SId\" value=\"1\"\u002F>\n    \u003Cproperty name=\"SName\" value=\"张三\"\u002F>\n    \u003Cproperty name=\"age\" value=\"12\"\u002F>\n    \u003Cproperty name=\"gender\">\n        \u003Cnull\u002F>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"score\" value=\"24.1\"\u002F>\n\u003C\u002Fbean>\n\u003Cbean id=\"clazzTwo\" class=\"com.wangkun.spring.pojo.Clazz\">\n    \u003Cproperty name=\"cid\" value=\"1003\"\u002F>\n    \u003Cproperty name=\"cname\" value=\"1003\"\u002F>\n    \u003Cproperty name=\"students\">\n        \u003Clist>\n            \u003Cref bean=\"studentOne\"\u002F>\n            \u003Cref bean=\"studentTwo\"\u002F>\n            \u003Cref bean=\"studentThree\"\u002F>\n        \u003C\u002Flist>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n",[27940],{"type":20,"tag":84,"props":27941,"children":27942},{"__ignoreMap":8},[27943,27950,27957,27964,27971,27978,27985,27992,27999,28006,28014,28022,28030,28038,28046,28054,28062,28070,28078,28085],{"type":20,"tag":157,"props":27944,"children":27945},{"class":159,"line":160},[27946],{"type":20,"tag":157,"props":27947,"children":27948},{},[27949],{"type":25,"value":26734},{"type":20,"tag":157,"props":27951,"children":27952},{"class":159,"line":169},[27953],{"type":20,"tag":157,"props":27954,"children":27955},{},[27956],{"type":25,"value":26742},{"type":20,"tag":157,"props":27958,"children":27959},{"class":159,"line":179},[27960],{"type":20,"tag":157,"props":27961,"children":27962},{},[27963],{"type":25,"value":26750},{"type":20,"tag":157,"props":27965,"children":27966},{"class":159,"line":188},[27967],{"type":20,"tag":157,"props":27968,"children":27969},{},[27970],{"type":25,"value":26758},{"type":20,"tag":157,"props":27972,"children":27973},{"class":159,"line":196},[27974],{"type":20,"tag":157,"props":27975,"children":27976},{},[27977],{"type":25,"value":26899},{"type":20,"tag":157,"props":27979,"children":27980},{"class":159,"line":204},[27981],{"type":20,"tag":157,"props":27982,"children":27983},{},[27984],{"type":25,"value":26907},{"type":20,"tag":157,"props":27986,"children":27987},{"class":159,"line":213},[27988],{"type":20,"tag":157,"props":27989,"children":27990},{},[27991],{"type":25,"value":26915},{"type":20,"tag":157,"props":27993,"children":27994},{"class":159,"line":222},[27995],{"type":20,"tag":157,"props":27996,"children":27997},{},[27998],{"type":25,"value":26923},{"type":20,"tag":157,"props":28000,"children":28001},{"class":159,"line":440},[28002],{"type":20,"tag":157,"props":28003,"children":28004},{},[28005],{"type":25,"value":26774},{"type":20,"tag":157,"props":28007,"children":28008},{"class":159,"line":448},[28009],{"type":20,"tag":157,"props":28010,"children":28011},{},[28012],{"type":25,"value":28013},"\u003Cbean id=\"clazzTwo\" class=\"com.wangkun.spring.pojo.Clazz\">\n",{"type":20,"tag":157,"props":28015,"children":28016},{"class":159,"line":456},[28017],{"type":20,"tag":157,"props":28018,"children":28019},{},[28020],{"type":25,"value":28021},"    \u003Cproperty name=\"cid\" value=\"1003\"\u002F>\n",{"type":20,"tag":157,"props":28023,"children":28024},{"class":159,"line":465},[28025],{"type":20,"tag":157,"props":28026,"children":28027},{},[28028],{"type":25,"value":28029},"    \u003Cproperty name=\"cname\" value=\"1003\"\u002F>\n",{"type":20,"tag":157,"props":28031,"children":28032},{"class":159,"line":474},[28033],{"type":20,"tag":157,"props":28034,"children":28035},{},[28036],{"type":25,"value":28037},"    \u003Cproperty name=\"students\">\n",{"type":20,"tag":157,"props":28039,"children":28040},{"class":159,"line":483},[28041],{"type":20,"tag":157,"props":28042,"children":28043},{},[28044],{"type":25,"value":28045},"        \u003Clist>\n",{"type":20,"tag":157,"props":28047,"children":28048},{"class":159,"line":491},[28049],{"type":20,"tag":157,"props":28050,"children":28051},{},[28052],{"type":25,"value":28053},"            \u003Cref bean=\"studentOne\"\u002F>\n",{"type":20,"tag":157,"props":28055,"children":28056},{"class":159,"line":499},[28057],{"type":20,"tag":157,"props":28058,"children":28059},{},[28060],{"type":25,"value":28061},"            \u003Cref bean=\"studentTwo\"\u002F>\n",{"type":20,"tag":157,"props":28063,"children":28064},{"class":159,"line":508},[28065],{"type":20,"tag":157,"props":28066,"children":28067},{},[28068],{"type":25,"value":28069},"            \u003Cref bean=\"studentThree\"\u002F>\n",{"type":20,"tag":157,"props":28071,"children":28072},{"class":159,"line":517},[28073],{"type":20,"tag":157,"props":28074,"children":28075},{},[28076],{"type":25,"value":28077},"        \u003C\u002Flist>\n",{"type":20,"tag":157,"props":28079,"children":28080},{"class":159,"line":1499},[28081],{"type":20,"tag":157,"props":28082,"children":28083},{},[28084],{"type":25,"value":26915},{"type":20,"tag":157,"props":28086,"children":28087},{"class":159,"line":1507},[28088],{"type":20,"tag":157,"props":28089,"children":28090},{},[28091],{"type":25,"value":26774},{"type":20,"tag":21,"props":28093,"children":28094},{},[28095],{"type":20,"tag":33,"props":28096,"children":28097},{},[28098],{"type":25,"value":28099},"方式二：配置集合类型的bean(util:list)",{"type":20,"tag":126,"props":28101,"children":28103},{"className":17052,"code":28102,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"clazzThree\" class=\"com.wangkun.spring.pojo.Clazz\">\n    \u003Cproperty name=\"cid\" value=\"5001\"\u002F>\n    \u003Cproperty name=\"cname\" value=\"键盘敲烂班\"\u002F>\n    \u003Cproperty name=\"students\" ref=\"studentList\"\u002F>\n\u003C\u002Fbean>\n\n\u003Cutil:list id=\"studentList\">\n    \u003Cref bean=\"studentOne\"\u002F>\n    \u003Cref bean=\"studentTwo\"\u002F>\n    \u003Cref bean=\"studentThree\"\u002F>\n\u003C\u002Futil:list>\n",[28104],{"type":20,"tag":84,"props":28105,"children":28106},{"__ignoreMap":8},[28107,28115,28123,28131,28139,28146,28153,28161,28169,28177,28185],{"type":20,"tag":157,"props":28108,"children":28109},{"class":159,"line":160},[28110],{"type":20,"tag":157,"props":28111,"children":28112},{},[28113],{"type":25,"value":28114},"\u003Cbean id=\"clazzThree\" class=\"com.wangkun.spring.pojo.Clazz\">\n",{"type":20,"tag":157,"props":28116,"children":28117},{"class":159,"line":169},[28118],{"type":20,"tag":157,"props":28119,"children":28120},{},[28121],{"type":25,"value":28122},"    \u003Cproperty name=\"cid\" value=\"5001\"\u002F>\n",{"type":20,"tag":157,"props":28124,"children":28125},{"class":159,"line":179},[28126],{"type":20,"tag":157,"props":28127,"children":28128},{},[28129],{"type":25,"value":28130},"    \u003Cproperty name=\"cname\" value=\"键盘敲烂班\"\u002F>\n",{"type":20,"tag":157,"props":28132,"children":28133},{"class":159,"line":188},[28134],{"type":20,"tag":157,"props":28135,"children":28136},{},[28137],{"type":25,"value":28138},"    \u003Cproperty name=\"students\" ref=\"studentList\"\u002F>\n",{"type":20,"tag":157,"props":28140,"children":28141},{"class":159,"line":196},[28142],{"type":20,"tag":157,"props":28143,"children":28144},{},[28145],{"type":25,"value":26774},{"type":20,"tag":157,"props":28147,"children":28148},{"class":159,"line":204},[28149],{"type":20,"tag":157,"props":28150,"children":28151},{"emptyLinePlaceholder":173},[28152],{"type":25,"value":176},{"type":20,"tag":157,"props":28154,"children":28155},{"class":159,"line":213},[28156],{"type":20,"tag":157,"props":28157,"children":28158},{},[28159],{"type":25,"value":28160},"\u003Cutil:list id=\"studentList\">\n",{"type":20,"tag":157,"props":28162,"children":28163},{"class":159,"line":222},[28164],{"type":20,"tag":157,"props":28165,"children":28166},{},[28167],{"type":25,"value":28168},"    \u003Cref bean=\"studentOne\"\u002F>\n",{"type":20,"tag":157,"props":28170,"children":28171},{"class":159,"line":440},[28172],{"type":20,"tag":157,"props":28173,"children":28174},{},[28175],{"type":25,"value":28176},"    \u003Cref bean=\"studentTwo\"\u002F>\n",{"type":20,"tag":157,"props":28178,"children":28179},{"class":159,"line":448},[28180],{"type":20,"tag":157,"props":28181,"children":28182},{},[28183],{"type":25,"value":28184},"    \u003Cref bean=\"studentThree\"\u002F>\n",{"type":20,"tag":157,"props":28186,"children":28187},{"class":159,"line":456},[28188],{"type":20,"tag":157,"props":28189,"children":28190},{},[28191],{"type":25,"value":28192},"\u003C\u002Futil:list>\n",{"type":20,"tag":18942,"props":28194,"children":28196},{"id":28195},"_237-为map类型赋值",[28197],{"type":25,"value":28198},"2.3.7 为Map类型赋值",{"type":20,"tag":21,"props":28200,"children":28201},{},[28202],{"type":20,"tag":33,"props":28203,"children":28204},{},[28205],{"type":25,"value":28206},"方式一：内部map标签",{"type":20,"tag":126,"props":28208,"children":28210},{"className":17052,"code":28209,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"sId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"sName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n    \u003Cproperty name=\"clazz\">\n        \u003Cbean class=\"com.wangkun.spring.pojo.Clazz\">\n            \u003Cproperty name=\"cid\" value=\"1002\"\u002F>\n            \u003Cproperty name=\"cname\" value=\"键盘敲碎班\"\u002F>\n        \u003C\u002Fbean>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"hobby\">\n        \u003Carray>\n            \u003Cvalue>抽烟\u003C\u002Fvalue>\n            \u003Cvalue>喝酒\u003C\u002Fvalue>\n            \u003Cvalue>烫头\u003C\u002Fvalue>\n        \u003C\u002Farray>\n    \u003C\u002Fproperty>\n    \u003C!-- 通过Map标签引入teacher -->\n    \u003Cproperty name=\"teacherMap\">\n        \u003Cmap>\n            \u003Centry key=\"语文老师\" value-ref=\"teacherOne\"\u002F>\n            \u003Centry key=\"数学老师\" value-ref=\"teacherTwo\"\u002F>\n        \u003C\u002Fmap>\n    \u003C\u002Fproperty>\n\u003C\u002Fbean>\n\n\u003C!--创建teavher的bean-->\n\u003Cbean id=\"teacherOne\" class=\"com.wangkun.spring.pojo.Teacher\">\n    \u003Cproperty name=\"tid\" value=\"1001\"\u002F>\n    \u003Cproperty name=\"tname\" value=\"张三\"\u002F>\n\u003C\u002Fbean>\n\u003Cbean id=\"teacherTwo\" class=\"com.wangkun.spring.pojo.Teacher\">\n    \u003Cproperty name=\"tid\" value=\"1002\"\u002F>\n    \u003Cproperty name=\"tname\" value=\"李四\"\u002F>\n\u003C\u002Fbean>\n",[28211],{"type":20,"tag":84,"props":28212,"children":28213},{"__ignoreMap":8},[28214,28221,28229,28237,28244,28251,28258,28265,28272,28279,28286,28293,28300,28307,28314,28321,28328,28335,28342,28350,28358,28366,28374,28382,28390,28397,28404,28411,28419,28427,28435,28443,28450,28458,28466,28474],{"type":20,"tag":157,"props":28215,"children":28216},{"class":159,"line":160},[28217],{"type":20,"tag":157,"props":28218,"children":28219},{},[28220],{"type":25,"value":26795},{"type":20,"tag":157,"props":28222,"children":28223},{"class":159,"line":169},[28224],{"type":20,"tag":157,"props":28225,"children":28226},{},[28227],{"type":25,"value":28228},"    \u003Cproperty name=\"sId\" value=\"1111\"\u002F>\n",{"type":20,"tag":157,"props":28230,"children":28231},{"class":159,"line":179},[28232],{"type":20,"tag":157,"props":28233,"children":28234},{},[28235],{"type":25,"value":28236},"    \u003Cproperty name=\"sName\" value=\"程浩\"\u002F>\n",{"type":20,"tag":157,"props":28238,"children":28239},{"class":159,"line":188},[28240],{"type":20,"tag":157,"props":28241,"children":28242},{},[28243],{"type":25,"value":27274},{"type":20,"tag":157,"props":28245,"children":28246},{"class":159,"line":196},[28247],{"type":20,"tag":157,"props":28248,"children":28249},{},[28250],{"type":25,"value":26766},{"type":20,"tag":157,"props":28252,"children":28253},{"class":159,"line":204},[28254],{"type":20,"tag":157,"props":28255,"children":28256},{},[28257],{"type":25,"value":27400},{"type":20,"tag":157,"props":28259,"children":28260},{"class":159,"line":213},[28261],{"type":20,"tag":157,"props":28262,"children":28263},{},[28264],{"type":25,"value":27408},{"type":20,"tag":157,"props":28266,"children":28267},{"class":159,"line":222},[28268],{"type":20,"tag":157,"props":28269,"children":28270},{},[28271],{"type":25,"value":27416},{"type":20,"tag":157,"props":28273,"children":28274},{"class":159,"line":440},[28275],{"type":20,"tag":157,"props":28276,"children":28277},{},[28278],{"type":25,"value":27424},{"type":20,"tag":157,"props":28280,"children":28281},{"class":159,"line":448},[28282],{"type":20,"tag":157,"props":28283,"children":28284},{},[28285],{"type":25,"value":27432},{"type":20,"tag":157,"props":28287,"children":28288},{"class":159,"line":456},[28289],{"type":20,"tag":157,"props":28290,"children":28291},{},[28292],{"type":25,"value":26915},{"type":20,"tag":157,"props":28294,"children":28295},{"class":159,"line":465},[28296],{"type":20,"tag":157,"props":28297,"children":28298},{},[28299],{"type":25,"value":27803},{"type":20,"tag":157,"props":28301,"children":28302},{"class":159,"line":474},[28303],{"type":20,"tag":157,"props":28304,"children":28305},{},[28306],{"type":25,"value":27811},{"type":20,"tag":157,"props":28308,"children":28309},{"class":159,"line":483},[28310],{"type":20,"tag":157,"props":28311,"children":28312},{},[28313],{"type":25,"value":27819},{"type":20,"tag":157,"props":28315,"children":28316},{"class":159,"line":491},[28317],{"type":20,"tag":157,"props":28318,"children":28319},{},[28320],{"type":25,"value":27827},{"type":20,"tag":157,"props":28322,"children":28323},{"class":159,"line":499},[28324],{"type":20,"tag":157,"props":28325,"children":28326},{},[28327],{"type":25,"value":27835},{"type":20,"tag":157,"props":28329,"children":28330},{"class":159,"line":508},[28331],{"type":20,"tag":157,"props":28332,"children":28333},{},[28334],{"type":25,"value":27843},{"type":20,"tag":157,"props":28336,"children":28337},{"class":159,"line":517},[28338],{"type":20,"tag":157,"props":28339,"children":28340},{},[28341],{"type":25,"value":26915},{"type":20,"tag":157,"props":28343,"children":28344},{"class":159,"line":1499},[28345],{"type":20,"tag":157,"props":28346,"children":28347},{},[28348],{"type":25,"value":28349},"    \u003C!-- 通过Map标签引入teacher -->\n",{"type":20,"tag":157,"props":28351,"children":28352},{"class":159,"line":1507},[28353],{"type":20,"tag":157,"props":28354,"children":28355},{},[28356],{"type":25,"value":28357},"    \u003Cproperty name=\"teacherMap\">\n",{"type":20,"tag":157,"props":28359,"children":28360},{"class":159,"line":1515},[28361],{"type":20,"tag":157,"props":28362,"children":28363},{},[28364],{"type":25,"value":28365},"        \u003Cmap>\n",{"type":20,"tag":157,"props":28367,"children":28368},{"class":159,"line":1523},[28369],{"type":20,"tag":157,"props":28370,"children":28371},{},[28372],{"type":25,"value":28373},"            \u003Centry key=\"语文老师\" value-ref=\"teacherOne\"\u002F>\n",{"type":20,"tag":157,"props":28375,"children":28376},{"class":159,"line":1532},[28377],{"type":20,"tag":157,"props":28378,"children":28379},{},[28380],{"type":25,"value":28381},"            \u003Centry key=\"数学老师\" value-ref=\"teacherTwo\"\u002F>\n",{"type":20,"tag":157,"props":28383,"children":28384},{"class":159,"line":1541},[28385],{"type":20,"tag":157,"props":28386,"children":28387},{},[28388],{"type":25,"value":28389},"        \u003C\u002Fmap>\n",{"type":20,"tag":157,"props":28391,"children":28392},{"class":159,"line":1550},[28393],{"type":20,"tag":157,"props":28394,"children":28395},{},[28396],{"type":25,"value":26915},{"type":20,"tag":157,"props":28398,"children":28399},{"class":159,"line":1558},[28400],{"type":20,"tag":157,"props":28401,"children":28402},{},[28403],{"type":25,"value":26774},{"type":20,"tag":157,"props":28405,"children":28406},{"class":159,"line":1566},[28407],{"type":20,"tag":157,"props":28408,"children":28409},{"emptyLinePlaceholder":173},[28410],{"type":25,"value":176},{"type":20,"tag":157,"props":28412,"children":28413},{"class":159,"line":1574},[28414],{"type":20,"tag":157,"props":28415,"children":28416},{},[28417],{"type":25,"value":28418},"\u003C!--创建teavher的bean-->\n",{"type":20,"tag":157,"props":28420,"children":28421},{"class":159,"line":1582},[28422],{"type":20,"tag":157,"props":28423,"children":28424},{},[28425],{"type":25,"value":28426},"\u003Cbean id=\"teacherOne\" class=\"com.wangkun.spring.pojo.Teacher\">\n",{"type":20,"tag":157,"props":28428,"children":28429},{"class":159,"line":1591},[28430],{"type":20,"tag":157,"props":28431,"children":28432},{},[28433],{"type":25,"value":28434},"    \u003Cproperty name=\"tid\" value=\"1001\"\u002F>\n",{"type":20,"tag":157,"props":28436,"children":28437},{"class":159,"line":1599},[28438],{"type":20,"tag":157,"props":28439,"children":28440},{},[28441],{"type":25,"value":28442},"    \u003Cproperty name=\"tname\" value=\"张三\"\u002F>\n",{"type":20,"tag":157,"props":28444,"children":28445},{"class":159,"line":1608},[28446],{"type":20,"tag":157,"props":28447,"children":28448},{},[28449],{"type":25,"value":26774},{"type":20,"tag":157,"props":28451,"children":28452},{"class":159,"line":1617},[28453],{"type":20,"tag":157,"props":28454,"children":28455},{},[28456],{"type":25,"value":28457},"\u003Cbean id=\"teacherTwo\" class=\"com.wangkun.spring.pojo.Teacher\">\n",{"type":20,"tag":157,"props":28459,"children":28460},{"class":159,"line":1626},[28461],{"type":20,"tag":157,"props":28462,"children":28463},{},[28464],{"type":25,"value":28465},"    \u003Cproperty name=\"tid\" value=\"1002\"\u002F>\n",{"type":20,"tag":157,"props":28467,"children":28468},{"class":159,"line":1634},[28469],{"type":20,"tag":157,"props":28470,"children":28471},{},[28472],{"type":25,"value":28473},"    \u003Cproperty name=\"tname\" value=\"李四\"\u002F>\n",{"type":20,"tag":157,"props":28475,"children":28476},{"class":159,"line":1642},[28477],{"type":20,"tag":157,"props":28478,"children":28479},{},[28480],{"type":25,"value":26774},{"type":20,"tag":21,"props":28482,"children":28483},{},[28484],{"type":20,"tag":33,"props":28485,"children":28486},{},[28487],{"type":25,"value":28488},"方式二：配置Map类型的bean(util:map)",{"type":20,"tag":126,"props":28490,"children":28492},{"className":17052,"code":28491,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"studentThree\" class=\"com.wangkun.spring.pojo.Student\">\n    \u003Cproperty name=\"sId\" value=\"1111\"\u002F>\n    \u003Cproperty name=\"sName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"27\"\u002F>\n    \u003Cproperty name=\"gender\" value=\"男\"\u002F>\n    \u003Cproperty name=\"clazz\">\n        \u003Cbean class=\"com.wangkun.spring.pojo.Clazz\">\n            \u003Cproperty name=\"cid\" value=\"1002\"\u002F>\n            \u003Cproperty name=\"cname\" value=\"键盘敲碎班\"\u002F>\n        \u003C\u002Fbean>\n    \u003C\u002Fproperty>\n    \u003Cproperty name=\"hobby\">\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\n\u003Cutil:map id=\"teacherMap\">\n    \u003Centry key=\"语文老师\" value-ref=\"teacherOne\"\u002F>\n    \u003Centry key=\"数学老师\" value-ref=\"teacherTwo\"\u002F>\n\u003C\u002Futil:map>\n\n\u003Cbean id=\"teacherOne\" class=\"com.wangkun.spring.pojo.Teacher\">\n    \u003Cproperty name=\"tid\" value=\"1001\"\u002F>\n    \u003Cproperty name=\"tname\" value=\"张三\"\u002F>\n\u003C\u002Fbean>\n\n\u003Cbean id=\"teacherTwo\" class=\"com.wangkun.spring.pojo.Teacher\">\n    \u003Cproperty name=\"tid\" value=\"1002\"\u002F>\n    \u003Cproperty name=\"tname\" value=\"李四\"\u002F>\n\u003C\u002Fbean>\n",[28493],{"type":20,"tag":84,"props":28494,"children":28495},{"__ignoreMap":8},[28496,28503,28510,28517,28524,28531,28538,28545,28552,28559,28566,28573,28580,28587,28594,28601,28608,28615,28622,28630,28637,28644,28652,28660,28668,28676,28683,28690,28697,28704,28711,28718,28725,28732,28739],{"type":20,"tag":157,"props":28497,"children":28498},{"class":159,"line":160},[28499],{"type":20,"tag":157,"props":28500,"children":28501},{},[28502],{"type":25,"value":26795},{"type":20,"tag":157,"props":28504,"children":28505},{"class":159,"line":169},[28506],{"type":20,"tag":157,"props":28507,"children":28508},{},[28509],{"type":25,"value":28228},{"type":20,"tag":157,"props":28511,"children":28512},{"class":159,"line":179},[28513],{"type":20,"tag":157,"props":28514,"children":28515},{},[28516],{"type":25,"value":28236},{"type":20,"tag":157,"props":28518,"children":28519},{"class":159,"line":188},[28520],{"type":20,"tag":157,"props":28521,"children":28522},{},[28523],{"type":25,"value":27274},{"type":20,"tag":157,"props":28525,"children":28526},{"class":159,"line":196},[28527],{"type":20,"tag":157,"props":28528,"children":28529},{},[28530],{"type":25,"value":26766},{"type":20,"tag":157,"props":28532,"children":28533},{"class":159,"line":204},[28534],{"type":20,"tag":157,"props":28535,"children":28536},{},[28537],{"type":25,"value":27400},{"type":20,"tag":157,"props":28539,"children":28540},{"class":159,"line":213},[28541],{"type":20,"tag":157,"props":28542,"children":28543},{},[28544],{"type":25,"value":27408},{"type":20,"tag":157,"props":28546,"children":28547},{"class":159,"line":222},[28548],{"type":20,"tag":157,"props":28549,"children":28550},{},[28551],{"type":25,"value":27416},{"type":20,"tag":157,"props":28553,"children":28554},{"class":159,"line":440},[28555],{"type":20,"tag":157,"props":28556,"children":28557},{},[28558],{"type":25,"value":27424},{"type":20,"tag":157,"props":28560,"children":28561},{"class":159,"line":448},[28562],{"type":20,"tag":157,"props":28563,"children":28564},{},[28565],{"type":25,"value":27432},{"type":20,"tag":157,"props":28567,"children":28568},{"class":159,"line":456},[28569],{"type":20,"tag":157,"props":28570,"children":28571},{},[28572],{"type":25,"value":26915},{"type":20,"tag":157,"props":28574,"children":28575},{"class":159,"line":465},[28576],{"type":20,"tag":157,"props":28577,"children":28578},{},[28579],{"type":25,"value":27803},{"type":20,"tag":157,"props":28581,"children":28582},{"class":159,"line":474},[28583],{"type":20,"tag":157,"props":28584,"children":28585},{},[28586],{"type":25,"value":27811},{"type":20,"tag":157,"props":28588,"children":28589},{"class":159,"line":483},[28590],{"type":20,"tag":157,"props":28591,"children":28592},{},[28593],{"type":25,"value":27819},{"type":20,"tag":157,"props":28595,"children":28596},{"class":159,"line":491},[28597],{"type":20,"tag":157,"props":28598,"children":28599},{},[28600],{"type":25,"value":27827},{"type":20,"tag":157,"props":28602,"children":28603},{"class":159,"line":499},[28604],{"type":20,"tag":157,"props":28605,"children":28606},{},[28607],{"type":25,"value":27835},{"type":20,"tag":157,"props":28609,"children":28610},{"class":159,"line":508},[28611],{"type":20,"tag":157,"props":28612,"children":28613},{},[28614],{"type":25,"value":27843},{"type":20,"tag":157,"props":28616,"children":28617},{"class":159,"line":517},[28618],{"type":20,"tag":157,"props":28619,"children":28620},{},[28621],{"type":25,"value":26915},{"type":20,"tag":157,"props":28623,"children":28624},{"class":159,"line":1499},[28625],{"type":20,"tag":157,"props":28626,"children":28627},{},[28628],{"type":25,"value":28629},"   \u003Cproperty name=\"teacherMap\" ref=\"teacherMap\"\u002F>\n",{"type":20,"tag":157,"props":28631,"children":28632},{"class":159,"line":1507},[28633],{"type":20,"tag":157,"props":28634,"children":28635},{},[28636],{"type":25,"value":26774},{"type":20,"tag":157,"props":28638,"children":28639},{"class":159,"line":1515},[28640],{"type":20,"tag":157,"props":28641,"children":28642},{"emptyLinePlaceholder":173},[28643],{"type":25,"value":176},{"type":20,"tag":157,"props":28645,"children":28646},{"class":159,"line":1523},[28647],{"type":20,"tag":157,"props":28648,"children":28649},{},[28650],{"type":25,"value":28651},"\u003Cutil:map id=\"teacherMap\">\n",{"type":20,"tag":157,"props":28653,"children":28654},{"class":159,"line":1532},[28655],{"type":20,"tag":157,"props":28656,"children":28657},{},[28658],{"type":25,"value":28659},"    \u003Centry key=\"语文老师\" value-ref=\"teacherOne\"\u002F>\n",{"type":20,"tag":157,"props":28661,"children":28662},{"class":159,"line":1541},[28663],{"type":20,"tag":157,"props":28664,"children":28665},{},[28666],{"type":25,"value":28667},"    \u003Centry key=\"数学老师\" value-ref=\"teacherTwo\"\u002F>\n",{"type":20,"tag":157,"props":28669,"children":28670},{"class":159,"line":1550},[28671],{"type":20,"tag":157,"props":28672,"children":28673},{},[28674],{"type":25,"value":28675},"\u003C\u002Futil:map>\n",{"type":20,"tag":157,"props":28677,"children":28678},{"class":159,"line":1558},[28679],{"type":20,"tag":157,"props":28680,"children":28681},{"emptyLinePlaceholder":173},[28682],{"type":25,"value":176},{"type":20,"tag":157,"props":28684,"children":28685},{"class":159,"line":1566},[28686],{"type":20,"tag":157,"props":28687,"children":28688},{},[28689],{"type":25,"value":28426},{"type":20,"tag":157,"props":28691,"children":28692},{"class":159,"line":1574},[28693],{"type":20,"tag":157,"props":28694,"children":28695},{},[28696],{"type":25,"value":28434},{"type":20,"tag":157,"props":28698,"children":28699},{"class":159,"line":1582},[28700],{"type":20,"tag":157,"props":28701,"children":28702},{},[28703],{"type":25,"value":28442},{"type":20,"tag":157,"props":28705,"children":28706},{"class":159,"line":1591},[28707],{"type":20,"tag":157,"props":28708,"children":28709},{},[28710],{"type":25,"value":26774},{"type":20,"tag":157,"props":28712,"children":28713},{"class":159,"line":1599},[28714],{"type":20,"tag":157,"props":28715,"children":28716},{"emptyLinePlaceholder":173},[28717],{"type":25,"value":176},{"type":20,"tag":157,"props":28719,"children":28720},{"class":159,"line":1608},[28721],{"type":20,"tag":157,"props":28722,"children":28723},{},[28724],{"type":25,"value":28457},{"type":20,"tag":157,"props":28726,"children":28727},{"class":159,"line":1617},[28728],{"type":20,"tag":157,"props":28729,"children":28730},{},[28731],{"type":25,"value":28465},{"type":20,"tag":157,"props":28733,"children":28734},{"class":159,"line":1626},[28735],{"type":20,"tag":157,"props":28736,"children":28737},{},[28738],{"type":25,"value":28473},{"type":20,"tag":157,"props":28740,"children":28741},{"class":159,"line":1634},[28742],{"type":20,"tag":157,"props":28743,"children":28744},{},[28745],{"type":25,"value":26774},{"type":20,"tag":18942,"props":28747,"children":28749},{"id":28748},"_238-引入外部属性文件",[28750],{"type":25,"value":28751},"2.3.8 引入外部属性文件",{"type":20,"tag":6665,"props":28753,"children":28754},{},[28755],{"type":20,"tag":21,"props":28756,"children":28757},{},[28758],{"type":25,"value":28759},"已druid为例",{"type":20,"tag":21,"props":28761,"children":28762},{},[28763],{"type":20,"tag":33,"props":28764,"children":28765},{},[28766],{"type":25,"value":28767},"jdbc-properties.properties：",{"type":20,"tag":126,"props":28769,"children":28773},{"className":28770,"code":28771,"language":28772,"meta":8,"style":8},"language-properties shiki shiki-themes github-dark","jdbc.driver=com.mysql.cj.jdbc.Driver\njdbc.url=jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fatguigu?serverTimezone=UTC\njdbc.username=root\njdbc.password=wangkun1\n","properties",[28774],{"type":20,"tag":84,"props":28775,"children":28776},{"__ignoreMap":8},[28777,28785,28793,28801],{"type":20,"tag":157,"props":28778,"children":28779},{"class":159,"line":160},[28780],{"type":20,"tag":157,"props":28781,"children":28782},{},[28783],{"type":25,"value":28784},"jdbc.driver=com.mysql.cj.jdbc.Driver\n",{"type":20,"tag":157,"props":28786,"children":28787},{"class":159,"line":169},[28788],{"type":20,"tag":157,"props":28789,"children":28790},{},[28791],{"type":25,"value":28792},"jdbc.url=jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fatguigu?serverTimezone=UTC\n",{"type":20,"tag":157,"props":28794,"children":28795},{"class":159,"line":179},[28796],{"type":20,"tag":157,"props":28797,"children":28798},{},[28799],{"type":25,"value":28800},"jdbc.username=root\n",{"type":20,"tag":157,"props":28802,"children":28803},{"class":159,"line":188},[28804],{"type":20,"tag":157,"props":28805,"children":28806},{},[28807],{"type":25,"value":28808},"jdbc.password=wangkun1\n",{"type":20,"tag":21,"props":28810,"children":28811},{},[28812],{"type":20,"tag":33,"props":28813,"children":28814},{},[28815],{"type":25,"value":28816},"spring-datasource.xml：",{"type":20,"tag":126,"props":28818,"children":28820},{"className":17052,"code":28819,"language":17054,"meta":8,"style":8},"\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=\"\n                 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!--引入jdbc-properties.properties文件-->\n    \u003Ccontext:property-placeholder location=\"jdbc-properties.properties\"\u002F>\n\n    \u003Cbean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\">\n        \u003Cproperty name=\"driverClassName\" value=\"${jdbc.driver}\"\u002F>\n        \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n        \u003Cproperty name=\"username\" value=\"${jdbc.username}\"\u002F>\n        \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n    \u003C\u002Fbean>\n\n\u003C\u002Fbeans>\n",[28821],{"type":20,"tag":84,"props":28822,"children":28823},{"__ignoreMap":8},[28824,28831,28838,28845,28853,28861,28869,28877,28885,28893,28900,28908,28916,28923,28931,28939,28947,28955,28963,28971,28978],{"type":20,"tag":157,"props":28825,"children":28826},{"class":159,"line":160},[28827],{"type":20,"tag":157,"props":28828,"children":28829},{},[28830],{"type":25,"value":23638},{"type":20,"tag":157,"props":28832,"children":28833},{"class":159,"line":169},[28834],{"type":20,"tag":157,"props":28835,"children":28836},{},[28837],{"type":25,"value":26182},{"type":20,"tag":157,"props":28839,"children":28840},{"class":159,"line":179},[28841],{"type":20,"tag":157,"props":28842,"children":28843},{},[28844],{"type":25,"value":26190},{"type":20,"tag":157,"props":28846,"children":28847},{"class":159,"line":188},[28848],{"type":20,"tag":157,"props":28849,"children":28850},{},[28851],{"type":25,"value":28852},"       xmlns:context=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\"\n",{"type":20,"tag":157,"props":28854,"children":28855},{"class":159,"line":196},[28856],{"type":20,"tag":157,"props":28857,"children":28858},{},[28859],{"type":25,"value":28860},"       xsi:schemaLocation=\"\n",{"type":20,"tag":157,"props":28862,"children":28863},{"class":159,"line":204},[28864],{"type":20,"tag":157,"props":28865,"children":28866},{},[28867],{"type":25,"value":28868},"                 http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n",{"type":20,"tag":157,"props":28870,"children":28871},{"class":159,"line":213},[28872],{"type":20,"tag":157,"props":28873,"children":28874},{},[28875],{"type":25,"value":28876},"                 http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\n",{"type":20,"tag":157,"props":28878,"children":28879},{"class":159,"line":222},[28880],{"type":20,"tag":157,"props":28881,"children":28882},{},[28883],{"type":25,"value":28884},"                  http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\n",{"type":20,"tag":157,"props":28886,"children":28887},{"class":159,"line":440},[28888],{"type":20,"tag":157,"props":28889,"children":28890},{},[28891],{"type":25,"value":28892},"                  http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n",{"type":20,"tag":157,"props":28894,"children":28895},{"class":159,"line":448},[28896],{"type":20,"tag":157,"props":28897,"children":28898},{},[28899],{"type":25,"value":17278},{"type":20,"tag":157,"props":28901,"children":28902},{"class":159,"line":456},[28903],{"type":20,"tag":157,"props":28904,"children":28905},{},[28906],{"type":25,"value":28907},"    \u003C!--引入jdbc-properties.properties文件-->\n",{"type":20,"tag":157,"props":28909,"children":28910},{"class":159,"line":465},[28911],{"type":20,"tag":157,"props":28912,"children":28913},{},[28914],{"type":25,"value":28915},"    \u003Ccontext:property-placeholder location=\"jdbc-properties.properties\"\u002F>\n",{"type":20,"tag":157,"props":28917,"children":28918},{"class":159,"line":474},[28919],{"type":20,"tag":157,"props":28920,"children":28921},{"emptyLinePlaceholder":173},[28922],{"type":25,"value":176},{"type":20,"tag":157,"props":28924,"children":28925},{"class":159,"line":483},[28926],{"type":20,"tag":157,"props":28927,"children":28928},{},[28929],{"type":25,"value":28930},"    \u003Cbean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\">\n",{"type":20,"tag":157,"props":28932,"children":28933},{"class":159,"line":491},[28934],{"type":20,"tag":157,"props":28935,"children":28936},{},[28937],{"type":25,"value":28938},"        \u003Cproperty name=\"driverClassName\" value=\"${jdbc.driver}\"\u002F>\n",{"type":20,"tag":157,"props":28940,"children":28941},{"class":159,"line":499},[28942],{"type":20,"tag":157,"props":28943,"children":28944},{},[28945],{"type":25,"value":28946},"        \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n",{"type":20,"tag":157,"props":28948,"children":28949},{"class":159,"line":508},[28950],{"type":20,"tag":157,"props":28951,"children":28952},{},[28953],{"type":25,"value":28954},"        \u003Cproperty name=\"username\" value=\"${jdbc.username}\"\u002F>\n",{"type":20,"tag":157,"props":28956,"children":28957},{"class":159,"line":517},[28958],{"type":20,"tag":157,"props":28959,"children":28960},{},[28961],{"type":25,"value":28962},"        \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n",{"type":20,"tag":157,"props":28964,"children":28965},{"class":159,"line":1499},[28966],{"type":20,"tag":157,"props":28967,"children":28968},{},[28969],{"type":25,"value":28970},"    \u003C\u002Fbean>\n",{"type":20,"tag":157,"props":28972,"children":28973},{"class":159,"line":1507},[28974],{"type":20,"tag":157,"props":28975,"children":28976},{"emptyLinePlaceholder":173},[28977],{"type":25,"value":176},{"type":20,"tag":157,"props":28979,"children":28980},{"class":159,"line":1515},[28981],{"type":20,"tag":157,"props":28982,"children":28983},{},[28984],{"type":25,"value":26276},{"type":20,"tag":18942,"props":28986,"children":28988},{"id":28987},"_239-bean的作用域",[28989],{"type":25,"value":28990},"2.3.9 bean的作用域",{"type":20,"tag":6665,"props":28992,"children":28993},{},[28994],{"type":20,"tag":21,"props":28995,"children":28996},{},[28997],{"type":25,"value":28998},"在Spring中可以配置bean标签的scope属性来指定bean的作用域范围",{"type":20,"tag":1902,"props":29000,"children":29001},{},[29002,29022],{"type":20,"tag":1906,"props":29003,"children":29004},{},[29005],{"type":20,"tag":1910,"props":29006,"children":29007},{},[29008,29013,29017],{"type":20,"tag":1914,"props":29009,"children":29010},{},[29011],{"type":25,"value":29012},"取值",{"type":20,"tag":1914,"props":29014,"children":29015},{},[29016],{"type":25,"value":2195},{"type":20,"tag":1914,"props":29018,"children":29019},{},[29020],{"type":25,"value":29021},"创建对象的时机",{"type":20,"tag":1930,"props":29023,"children":29024},{},[29025,29043],{"type":20,"tag":1910,"props":29026,"children":29027},{},[29028,29033,29038],{"type":20,"tag":1937,"props":29029,"children":29030},{},[29031],{"type":25,"value":29032},"singleton（默认）",{"type":20,"tag":1937,"props":29034,"children":29035},{},[29036],{"type":25,"value":29037},"在IOC容器中，这个bean的对象始终为单实例",{"type":20,"tag":1937,"props":29039,"children":29040},{},[29041],{"type":25,"value":29042},"IOC容器初始化",{"type":20,"tag":1910,"props":29044,"children":29045},{},[29046,29051,29056],{"type":20,"tag":1937,"props":29047,"children":29048},{},[29049],{"type":25,"value":29050},"prototype",{"type":20,"tag":1937,"props":29052,"children":29053},{},[29054],{"type":25,"value":29055},"这个bean在IOC容器中可以有多个实例",{"type":20,"tag":1937,"props":29057,"children":29058},{},[29059],{"type":25,"value":29060},"获取bean时",{"type":20,"tag":21,"props":29062,"children":29063},{},[29064],{"type":20,"tag":33,"props":29065,"children":29066},{},[29067],{"type":25,"value":29068},"bean配置文件：",{"type":20,"tag":126,"props":29070,"children":29072},{"className":17052,"code":29071,"language":17054,"meta":8,"style":8},"\u003Cbean id=\"student\" class=\"com.wangkun.spring.pojo.Student\" scope=\"prototype\">\n    \u003Cproperty name=\"sName\" value=\"程浩\"\u002F>\n    \u003Cproperty name=\"age\" value=\"19\"\u002F>\n\u003C\u002Fbean>\n",[29073],{"type":20,"tag":84,"props":29074,"children":29075},{"__ignoreMap":8},[29076,29084,29091,29099],{"type":20,"tag":157,"props":29077,"children":29078},{"class":159,"line":160},[29079],{"type":20,"tag":157,"props":29080,"children":29081},{},[29082],{"type":25,"value":29083},"\u003Cbean id=\"student\" class=\"com.wangkun.spring.pojo.Student\" scope=\"prototype\">\n",{"type":20,"tag":157,"props":29085,"children":29086},{"class":159,"line":169},[29087],{"type":20,"tag":157,"props":29088,"children":29089},{},[29090],{"type":25,"value":28236},{"type":20,"tag":157,"props":29092,"children":29093},{"class":159,"line":179},[29094],{"type":20,"tag":157,"props":29095,"children":29096},{},[29097],{"type":25,"value":29098},"    \u003Cproperty name=\"age\" value=\"19\"\u002F>\n",{"type":20,"tag":157,"props":29100,"children":29101},{"class":159,"line":188},[29102],{"type":20,"tag":157,"props":29103,"children":29104},{},[29105],{"type":25,"value":26774},{"type":20,"tag":18942,"props":29107,"children":29109},{"id":29108},"_2310-bean生命周期",[29110],{"type":25,"value":29111},"2.3.10 bean生命周期",{"type":20,"tag":6665,"props":29113,"children":29114},{},[29115,29138,29143,29148,29153],{"type":20,"tag":44,"props":29116,"children":29117},{},[29118,29123,29128,29133],{"type":20,"tag":48,"props":29119,"children":29120},{},[29121],{"type":25,"value":29122},"实例化： 调用空参构造",{"type":20,"tag":48,"props":29124,"children":29125},{},[29126],{"type":25,"value":29127},"依赖注入：为类组件的属性赋值",{"type":20,"tag":48,"props":29129,"children":29130},{},[29131],{"type":25,"value":29132},"初始化：在bean配置中指定类组件中的初始化方法",{"type":20,"tag":48,"props":29134,"children":29135},{},[29136],{"type":25,"value":29137},"销毁：在bean配置中指定类组件中的销毁方法（IOC容器关闭时销毁）",{"type":20,"tag":21,"props":29139,"children":29140},{},[29141],{"type":25,"value":29142},"对于Spring中的单例(Singleton)bean，它的实例化是在容器启动时进行的，也就是在应用程序启动时，Spring容器会创建并初始化所有的单例bean。这个过程中，Spring容器会扫描应用程序上下文中所有的bean定义，创建并实例化它们。",{"type":20,"tag":21,"props":29144,"children":29145},{},[29146],{"type":25,"value":29147},"当Spring容器启动时，会调用BeanFactoryPostProcessor和BeanPostProcessor，它们可以修改bean的定义和实例化过程。BeanFactoryPostProcessor用于修改bean的定义，而BeanPostProcessor则可以在bean实例化之后修改bean的属性和状态。",{"type":20,"tag":21,"props":29149,"children":29150},{},[29151],{"type":25,"value":29152},"接下来，Spring容器会对所有的单例bean进行实例化、属性注入、初始化和销毁，这些bean将会一直存在于应用程序的整个生命周期中，直到应用程序关闭。",{"type":20,"tag":21,"props":29154,"children":29155},{},[29156],{"type":25,"value":29157},"需要注意的是，对于非单例(Prototype)bean，它的实例化是在每次获取实例时进行的，也就是每次调用getBean()方法时都会创建一个新的实例。这个时候，Spring容器会对bean进行实例化、属性注入、初始化和销毁，但是每个实例的生命周期是独立的，不会影响其他实例。",{"type":20,"tag":21,"props":29159,"children":29160},{},[29161],{"type":20,"tag":33,"props":29162,"children":29163},{},[29164],{"type":25,"value":29165},"类组件：User",{"type":20,"tag":126,"props":29167,"children":29169},{"className":16050,"code":29168,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.pojo;\n\npublic class User {\n    private Integer id;\n    private String username;\n    private String password;\n    private Integer age;\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 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 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 User() {\n        System.out.println(\"生命周期1：实例化\");\n    }\n\n    public void initMethod() {\n        System.out.println(\"生命周期3：初始化\");\n    }\n\n    public void destroyMethod() {\n        System.out.println(\"生命周期4：销毁\");\n    }\n}\n",[29170],{"type":20,"tag":84,"props":29171,"children":29172},{"__ignoreMap":8},[29173,29180,29187,29195,29203,29211,29219,29227,29234,29242,29250,29258,29266,29274,29282,29290,29298,29305,29312,29320,29328,29335,29342,29350,29358,29366,29373,29380,29388,29396,29403,29410,29418,29426,29433,29440,29448,29456,29463,29470,29478,29486,29493,29500,29508,29516,29523,29530,29538,29546,29553,29560,29568,29575,29582,29589,29596,29603,29610,29618,29626,29633,29640,29648,29656,29663,29670,29678,29686,29693],{"type":20,"tag":157,"props":29174,"children":29175},{"class":159,"line":160},[29176],{"type":20,"tag":157,"props":29177,"children":29178},{},[29179],{"type":25,"value":26076},{"type":20,"tag":157,"props":29181,"children":29182},{"class":159,"line":169},[29183],{"type":20,"tag":157,"props":29184,"children":29185},{"emptyLinePlaceholder":173},[29186],{"type":25,"value":176},{"type":20,"tag":157,"props":29188,"children":29189},{"class":159,"line":179},[29190],{"type":20,"tag":157,"props":29191,"children":29192},{},[29193],{"type":25,"value":29194},"public class User {\n",{"type":20,"tag":157,"props":29196,"children":29197},{"class":159,"line":188},[29198],{"type":20,"tag":157,"props":29199,"children":29200},{},[29201],{"type":25,"value":29202},"    private Integer id;\n",{"type":20,"tag":157,"props":29204,"children":29205},{"class":159,"line":196},[29206],{"type":20,"tag":157,"props":29207,"children":29208},{},[29209],{"type":25,"value":29210},"    private String username;\n",{"type":20,"tag":157,"props":29212,"children":29213},{"class":159,"line":204},[29214],{"type":20,"tag":157,"props":29215,"children":29216},{},[29217],{"type":25,"value":29218},"    private String password;\n",{"type":20,"tag":157,"props":29220,"children":29221},{"class":159,"line":213},[29222],{"type":20,"tag":157,"props":29223,"children":29224},{},[29225],{"type":25,"value":29226},"    private Integer age;\n",{"type":20,"tag":157,"props":29228,"children":29229},{"class":159,"line":222},[29230],{"type":20,"tag":157,"props":29231,"children":29232},{"emptyLinePlaceholder":173},[29233],{"type":25,"value":176},{"type":20,"tag":157,"props":29235,"children":29236},{"class":159,"line":440},[29237],{"type":20,"tag":157,"props":29238,"children":29239},{},[29240],{"type":25,"value":29241},"    @Override\n",{"type":20,"tag":157,"props":29243,"children":29244},{"class":159,"line":448},[29245],{"type":20,"tag":157,"props":29246,"children":29247},{},[29248],{"type":25,"value":29249},"    public String toString() {\n",{"type":20,"tag":157,"props":29251,"children":29252},{"class":159,"line":456},[29253],{"type":20,"tag":157,"props":29254,"children":29255},{},[29256],{"type":25,"value":29257},"        return \"User{\" +\n",{"type":20,"tag":157,"props":29259,"children":29260},{"class":159,"line":465},[29261],{"type":20,"tag":157,"props":29262,"children":29263},{},[29264],{"type":25,"value":29265},"                \"id=\" + id +\n",{"type":20,"tag":157,"props":29267,"children":29268},{"class":159,"line":474},[29269],{"type":20,"tag":157,"props":29270,"children":29271},{},[29272],{"type":25,"value":29273},"                \", username='\" + username + '\\'' +\n",{"type":20,"tag":157,"props":29275,"children":29276},{"class":159,"line":483},[29277],{"type":20,"tag":157,"props":29278,"children":29279},{},[29280],{"type":25,"value":29281},"                \", password='\" + password + '\\'' +\n",{"type":20,"tag":157,"props":29283,"children":29284},{"class":159,"line":491},[29285],{"type":20,"tag":157,"props":29286,"children":29287},{},[29288],{"type":25,"value":29289},"                \", age=\" + age +\n",{"type":20,"tag":157,"props":29291,"children":29292},{"class":159,"line":499},[29293],{"type":20,"tag":157,"props":29294,"children":29295},{},[29296],{"type":25,"value":29297},"                '}';\n",{"type":20,"tag":157,"props":29299,"children":29300},{"class":159,"line":508},[29301],{"type":20,"tag":157,"props":29302,"children":29303},{},[29304],{"type":25,"value":872},{"type":20,"tag":157,"props":29306,"children":29307},{"class":159,"line":517},[29308],{"type":20,"tag":157,"props":29309,"children":29310},{"emptyLinePlaceholder":173},[29311],{"type":25,"value":176},{"type":20,"tag":157,"props":29313,"children":29314},{"class":159,"line":1499},[29315],{"type":20,"tag":157,"props":29316,"children":29317},{},[29318],{"type":25,"value":29319},"    public Integer getId() {\n",{"type":20,"tag":157,"props":29321,"children":29322},{"class":159,"line":1507},[29323],{"type":20,"tag":157,"props":29324,"children":29325},{},[29326],{"type":25,"value":29327},"        return id;\n",{"type":20,"tag":157,"props":29329,"children":29330},{"class":159,"line":1515},[29331],{"type":20,"tag":157,"props":29332,"children":29333},{},[29334],{"type":25,"value":872},{"type":20,"tag":157,"props":29336,"children":29337},{"class":159,"line":1523},[29338],{"type":20,"tag":157,"props":29339,"children":29340},{"emptyLinePlaceholder":173},[29341],{"type":25,"value":176},{"type":20,"tag":157,"props":29343,"children":29344},{"class":159,"line":1532},[29345],{"type":20,"tag":157,"props":29346,"children":29347},{},[29348],{"type":25,"value":29349},"    public void setId(Integer id) {\n",{"type":20,"tag":157,"props":29351,"children":29352},{"class":159,"line":1541},[29353],{"type":20,"tag":157,"props":29354,"children":29355},{},[29356],{"type":25,"value":29357},"        System.out.println(\"生命周期2：依赖注入\");\n",{"type":20,"tag":157,"props":29359,"children":29360},{"class":159,"line":1550},[29361],{"type":20,"tag":157,"props":29362,"children":29363},{},[29364],{"type":25,"value":29365},"        this.id = id;\n",{"type":20,"tag":157,"props":29367,"children":29368},{"class":159,"line":1558},[29369],{"type":20,"tag":157,"props":29370,"children":29371},{},[29372],{"type":25,"value":872},{"type":20,"tag":157,"props":29374,"children":29375},{"class":159,"line":1566},[29376],{"type":20,"tag":157,"props":29377,"children":29378},{"emptyLinePlaceholder":173},[29379],{"type":25,"value":176},{"type":20,"tag":157,"props":29381,"children":29382},{"class":159,"line":1574},[29383],{"type":20,"tag":157,"props":29384,"children":29385},{},[29386],{"type":25,"value":29387},"    public String getUsername() {\n",{"type":20,"tag":157,"props":29389,"children":29390},{"class":159,"line":1582},[29391],{"type":20,"tag":157,"props":29392,"children":29393},{},[29394],{"type":25,"value":29395},"        return username;\n",{"type":20,"tag":157,"props":29397,"children":29398},{"class":159,"line":1591},[29399],{"type":20,"tag":157,"props":29400,"children":29401},{},[29402],{"type":25,"value":872},{"type":20,"tag":157,"props":29404,"children":29405},{"class":159,"line":1599},[29406],{"type":20,"tag":157,"props":29407,"children":29408},{"emptyLinePlaceholder":173},[29409],{"type":25,"value":176},{"type":20,"tag":157,"props":29411,"children":29412},{"class":159,"line":1608},[29413],{"type":20,"tag":157,"props":29414,"children":29415},{},[29416],{"type":25,"value":29417},"    public void setUsername(String username) {\n",{"type":20,"tag":157,"props":29419,"children":29420},{"class":159,"line":1617},[29421],{"type":20,"tag":157,"props":29422,"children":29423},{},[29424],{"type":25,"value":29425},"        this.username = username;\n",{"type":20,"tag":157,"props":29427,"children":29428},{"class":159,"line":1626},[29429],{"type":20,"tag":157,"props":29430,"children":29431},{},[29432],{"type":25,"value":872},{"type":20,"tag":157,"props":29434,"children":29435},{"class":159,"line":1634},[29436],{"type":20,"tag":157,"props":29437,"children":29438},{"emptyLinePlaceholder":173},[29439],{"type":25,"value":176},{"type":20,"tag":157,"props":29441,"children":29442},{"class":159,"line":1642},[29443],{"type":20,"tag":157,"props":29444,"children":29445},{},[29446],{"type":25,"value":29447},"    public String getPassword() {\n",{"type":20,"tag":157,"props":29449,"children":29450},{"class":159,"line":1650},[29451],{"type":20,"tag":157,"props":29452,"children":29453},{},[29454],{"type":25,"value":29455},"        return password;\n",{"type":20,"tag":157,"props":29457,"children":29458},{"class":159,"line":1659},[29459],{"type":20,"tag":157,"props":29460,"children":29461},{},[29462],{"type":25,"value":872},{"type":20,"tag":157,"props":29464,"children":29465},{"class":159,"line":1668},[29466],{"type":20,"tag":157,"props":29467,"children":29468},{"emptyLinePlaceholder":173},[29469],{"type":25,"value":176},{"type":20,"tag":157,"props":29471,"children":29472},{"class":159,"line":1677},[29473],{"type":20,"tag":157,"props":29474,"children":29475},{},[29476],{"type":25,"value":29477},"    public void setPassword(String password) {\n",{"type":20,"tag":157,"props":29479,"children":29480},{"class":159,"line":1685},[29481],{"type":20,"tag":157,"props":29482,"children":29483},{},[29484],{"type":25,"value":29485},"        this.password = password;\n",{"type":20,"tag":157,"props":29487,"children":29488},{"class":159,"line":1693},[29489],{"type":20,"tag":157,"props":29490,"children":29491},{},[29492],{"type":25,"value":872},{"type":20,"tag":157,"props":29494,"children":29495},{"class":159,"line":1701},[29496],{"type":20,"tag":157,"props":29497,"children":29498},{"emptyLinePlaceholder":173},[29499],{"type":25,"value":176},{"type":20,"tag":157,"props":29501,"children":29502},{"class":159,"line":1710},[29503],{"type":20,"tag":157,"props":29504,"children":29505},{},[29506],{"type":25,"value":29507},"    public Integer getAge() {\n",{"type":20,"tag":157,"props":29509,"children":29510},{"class":159,"line":23976},[29511],{"type":20,"tag":157,"props":29512,"children":29513},{},[29514],{"type":25,"value":29515},"        return age;\n",{"type":20,"tag":157,"props":29517,"children":29518},{"class":159,"line":23985},[29519],{"type":20,"tag":157,"props":29520,"children":29521},{},[29522],{"type":25,"value":872},{"type":20,"tag":157,"props":29524,"children":29525},{"class":159,"line":23994},[29526],{"type":20,"tag":157,"props":29527,"children":29528},{"emptyLinePlaceholder":173},[29529],{"type":25,"value":176},{"type":20,"tag":157,"props":29531,"children":29532},{"class":159,"line":24003},[29533],{"type":20,"tag":157,"props":29534,"children":29535},{},[29536],{"type":25,"value":29537},"    public void setAge(Integer age) {\n",{"type":20,"tag":157,"props":29539,"children":29540},{"class":159,"line":24012},[29541],{"type":20,"tag":157,"props":29542,"children":29543},{},[29544],{"type":25,"value":29545},"        this.age = age;\n",{"type":20,"tag":157,"props":29547,"children":29548},{"class":159,"line":24021},[29549],{"type":20,"tag":157,"props":29550,"children":29551},{},[29552],{"type":25,"value":872},{"type":20,"tag":157,"props":29554,"children":29555},{"class":159,"line":24030},[29556],{"type":20,"tag":157,"props":29557,"children":29558},{"emptyLinePlaceholder":173},[29559],{"type":25,"value":176},{"type":20,"tag":157,"props":29561,"children":29562},{"class":159,"line":24039},[29563],{"type":20,"tag":157,"props":29564,"children":29565},{},[29566],{"type":25,"value":29567},"    public User(Integer id, String username, String password, Integer age) {\n",{"type":20,"tag":157,"props":29569,"children":29570},{"class":159,"line":24048},[29571],{"type":20,"tag":157,"props":29572,"children":29573},{},[29574],{"type":25,"value":29365},{"type":20,"tag":157,"props":29576,"children":29577},{"class":159,"line":24057},[29578],{"type":20,"tag":157,"props":29579,"children":29580},{},[29581],{"type":25,"value":29425},{"type":20,"tag":157,"props":29583,"children":29584},{"class":159,"line":24066},[29585],{"type":20,"tag":157,"props":29586,"children":29587},{},[29588],{"type":25,"value":29485},{"type":20,"tag":157,"props":29590,"children":29591},{"class":159,"line":24075},[29592],{"type":20,"tag":157,"props":29593,"children":29594},{},[29595],{"type":25,"value":29545},{"type":20,"tag":157,"props":29597,"children":29598},{"class":159,"line":24084},[29599],{"type":20,"tag":157,"props":29600,"children":29601},{},[29602],{"type":25,"value":872},{"type":20,"tag":157,"props":29604,"children":29605},{"class":159,"line":24093},[29606],{"type":20,"tag":157,"props":29607,"children":29608},{"emptyLinePlaceholder":173},[29609],{"type":25,"value":176},{"type":20,"tag":157,"props":29611,"children":29612},{"class":159,"line":24102},[29613],{"type":20,"tag":157,"props":29614,"children":29615},{},[29616],{"type":25,"value":29617},"    public User() {\n",{"type":20,"tag":157,"props":29619,"children":29620},{"class":159,"line":24111},[29621],{"type":20,"tag":157,"props":29622,"children":29623},{},[29624],{"type":25,"value":29625},"        System.out.println(\"生命周期1：实例化\");\n",{"type":20,"tag":157,"props":29627,"children":29628},{"class":159,"line":24119},[29629],{"type":20,"tag":157,"props":29630,"children":29631},{},[29632],{"type":25,"value":872},{"type":20,"tag":157,"props":29634,"children":29635},{"class":159,"line":24128},[29636],{"type":20,"tag":157,"props":29637,"children":29638},{"emptyLinePlaceholder":173},[29639],{"type":25,"value":176},{"type":20,"tag":157,"props":29641,"children":29642},{"class":159,"line":24137},[29643],{"type":20,"tag":157,"props":29644,"children":29645},{},[29646],{"type":25,"value":29647},"    public void initMethod() {\n",{"type":20,"tag":157,"props":29649,"children":29650},{"class":159,"line":24146},[29651],{"type":20,"tag":157,"props":29652,"children":29653},{},[29654],{"type":25,"value":29655},"        System.out.println(\"生命周期3：初始化\");\n",{"type":20,"tag":157,"props":29657,"children":29658},{"class":159,"line":24154},[29659],{"type":20,"tag":157,"props":29660,"children":29661},{},[29662],{"type":25,"value":872},{"type":20,"tag":157,"props":29664,"children":29665},{"class":159,"line":24163},[29666],{"type":20,"tag":157,"props":29667,"children":29668},{"emptyLinePlaceholder":173},[29669],{"type":25,"value":176},{"type":20,"tag":157,"props":29671,"children":29672},{"class":159,"line":24172},[29673],{"type":20,"tag":157,"props":29674,"children":29675},{},[29676],{"type":25,"value":29677},"    public void destroyMethod() {\n",{"type":20,"tag":157,"props":29679,"children":29680},{"class":159,"line":24181},[29681],{"type":20,"tag":157,"props":29682,"children":29683},{},[29684],{"type":25,"value":29685},"        System.out.println(\"生命周期4：销毁\");\n",{"type":20,"tag":157,"props":29687,"children":29688},{"class":159,"line":24190},[29689],{"type":20,"tag":157,"props":29690,"children":29691},{},[29692],{"type":25,"value":872},{"type":20,"tag":157,"props":29694,"children":29695},{"class":159,"line":25069},[29696],{"type":20,"tag":157,"props":29697,"children":29698},{},[29699],{"type":25,"value":943},{"type":20,"tag":21,"props":29701,"children":29702},{},[29703],{"type":20,"tag":33,"props":29704,"children":29705},{},[29706],{"type":25,"value":29068},{"type":20,"tag":126,"props":29708,"children":29710},{"className":17052,"code":29709,"language":17054,"meta":8,"style":8},"\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       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n\n    \u003Cbean id=\"lifeCycle\" class=\"com.wangkun.spring.pojo.User\" init-method=\"initMethod\" destroy-method=\"destroyMethod\">\n        \u003Cproperty name=\"id\" value=\"1\"\u002F>\n        \u003Cproperty name=\"username\" value=\"王琨\"\u002F>\n        \u003Cproperty name=\"password\" value=\"1231231\"\u002F>\n        \u003Cproperty name=\"age\" value=\"23\"\u002F>\n    \u003C\u002Fbean>\n\n\u003C\u002Fbeans>\n",[29711],{"type":20,"tag":84,"props":29712,"children":29713},{"__ignoreMap":8},[29714,29721,29728,29735,29742,29749,29757,29765,29773,29781,29789,29796,29803],{"type":20,"tag":157,"props":29715,"children":29716},{"class":159,"line":160},[29717],{"type":20,"tag":157,"props":29718,"children":29719},{},[29720],{"type":25,"value":23638},{"type":20,"tag":157,"props":29722,"children":29723},{"class":159,"line":169},[29724],{"type":20,"tag":157,"props":29725,"children":29726},{},[29727],{"type":25,"value":26182},{"type":20,"tag":157,"props":29729,"children":29730},{"class":159,"line":179},[29731],{"type":20,"tag":157,"props":29732,"children":29733},{},[29734],{"type":25,"value":26190},{"type":20,"tag":157,"props":29736,"children":29737},{"class":159,"line":188},[29738],{"type":20,"tag":157,"props":29739,"children":29740},{},[29741],{"type":25,"value":26198},{"type":20,"tag":157,"props":29743,"children":29744},{"class":159,"line":196},[29745],{"type":20,"tag":157,"props":29746,"children":29747},{"emptyLinePlaceholder":173},[29748],{"type":25,"value":176},{"type":20,"tag":157,"props":29750,"children":29751},{"class":159,"line":204},[29752],{"type":20,"tag":157,"props":29753,"children":29754},{},[29755],{"type":25,"value":29756},"    \u003Cbean id=\"lifeCycle\" class=\"com.wangkun.spring.pojo.User\" init-method=\"initMethod\" destroy-method=\"destroyMethod\">\n",{"type":20,"tag":157,"props":29758,"children":29759},{"class":159,"line":213},[29760],{"type":20,"tag":157,"props":29761,"children":29762},{},[29763],{"type":25,"value":29764},"        \u003Cproperty name=\"id\" value=\"1\"\u002F>\n",{"type":20,"tag":157,"props":29766,"children":29767},{"class":159,"line":222},[29768],{"type":20,"tag":157,"props":29769,"children":29770},{},[29771],{"type":25,"value":29772},"        \u003Cproperty name=\"username\" value=\"王琨\"\u002F>\n",{"type":20,"tag":157,"props":29774,"children":29775},{"class":159,"line":440},[29776],{"type":20,"tag":157,"props":29777,"children":29778},{},[29779],{"type":25,"value":29780},"        \u003Cproperty name=\"password\" value=\"1231231\"\u002F>\n",{"type":20,"tag":157,"props":29782,"children":29783},{"class":159,"line":448},[29784],{"type":20,"tag":157,"props":29785,"children":29786},{},[29787],{"type":25,"value":29788},"        \u003Cproperty name=\"age\" value=\"23\"\u002F>\n",{"type":20,"tag":157,"props":29790,"children":29791},{"class":159,"line":456},[29792],{"type":20,"tag":157,"props":29793,"children":29794},{},[29795],{"type":25,"value":28970},{"type":20,"tag":157,"props":29797,"children":29798},{"class":159,"line":465},[29799],{"type":20,"tag":157,"props":29800,"children":29801},{"emptyLinePlaceholder":173},[29802],{"type":25,"value":176},{"type":20,"tag":157,"props":29804,"children":29805},{"class":159,"line":474},[29806],{"type":20,"tag":157,"props":29807,"children":29808},{},[29809],{"type":25,"value":26276},{"type":20,"tag":18942,"props":29811,"children":29813},{"id":29812},"_2311-factorybean",[29814],{"type":25,"value":29815},"2.3.11 FactoryBean",{"type":20,"tag":6665,"props":29817,"children":29818},{},[29819,29824,29829],{"type":20,"tag":21,"props":29820,"children":29821},{},[29822],{"type":25,"value":29823},"FactoryBean是一个Spring提供的一种整合第三方框架的常用机制。",{"type":20,"tag":21,"props":29825,"children":29826},{},[29827],{"type":25,"value":29828},"和普通bean不同，配置一个FactoryBean的bean，在获取bean的时候并不是class属性配置的这个对象类，而是getObject()方法的返回值。通过这种机制，Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来，只把最简洁的使用界面展示给我们。",{"type":20,"tag":21,"props":29830,"children":29831},{},[29832],{"type":25,"value":29833},"将来我们整合Mybatis，Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的",{"type":20,"tag":21,"props":29835,"children":29836},{},[29837],{"type":20,"tag":33,"props":29838,"children":29839},{},[29840],{"type":25,"value":29841},"创建工厂类：",{"type":20,"tag":126,"props":29843,"children":29845},{"className":16050,"code":29844,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.factory;\n\nimport com.wangkun.spring.pojo.User;\nimport org.springframework.beans.factory.FactoryBean;\n\n\u002F*\n* FactoryBean是一个接口，需要创建一个类实现接口\n* 其中有三个方法：\n*   1. getObject(): 通过一个对象交给IOC容器管理\n*   2. GetObjectType(): 设置所提供对象的类型\n*   3. isSingleton(): 所提供的对象是否为单例\n* *\u002F\n\npublic class UserFactoryBean implements FactoryBean\u003CUser> {\n    @Override\n    public User getObject() throws Exception {\n        return new User();\n    }\n    @Override\n    public Class\u003C?> getObjectType() {\n        return User.class;\n    }\n}\n",[29846],{"type":20,"tag":84,"props":29847,"children":29848},{"__ignoreMap":8},[29849,29857,29864,29872,29880,29887,29895,29903,29911,29919,29927,29935,29943,29950,29958,29965,29973,29981,29988,29995,30003,30011,30018],{"type":20,"tag":157,"props":29850,"children":29851},{"class":159,"line":160},[29852],{"type":20,"tag":157,"props":29853,"children":29854},{},[29855],{"type":25,"value":29856},"package com.wangkun.spring.factory;\n",{"type":20,"tag":157,"props":29858,"children":29859},{"class":159,"line":169},[29860],{"type":20,"tag":157,"props":29861,"children":29862},{"emptyLinePlaceholder":173},[29863],{"type":25,"value":176},{"type":20,"tag":157,"props":29865,"children":29866},{"class":159,"line":179},[29867],{"type":20,"tag":157,"props":29868,"children":29869},{},[29870],{"type":25,"value":29871},"import com.wangkun.spring.pojo.User;\n",{"type":20,"tag":157,"props":29873,"children":29874},{"class":159,"line":188},[29875],{"type":20,"tag":157,"props":29876,"children":29877},{},[29878],{"type":25,"value":29879},"import org.springframework.beans.factory.FactoryBean;\n",{"type":20,"tag":157,"props":29881,"children":29882},{"class":159,"line":196},[29883],{"type":20,"tag":157,"props":29884,"children":29885},{"emptyLinePlaceholder":173},[29886],{"type":25,"value":176},{"type":20,"tag":157,"props":29888,"children":29889},{"class":159,"line":204},[29890],{"type":20,"tag":157,"props":29891,"children":29892},{},[29893],{"type":25,"value":29894},"\u002F*\n",{"type":20,"tag":157,"props":29896,"children":29897},{"class":159,"line":213},[29898],{"type":20,"tag":157,"props":29899,"children":29900},{},[29901],{"type":25,"value":29902},"* FactoryBean是一个接口，需要创建一个类实现接口\n",{"type":20,"tag":157,"props":29904,"children":29905},{"class":159,"line":222},[29906],{"type":20,"tag":157,"props":29907,"children":29908},{},[29909],{"type":25,"value":29910},"* 其中有三个方法：\n",{"type":20,"tag":157,"props":29912,"children":29913},{"class":159,"line":440},[29914],{"type":20,"tag":157,"props":29915,"children":29916},{},[29917],{"type":25,"value":29918},"*   1. getObject(): 通过一个对象交给IOC容器管理\n",{"type":20,"tag":157,"props":29920,"children":29921},{"class":159,"line":448},[29922],{"type":20,"tag":157,"props":29923,"children":29924},{},[29925],{"type":25,"value":29926},"*   2. GetObjectType(): 设置所提供对象的类型\n",{"type":20,"tag":157,"props":29928,"children":29929},{"class":159,"line":456},[29930],{"type":20,"tag":157,"props":29931,"children":29932},{},[29933],{"type":25,"value":29934},"*   3. isSingleton(): 所提供的对象是否为单例\n",{"type":20,"tag":157,"props":29936,"children":29937},{"class":159,"line":465},[29938],{"type":20,"tag":157,"props":29939,"children":29940},{},[29941],{"type":25,"value":29942},"* *\u002F\n",{"type":20,"tag":157,"props":29944,"children":29945},{"class":159,"line":474},[29946],{"type":20,"tag":157,"props":29947,"children":29948},{"emptyLinePlaceholder":173},[29949],{"type":25,"value":176},{"type":20,"tag":157,"props":29951,"children":29952},{"class":159,"line":483},[29953],{"type":20,"tag":157,"props":29954,"children":29955},{},[29956],{"type":25,"value":29957},"public class UserFactoryBean implements FactoryBean\u003CUser> {\n",{"type":20,"tag":157,"props":29959,"children":29960},{"class":159,"line":491},[29961],{"type":20,"tag":157,"props":29962,"children":29963},{},[29964],{"type":25,"value":29241},{"type":20,"tag":157,"props":29966,"children":29967},{"class":159,"line":499},[29968],{"type":20,"tag":157,"props":29969,"children":29970},{},[29971],{"type":25,"value":29972},"    public User getObject() throws Exception {\n",{"type":20,"tag":157,"props":29974,"children":29975},{"class":159,"line":508},[29976],{"type":20,"tag":157,"props":29977,"children":29978},{},[29979],{"type":25,"value":29980},"        return new User();\n",{"type":20,"tag":157,"props":29982,"children":29983},{"class":159,"line":517},[29984],{"type":20,"tag":157,"props":29985,"children":29986},{},[29987],{"type":25,"value":872},{"type":20,"tag":157,"props":29989,"children":29990},{"class":159,"line":1499},[29991],{"type":20,"tag":157,"props":29992,"children":29993},{},[29994],{"type":25,"value":29241},{"type":20,"tag":157,"props":29996,"children":29997},{"class":159,"line":1507},[29998],{"type":20,"tag":157,"props":29999,"children":30000},{},[30001],{"type":25,"value":30002},"    public Class\u003C?> getObjectType() {\n",{"type":20,"tag":157,"props":30004,"children":30005},{"class":159,"line":1515},[30006],{"type":20,"tag":157,"props":30007,"children":30008},{},[30009],{"type":25,"value":30010},"        return User.class;\n",{"type":20,"tag":157,"props":30012,"children":30013},{"class":159,"line":1523},[30014],{"type":20,"tag":157,"props":30015,"children":30016},{},[30017],{"type":25,"value":872},{"type":20,"tag":157,"props":30019,"children":30020},{"class":159,"line":1532},[30021],{"type":20,"tag":157,"props":30022,"children":30023},{},[30024],{"type":25,"value":943},{"type":20,"tag":21,"props":30026,"children":30027},{},[30028],{"type":20,"tag":33,"props":30029,"children":30030},{},[30031],{"type":25,"value":30032},"bean配置：",{"type":20,"tag":126,"props":30034,"children":30036},{"className":17052,"code":30035,"language":17054,"meta":8,"style":8},"\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       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n\n    \u003Cbean id=\"userFactory\" class=\"com.wangkun.spring.factory.UserFactoryBean\"\u002F>\n\n\u003C\u002Fbeans>\n",[30037],{"type":20,"tag":84,"props":30038,"children":30039},{"__ignoreMap":8},[30040,30047,30054,30061,30068,30075,30083,30090],{"type":20,"tag":157,"props":30041,"children":30042},{"class":159,"line":160},[30043],{"type":20,"tag":157,"props":30044,"children":30045},{},[30046],{"type":25,"value":23638},{"type":20,"tag":157,"props":30048,"children":30049},{"class":159,"line":169},[30050],{"type":20,"tag":157,"props":30051,"children":30052},{},[30053],{"type":25,"value":26182},{"type":20,"tag":157,"props":30055,"children":30056},{"class":159,"line":179},[30057],{"type":20,"tag":157,"props":30058,"children":30059},{},[30060],{"type":25,"value":26190},{"type":20,"tag":157,"props":30062,"children":30063},{"class":159,"line":188},[30064],{"type":20,"tag":157,"props":30065,"children":30066},{},[30067],{"type":25,"value":26198},{"type":20,"tag":157,"props":30069,"children":30070},{"class":159,"line":196},[30071],{"type":20,"tag":157,"props":30072,"children":30073},{"emptyLinePlaceholder":173},[30074],{"type":25,"value":176},{"type":20,"tag":157,"props":30076,"children":30077},{"class":159,"line":204},[30078],{"type":20,"tag":157,"props":30079,"children":30080},{},[30081],{"type":25,"value":30082},"    \u003Cbean id=\"userFactory\" class=\"com.wangkun.spring.factory.UserFactoryBean\"\u002F>\n",{"type":20,"tag":157,"props":30084,"children":30085},{"class":159,"line":213},[30086],{"type":20,"tag":157,"props":30087,"children":30088},{"emptyLinePlaceholder":173},[30089],{"type":25,"value":176},{"type":20,"tag":157,"props":30091,"children":30092},{"class":159,"line":222},[30093],{"type":20,"tag":157,"props":30094,"children":30095},{},[30096],{"type":25,"value":26276},{"type":20,"tag":21,"props":30098,"children":30099},{},[30100],{"type":20,"tag":33,"props":30101,"children":30102},{},[30103],{"type":25,"value":30104},"测试类：使用，与打印结果",{"type":20,"tag":126,"props":30106,"children":30108},{"className":16050,"code":30107,"language":16052,"meta":8,"style":8},"@Test\npublic void testFactory() {\n\n    ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"spring-factory.xml\");\n\n    User bean = ioc.getBean(User.class);\n    System.out.println(bean);\n\n}\n\n\u002F\u002F 打印结果，只有生命周期第一步，因为没有进行依赖注入，\n\u002F\u002F 生命周期1：实例化\n\u002F\u002F User{id=null, username='null', password='null', age=null}\n",[30109],{"type":20,"tag":84,"props":30110,"children":30111},{"__ignoreMap":8},[30112,30119,30127,30134,30142,30149,30157,30164,30171,30178,30185,30193,30201],{"type":20,"tag":157,"props":30113,"children":30114},{"class":159,"line":160},[30115],{"type":20,"tag":157,"props":30116,"children":30117},{},[30118],{"type":25,"value":17978},{"type":20,"tag":157,"props":30120,"children":30121},{"class":159,"line":169},[30122],{"type":20,"tag":157,"props":30123,"children":30124},{},[30125],{"type":25,"value":30126},"public void testFactory() {\n",{"type":20,"tag":157,"props":30128,"children":30129},{"class":159,"line":179},[30130],{"type":20,"tag":157,"props":30131,"children":30132},{"emptyLinePlaceholder":173},[30133],{"type":25,"value":176},{"type":20,"tag":157,"props":30135,"children":30136},{"class":159,"line":188},[30137],{"type":20,"tag":157,"props":30138,"children":30139},{},[30140],{"type":25,"value":30141},"    ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"spring-factory.xml\");\n",{"type":20,"tag":157,"props":30143,"children":30144},{"class":159,"line":196},[30145],{"type":20,"tag":157,"props":30146,"children":30147},{"emptyLinePlaceholder":173},[30148],{"type":25,"value":176},{"type":20,"tag":157,"props":30150,"children":30151},{"class":159,"line":204},[30152],{"type":20,"tag":157,"props":30153,"children":30154},{},[30155],{"type":25,"value":30156},"    User bean = ioc.getBean(User.class);\n",{"type":20,"tag":157,"props":30158,"children":30159},{"class":159,"line":213},[30160],{"type":20,"tag":157,"props":30161,"children":30162},{},[30163],{"type":25,"value":26558},{"type":20,"tag":157,"props":30165,"children":30166},{"class":159,"line":222},[30167],{"type":20,"tag":157,"props":30168,"children":30169},{"emptyLinePlaceholder":173},[30170],{"type":25,"value":176},{"type":20,"tag":157,"props":30172,"children":30173},{"class":159,"line":440},[30174],{"type":20,"tag":157,"props":30175,"children":30176},{},[30177],{"type":25,"value":943},{"type":20,"tag":157,"props":30179,"children":30180},{"class":159,"line":448},[30181],{"type":20,"tag":157,"props":30182,"children":30183},{"emptyLinePlaceholder":173},[30184],{"type":25,"value":176},{"type":20,"tag":157,"props":30186,"children":30187},{"class":159,"line":456},[30188],{"type":20,"tag":157,"props":30189,"children":30190},{},[30191],{"type":25,"value":30192},"\u002F\u002F 打印结果，只有生命周期第一步，因为没有进行依赖注入，\n",{"type":20,"tag":157,"props":30194,"children":30195},{"class":159,"line":465},[30196],{"type":20,"tag":157,"props":30197,"children":30198},{},[30199],{"type":25,"value":30200},"\u002F\u002F 生命周期1：实例化\n",{"type":20,"tag":157,"props":30202,"children":30203},{"class":159,"line":474},[30204],{"type":20,"tag":157,"props":30205,"children":30206},{},[30207],{"type":25,"value":30208},"\u002F\u002F User{id=null, username='null', password='null', age=null}\n",{"type":20,"tag":18942,"props":30210,"children":30212},{"id":30211},"_2312-基于xml的自动装配",[30213],{"type":25,"value":30214},"2.3.12 基于xml的自动装配",{"type":20,"tag":6665,"props":30216,"children":30217},{},[30218,30223,30228,30233],{"type":20,"tag":21,"props":30219,"children":30220},{},[30221],{"type":25,"value":30222},"根据指定的策略，在IOC容器匹配某一个bean，自动为指定的bean中所依赖的类类型或者接口类型属性赋值",{"type":20,"tag":21,"props":30224,"children":30225},{},[30226],{"type":25,"value":30227},"可以通过bean标签中的autowire属性设置自定装配策略",{"type":20,"tag":21,"props":30229,"children":30230},{},[30231],{"type":25,"value":30232},"可选值：",{"type":20,"tag":44,"props":30234,"children":30235},{},[30236,30241],{"type":20,"tag":48,"props":30237,"children":30238},{},[30239],{"type":25,"value":30240},"no、default：不装配",{"type":20,"tag":48,"props":30242,"children":30243},{},[30244],{"type":25,"value":30245},"bytype：根据要赋值的属性的类型，在IOC容器中匹配某个bean，为属性赋值",{"type":20,"tag":21,"props":30247,"children":30248},{},[30249],{"type":20,"tag":33,"props":30250,"children":30251},{},[30252],{"type":25,"value":30253},"byType",{"type":20,"tag":126,"props":30255,"children":30257},{"className":17052,"code":30256,"language":17054,"meta":8,"style":8},"\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       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n\n\n    \u003Cbean id=\"userController\" class=\"com.wangkun.spring.controller.UserController\" autowire=\"byType\">\n\u003C!--        \u003Cproperty name=\"userService\" ref=\"userService\"\u002F>-->\n    \u003C\u002Fbean>\n\n    \u003Cbean class=\"com.wangkun.spring.service.impl.UserServiceImpl\" id=\"userService\" autowire=\"byType\">\n\u003C!--        \u003Cproperty name=\"userDao\" ref=\"userDao\"\u002F>-->\n    \u003C\u002Fbean>\n\n    \u003Cbean class=\"com.wangkun.spring.dao.impl.UserDaoImpl\" id=\"userDao\">\n    \u003C\u002Fbean>\n\u003C\u002Fbeans>\n",[30258],{"type":20,"tag":84,"props":30259,"children":30260},{"__ignoreMap":8},[30261,30268,30275,30282,30289,30296,30303,30311,30319,30326,30333,30341,30349,30356,30363,30371,30378],{"type":20,"tag":157,"props":30262,"children":30263},{"class":159,"line":160},[30264],{"type":20,"tag":157,"props":30265,"children":30266},{},[30267],{"type":25,"value":23638},{"type":20,"tag":157,"props":30269,"children":30270},{"class":159,"line":169},[30271],{"type":20,"tag":157,"props":30272,"children":30273},{},[30274],{"type":25,"value":26182},{"type":20,"tag":157,"props":30276,"children":30277},{"class":159,"line":179},[30278],{"type":20,"tag":157,"props":30279,"children":30280},{},[30281],{"type":25,"value":26190},{"type":20,"tag":157,"props":30283,"children":30284},{"class":159,"line":188},[30285],{"type":20,"tag":157,"props":30286,"children":30287},{},[30288],{"type":25,"value":26198},{"type":20,"tag":157,"props":30290,"children":30291},{"class":159,"line":196},[30292],{"type":20,"tag":157,"props":30293,"children":30294},{"emptyLinePlaceholder":173},[30295],{"type":25,"value":176},{"type":20,"tag":157,"props":30297,"children":30298},{"class":159,"line":204},[30299],{"type":20,"tag":157,"props":30300,"children":30301},{"emptyLinePlaceholder":173},[30302],{"type":25,"value":176},{"type":20,"tag":157,"props":30304,"children":30305},{"class":159,"line":213},[30306],{"type":20,"tag":157,"props":30307,"children":30308},{},[30309],{"type":25,"value":30310},"    \u003Cbean id=\"userController\" class=\"com.wangkun.spring.controller.UserController\" autowire=\"byType\">\n",{"type":20,"tag":157,"props":30312,"children":30313},{"class":159,"line":222},[30314],{"type":20,"tag":157,"props":30315,"children":30316},{},[30317],{"type":25,"value":30318},"\u003C!--        \u003Cproperty name=\"userService\" ref=\"userService\"\u002F>-->\n",{"type":20,"tag":157,"props":30320,"children":30321},{"class":159,"line":440},[30322],{"type":20,"tag":157,"props":30323,"children":30324},{},[30325],{"type":25,"value":28970},{"type":20,"tag":157,"props":30327,"children":30328},{"class":159,"line":448},[30329],{"type":20,"tag":157,"props":30330,"children":30331},{"emptyLinePlaceholder":173},[30332],{"type":25,"value":176},{"type":20,"tag":157,"props":30334,"children":30335},{"class":159,"line":456},[30336],{"type":20,"tag":157,"props":30337,"children":30338},{},[30339],{"type":25,"value":30340},"    \u003Cbean class=\"com.wangkun.spring.service.impl.UserServiceImpl\" id=\"userService\" autowire=\"byType\">\n",{"type":20,"tag":157,"props":30342,"children":30343},{"class":159,"line":465},[30344],{"type":20,"tag":157,"props":30345,"children":30346},{},[30347],{"type":25,"value":30348},"\u003C!--        \u003Cproperty name=\"userDao\" ref=\"userDao\"\u002F>-->\n",{"type":20,"tag":157,"props":30350,"children":30351},{"class":159,"line":474},[30352],{"type":20,"tag":157,"props":30353,"children":30354},{},[30355],{"type":25,"value":28970},{"type":20,"tag":157,"props":30357,"children":30358},{"class":159,"line":483},[30359],{"type":20,"tag":157,"props":30360,"children":30361},{"emptyLinePlaceholder":173},[30362],{"type":25,"value":176},{"type":20,"tag":157,"props":30364,"children":30365},{"class":159,"line":491},[30366],{"type":20,"tag":157,"props":30367,"children":30368},{},[30369],{"type":25,"value":30370},"    \u003Cbean class=\"com.wangkun.spring.dao.impl.UserDaoImpl\" id=\"userDao\">\n",{"type":20,"tag":157,"props":30372,"children":30373},{"class":159,"line":499},[30374],{"type":20,"tag":157,"props":30375,"children":30376},{},[30377],{"type":25,"value":28970},{"type":20,"tag":157,"props":30379,"children":30380},{"class":159,"line":508},[30381],{"type":20,"tag":157,"props":30382,"children":30383},{},[30384],{"type":25,"value":26276},{"type":20,"tag":20294,"props":30386,"children":30388},{"id":30387},"byname",[30389],{"type":20,"tag":33,"props":30390,"children":30391},{},[30392],{"type":25,"value":30393},"byName",{"type":20,"tag":126,"props":30395,"children":30397},{"className":17052,"code":30396,"language":17054,"meta":8,"style":8},"\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       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\">\n\n\n    \u003Cbean id=\"userController\" class=\"com.wangkun.spring.controller.UserController\" autowire=\"byName\">\n\u003C!--        \u003Cproperty name=\"userService\" ref=\"userService\"\u002F>-->\n    \u003C\u002Fbean>\n\n    \u003Cbean class=\"com.wangkun.spring.service.impl.UserServiceImpl\" id=\"userService\" autowire=\"byName\">\n\u003C!--        \u003Cproperty name=\"userDao\" ref=\"userDao\"\u002F>-->\n    \u003C\u002Fbean>\n\n    \u003Cbean class=\"com.wangkun.spring.dao.impl.UserDaoImpl\" id=\"userDao\">\n    \u003C\u002Fbean>\n\u003C\u002Fbeans>\n",[30398],{"type":20,"tag":84,"props":30399,"children":30400},{"__ignoreMap":8},[30401,30408,30415,30422,30429,30436,30443,30451,30458,30465,30472,30480,30487,30494,30501,30508,30515],{"type":20,"tag":157,"props":30402,"children":30403},{"class":159,"line":160},[30404],{"type":20,"tag":157,"props":30405,"children":30406},{},[30407],{"type":25,"value":23638},{"type":20,"tag":157,"props":30409,"children":30410},{"class":159,"line":169},[30411],{"type":20,"tag":157,"props":30412,"children":30413},{},[30414],{"type":25,"value":26182},{"type":20,"tag":157,"props":30416,"children":30417},{"class":159,"line":179},[30418],{"type":20,"tag":157,"props":30419,"children":30420},{},[30421],{"type":25,"value":26190},{"type":20,"tag":157,"props":30423,"children":30424},{"class":159,"line":188},[30425],{"type":20,"tag":157,"props":30426,"children":30427},{},[30428],{"type":25,"value":26198},{"type":20,"tag":157,"props":30430,"children":30431},{"class":159,"line":196},[30432],{"type":20,"tag":157,"props":30433,"children":30434},{"emptyLinePlaceholder":173},[30435],{"type":25,"value":176},{"type":20,"tag":157,"props":30437,"children":30438},{"class":159,"line":204},[30439],{"type":20,"tag":157,"props":30440,"children":30441},{"emptyLinePlaceholder":173},[30442],{"type":25,"value":176},{"type":20,"tag":157,"props":30444,"children":30445},{"class":159,"line":213},[30446],{"type":20,"tag":157,"props":30447,"children":30448},{},[30449],{"type":25,"value":30450},"    \u003Cbean id=\"userController\" class=\"com.wangkun.spring.controller.UserController\" autowire=\"byName\">\n",{"type":20,"tag":157,"props":30452,"children":30453},{"class":159,"line":222},[30454],{"type":20,"tag":157,"props":30455,"children":30456},{},[30457],{"type":25,"value":30318},{"type":20,"tag":157,"props":30459,"children":30460},{"class":159,"line":440},[30461],{"type":20,"tag":157,"props":30462,"children":30463},{},[30464],{"type":25,"value":28970},{"type":20,"tag":157,"props":30466,"children":30467},{"class":159,"line":448},[30468],{"type":20,"tag":157,"props":30469,"children":30470},{"emptyLinePlaceholder":173},[30471],{"type":25,"value":176},{"type":20,"tag":157,"props":30473,"children":30474},{"class":159,"line":456},[30475],{"type":20,"tag":157,"props":30476,"children":30477},{},[30478],{"type":25,"value":30479},"    \u003Cbean class=\"com.wangkun.spring.service.impl.UserServiceImpl\" id=\"userService\" autowire=\"byName\">\n",{"type":20,"tag":157,"props":30481,"children":30482},{"class":159,"line":465},[30483],{"type":20,"tag":157,"props":30484,"children":30485},{},[30486],{"type":25,"value":30348},{"type":20,"tag":157,"props":30488,"children":30489},{"class":159,"line":474},[30490],{"type":20,"tag":157,"props":30491,"children":30492},{},[30493],{"type":25,"value":28970},{"type":20,"tag":157,"props":30495,"children":30496},{"class":159,"line":483},[30497],{"type":20,"tag":157,"props":30498,"children":30499},{"emptyLinePlaceholder":173},[30500],{"type":25,"value":176},{"type":20,"tag":157,"props":30502,"children":30503},{"class":159,"line":491},[30504],{"type":20,"tag":157,"props":30505,"children":30506},{},[30507],{"type":25,"value":30370},{"type":20,"tag":157,"props":30509,"children":30510},{"class":159,"line":499},[30511],{"type":20,"tag":157,"props":30512,"children":30513},{},[30514],{"type":25,"value":28970},{"type":20,"tag":157,"props":30516,"children":30517},{"class":159,"line":508},[30518],{"type":20,"tag":157,"props":30519,"children":30520},{},[30521],{"type":25,"value":26276},{"type":20,"tag":21,"props":30523,"children":30524},{},[30525],{"type":25,"value":30526},"**总结：**当类型匹配的bean有多个时，此时可以使用byName实现自动装配",{"type":20,"tag":11085,"props":30528,"children":30530},{"id":30529},"_24-基于注解管理bean",[30531],{"type":25,"value":30532},"2.4 基于注解管理bean",{"type":20,"tag":6665,"props":30534,"children":30535},{},[30536,30541],{"type":20,"tag":21,"props":30537,"children":30538},{},[30539],{"type":25,"value":30540},"常用的注解：",{"type":20,"tag":44,"props":30542,"children":30543},{},[30544,30549,30554,30559],{"type":20,"tag":48,"props":30545,"children":30546},{},[30547],{"type":25,"value":30548},"@Component：将类标识为普通组件",{"type":20,"tag":48,"props":30550,"children":30551},{},[30552],{"type":25,"value":30553},"@Controller：将类标识为控制层组件",{"type":20,"tag":48,"props":30555,"children":30556},{},[30557],{"type":25,"value":30558},"@Service：将类标识为业务层组件",{"type":20,"tag":48,"props":30560,"children":30561},{},[30562],{"type":25,"value":30563},"@Repository：将类标识为持久层组件",{"type":20,"tag":18942,"props":30565,"children":30567},{"id":30566},"_241-扫描组件",[30568,30570],{"type":25,"value":30569},"2.4.1 ",{"type":20,"tag":33,"props":30571,"children":30572},{},[30573],{"type":25,"value":30574},"扫描组件：",{"type":20,"tag":5719,"props":30576,"children":30577},{},[30578],{"type":20,"tag":48,"props":30579,"children":30580},{},[30581],{"type":25,"value":30582},"情况一：最基本的扫描方式",{"type":20,"tag":126,"props":30584,"children":30586},{"className":17052,"code":30585,"language":17054,"meta":8,"style":8},"\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       https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\"\n>\n\n    \u003Ccontext:component-scan base-package=\"com.wangkun.spring\"\u002F>\n    \n\u003C\u002Fbeans>\n",[30587],{"type":20,"tag":84,"props":30588,"children":30589},{"__ignoreMap":8},[30590,30597,30604,30611,30618,30626,30634,30642,30650,30658,30665,30673,30681],{"type":20,"tag":157,"props":30591,"children":30592},{"class":159,"line":160},[30593],{"type":20,"tag":157,"props":30594,"children":30595},{},[30596],{"type":25,"value":23638},{"type":20,"tag":157,"props":30598,"children":30599},{"class":159,"line":169},[30600],{"type":20,"tag":157,"props":30601,"children":30602},{},[30603],{"type":25,"value":26182},{"type":20,"tag":157,"props":30605,"children":30606},{"class":159,"line":179},[30607],{"type":20,"tag":157,"props":30608,"children":30609},{},[30610],{"type":25,"value":26190},{"type":20,"tag":157,"props":30612,"children":30613},{"class":159,"line":188},[30614],{"type":20,"tag":157,"props":30615,"children":30616},{},[30617],{"type":25,"value":28852},{"type":20,"tag":157,"props":30619,"children":30620},{"class":159,"line":196},[30621],{"type":20,"tag":157,"props":30622,"children":30623},{},[30624],{"type":25,"value":30625},"       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\n",{"type":20,"tag":157,"props":30627,"children":30628},{"class":159,"line":204},[30629],{"type":20,"tag":157,"props":30630,"children":30631},{},[30632],{"type":25,"value":30633},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd\n",{"type":20,"tag":157,"props":30635,"children":30636},{"class":159,"line":213},[30637],{"type":20,"tag":157,"props":30638,"children":30639},{},[30640],{"type":25,"value":30641},"       http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\n",{"type":20,"tag":157,"props":30643,"children":30644},{"class":159,"line":222},[30645],{"type":20,"tag":157,"props":30646,"children":30647},{},[30648],{"type":25,"value":30649},"       https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\"\n",{"type":20,"tag":157,"props":30651,"children":30652},{"class":159,"line":440},[30653],{"type":20,"tag":157,"props":30654,"children":30655},{},[30656],{"type":25,"value":30657},">\n",{"type":20,"tag":157,"props":30659,"children":30660},{"class":159,"line":448},[30661],{"type":20,"tag":157,"props":30662,"children":30663},{"emptyLinePlaceholder":173},[30664],{"type":25,"value":176},{"type":20,"tag":157,"props":30666,"children":30667},{"class":159,"line":456},[30668],{"type":20,"tag":157,"props":30669,"children":30670},{},[30671],{"type":25,"value":30672},"    \u003Ccontext:component-scan base-package=\"com.wangkun.spring\"\u002F>\n",{"type":20,"tag":157,"props":30674,"children":30675},{"class":159,"line":465},[30676],{"type":20,"tag":157,"props":30677,"children":30678},{},[30679],{"type":25,"value":30680},"    \n",{"type":20,"tag":157,"props":30682,"children":30683},{"class":159,"line":474},[30684],{"type":20,"tag":157,"props":30685,"children":30686},{},[30687],{"type":25,"value":26276},{"type":20,"tag":5719,"props":30689,"children":30690},{"start":169},[30691],{"type":20,"tag":48,"props":30692,"children":30693},{},[30694],{"type":25,"value":30695},"情况二：指定要配出的组件",{"type":20,"tag":6665,"props":30697,"children":30698},{},[30699,30704],{"type":20,"tag":21,"props":30700,"children":30701},{},[30702],{"type":25,"value":30703},"type：",{"type":20,"tag":44,"props":30705,"children":30706},{},[30707,30718],{"type":20,"tag":48,"props":30708,"children":30709},{},[30710,30716],{"type":20,"tag":84,"props":30711,"children":30713},{"className":30712},[],[30714],{"type":25,"value":30715},"annotation",{"type":25,"value":30717},"：根据注解排除，expression中设置要排除的注解的全类名",{"type":20,"tag":48,"props":30719,"children":30720},{},[30721,30727],{"type":20,"tag":84,"props":30722,"children":30724},{"className":30723},[],[30725],{"type":25,"value":30726},"assignable",{"type":25,"value":30728},"：根据类型排除，expression中设置要排除的类型的全类名",{"type":20,"tag":5719,"props":30730,"children":30731},{"start":179},[30732],{"type":20,"tag":48,"props":30733,"children":30734},{},[30735],{"type":25,"value":30736},"情况三：指定要扫描的组件",{"type":20,"tag":6665,"props":30738,"children":30739},{},[30740,30745,30750,30755,30759],{"type":20,"tag":21,"props":30741,"children":30742},{},[30743],{"type":25,"value":30744},"context:include-filter标签：指定在原有扫描规则的基础上追加的规则",{"type":20,"tag":21,"props":30746,"children":30747},{},[30748],{"type":25,"value":30749},"use-default-filters属性：取值false表示关闭默认扫描规则",{"type":20,"tag":21,"props":30751,"children":30752},{},[30753],{"type":25,"value":30754},"此时必须设置use-default-filters=\"false\"，因为默认规则即扫描指定包下所有类",{"type":20,"tag":21,"props":30756,"children":30757},{},[30758],{"type":25,"value":30703},{"type":20,"tag":44,"props":30760,"children":30761},{},[30762,30772],{"type":20,"tag":48,"props":30763,"children":30764},{},[30765,30770],{"type":20,"tag":84,"props":30766,"children":30768},{"className":30767},[],[30769],{"type":25,"value":30715},{"type":25,"value":30771},"：根据注解扫描，expression中设置要扫描的注解的全类名",{"type":20,"tag":48,"props":30773,"children":30774},{},[30775,30780],{"type":20,"tag":84,"props":30776,"children":30778},{"className":30777},[],[30779],{"type":25,"value":30726},{"type":25,"value":30781},"：根据类型扫描，expression中设置要扫描的类型的全类名",{"type":20,"tag":18942,"props":30783,"children":30785},{"id":30784},"_242-自定义组件bean的id",[30786],{"type":25,"value":30787},"2.4.2 自定义组件bean的id",{"type":20,"tag":6665,"props":30789,"children":30790},{},[30791],{"type":20,"tag":21,"props":30792,"children":30793},{},[30794,30796,30801],{"type":25,"value":30795},"基于注解的管理的bean默认id就是",{"type":20,"tag":33,"props":30797,"children":30798},{},[30799],{"type":25,"value":30800},"首字母小写的类名",{"type":25,"value":30802},"，我们可以通过注解中的value属性自定义id",{"type":20,"tag":126,"props":30804,"children":30806},{"className":16050,"code":30805,"language":16052,"meta":8,"style":8},"@Controller(\"controller\")\npublic class UserController {\n  \n}\n\n\u002F\u002F 测试\nClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n\n\u002F\u002F 默认id\nObject controller1 = ioc.getBean(\"userController\");\n\u002F\u002F 自定义id\nObject controller2 = ioc.getBean(\"controller\");\nSystem.out.println(controller);\n",[30807],{"type":20,"tag":84,"props":30808,"children":30809},{"__ignoreMap":8},[30810,30818,30826,30833,30840,30847,30855,30863,30870,30878,30886,30894,30902],{"type":20,"tag":157,"props":30811,"children":30812},{"class":159,"line":160},[30813],{"type":20,"tag":157,"props":30814,"children":30815},{},[30816],{"type":25,"value":30817},"@Controller(\"controller\")\n",{"type":20,"tag":157,"props":30819,"children":30820},{"class":159,"line":169},[30821],{"type":20,"tag":157,"props":30822,"children":30823},{},[30824],{"type":25,"value":30825},"public class UserController {\n",{"type":20,"tag":157,"props":30827,"children":30828},{"class":159,"line":179},[30829],{"type":20,"tag":157,"props":30830,"children":30831},{},[30832],{"type":25,"value":17278},{"type":20,"tag":157,"props":30834,"children":30835},{"class":159,"line":188},[30836],{"type":20,"tag":157,"props":30837,"children":30838},{},[30839],{"type":25,"value":943},{"type":20,"tag":157,"props":30841,"children":30842},{"class":159,"line":196},[30843],{"type":20,"tag":157,"props":30844,"children":30845},{"emptyLinePlaceholder":173},[30846],{"type":25,"value":176},{"type":20,"tag":157,"props":30848,"children":30849},{"class":159,"line":204},[30850],{"type":20,"tag":157,"props":30851,"children":30852},{},[30853],{"type":25,"value":30854},"\u002F\u002F 测试\n",{"type":20,"tag":157,"props":30856,"children":30857},{"class":159,"line":213},[30858],{"type":20,"tag":157,"props":30859,"children":30860},{},[30861],{"type":25,"value":30862},"ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext(\"applicationContext.xml\");\n",{"type":20,"tag":157,"props":30864,"children":30865},{"class":159,"line":222},[30866],{"type":20,"tag":157,"props":30867,"children":30868},{"emptyLinePlaceholder":173},[30869],{"type":25,"value":176},{"type":20,"tag":157,"props":30871,"children":30872},{"class":159,"line":440},[30873],{"type":20,"tag":157,"props":30874,"children":30875},{},[30876],{"type":25,"value":30877},"\u002F\u002F 默认id\n",{"type":20,"tag":157,"props":30879,"children":30880},{"class":159,"line":448},[30881],{"type":20,"tag":157,"props":30882,"children":30883},{},[30884],{"type":25,"value":30885},"Object controller1 = ioc.getBean(\"userController\");\n",{"type":20,"tag":157,"props":30887,"children":30888},{"class":159,"line":456},[30889],{"type":20,"tag":157,"props":30890,"children":30891},{},[30892],{"type":25,"value":30893},"\u002F\u002F 自定义id\n",{"type":20,"tag":157,"props":30895,"children":30896},{"class":159,"line":465},[30897],{"type":20,"tag":157,"props":30898,"children":30899},{},[30900],{"type":25,"value":30901},"Object controller2 = ioc.getBean(\"controller\");\n",{"type":20,"tag":157,"props":30903,"children":30904},{"class":159,"line":474},[30905],{"type":20,"tag":157,"props":30906,"children":30907},{},[30908],{"type":25,"value":30909},"System.out.println(controller);\n",{"type":20,"tag":18942,"props":30911,"children":30913},{"id":30912},"_243-基于注解的自动装配",[30914],{"type":25,"value":30915},"2.4.3 基于注解的自动装配",{"type":20,"tag":6665,"props":30917,"children":30918},{},[30919,30927,30945,30953,30984],{"type":20,"tag":21,"props":30920,"children":30921},{},[30922],{"type":20,"tag":33,"props":30923,"children":30924},{},[30925],{"type":25,"value":30926},"@Autowired注解能够标识的位置",{"type":20,"tag":44,"props":30928,"children":30929},{},[30930,30935,30940],{"type":20,"tag":48,"props":30931,"children":30932},{},[30933],{"type":25,"value":30934},"标识在成员变量上，此时不需要设置成员变量的set方法",{"type":20,"tag":48,"props":30936,"children":30937},{},[30938],{"type":25,"value":30939},"标识在set方法上",{"type":20,"tag":48,"props":30941,"children":30942},{},[30943],{"type":25,"value":30944},"标识在为当前成员变量赋值的有参构造上",{"type":20,"tag":21,"props":30946,"children":30947},{},[30948],{"type":20,"tag":33,"props":30949,"children":30950},{},[30951],{"type":25,"value":30952},"@Autowired注解原理",{"type":20,"tag":44,"props":30954,"children":30955},{},[30956,30961,30966,30971],{"type":20,"tag":48,"props":30957,"children":30958},{},[30959],{"type":25,"value":30960},"默认通过byType的方式，在IOC容器中通过类型匹配某个bean为属性赋值",{"type":20,"tag":48,"props":30962,"children":30963},{},[30964],{"type":25,"value":30965},"若有多了类型匹配的bean，此时会自动转换为byName的方式实现自动装备的效果，将要赋值的属性的属性名作为bean的id匹配某个bean为属性赋值",{"type":20,"tag":48,"props":30967,"children":30968},{},[30969],{"type":25,"value":30970},"若byType与byName的方式都无法实现自动装配，即IOC容器中有多个类型匹配的bean，且这些bean的id和要赋值的属性的属性名都一致，会抛出异常",{"type":20,"tag":48,"props":30972,"children":30973},{},[30974,30976,30982],{"type":25,"value":30975},"此时可以再要赋值的属性上，添加一个注解",{"type":20,"tag":84,"props":30977,"children":30979},{"className":30978},[],[30980],{"type":25,"value":30981},"@Qualifier",{"type":25,"value":30983},"，通过该注解的value属性，指定某个bean的id，将这个bean为属性赋值",{"type":20,"tag":21,"props":30985,"children":30986},{},[30987],{"type":25,"value":30988},"@Autowired中有属性required，默认值为true，因此在自动装配无法找到相应的bean时，会装配失败可以将属性required的值设置为true，则表示能装就装，装不上就不装，此时自动装配的属性为默认，但是实际开发时，基本上所有需要装配组件的地方都是必须装配的，用不上这个属性。",{"type":20,"tag":126,"props":30990,"children":30992},{"className":16050,"code":30991,"language":16052,"meta":8,"style":8},"@Controller\npublic class UserController {\n\n    @Autowired\n    private UserService userService;\n\n    public void saveUser() {\n      \n        userService.saveUser();\n      \n    }\n}\n",[30993],{"type":20,"tag":84,"props":30994,"children":30995},{"__ignoreMap":8},[30996,31004,31011,31018,31026,31034,31041,31049,31057,31065,31072,31079],{"type":20,"tag":157,"props":30997,"children":30998},{"class":159,"line":160},[30999],{"type":20,"tag":157,"props":31000,"children":31001},{},[31002],{"type":25,"value":31003},"@Controller\n",{"type":20,"tag":157,"props":31005,"children":31006},{"class":159,"line":169},[31007],{"type":20,"tag":157,"props":31008,"children":31009},{},[31010],{"type":25,"value":30825},{"type":20,"tag":157,"props":31012,"children":31013},{"class":159,"line":179},[31014],{"type":20,"tag":157,"props":31015,"children":31016},{"emptyLinePlaceholder":173},[31017],{"type":25,"value":176},{"type":20,"tag":157,"props":31019,"children":31020},{"class":159,"line":188},[31021],{"type":20,"tag":157,"props":31022,"children":31023},{},[31024],{"type":25,"value":31025},"    @Autowired\n",{"type":20,"tag":157,"props":31027,"children":31028},{"class":159,"line":196},[31029],{"type":20,"tag":157,"props":31030,"children":31031},{},[31032],{"type":25,"value":31033},"    private UserService userService;\n",{"type":20,"tag":157,"props":31035,"children":31036},{"class":159,"line":204},[31037],{"type":20,"tag":157,"props":31038,"children":31039},{"emptyLinePlaceholder":173},[31040],{"type":25,"value":176},{"type":20,"tag":157,"props":31042,"children":31043},{"class":159,"line":213},[31044],{"type":20,"tag":157,"props":31045,"children":31046},{},[31047],{"type":25,"value":31048},"    public void saveUser() {\n",{"type":20,"tag":157,"props":31050,"children":31051},{"class":159,"line":222},[31052],{"type":20,"tag":157,"props":31053,"children":31054},{},[31055],{"type":25,"value":31056},"      \n",{"type":20,"tag":157,"props":31058,"children":31059},{"class":159,"line":440},[31060],{"type":20,"tag":157,"props":31061,"children":31062},{},[31063],{"type":25,"value":31064},"        userService.saveUser();\n",{"type":20,"tag":157,"props":31066,"children":31067},{"class":159,"line":448},[31068],{"type":20,"tag":157,"props":31069,"children":31070},{},[31071],{"type":25,"value":31056},{"type":20,"tag":157,"props":31073,"children":31074},{"class":159,"line":456},[31075],{"type":20,"tag":157,"props":31076,"children":31077},{},[31078],{"type":25,"value":872},{"type":20,"tag":157,"props":31080,"children":31081},{"class":159,"line":465},[31082],{"type":20,"tag":157,"props":31083,"children":31084},{},[31085],{"type":25,"value":943},{"type":20,"tag":28,"props":31087,"children":31089},{"id":31088},"_3-aop",[31090],{"type":25,"value":31091},"3. AOP",{"type":20,"tag":11085,"props":31093,"children":31095},{"id":31094},"_31-aop概念及相关术语",[31096],{"type":25,"value":31097},"3.1 AOP概念及相关术语",{"type":20,"tag":6665,"props":31099,"children":31100},{},[31101,31106],{"type":20,"tag":21,"props":31102,"children":31103},{},[31104],{"type":25,"value":31105},"AOP（Aspect Oriented Programming）是一种设计思想，是软件设计领域中的面向切面编程，它是面向对象编程的一种补充和完善，它以通过预编译方式和运行期动态代理方式实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。",{"type":20,"tag":21,"props":31107,"children":31108},{},[31109],{"type":25,"value":31110},"我们需要做的事：创建切面，创建通知，通过切入点表达式，把通知作用在连接点",{"type":20,"tag":18942,"props":31112,"children":31114},{"id":31113},"_311-相关术语",[31115],{"type":25,"value":31116},"3.1.1 相关术语",{"type":20,"tag":44,"props":31118,"children":31119},{},[31120,31136,31226,31231,31236,31241],{"type":20,"tag":48,"props":31121,"children":31122},{},[31123,31128],{"type":20,"tag":33,"props":31124,"children":31125},{},[31126],{"type":25,"value":31127},"横切关注点：",{"type":20,"tag":44,"props":31129,"children":31130},{},[31131],{"type":20,"tag":48,"props":31132,"children":31133},{},[31134],{"type":25,"value":31135},"从每个方法中抽取出来的同一类非核心业务。在同一个项目中，我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。这个概不是语法层面天然存在的，而是根据附加功能逻辑上的需要：有十个附加功能，就有十个横切关注点。（如上述案例的日志功能）",{"type":20,"tag":48,"props":31137,"children":31138},{},[31139,31144,31146],{"type":20,"tag":33,"props":31140,"children":31141},{},[31142],{"type":25,"value":31143},"通知",{"type":25,"value":31145},"：每一个横切关注点上要做的事情都需要写一个方法来实现，这样的方法就叫通知方法。（通知就是添加功能的方法，就是代理后的方法）\n",{"type":20,"tag":44,"props":31147,"children":31148},{},[31149,31161,31180,31197,31214],{"type":20,"tag":48,"props":31150,"children":31151},{},[31152,31154,31159],{"type":25,"value":31153},"前置通知：在被代理的目标方法",{"type":20,"tag":33,"props":31155,"children":31156},{},[31157],{"type":25,"value":31158},"前",{"type":25,"value":31160},"执行",{"type":20,"tag":48,"props":31162,"children":31163},{},[31164,31166,31171,31173,31178],{"type":25,"value":31165},"返回通知：在被代理的目标方法",{"type":20,"tag":33,"props":31167,"children":31168},{},[31169],{"type":25,"value":31170},"成功结束",{"type":25,"value":31172},"后执行（",{"type":20,"tag":33,"props":31174,"children":31175},{},[31176],{"type":25,"value":31177},"寿终正寝",{"type":25,"value":31179},"）",{"type":20,"tag":48,"props":31181,"children":31182},{},[31183,31185,31190,31191,31196],{"type":25,"value":31184},"异常通知：在被代理的目标方法",{"type":20,"tag":33,"props":31186,"children":31187},{},[31188],{"type":25,"value":31189},"异常结束",{"type":25,"value":31172},{"type":20,"tag":33,"props":31192,"children":31193},{},[31194],{"type":25,"value":31195},"死于非命",{"type":25,"value":31179},{"type":20,"tag":48,"props":31198,"children":31199},{},[31200,31202,31207,31208,31213],{"type":25,"value":31201},"后置通知：在被代理的目标方法",{"type":20,"tag":33,"props":31203,"children":31204},{},[31205],{"type":25,"value":31206},"最终结束",{"type":25,"value":31172},{"type":20,"tag":33,"props":31209,"children":31210},{},[31211],{"type":25,"value":31212},"盖棺定论",{"type":25,"value":31179},{"type":20,"tag":48,"props":31215,"children":31216},{},[31217,31219,31224],{"type":25,"value":31218},"环绕通知：使用try...catch...finally结构围绕",{"type":20,"tag":33,"props":31220,"children":31221},{},[31222],{"type":25,"value":31223},"整个",{"type":25,"value":31225},"被代理的目标方法，包括上面四种通知对应的所有位置（相当于上述的「参数是。。。结果是。。。」）",{"type":20,"tag":48,"props":31227,"children":31228},{},[31229],{"type":25,"value":31230},"**目标：**被代理的目标对象。",{"type":20,"tag":48,"props":31232,"children":31233},{},[31234],{"type":25,"value":31235},"**代理：**向目标对象应用通知之后创建的代理对象。",{"type":20,"tag":48,"props":31237,"children":31238},{},[31239],{"type":25,"value":31240},"**连接点：**这也是一个纯逻辑概念，不是语法定义的。把方法排成一排，每一个横切位置看成x轴方向，把方法从上到下执行的顺序看成y轴，x轴和y轴的交叉点就是连接点。（连接点就是目标方法）",{"type":20,"tag":48,"props":31242,"children":31243},{},[31244],{"type":25,"value":31245},"**切入点：**定位连接点的方式。每个类的方法中都包含多个连接点，所以连接点是类中客观存在的事物（从逻辑上来说）。如果把连接点看作数据中的记录，那么切入点就是查询记录的 SQL 语句。Spring 的 AOP 技术可以通过切入点定位到特定的连接点。切点通过 org.springframework.aop.Pointcut 接口进行描述，它使用类和方法作为连接点的查询条件。（就是通知上面的注解）",{"type":20,"tag":18942,"props":31247,"children":31249},{"id":31248},"_312-作用",[31250],{"type":25,"value":31251},"3.1.2 作用",{"type":20,"tag":44,"props":31253,"children":31254},{},[31255,31267],{"type":20,"tag":48,"props":31256,"children":31257},{},[31258,31260,31265],{"type":25,"value":31259},"简化代码：把方法中固定位置的重复的代码",{"type":20,"tag":33,"props":31261,"children":31262},{},[31263],{"type":25,"value":31264},"抽取",{"type":25,"value":31266},"出来，让被抽取的方法更专注于自己的核心功能，提高内聚性。",{"type":20,"tag":48,"props":31268,"children":31269},{},[31270,31272,31277],{"type":25,"value":31271},"代码增强：把特定的功能封装到切面类中，看哪里有需要，就往上套，被",{"type":20,"tag":33,"props":31273,"children":31274},{},[31275],{"type":25,"value":31276},"套用",{"type":25,"value":31278},"了切面逻辑的方法就被切面给增强了。",{"type":20,"tag":11085,"props":31280,"children":31282},{"id":31281},"_32基于注解的aop",[31283],{"type":25,"value":31284},"3.2基于注解的AOP",{"type":20,"tag":18942,"props":31286,"children":31288},{"id":31287},"_321-步骤",[31289],{"type":25,"value":31290},"3.2.1 步骤",{"type":20,"tag":6665,"props":31292,"children":31293},{},[31294],{"type":20,"tag":44,"props":31295,"children":31296},{},[31297,31302,31307],{"type":20,"tag":48,"props":31298,"children":31299},{},[31300],{"type":25,"value":31301},"将目标对象和切面交给IOC容器管理（注解+扫描）",{"type":20,"tag":48,"props":31303,"children":31304},{},[31305],{"type":25,"value":31306},"开启AspectJ的自动代理，为目标对象自动生成代理",{"type":20,"tag":48,"props":31308,"children":31309},{},[31310],{"type":25,"value":31311},"将切面类通过注解@Aspect标识",{"type":20,"tag":5719,"props":31313,"children":31314},{},[31315],{"type":20,"tag":48,"props":31316,"children":31317},{},[31318,31322],{"type":20,"tag":33,"props":31319,"children":31320},{},[31321],{"type":25,"value":25210},{"type":25,"value":146},{"type":20,"tag":126,"props":31324,"children":31326},{"className":17052,"code":31325,"language":17054,"meta":8,"style":8},"\u003Cdependencies>\n    \u003C!-- 基于Maven依赖传递性，导入spring-context依赖即可导入当前所需所有jar包 -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-context\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- junit测试 -->\n    \u003Cdependency>\n        \u003CgroupId>junit\u003C\u002FgroupId>\n        \u003CartifactId>junit\u003C\u002FartifactId>\n        \u003Cversion>4.12\u003C\u002Fversion>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n\n    \u003C!-- spring-aspects会帮我们传递过来aspectjweaver -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-aspects\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n",[31327],{"type":20,"tag":84,"props":31328,"children":31329},{"__ignoreMap":8},[31330,31337,31344,31351,31358,31365,31372,31379,31386,31393,31400,31407,31414,31421,31428,31435,31443,31450,31457,31465,31472,31479],{"type":20,"tag":157,"props":31331,"children":31332},{"class":159,"line":160},[31333],{"type":20,"tag":157,"props":31334,"children":31335},{},[31336],{"type":25,"value":25950},{"type":20,"tag":157,"props":31338,"children":31339},{"class":159,"line":169},[31340],{"type":20,"tag":157,"props":31341,"children":31342},{},[31343],{"type":25,"value":25958},{"type":20,"tag":157,"props":31345,"children":31346},{"class":159,"line":179},[31347],{"type":20,"tag":157,"props":31348,"children":31349},{},[31350],{"type":25,"value":16072},{"type":20,"tag":157,"props":31352,"children":31353},{"class":159,"line":188},[31354],{"type":20,"tag":157,"props":31355,"children":31356},{},[31357],{"type":25,"value":25973},{"type":20,"tag":157,"props":31359,"children":31360},{"class":159,"line":196},[31361],{"type":20,"tag":157,"props":31362,"children":31363},{},[31364],{"type":25,"value":25981},{"type":20,"tag":157,"props":31366,"children":31367},{"class":159,"line":204},[31368],{"type":20,"tag":157,"props":31369,"children":31370},{},[31371],{"type":25,"value":25989},{"type":20,"tag":157,"props":31373,"children":31374},{"class":159,"line":213},[31375],{"type":20,"tag":157,"props":31376,"children":31377},{},[31378],{"type":25,"value":16190},{"type":20,"tag":157,"props":31380,"children":31381},{"class":159,"line":222},[31382],{"type":20,"tag":157,"props":31383,"children":31384},{},[31385],{"type":25,"value":26004},{"type":20,"tag":157,"props":31387,"children":31388},{"class":159,"line":440},[31389],{"type":20,"tag":157,"props":31390,"children":31391},{},[31392],{"type":25,"value":16072},{"type":20,"tag":157,"props":31394,"children":31395},{"class":159,"line":448},[31396],{"type":20,"tag":157,"props":31397,"children":31398},{},[31399],{"type":25,"value":16119},{"type":20,"tag":157,"props":31401,"children":31402},{"class":159,"line":456},[31403],{"type":20,"tag":157,"props":31404,"children":31405},{},[31406],{"type":25,"value":16127},{"type":20,"tag":157,"props":31408,"children":31409},{"class":159,"line":465},[31410],{"type":20,"tag":157,"props":31411,"children":31412},{},[31413],{"type":25,"value":16135},{"type":20,"tag":157,"props":31415,"children":31416},{"class":159,"line":474},[31417],{"type":20,"tag":157,"props":31418,"children":31419},{},[31420],{"type":25,"value":16143},{"type":20,"tag":157,"props":31422,"children":31423},{"class":159,"line":483},[31424],{"type":20,"tag":157,"props":31425,"children":31426},{},[31427],{"type":25,"value":16190},{"type":20,"tag":157,"props":31429,"children":31430},{"class":159,"line":491},[31431],{"type":20,"tag":157,"props":31432,"children":31433},{"emptyLinePlaceholder":173},[31434],{"type":25,"value":176},{"type":20,"tag":157,"props":31436,"children":31437},{"class":159,"line":499},[31438],{"type":20,"tag":157,"props":31439,"children":31440},{},[31441],{"type":25,"value":31442},"    \u003C!-- spring-aspects会帮我们传递过来aspectjweaver -->\n",{"type":20,"tag":157,"props":31444,"children":31445},{"class":159,"line":508},[31446],{"type":20,"tag":157,"props":31447,"children":31448},{},[31449],{"type":25,"value":16072},{"type":20,"tag":157,"props":31451,"children":31452},{"class":159,"line":517},[31453],{"type":20,"tag":157,"props":31454,"children":31455},{},[31456],{"type":25,"value":25973},{"type":20,"tag":157,"props":31458,"children":31459},{"class":159,"line":1499},[31460],{"type":20,"tag":157,"props":31461,"children":31462},{},[31463],{"type":25,"value":31464},"        \u003CartifactId>spring-aspects\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":31466,"children":31467},{"class":159,"line":1507},[31468],{"type":20,"tag":157,"props":31469,"children":31470},{},[31471],{"type":25,"value":25989},{"type":20,"tag":157,"props":31473,"children":31474},{"class":159,"line":1515},[31475],{"type":20,"tag":157,"props":31476,"children":31477},{},[31478],{"type":25,"value":16190},{"type":20,"tag":157,"props":31480,"children":31481},{"class":159,"line":1523},[31482],{"type":20,"tag":157,"props":31483,"children":31484},{},[31485],{"type":25,"value":16198},{"type":20,"tag":5719,"props":31487,"children":31488},{"start":169},[31489],{"type":20,"tag":48,"props":31490,"children":31491},{},[31492,31497,31500],{"type":20,"tag":33,"props":31493,"children":31494},{},[31495],{"type":25,"value":31496},"准备被代理的目标资源",{"type":20,"tag":9908,"props":31498,"children":31499},{},[],{"type":20,"tag":33,"props":31501,"children":31502},{},[31503],{"type":25,"value":31504},"接口：",{"type":20,"tag":126,"props":31506,"children":31508},{"className":16050,"code":31507,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.aop.annotation;\n\npublic interface Calculator {\n    int add(int i, int j);\n\n    int sub(int i, int j);\n\n    int mul(int i, int j);\n\n    int div(int i, int j);\n}\n",[31509],{"type":20,"tag":84,"props":31510,"children":31511},{"__ignoreMap":8},[31512,31520,31527,31535,31543,31550,31558,31565,31573,31580,31588],{"type":20,"tag":157,"props":31513,"children":31514},{"class":159,"line":160},[31515],{"type":20,"tag":157,"props":31516,"children":31517},{},[31518],{"type":25,"value":31519},"package com.wangkun.spring.aop.annotation;\n",{"type":20,"tag":157,"props":31521,"children":31522},{"class":159,"line":169},[31523],{"type":20,"tag":157,"props":31524,"children":31525},{"emptyLinePlaceholder":173},[31526],{"type":25,"value":176},{"type":20,"tag":157,"props":31528,"children":31529},{"class":159,"line":179},[31530],{"type":20,"tag":157,"props":31531,"children":31532},{},[31533],{"type":25,"value":31534},"public interface Calculator {\n",{"type":20,"tag":157,"props":31536,"children":31537},{"class":159,"line":188},[31538],{"type":20,"tag":157,"props":31539,"children":31540},{},[31541],{"type":25,"value":31542},"    int add(int i, int j);\n",{"type":20,"tag":157,"props":31544,"children":31545},{"class":159,"line":196},[31546],{"type":20,"tag":157,"props":31547,"children":31548},{"emptyLinePlaceholder":173},[31549],{"type":25,"value":176},{"type":20,"tag":157,"props":31551,"children":31552},{"class":159,"line":204},[31553],{"type":20,"tag":157,"props":31554,"children":31555},{},[31556],{"type":25,"value":31557},"    int sub(int i, int j);\n",{"type":20,"tag":157,"props":31559,"children":31560},{"class":159,"line":213},[31561],{"type":20,"tag":157,"props":31562,"children":31563},{"emptyLinePlaceholder":173},[31564],{"type":25,"value":176},{"type":20,"tag":157,"props":31566,"children":31567},{"class":159,"line":222},[31568],{"type":20,"tag":157,"props":31569,"children":31570},{},[31571],{"type":25,"value":31572},"    int mul(int i, int j);\n",{"type":20,"tag":157,"props":31574,"children":31575},{"class":159,"line":440},[31576],{"type":20,"tag":157,"props":31577,"children":31578},{"emptyLinePlaceholder":173},[31579],{"type":25,"value":176},{"type":20,"tag":157,"props":31581,"children":31582},{"class":159,"line":448},[31583],{"type":20,"tag":157,"props":31584,"children":31585},{},[31586],{"type":25,"value":31587},"    int div(int i, int j);\n",{"type":20,"tag":157,"props":31589,"children":31590},{"class":159,"line":456},[31591],{"type":20,"tag":157,"props":31592,"children":31593},{},[31594],{"type":25,"value":943},{"type":20,"tag":21,"props":31596,"children":31597},{},[31598],{"type":20,"tag":33,"props":31599,"children":31600},{},[31601],{"type":25,"value":31602},"实现类：",{"type":20,"tag":5719,"props":31604,"children":31605},{"start":179},[31606],{"type":20,"tag":48,"props":31607,"children":31608},{},[31609],{"type":20,"tag":33,"props":31610,"children":31611},{},[31612],{"type":25,"value":31613},"创建切面类并配置",{"type":20,"tag":126,"props":31615,"children":31617},{"className":16050,"code":31616,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.aop.annotation;\n\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.annotation.After;\nimport org.aspectj.lang.annotation.AfterReturning;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Arrays;\n\n@Component\n@Aspect\npublic class LoggerAspect {\n\n    \u002F**\n     * \n     * @param joinPoint\n     *\u002F\n    @Before(\"execution(* com.wangkun.spring.aop.annotation.CalculatorImpl.*(..))\")\n    public void beforeMethod(JoinPoint joinPoint) {\n        \u002F\u002F 获取连接点的方法名（签名信息）\n        String methodName = joinPoint.getSignature().getName();\n        \u002F\u002F 获取参数\n        String args = Arrays.toString(joinPoint.getArgs());\n\n        \u002F\u002F 添加前置通知\n        System.out.println(\"Logger===> 前置通知，方法名\" + methodName + \"参数\" + args);\n    }\n}\n",[31618],{"type":20,"tag":84,"props":31619,"children":31620},{"__ignoreMap":8},[31621,31628,31635,31643,31651,31659,31667,31675,31683,31690,31698,31705,31713,31721,31729,31736,31743,31751,31759,31766,31774,31782,31790,31798,31806,31814,31821,31829,31837,31844],{"type":20,"tag":157,"props":31622,"children":31623},{"class":159,"line":160},[31624],{"type":20,"tag":157,"props":31625,"children":31626},{},[31627],{"type":25,"value":31519},{"type":20,"tag":157,"props":31629,"children":31630},{"class":159,"line":169},[31631],{"type":20,"tag":157,"props":31632,"children":31633},{"emptyLinePlaceholder":173},[31634],{"type":25,"value":176},{"type":20,"tag":157,"props":31636,"children":31637},{"class":159,"line":179},[31638],{"type":20,"tag":157,"props":31639,"children":31640},{},[31641],{"type":25,"value":31642},"import org.aspectj.lang.JoinPoint;\n",{"type":20,"tag":157,"props":31644,"children":31645},{"class":159,"line":188},[31646],{"type":20,"tag":157,"props":31647,"children":31648},{},[31649],{"type":25,"value":31650},"import org.aspectj.lang.annotation.After;\n",{"type":20,"tag":157,"props":31652,"children":31653},{"class":159,"line":196},[31654],{"type":20,"tag":157,"props":31655,"children":31656},{},[31657],{"type":25,"value":31658},"import org.aspectj.lang.annotation.AfterReturning;\n",{"type":20,"tag":157,"props":31660,"children":31661},{"class":159,"line":204},[31662],{"type":20,"tag":157,"props":31663,"children":31664},{},[31665],{"type":25,"value":31666},"import org.aspectj.lang.annotation.Aspect;\n",{"type":20,"tag":157,"props":31668,"children":31669},{"class":159,"line":213},[31670],{"type":20,"tag":157,"props":31671,"children":31672},{},[31673],{"type":25,"value":31674},"import org.aspectj.lang.annotation.Before;\n",{"type":20,"tag":157,"props":31676,"children":31677},{"class":159,"line":222},[31678],{"type":20,"tag":157,"props":31679,"children":31680},{},[31681],{"type":25,"value":31682},"import org.springframework.stereotype.Component;\n",{"type":20,"tag":157,"props":31684,"children":31685},{"class":159,"line":440},[31686],{"type":20,"tag":157,"props":31687,"children":31688},{"emptyLinePlaceholder":173},[31689],{"type":25,"value":176},{"type":20,"tag":157,"props":31691,"children":31692},{"class":159,"line":448},[31693],{"type":20,"tag":157,"props":31694,"children":31695},{},[31696],{"type":25,"value":31697},"import java.util.Arrays;\n",{"type":20,"tag":157,"props":31699,"children":31700},{"class":159,"line":456},[31701],{"type":20,"tag":157,"props":31702,"children":31703},{"emptyLinePlaceholder":173},[31704],{"type":25,"value":176},{"type":20,"tag":157,"props":31706,"children":31707},{"class":159,"line":465},[31708],{"type":20,"tag":157,"props":31709,"children":31710},{},[31711],{"type":25,"value":31712},"@Component\n",{"type":20,"tag":157,"props":31714,"children":31715},{"class":159,"line":474},[31716],{"type":20,"tag":157,"props":31717,"children":31718},{},[31719],{"type":25,"value":31720},"@Aspect\n",{"type":20,"tag":157,"props":31722,"children":31723},{"class":159,"line":483},[31724],{"type":20,"tag":157,"props":31725,"children":31726},{},[31727],{"type":25,"value":31728},"public class LoggerAspect {\n",{"type":20,"tag":157,"props":31730,"children":31731},{"class":159,"line":491},[31732],{"type":20,"tag":157,"props":31733,"children":31734},{"emptyLinePlaceholder":173},[31735],{"type":25,"value":176},{"type":20,"tag":157,"props":31737,"children":31738},{"class":159,"line":499},[31739],{"type":20,"tag":157,"props":31740,"children":31741},{},[31742],{"type":25,"value":24638},{"type":20,"tag":157,"props":31744,"children":31745},{"class":159,"line":508},[31746],{"type":20,"tag":157,"props":31747,"children":31748},{},[31749],{"type":25,"value":31750},"     * \n",{"type":20,"tag":157,"props":31752,"children":31753},{"class":159,"line":517},[31754],{"type":20,"tag":157,"props":31755,"children":31756},{},[31757],{"type":25,"value":31758},"     * @param joinPoint\n",{"type":20,"tag":157,"props":31760,"children":31761},{"class":159,"line":1499},[31762],{"type":20,"tag":157,"props":31763,"children":31764},{},[31765],{"type":25,"value":24654},{"type":20,"tag":157,"props":31767,"children":31768},{"class":159,"line":1507},[31769],{"type":20,"tag":157,"props":31770,"children":31771},{},[31772],{"type":25,"value":31773},"    @Before(\"execution(* com.wangkun.spring.aop.annotation.CalculatorImpl.*(..))\")\n",{"type":20,"tag":157,"props":31775,"children":31776},{"class":159,"line":1515},[31777],{"type":20,"tag":157,"props":31778,"children":31779},{},[31780],{"type":25,"value":31781},"    public void beforeMethod(JoinPoint joinPoint) {\n",{"type":20,"tag":157,"props":31783,"children":31784},{"class":159,"line":1523},[31785],{"type":20,"tag":157,"props":31786,"children":31787},{},[31788],{"type":25,"value":31789},"        \u002F\u002F 获取连接点的方法名（签名信息）\n",{"type":20,"tag":157,"props":31791,"children":31792},{"class":159,"line":1532},[31793],{"type":20,"tag":157,"props":31794,"children":31795},{},[31796],{"type":25,"value":31797},"        String methodName = joinPoint.getSignature().getName();\n",{"type":20,"tag":157,"props":31799,"children":31800},{"class":159,"line":1541},[31801],{"type":20,"tag":157,"props":31802,"children":31803},{},[31804],{"type":25,"value":31805},"        \u002F\u002F 获取参数\n",{"type":20,"tag":157,"props":31807,"children":31808},{"class":159,"line":1550},[31809],{"type":20,"tag":157,"props":31810,"children":31811},{},[31812],{"type":25,"value":31813},"        String args = Arrays.toString(joinPoint.getArgs());\n",{"type":20,"tag":157,"props":31815,"children":31816},{"class":159,"line":1558},[31817],{"type":20,"tag":157,"props":31818,"children":31819},{"emptyLinePlaceholder":173},[31820],{"type":25,"value":176},{"type":20,"tag":157,"props":31822,"children":31823},{"class":159,"line":1566},[31824],{"type":20,"tag":157,"props":31825,"children":31826},{},[31827],{"type":25,"value":31828},"        \u002F\u002F 添加前置通知\n",{"type":20,"tag":157,"props":31830,"children":31831},{"class":159,"line":1574},[31832],{"type":20,"tag":157,"props":31833,"children":31834},{},[31835],{"type":25,"value":31836},"        System.out.println(\"Logger===> 前置通知，方法名\" + methodName + \"参数\" + args);\n",{"type":20,"tag":157,"props":31838,"children":31839},{"class":159,"line":1582},[31840],{"type":20,"tag":157,"props":31841,"children":31842},{},[31843],{"type":25,"value":872},{"type":20,"tag":157,"props":31845,"children":31846},{"class":159,"line":1591},[31847],{"type":20,"tag":157,"props":31848,"children":31849},{},[31850],{"type":25,"value":943},{"type":20,"tag":5719,"props":31852,"children":31853},{"start":188},[31854],{"type":20,"tag":48,"props":31855,"children":31856},{},[31857],{"type":20,"tag":33,"props":31858,"children":31859},{},[31860],{"type":25,"value":27711},{"type":20,"tag":126,"props":31862,"children":31864},{"className":17052,"code":31863,"language":17054,"meta":8,"style":8},"\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       xmlns:aop=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Faop\"\n       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Faop https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Faop\u002Fspring-aop.xsd\">\n\n    \u003Ccontext:component-scan base-package=\"com.wangkun.spring.aop.annotation\"\u002F>\n\n    \u003C!--开区基于注解的AOP-->\n    \u003Caop:aspectj-autoproxy\u002F>\n\n\u003C\u002Fbeans>\n",[31865],{"type":20,"tag":84,"props":31866,"children":31867},{"__ignoreMap":8},[31868,31875,31882,31889,31896,31904,31912,31919,31927,31934,31942,31950,31957],{"type":20,"tag":157,"props":31869,"children":31870},{"class":159,"line":160},[31871],{"type":20,"tag":157,"props":31872,"children":31873},{},[31874],{"type":25,"value":23638},{"type":20,"tag":157,"props":31876,"children":31877},{"class":159,"line":169},[31878],{"type":20,"tag":157,"props":31879,"children":31880},{},[31881],{"type":25,"value":26182},{"type":20,"tag":157,"props":31883,"children":31884},{"class":159,"line":179},[31885],{"type":20,"tag":157,"props":31886,"children":31887},{},[31888],{"type":25,"value":26190},{"type":20,"tag":157,"props":31890,"children":31891},{"class":159,"line":188},[31892],{"type":20,"tag":157,"props":31893,"children":31894},{},[31895],{"type":25,"value":28852},{"type":20,"tag":157,"props":31897,"children":31898},{"class":159,"line":196},[31899],{"type":20,"tag":157,"props":31900,"children":31901},{},[31902],{"type":25,"value":31903},"       xmlns:aop=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Faop\"\n",{"type":20,"tag":157,"props":31905,"children":31906},{"class":159,"line":204},[31907],{"type":20,"tag":157,"props":31908,"children":31909},{},[31910],{"type":25,"value":31911},"       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Faop https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Faop\u002Fspring-aop.xsd\">\n",{"type":20,"tag":157,"props":31913,"children":31914},{"class":159,"line":213},[31915],{"type":20,"tag":157,"props":31916,"children":31917},{"emptyLinePlaceholder":173},[31918],{"type":25,"value":176},{"type":20,"tag":157,"props":31920,"children":31921},{"class":159,"line":222},[31922],{"type":20,"tag":157,"props":31923,"children":31924},{},[31925],{"type":25,"value":31926},"    \u003Ccontext:component-scan base-package=\"com.wangkun.spring.aop.annotation\"\u002F>\n",{"type":20,"tag":157,"props":31928,"children":31929},{"class":159,"line":440},[31930],{"type":20,"tag":157,"props":31931,"children":31932},{"emptyLinePlaceholder":173},[31933],{"type":25,"value":176},{"type":20,"tag":157,"props":31935,"children":31936},{"class":159,"line":448},[31937],{"type":20,"tag":157,"props":31938,"children":31939},{},[31940],{"type":25,"value":31941},"    \u003C!--开区基于注解的AOP-->\n",{"type":20,"tag":157,"props":31943,"children":31944},{"class":159,"line":456},[31945],{"type":20,"tag":157,"props":31946,"children":31947},{},[31948],{"type":25,"value":31949},"    \u003Caop:aspectj-autoproxy\u002F>\n",{"type":20,"tag":157,"props":31951,"children":31952},{"class":159,"line":465},[31953],{"type":20,"tag":157,"props":31954,"children":31955},{"emptyLinePlaceholder":173},[31956],{"type":25,"value":176},{"type":20,"tag":157,"props":31958,"children":31959},{"class":159,"line":474},[31960],{"type":20,"tag":157,"props":31961,"children":31962},{},[31963],{"type":25,"value":26276},{"type":20,"tag":18942,"props":31965,"children":31967},{"id":31966},"_322-重用切入点表达式",[31968],{"type":25,"value":31969},"3.2.2 重用切入点表达式",{"type":20,"tag":44,"props":31971,"children":31972},{},[31973],{"type":20,"tag":48,"props":31974,"children":31975},{},[31976],{"type":20,"tag":33,"props":31977,"children":31978},{},[31979],{"type":25,"value":31980},"声明：",{"type":20,"tag":126,"props":31982,"children":31984},{"className":16050,"code":31983,"language":16052,"meta":8,"style":8},"@Pointcut(\"execution(* com.wangkun.spring.aop.annotation.CalculatorImpl.*(..))\")\npublic void pointCut() {}\n",[31985],{"type":20,"tag":84,"props":31986,"children":31987},{"__ignoreMap":8},[31988,31996],{"type":20,"tag":157,"props":31989,"children":31990},{"class":159,"line":160},[31991],{"type":20,"tag":157,"props":31992,"children":31993},{},[31994],{"type":25,"value":31995},"@Pointcut(\"execution(* com.wangkun.spring.aop.annotation.CalculatorImpl.*(..))\")\n",{"type":20,"tag":157,"props":31997,"children":31998},{"class":159,"line":169},[31999],{"type":20,"tag":157,"props":32000,"children":32001},{},[32002],{"type":25,"value":32003},"public void pointCut() {}\n",{"type":20,"tag":44,"props":32005,"children":32006},{},[32007],{"type":20,"tag":48,"props":32008,"children":32009},{},[32010],{"type":20,"tag":33,"props":32011,"children":32012},{},[32013],{"type":25,"value":32014},"在同一切面使用：",{"type":20,"tag":126,"props":32016,"children":32018},{"className":16050,"code":32017,"language":16052,"meta":8,"style":8},"@Before(\"pointcut()\")\npublic void beforeMethod(JoinPoint joinPoint) {\n    \u002F\u002F 获取连接点的方法名（签名信息）\n    String methodName = joinPoint.getSignature().getName();\n    \u002F\u002F 获取参数\n    String args = Arrays.toString(joinPoint.getArgs());\n\n    \u002F\u002F 添加前置通知\n    System.out.println(\"Logger===> 前置通知，方法名\" + methodName + \"参数\" + args);\n}\n",[32019],{"type":20,"tag":84,"props":32020,"children":32021},{"__ignoreMap":8},[32022,32030,32038,32046,32054,32062,32070,32077,32085,32093],{"type":20,"tag":157,"props":32023,"children":32024},{"class":159,"line":160},[32025],{"type":20,"tag":157,"props":32026,"children":32027},{},[32028],{"type":25,"value":32029},"@Before(\"pointcut()\")\n",{"type":20,"tag":157,"props":32031,"children":32032},{"class":159,"line":169},[32033],{"type":20,"tag":157,"props":32034,"children":32035},{},[32036],{"type":25,"value":32037},"public void beforeMethod(JoinPoint joinPoint) {\n",{"type":20,"tag":157,"props":32039,"children":32040},{"class":159,"line":179},[32041],{"type":20,"tag":157,"props":32042,"children":32043},{},[32044],{"type":25,"value":32045},"    \u002F\u002F 获取连接点的方法名（签名信息）\n",{"type":20,"tag":157,"props":32047,"children":32048},{"class":159,"line":188},[32049],{"type":20,"tag":157,"props":32050,"children":32051},{},[32052],{"type":25,"value":32053},"    String methodName = joinPoint.getSignature().getName();\n",{"type":20,"tag":157,"props":32055,"children":32056},{"class":159,"line":196},[32057],{"type":20,"tag":157,"props":32058,"children":32059},{},[32060],{"type":25,"value":32061},"    \u002F\u002F 获取参数\n",{"type":20,"tag":157,"props":32063,"children":32064},{"class":159,"line":204},[32065],{"type":20,"tag":157,"props":32066,"children":32067},{},[32068],{"type":25,"value":32069},"    String args = Arrays.toString(joinPoint.getArgs());\n",{"type":20,"tag":157,"props":32071,"children":32072},{"class":159,"line":213},[32073],{"type":20,"tag":157,"props":32074,"children":32075},{"emptyLinePlaceholder":173},[32076],{"type":25,"value":176},{"type":20,"tag":157,"props":32078,"children":32079},{"class":159,"line":222},[32080],{"type":20,"tag":157,"props":32081,"children":32082},{},[32083],{"type":25,"value":32084},"    \u002F\u002F 添加前置通知\n",{"type":20,"tag":157,"props":32086,"children":32087},{"class":159,"line":440},[32088],{"type":20,"tag":157,"props":32089,"children":32090},{},[32091],{"type":25,"value":32092},"    System.out.println(\"Logger===> 前置通知，方法名\" + methodName + \"参数\" + args);\n",{"type":20,"tag":157,"props":32094,"children":32095},{"class":159,"line":448},[32096],{"type":20,"tag":157,"props":32097,"children":32098},{},[32099],{"type":25,"value":943},{"type":20,"tag":44,"props":32101,"children":32102},{},[32103],{"type":20,"tag":48,"props":32104,"children":32105},{},[32106],{"type":25,"value":32107},"在不同切面使用",{"type":20,"tag":126,"props":32109,"children":32111},{"className":16050,"code":32110,"language":16052,"meta":8,"style":8},"@Before(\"com.atguigu.aop.CommonPointCut.pointCut()\")\npublic void beforeMethod(JoinPoint joinPoint) {\n    String methodName = joinPoint.getSignature().getName();\n    String args = Arrays.toString(joinPoint.getArgs());\n    System.out.println(\"Logger-->前置通知，方法名：\" + methodName + \"，参数：\" + args);\n}\n",[32112],{"type":20,"tag":84,"props":32113,"children":32114},{"__ignoreMap":8},[32115,32123,32130,32137,32144,32152],{"type":20,"tag":157,"props":32116,"children":32117},{"class":159,"line":160},[32118],{"type":20,"tag":157,"props":32119,"children":32120},{},[32121],{"type":25,"value":32122},"@Before(\"com.atguigu.aop.CommonPointCut.pointCut()\")\n",{"type":20,"tag":157,"props":32124,"children":32125},{"class":159,"line":169},[32126],{"type":20,"tag":157,"props":32127,"children":32128},{},[32129],{"type":25,"value":32037},{"type":20,"tag":157,"props":32131,"children":32132},{"class":159,"line":179},[32133],{"type":20,"tag":157,"props":32134,"children":32135},{},[32136],{"type":25,"value":32053},{"type":20,"tag":157,"props":32138,"children":32139},{"class":159,"line":188},[32140],{"type":20,"tag":157,"props":32141,"children":32142},{},[32143],{"type":25,"value":32069},{"type":20,"tag":157,"props":32145,"children":32146},{"class":159,"line":196},[32147],{"type":20,"tag":157,"props":32148,"children":32149},{},[32150],{"type":25,"value":32151},"    System.out.println(\"Logger-->前置通知，方法名：\" + methodName + \"，参数：\" + args);\n",{"type":20,"tag":157,"props":32153,"children":32154},{"class":159,"line":204},[32155],{"type":20,"tag":157,"props":32156,"children":32157},{},[32158],{"type":25,"value":943},{"type":20,"tag":18942,"props":32160,"children":32162},{"id":32161},"_323-获取通知的相关信息",[32163],{"type":25,"value":32164},"3.2.3 获取通知的相关信息",{"type":20,"tag":6665,"props":32166,"children":32167},{},[32168,32173],{"type":20,"tag":21,"props":32169,"children":32170},{},[32171],{"type":25,"value":32172},"通知的执行机制与try catch一样",{"type":20,"tag":44,"props":32174,"children":32175},{},[32176,32189,32202,32215],{"type":20,"tag":48,"props":32177,"children":32178},{},[32179,32181,32187],{"type":25,"value":32180},"前置通知：",{"type":20,"tag":84,"props":32182,"children":32184},{"className":32183},[],[32185],{"type":25,"value":32186},"@Before",{"type":25,"value":32188},"目标方法执行前执行\t====\ttry",{"type":20,"tag":48,"props":32190,"children":32191},{},[32192,32194,32200],{"type":25,"value":32193},"返回通知：",{"type":20,"tag":84,"props":32195,"children":32197},{"className":32196},[],[32198],{"type":25,"value":32199},"@AfterReturning",{"type":25,"value":32201},"目标方法返回结果之后执行\t====\ttry",{"type":20,"tag":48,"props":32203,"children":32204},{},[32205,32207,32213],{"type":25,"value":32206},"异常通知：",{"type":20,"tag":84,"props":32208,"children":32210},{"className":32209},[],[32211],{"type":25,"value":32212},"@AfterThrowing",{"type":25,"value":32214},"目标方法报错后执行\t====\tcatch",{"type":20,"tag":48,"props":32216,"children":32217},{},[32218,32220,32226],{"type":25,"value":32219},"后置通知：",{"type":20,"tag":84,"props":32221,"children":32223},{"className":32222},[],[32224],{"type":25,"value":32225},"@After",{"type":25,"value":32227},"目标方法执行完毕后执行\t====\tfinally",{"type":20,"tag":126,"props":32229,"children":32231},{"className":16050,"code":32230,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.aop.annotation;\n\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.*;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Arrays;\n\n@Component\n@Aspect\npublic class LoggerAspect {\n    @Pointcut(\"execution(* com.wangkun.spring.aop.annotation.CalculatorImpl.*(..))\")\n    public void pointCut() {\n    }\n\n    \u002F**\n     * 前置通知\n     *\n     * @param joinPoint\n     *\u002F\n    @Before(\"pointCut()\")\n    public void beforeMethod(JoinPoint joinPoint) {\n        \u002F\u002F 获取连接点的方法名（签名信息）\n        String methodName = joinPoint.getSignature().getName();\n        \u002F\u002F 获取参数\n        String args = Arrays.toString(joinPoint.getArgs());\n\n        \u002F\u002F 添加前置通知\n        System.out.println(\"Logger===> 前置通知，方法名：\" + methodName + \"参数：\" + args);\n    }\n\n    \u002F**\n     * 返回通知\n     *\n     * @param joinPoint\n     * @param result\n     *\u002F\n    @AfterReturning(value = \"pointCut()\", returning = \"result\")\n    public void afterReturningMethod(JoinPoint joinPoint, Object result) {\n        \u002F\u002F 获取方法（签名信息）\n        String methodName = joinPoint.getSignature().getName();\n\n        \u002F\u002F 添加后置通知\n        System.out.println(\"Logger===> 后置结果通知，方法名：\" + methodName + \"结果：\" + result);\n    }\n\n    \u002F**\n     * 异常通知\n     *\n     * @param joinPoint\n     * @param error\n     *\u002F\n    @AfterThrowing(value = \"pointCut()\", throwing = \"error\")\n    public void throwingMethod(JoinPoint joinPoint, Exception error) {\n        String methodName = joinPoint.getSignature().getName();\n\n        System.out.println(\"Logger===> 报错通知，方法名：\" + methodName + \"报错：\" + error);\n    }\n\n    \u002F**\n     * 后置通知\n     *\n     * @param joinPoint\n     *\u002F\n    @After(\"pointCut()\")\n    public void afterMethod(JoinPoint joinPoint) {\n        String methodName = joinPoint.getSignature().getName();\n\n        System.out.println(\"Logger===> 后置通知，方法名：\" + methodName + \" 执行结束\");\n    }\n\n\n    \u002F**\n     * 环绕通知\n     *\n     * @param joinPoint\n     * @return\n     *\u002F\n    @Around(\"pointCut()\")\n    public Object aroundMethod(ProceedingJoinPoint joinPoint) {\n\n        Object proceed = null;\n        try {\n            System.out.println(\"环绕通知 ==== 前置通知\");\n            proceed = joinPoint.proceed();\n            System.out.println(\"环绕通知 ==== 返回通知\");\n        } catch (Throwable e) {\n            System.out.println(\"环绕通知 ==== 异常通知\");\n            throw new RuntimeException(e);\n        } finally {\n            System.out.println(\"环绕通知 ==== 后置通知\");\n        }\n\n        return proceed;\n    }\n}\n",[32232],{"type":20,"tag":84,"props":32233,"children":32234},{"__ignoreMap":8},[32235,32242,32249,32256,32264,32272,32279,32286,32293,32300,32307,32314,32321,32329,32337,32344,32351,32358,32366,32374,32381,32388,32396,32403,32410,32417,32424,32431,32438,32445,32453,32460,32467,32474,32482,32489,32496,32504,32511,32519,32527,32535,32542,32549,32557,32565,32572,32579,32586,32594,32601,32608,32616,32623,32631,32639,32646,32653,32661,32668,32675,32682,32690,32697,32704,32711,32719,32727,32734,32741,32749,32756,32763,32770,32777,32785,32793,32801,32810,32818,32827,32836,32844,32853,32862,32871,32880,32889,32898,32907,32916,32925,32934,32942,32950,32959,32967],{"type":20,"tag":157,"props":32236,"children":32237},{"class":159,"line":160},[32238],{"type":20,"tag":157,"props":32239,"children":32240},{},[32241],{"type":25,"value":31519},{"type":20,"tag":157,"props":32243,"children":32244},{"class":159,"line":169},[32245],{"type":20,"tag":157,"props":32246,"children":32247},{"emptyLinePlaceholder":173},[32248],{"type":25,"value":176},{"type":20,"tag":157,"props":32250,"children":32251},{"class":159,"line":179},[32252],{"type":20,"tag":157,"props":32253,"children":32254},{},[32255],{"type":25,"value":31642},{"type":20,"tag":157,"props":32257,"children":32258},{"class":159,"line":188},[32259],{"type":20,"tag":157,"props":32260,"children":32261},{},[32262],{"type":25,"value":32263},"import org.aspectj.lang.ProceedingJoinPoint;\n",{"type":20,"tag":157,"props":32265,"children":32266},{"class":159,"line":196},[32267],{"type":20,"tag":157,"props":32268,"children":32269},{},[32270],{"type":25,"value":32271},"import org.aspectj.lang.annotation.*;\n",{"type":20,"tag":157,"props":32273,"children":32274},{"class":159,"line":204},[32275],{"type":20,"tag":157,"props":32276,"children":32277},{},[32278],{"type":25,"value":31682},{"type":20,"tag":157,"props":32280,"children":32281},{"class":159,"line":213},[32282],{"type":20,"tag":157,"props":32283,"children":32284},{"emptyLinePlaceholder":173},[32285],{"type":25,"value":176},{"type":20,"tag":157,"props":32287,"children":32288},{"class":159,"line":222},[32289],{"type":20,"tag":157,"props":32290,"children":32291},{},[32292],{"type":25,"value":31697},{"type":20,"tag":157,"props":32294,"children":32295},{"class":159,"line":440},[32296],{"type":20,"tag":157,"props":32297,"children":32298},{"emptyLinePlaceholder":173},[32299],{"type":25,"value":176},{"type":20,"tag":157,"props":32301,"children":32302},{"class":159,"line":448},[32303],{"type":20,"tag":157,"props":32304,"children":32305},{},[32306],{"type":25,"value":31712},{"type":20,"tag":157,"props":32308,"children":32309},{"class":159,"line":456},[32310],{"type":20,"tag":157,"props":32311,"children":32312},{},[32313],{"type":25,"value":31720},{"type":20,"tag":157,"props":32315,"children":32316},{"class":159,"line":465},[32317],{"type":20,"tag":157,"props":32318,"children":32319},{},[32320],{"type":25,"value":31728},{"type":20,"tag":157,"props":32322,"children":32323},{"class":159,"line":474},[32324],{"type":20,"tag":157,"props":32325,"children":32326},{},[32327],{"type":25,"value":32328},"    @Pointcut(\"execution(* com.wangkun.spring.aop.annotation.CalculatorImpl.*(..))\")\n",{"type":20,"tag":157,"props":32330,"children":32331},{"class":159,"line":483},[32332],{"type":20,"tag":157,"props":32333,"children":32334},{},[32335],{"type":25,"value":32336},"    public void pointCut() {\n",{"type":20,"tag":157,"props":32338,"children":32339},{"class":159,"line":491},[32340],{"type":20,"tag":157,"props":32341,"children":32342},{},[32343],{"type":25,"value":872},{"type":20,"tag":157,"props":32345,"children":32346},{"class":159,"line":499},[32347],{"type":20,"tag":157,"props":32348,"children":32349},{"emptyLinePlaceholder":173},[32350],{"type":25,"value":176},{"type":20,"tag":157,"props":32352,"children":32353},{"class":159,"line":508},[32354],{"type":20,"tag":157,"props":32355,"children":32356},{},[32357],{"type":25,"value":24638},{"type":20,"tag":157,"props":32359,"children":32360},{"class":159,"line":517},[32361],{"type":20,"tag":157,"props":32362,"children":32363},{},[32364],{"type":25,"value":32365},"     * 前置通知\n",{"type":20,"tag":157,"props":32367,"children":32368},{"class":159,"line":1499},[32369],{"type":20,"tag":157,"props":32370,"children":32371},{},[32372],{"type":25,"value":32373},"     *\n",{"type":20,"tag":157,"props":32375,"children":32376},{"class":159,"line":1507},[32377],{"type":20,"tag":157,"props":32378,"children":32379},{},[32380],{"type":25,"value":31758},{"type":20,"tag":157,"props":32382,"children":32383},{"class":159,"line":1515},[32384],{"type":20,"tag":157,"props":32385,"children":32386},{},[32387],{"type":25,"value":24654},{"type":20,"tag":157,"props":32389,"children":32390},{"class":159,"line":1523},[32391],{"type":20,"tag":157,"props":32392,"children":32393},{},[32394],{"type":25,"value":32395},"    @Before(\"pointCut()\")\n",{"type":20,"tag":157,"props":32397,"children":32398},{"class":159,"line":1532},[32399],{"type":20,"tag":157,"props":32400,"children":32401},{},[32402],{"type":25,"value":31781},{"type":20,"tag":157,"props":32404,"children":32405},{"class":159,"line":1541},[32406],{"type":20,"tag":157,"props":32407,"children":32408},{},[32409],{"type":25,"value":31789},{"type":20,"tag":157,"props":32411,"children":32412},{"class":159,"line":1550},[32413],{"type":20,"tag":157,"props":32414,"children":32415},{},[32416],{"type":25,"value":31797},{"type":20,"tag":157,"props":32418,"children":32419},{"class":159,"line":1558},[32420],{"type":20,"tag":157,"props":32421,"children":32422},{},[32423],{"type":25,"value":31805},{"type":20,"tag":157,"props":32425,"children":32426},{"class":159,"line":1566},[32427],{"type":20,"tag":157,"props":32428,"children":32429},{},[32430],{"type":25,"value":31813},{"type":20,"tag":157,"props":32432,"children":32433},{"class":159,"line":1574},[32434],{"type":20,"tag":157,"props":32435,"children":32436},{"emptyLinePlaceholder":173},[32437],{"type":25,"value":176},{"type":20,"tag":157,"props":32439,"children":32440},{"class":159,"line":1582},[32441],{"type":20,"tag":157,"props":32442,"children":32443},{},[32444],{"type":25,"value":31828},{"type":20,"tag":157,"props":32446,"children":32447},{"class":159,"line":1591},[32448],{"type":20,"tag":157,"props":32449,"children":32450},{},[32451],{"type":25,"value":32452},"        System.out.println(\"Logger===> 前置通知，方法名：\" + methodName + \"参数：\" + args);\n",{"type":20,"tag":157,"props":32454,"children":32455},{"class":159,"line":1599},[32456],{"type":20,"tag":157,"props":32457,"children":32458},{},[32459],{"type":25,"value":872},{"type":20,"tag":157,"props":32461,"children":32462},{"class":159,"line":1608},[32463],{"type":20,"tag":157,"props":32464,"children":32465},{"emptyLinePlaceholder":173},[32466],{"type":25,"value":176},{"type":20,"tag":157,"props":32468,"children":32469},{"class":159,"line":1617},[32470],{"type":20,"tag":157,"props":32471,"children":32472},{},[32473],{"type":25,"value":24638},{"type":20,"tag":157,"props":32475,"children":32476},{"class":159,"line":1626},[32477],{"type":20,"tag":157,"props":32478,"children":32479},{},[32480],{"type":25,"value":32481},"     * 返回通知\n",{"type":20,"tag":157,"props":32483,"children":32484},{"class":159,"line":1634},[32485],{"type":20,"tag":157,"props":32486,"children":32487},{},[32488],{"type":25,"value":32373},{"type":20,"tag":157,"props":32490,"children":32491},{"class":159,"line":1642},[32492],{"type":20,"tag":157,"props":32493,"children":32494},{},[32495],{"type":25,"value":31758},{"type":20,"tag":157,"props":32497,"children":32498},{"class":159,"line":1650},[32499],{"type":20,"tag":157,"props":32500,"children":32501},{},[32502],{"type":25,"value":32503},"     * @param result\n",{"type":20,"tag":157,"props":32505,"children":32506},{"class":159,"line":1659},[32507],{"type":20,"tag":157,"props":32508,"children":32509},{},[32510],{"type":25,"value":24654},{"type":20,"tag":157,"props":32512,"children":32513},{"class":159,"line":1668},[32514],{"type":20,"tag":157,"props":32515,"children":32516},{},[32517],{"type":25,"value":32518},"    @AfterReturning(value = \"pointCut()\", returning = \"result\")\n",{"type":20,"tag":157,"props":32520,"children":32521},{"class":159,"line":1677},[32522],{"type":20,"tag":157,"props":32523,"children":32524},{},[32525],{"type":25,"value":32526},"    public void afterReturningMethod(JoinPoint joinPoint, Object result) {\n",{"type":20,"tag":157,"props":32528,"children":32529},{"class":159,"line":1685},[32530],{"type":20,"tag":157,"props":32531,"children":32532},{},[32533],{"type":25,"value":32534},"        \u002F\u002F 获取方法（签名信息）\n",{"type":20,"tag":157,"props":32536,"children":32537},{"class":159,"line":1693},[32538],{"type":20,"tag":157,"props":32539,"children":32540},{},[32541],{"type":25,"value":31797},{"type":20,"tag":157,"props":32543,"children":32544},{"class":159,"line":1701},[32545],{"type":20,"tag":157,"props":32546,"children":32547},{"emptyLinePlaceholder":173},[32548],{"type":25,"value":176},{"type":20,"tag":157,"props":32550,"children":32551},{"class":159,"line":1710},[32552],{"type":20,"tag":157,"props":32553,"children":32554},{},[32555],{"type":25,"value":32556},"        \u002F\u002F 添加后置通知\n",{"type":20,"tag":157,"props":32558,"children":32559},{"class":159,"line":23976},[32560],{"type":20,"tag":157,"props":32561,"children":32562},{},[32563],{"type":25,"value":32564},"        System.out.println(\"Logger===> 后置结果通知，方法名：\" + methodName + \"结果：\" + result);\n",{"type":20,"tag":157,"props":32566,"children":32567},{"class":159,"line":23985},[32568],{"type":20,"tag":157,"props":32569,"children":32570},{},[32571],{"type":25,"value":872},{"type":20,"tag":157,"props":32573,"children":32574},{"class":159,"line":23994},[32575],{"type":20,"tag":157,"props":32576,"children":32577},{"emptyLinePlaceholder":173},[32578],{"type":25,"value":176},{"type":20,"tag":157,"props":32580,"children":32581},{"class":159,"line":24003},[32582],{"type":20,"tag":157,"props":32583,"children":32584},{},[32585],{"type":25,"value":24638},{"type":20,"tag":157,"props":32587,"children":32588},{"class":159,"line":24012},[32589],{"type":20,"tag":157,"props":32590,"children":32591},{},[32592],{"type":25,"value":32593},"     * 异常通知\n",{"type":20,"tag":157,"props":32595,"children":32596},{"class":159,"line":24021},[32597],{"type":20,"tag":157,"props":32598,"children":32599},{},[32600],{"type":25,"value":32373},{"type":20,"tag":157,"props":32602,"children":32603},{"class":159,"line":24030},[32604],{"type":20,"tag":157,"props":32605,"children":32606},{},[32607],{"type":25,"value":31758},{"type":20,"tag":157,"props":32609,"children":32610},{"class":159,"line":24039},[32611],{"type":20,"tag":157,"props":32612,"children":32613},{},[32614],{"type":25,"value":32615},"     * @param error\n",{"type":20,"tag":157,"props":32617,"children":32618},{"class":159,"line":24048},[32619],{"type":20,"tag":157,"props":32620,"children":32621},{},[32622],{"type":25,"value":24654},{"type":20,"tag":157,"props":32624,"children":32625},{"class":159,"line":24057},[32626],{"type":20,"tag":157,"props":32627,"children":32628},{},[32629],{"type":25,"value":32630},"    @AfterThrowing(value = \"pointCut()\", throwing = \"error\")\n",{"type":20,"tag":157,"props":32632,"children":32633},{"class":159,"line":24066},[32634],{"type":20,"tag":157,"props":32635,"children":32636},{},[32637],{"type":25,"value":32638},"    public void throwingMethod(JoinPoint joinPoint, Exception error) {\n",{"type":20,"tag":157,"props":32640,"children":32641},{"class":159,"line":24075},[32642],{"type":20,"tag":157,"props":32643,"children":32644},{},[32645],{"type":25,"value":31797},{"type":20,"tag":157,"props":32647,"children":32648},{"class":159,"line":24084},[32649],{"type":20,"tag":157,"props":32650,"children":32651},{"emptyLinePlaceholder":173},[32652],{"type":25,"value":176},{"type":20,"tag":157,"props":32654,"children":32655},{"class":159,"line":24093},[32656],{"type":20,"tag":157,"props":32657,"children":32658},{},[32659],{"type":25,"value":32660},"        System.out.println(\"Logger===> 报错通知，方法名：\" + methodName + \"报错：\" + error);\n",{"type":20,"tag":157,"props":32662,"children":32663},{"class":159,"line":24102},[32664],{"type":20,"tag":157,"props":32665,"children":32666},{},[32667],{"type":25,"value":872},{"type":20,"tag":157,"props":32669,"children":32670},{"class":159,"line":24111},[32671],{"type":20,"tag":157,"props":32672,"children":32673},{"emptyLinePlaceholder":173},[32674],{"type":25,"value":176},{"type":20,"tag":157,"props":32676,"children":32677},{"class":159,"line":24119},[32678],{"type":20,"tag":157,"props":32679,"children":32680},{},[32681],{"type":25,"value":24638},{"type":20,"tag":157,"props":32683,"children":32684},{"class":159,"line":24128},[32685],{"type":20,"tag":157,"props":32686,"children":32687},{},[32688],{"type":25,"value":32689},"     * 后置通知\n",{"type":20,"tag":157,"props":32691,"children":32692},{"class":159,"line":24137},[32693],{"type":20,"tag":157,"props":32694,"children":32695},{},[32696],{"type":25,"value":32373},{"type":20,"tag":157,"props":32698,"children":32699},{"class":159,"line":24146},[32700],{"type":20,"tag":157,"props":32701,"children":32702},{},[32703],{"type":25,"value":31758},{"type":20,"tag":157,"props":32705,"children":32706},{"class":159,"line":24154},[32707],{"type":20,"tag":157,"props":32708,"children":32709},{},[32710],{"type":25,"value":24654},{"type":20,"tag":157,"props":32712,"children":32713},{"class":159,"line":24163},[32714],{"type":20,"tag":157,"props":32715,"children":32716},{},[32717],{"type":25,"value":32718},"    @After(\"pointCut()\")\n",{"type":20,"tag":157,"props":32720,"children":32721},{"class":159,"line":24172},[32722],{"type":20,"tag":157,"props":32723,"children":32724},{},[32725],{"type":25,"value":32726},"    public void afterMethod(JoinPoint joinPoint) {\n",{"type":20,"tag":157,"props":32728,"children":32729},{"class":159,"line":24181},[32730],{"type":20,"tag":157,"props":32731,"children":32732},{},[32733],{"type":25,"value":31797},{"type":20,"tag":157,"props":32735,"children":32736},{"class":159,"line":24190},[32737],{"type":20,"tag":157,"props":32738,"children":32739},{"emptyLinePlaceholder":173},[32740],{"type":25,"value":176},{"type":20,"tag":157,"props":32742,"children":32743},{"class":159,"line":25069},[32744],{"type":20,"tag":157,"props":32745,"children":32746},{},[32747],{"type":25,"value":32748},"        System.out.println(\"Logger===> 后置通知，方法名：\" + methodName + \" 执行结束\");\n",{"type":20,"tag":157,"props":32750,"children":32751},{"class":159,"line":25078},[32752],{"type":20,"tag":157,"props":32753,"children":32754},{},[32755],{"type":25,"value":872},{"type":20,"tag":157,"props":32757,"children":32758},{"class":159,"line":25087},[32759],{"type":20,"tag":157,"props":32760,"children":32761},{"emptyLinePlaceholder":173},[32762],{"type":25,"value":176},{"type":20,"tag":157,"props":32764,"children":32765},{"class":159,"line":25095},[32766],{"type":20,"tag":157,"props":32767,"children":32768},{"emptyLinePlaceholder":173},[32769],{"type":25,"value":176},{"type":20,"tag":157,"props":32771,"children":32772},{"class":159,"line":25103},[32773],{"type":20,"tag":157,"props":32774,"children":32775},{},[32776],{"type":25,"value":24638},{"type":20,"tag":157,"props":32778,"children":32779},{"class":159,"line":25111},[32780],{"type":20,"tag":157,"props":32781,"children":32782},{},[32783],{"type":25,"value":32784},"     * 环绕通知\n",{"type":20,"tag":157,"props":32786,"children":32788},{"class":159,"line":32787},76,[32789],{"type":20,"tag":157,"props":32790,"children":32791},{},[32792],{"type":25,"value":32373},{"type":20,"tag":157,"props":32794,"children":32796},{"class":159,"line":32795},77,[32797],{"type":20,"tag":157,"props":32798,"children":32799},{},[32800],{"type":25,"value":31758},{"type":20,"tag":157,"props":32802,"children":32804},{"class":159,"line":32803},78,[32805],{"type":20,"tag":157,"props":32806,"children":32807},{},[32808],{"type":25,"value":32809},"     * @return\n",{"type":20,"tag":157,"props":32811,"children":32813},{"class":159,"line":32812},79,[32814],{"type":20,"tag":157,"props":32815,"children":32816},{},[32817],{"type":25,"value":24654},{"type":20,"tag":157,"props":32819,"children":32821},{"class":159,"line":32820},80,[32822],{"type":20,"tag":157,"props":32823,"children":32824},{},[32825],{"type":25,"value":32826},"    @Around(\"pointCut()\")\n",{"type":20,"tag":157,"props":32828,"children":32830},{"class":159,"line":32829},81,[32831],{"type":20,"tag":157,"props":32832,"children":32833},{},[32834],{"type":25,"value":32835},"    public Object aroundMethod(ProceedingJoinPoint joinPoint) {\n",{"type":20,"tag":157,"props":32837,"children":32839},{"class":159,"line":32838},82,[32840],{"type":20,"tag":157,"props":32841,"children":32842},{"emptyLinePlaceholder":173},[32843],{"type":25,"value":176},{"type":20,"tag":157,"props":32845,"children":32847},{"class":159,"line":32846},83,[32848],{"type":20,"tag":157,"props":32849,"children":32850},{},[32851],{"type":25,"value":32852},"        Object proceed = null;\n",{"type":20,"tag":157,"props":32854,"children":32856},{"class":159,"line":32855},84,[32857],{"type":20,"tag":157,"props":32858,"children":32859},{},[32860],{"type":25,"value":32861},"        try {\n",{"type":20,"tag":157,"props":32863,"children":32865},{"class":159,"line":32864},85,[32866],{"type":20,"tag":157,"props":32867,"children":32868},{},[32869],{"type":25,"value":32870},"            System.out.println(\"环绕通知 ==== 前置通知\");\n",{"type":20,"tag":157,"props":32872,"children":32874},{"class":159,"line":32873},86,[32875],{"type":20,"tag":157,"props":32876,"children":32877},{},[32878],{"type":25,"value":32879},"            proceed = joinPoint.proceed();\n",{"type":20,"tag":157,"props":32881,"children":32883},{"class":159,"line":32882},87,[32884],{"type":20,"tag":157,"props":32885,"children":32886},{},[32887],{"type":25,"value":32888},"            System.out.println(\"环绕通知 ==== 返回通知\");\n",{"type":20,"tag":157,"props":32890,"children":32892},{"class":159,"line":32891},88,[32893],{"type":20,"tag":157,"props":32894,"children":32895},{},[32896],{"type":25,"value":32897},"        } catch (Throwable e) {\n",{"type":20,"tag":157,"props":32899,"children":32901},{"class":159,"line":32900},89,[32902],{"type":20,"tag":157,"props":32903,"children":32904},{},[32905],{"type":25,"value":32906},"            System.out.println(\"环绕通知 ==== 异常通知\");\n",{"type":20,"tag":157,"props":32908,"children":32910},{"class":159,"line":32909},90,[32911],{"type":20,"tag":157,"props":32912,"children":32913},{},[32914],{"type":25,"value":32915},"            throw new RuntimeException(e);\n",{"type":20,"tag":157,"props":32917,"children":32919},{"class":159,"line":32918},91,[32920],{"type":20,"tag":157,"props":32921,"children":32922},{},[32923],{"type":25,"value":32924},"        } finally {\n",{"type":20,"tag":157,"props":32926,"children":32928},{"class":159,"line":32927},92,[32929],{"type":20,"tag":157,"props":32930,"children":32931},{},[32932],{"type":25,"value":32933},"            System.out.println(\"环绕通知 ==== 后置通知\");\n",{"type":20,"tag":157,"props":32935,"children":32937},{"class":159,"line":32936},93,[32938],{"type":20,"tag":157,"props":32939,"children":32940},{},[32941],{"type":25,"value":24820},{"type":20,"tag":157,"props":32943,"children":32945},{"class":159,"line":32944},94,[32946],{"type":20,"tag":157,"props":32947,"children":32948},{"emptyLinePlaceholder":173},[32949],{"type":25,"value":176},{"type":20,"tag":157,"props":32951,"children":32953},{"class":159,"line":32952},95,[32954],{"type":20,"tag":157,"props":32955,"children":32956},{},[32957],{"type":25,"value":32958},"        return proceed;\n",{"type":20,"tag":157,"props":32960,"children":32962},{"class":159,"line":32961},96,[32963],{"type":20,"tag":157,"props":32964,"children":32965},{},[32966],{"type":25,"value":872},{"type":20,"tag":157,"props":32968,"children":32970},{"class":159,"line":32969},97,[32971],{"type":20,"tag":157,"props":32972,"children":32973},{},[32974],{"type":25,"value":943},{"type":20,"tag":18942,"props":32976,"children":32978},{"id":32977},"_324-切面优先级",[32979],{"type":25,"value":32980},"3.2.4 切面优先级",{"type":20,"tag":6665,"props":32982,"children":32983},{},[32984,32989],{"type":20,"tag":21,"props":32985,"children":32986},{},[32987],{"type":25,"value":32988},"可以通过@Other注解的value属性设置优先级，默认是Integer的最大值",{"type":20,"tag":21,"props":32990,"children":32991},{},[32992],{"type":25,"value":32993},"@Order注解的value属性值越小，优先级越高",{"type":20,"tag":126,"props":32995,"children":32997},{"className":16050,"code":32996,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.aop.annotation;\n\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.stereotype.Component;\n\n@Component\n@Aspect\n@Order(1)\npublic class ValidateAspect {\n\n    @Before(\"com.wangkun.spring.aop.annotation.LoggerAspect.pointCut()\")\n    public void afterMethod() {\n\n        System.out.println(\"ValidateAspect ===  前置通知\");\n\n    }\n\n\n}\n",[32998],{"type":20,"tag":84,"props":32999,"children":33000},{"__ignoreMap":8},[33001,33008,33015,33022,33029,33037,33044,33051,33058,33065,33073,33081,33088,33096,33104,33111,33119,33126,33133,33140,33147],{"type":20,"tag":157,"props":33002,"children":33003},{"class":159,"line":160},[33004],{"type":20,"tag":157,"props":33005,"children":33006},{},[33007],{"type":25,"value":31519},{"type":20,"tag":157,"props":33009,"children":33010},{"class":159,"line":169},[33011],{"type":20,"tag":157,"props":33012,"children":33013},{"emptyLinePlaceholder":173},[33014],{"type":25,"value":176},{"type":20,"tag":157,"props":33016,"children":33017},{"class":159,"line":179},[33018],{"type":20,"tag":157,"props":33019,"children":33020},{},[33021],{"type":25,"value":31666},{"type":20,"tag":157,"props":33023,"children":33024},{"class":159,"line":188},[33025],{"type":20,"tag":157,"props":33026,"children":33027},{},[33028],{"type":25,"value":31674},{"type":20,"tag":157,"props":33030,"children":33031},{"class":159,"line":196},[33032],{"type":20,"tag":157,"props":33033,"children":33034},{},[33035],{"type":25,"value":33036},"import org.springframework.core.annotation.Order;\n",{"type":20,"tag":157,"props":33038,"children":33039},{"class":159,"line":204},[33040],{"type":20,"tag":157,"props":33041,"children":33042},{},[33043],{"type":25,"value":31682},{"type":20,"tag":157,"props":33045,"children":33046},{"class":159,"line":213},[33047],{"type":20,"tag":157,"props":33048,"children":33049},{"emptyLinePlaceholder":173},[33050],{"type":25,"value":176},{"type":20,"tag":157,"props":33052,"children":33053},{"class":159,"line":222},[33054],{"type":20,"tag":157,"props":33055,"children":33056},{},[33057],{"type":25,"value":31712},{"type":20,"tag":157,"props":33059,"children":33060},{"class":159,"line":440},[33061],{"type":20,"tag":157,"props":33062,"children":33063},{},[33064],{"type":25,"value":31720},{"type":20,"tag":157,"props":33066,"children":33067},{"class":159,"line":448},[33068],{"type":20,"tag":157,"props":33069,"children":33070},{},[33071],{"type":25,"value":33072},"@Order(1)\n",{"type":20,"tag":157,"props":33074,"children":33075},{"class":159,"line":456},[33076],{"type":20,"tag":157,"props":33077,"children":33078},{},[33079],{"type":25,"value":33080},"public class ValidateAspect {\n",{"type":20,"tag":157,"props":33082,"children":33083},{"class":159,"line":465},[33084],{"type":20,"tag":157,"props":33085,"children":33086},{"emptyLinePlaceholder":173},[33087],{"type":25,"value":176},{"type":20,"tag":157,"props":33089,"children":33090},{"class":159,"line":474},[33091],{"type":20,"tag":157,"props":33092,"children":33093},{},[33094],{"type":25,"value":33095},"    @Before(\"com.wangkun.spring.aop.annotation.LoggerAspect.pointCut()\")\n",{"type":20,"tag":157,"props":33097,"children":33098},{"class":159,"line":483},[33099],{"type":20,"tag":157,"props":33100,"children":33101},{},[33102],{"type":25,"value":33103},"    public void afterMethod() {\n",{"type":20,"tag":157,"props":33105,"children":33106},{"class":159,"line":491},[33107],{"type":20,"tag":157,"props":33108,"children":33109},{"emptyLinePlaceholder":173},[33110],{"type":25,"value":176},{"type":20,"tag":157,"props":33112,"children":33113},{"class":159,"line":499},[33114],{"type":20,"tag":157,"props":33115,"children":33116},{},[33117],{"type":25,"value":33118},"        System.out.println(\"ValidateAspect ===  前置通知\");\n",{"type":20,"tag":157,"props":33120,"children":33121},{"class":159,"line":508},[33122],{"type":20,"tag":157,"props":33123,"children":33124},{"emptyLinePlaceholder":173},[33125],{"type":25,"value":176},{"type":20,"tag":157,"props":33127,"children":33128},{"class":159,"line":517},[33129],{"type":20,"tag":157,"props":33130,"children":33131},{},[33132],{"type":25,"value":872},{"type":20,"tag":157,"props":33134,"children":33135},{"class":159,"line":1499},[33136],{"type":20,"tag":157,"props":33137,"children":33138},{"emptyLinePlaceholder":173},[33139],{"type":25,"value":176},{"type":20,"tag":157,"props":33141,"children":33142},{"class":159,"line":1507},[33143],{"type":20,"tag":157,"props":33144,"children":33145},{"emptyLinePlaceholder":173},[33146],{"type":25,"value":176},{"type":20,"tag":157,"props":33148,"children":33149},{"class":159,"line":1515},[33150],{"type":20,"tag":157,"props":33151,"children":33152},{},[33153],{"type":25,"value":943},{"type":20,"tag":11085,"props":33155,"children":33157},{"id":33156},"_33-基于xml的aop",[33158],{"type":25,"value":33159},"3.3 基于xml的AOP",{"type":20,"tag":21,"props":33161,"children":33162},{},[33163],{"type":25,"value":33164},"略。。。。",{"type":20,"tag":28,"props":33166,"children":33168},{"id":33167},"_4-声明式事务",[33169],{"type":25,"value":33170},"4. 声明式事务",{"type":20,"tag":11085,"props":33172,"children":33174},{"id":33173},"_41-jdbctemplate",[33175],{"type":25,"value":33176},"4.1 jdbcTemplate",{"type":20,"tag":18942,"props":33178,"children":33180},{"id":33179},"_411-简介",[33181],{"type":25,"value":33182},"4.1.1 简介",{"type":20,"tag":21,"props":33184,"children":33185},{},[33186],{"type":25,"value":33187},"Spring 框架对 JDBC 进行封装，使用 JdbcTemplate 方便实现对数据库操作",{"type":20,"tag":18942,"props":33189,"children":33191},{"id":33190},"_412准备工作",[33192],{"type":25,"value":33193},"4.1.2准备工作",{"type":20,"tag":5719,"props":33195,"children":33196},{},[33197],{"type":20,"tag":48,"props":33198,"children":33199},{},[33200],{"type":25,"value":17049},{"type":20,"tag":126,"props":33202,"children":33204},{"className":17052,"code":33203,"language":17054,"meta":8,"style":8},"\u003Cdependencies>\n    \u003C!-- 基于Maven依赖传递性，导入spring-context依赖即可导入当前所需所有jar包 -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-context\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- Spring 持久化层支持jar包 --> \u003C!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中，需要使用orm、jdbc、tx三个 jar包 --> \u003C!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-orm\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- Spring 测试相关 -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-test\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- junit测试 -->\n    \u003Cdependency>\n        \u003CgroupId>junit\u003C\u002FgroupId>\n        \u003CartifactId>junit\u003C\u002FartifactId>\n        \u003Cversion>4.12\u003C\u002Fversion>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n    \u003C!-- MySQL驱动 -->\n    \u003Cdependency>\n        \u003CgroupId>mysql\u003C\u002FgroupId>\n        \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n        \u003Cversion>8.0.16\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- 数据源 -->\n    \u003Cdependency>\n        \u003CgroupId>com.alibaba\u003C\u002FgroupId>\n        \u003CartifactId>druid\u003C\u002FartifactId>\n        \u003Cversion>1.0.31\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n",[33205],{"type":20,"tag":84,"props":33206,"children":33207},{"__ignoreMap":8},[33208,33215,33222,33229,33236,33243,33250,33257,33265,33272,33279,33287,33294,33301,33309,33316,33323,33331,33338,33345,33352,33359,33366,33373,33380,33387,33394,33402,33409,33416,33423,33430,33437,33445,33452,33460,33468,33476,33483],{"type":20,"tag":157,"props":33209,"children":33210},{"class":159,"line":160},[33211],{"type":20,"tag":157,"props":33212,"children":33213},{},[33214],{"type":25,"value":25950},{"type":20,"tag":157,"props":33216,"children":33217},{"class":159,"line":169},[33218],{"type":20,"tag":157,"props":33219,"children":33220},{},[33221],{"type":25,"value":25958},{"type":20,"tag":157,"props":33223,"children":33224},{"class":159,"line":179},[33225],{"type":20,"tag":157,"props":33226,"children":33227},{},[33228],{"type":25,"value":16072},{"type":20,"tag":157,"props":33230,"children":33231},{"class":159,"line":188},[33232],{"type":20,"tag":157,"props":33233,"children":33234},{},[33235],{"type":25,"value":25973},{"type":20,"tag":157,"props":33237,"children":33238},{"class":159,"line":196},[33239],{"type":20,"tag":157,"props":33240,"children":33241},{},[33242],{"type":25,"value":25981},{"type":20,"tag":157,"props":33244,"children":33245},{"class":159,"line":204},[33246],{"type":20,"tag":157,"props":33247,"children":33248},{},[33249],{"type":25,"value":25989},{"type":20,"tag":157,"props":33251,"children":33252},{"class":159,"line":213},[33253],{"type":20,"tag":157,"props":33254,"children":33255},{},[33256],{"type":25,"value":16190},{"type":20,"tag":157,"props":33258,"children":33259},{"class":159,"line":222},[33260],{"type":20,"tag":157,"props":33261,"children":33262},{},[33263],{"type":25,"value":33264},"    \u003C!-- Spring 持久化层支持jar包 --> \u003C!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中，需要使用orm、jdbc、tx三个 jar包 --> \u003C!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 -->\n",{"type":20,"tag":157,"props":33266,"children":33267},{"class":159,"line":440},[33268],{"type":20,"tag":157,"props":33269,"children":33270},{},[33271],{"type":25,"value":16072},{"type":20,"tag":157,"props":33273,"children":33274},{"class":159,"line":448},[33275],{"type":20,"tag":157,"props":33276,"children":33277},{},[33278],{"type":25,"value":25973},{"type":20,"tag":157,"props":33280,"children":33281},{"class":159,"line":456},[33282],{"type":20,"tag":157,"props":33283,"children":33284},{},[33285],{"type":25,"value":33286},"        \u003CartifactId>spring-orm\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":33288,"children":33289},{"class":159,"line":465},[33290],{"type":20,"tag":157,"props":33291,"children":33292},{},[33293],{"type":25,"value":25989},{"type":20,"tag":157,"props":33295,"children":33296},{"class":159,"line":474},[33297],{"type":20,"tag":157,"props":33298,"children":33299},{},[33300],{"type":25,"value":16190},{"type":20,"tag":157,"props":33302,"children":33303},{"class":159,"line":483},[33304],{"type":20,"tag":157,"props":33305,"children":33306},{},[33307],{"type":25,"value":33308},"    \u003C!-- Spring 测试相关 -->\n",{"type":20,"tag":157,"props":33310,"children":33311},{"class":159,"line":491},[33312],{"type":20,"tag":157,"props":33313,"children":33314},{},[33315],{"type":25,"value":16072},{"type":20,"tag":157,"props":33317,"children":33318},{"class":159,"line":499},[33319],{"type":20,"tag":157,"props":33320,"children":33321},{},[33322],{"type":25,"value":25973},{"type":20,"tag":157,"props":33324,"children":33325},{"class":159,"line":508},[33326],{"type":20,"tag":157,"props":33327,"children":33328},{},[33329],{"type":25,"value":33330},"        \u003CartifactId>spring-test\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":33332,"children":33333},{"class":159,"line":517},[33334],{"type":20,"tag":157,"props":33335,"children":33336},{},[33337],{"type":25,"value":25989},{"type":20,"tag":157,"props":33339,"children":33340},{"class":159,"line":1499},[33341],{"type":20,"tag":157,"props":33342,"children":33343},{},[33344],{"type":25,"value":16190},{"type":20,"tag":157,"props":33346,"children":33347},{"class":159,"line":1507},[33348],{"type":20,"tag":157,"props":33349,"children":33350},{},[33351],{"type":25,"value":26004},{"type":20,"tag":157,"props":33353,"children":33354},{"class":159,"line":1515},[33355],{"type":20,"tag":157,"props":33356,"children":33357},{},[33358],{"type":25,"value":16072},{"type":20,"tag":157,"props":33360,"children":33361},{"class":159,"line":1523},[33362],{"type":20,"tag":157,"props":33363,"children":33364},{},[33365],{"type":25,"value":16119},{"type":20,"tag":157,"props":33367,"children":33368},{"class":159,"line":1532},[33369],{"type":20,"tag":157,"props":33370,"children":33371},{},[33372],{"type":25,"value":16127},{"type":20,"tag":157,"props":33374,"children":33375},{"class":159,"line":1541},[33376],{"type":20,"tag":157,"props":33377,"children":33378},{},[33379],{"type":25,"value":16135},{"type":20,"tag":157,"props":33381,"children":33382},{"class":159,"line":1550},[33383],{"type":20,"tag":157,"props":33384,"children":33385},{},[33386],{"type":25,"value":16143},{"type":20,"tag":157,"props":33388,"children":33389},{"class":159,"line":1558},[33390],{"type":20,"tag":157,"props":33391,"children":33392},{},[33393],{"type":25,"value":16190},{"type":20,"tag":157,"props":33395,"children":33396},{"class":159,"line":1566},[33397],{"type":20,"tag":157,"props":33398,"children":33399},{},[33400],{"type":25,"value":33401},"    \u003C!-- MySQL驱动 -->\n",{"type":20,"tag":157,"props":33403,"children":33404},{"class":159,"line":1574},[33405],{"type":20,"tag":157,"props":33406,"children":33407},{},[33408],{"type":25,"value":16072},{"type":20,"tag":157,"props":33410,"children":33411},{"class":159,"line":1582},[33412],{"type":20,"tag":157,"props":33413,"children":33414},{},[33415],{"type":25,"value":16166},{"type":20,"tag":157,"props":33417,"children":33418},{"class":159,"line":1591},[33419],{"type":20,"tag":157,"props":33420,"children":33421},{},[33422],{"type":25,"value":16174},{"type":20,"tag":157,"props":33424,"children":33425},{"class":159,"line":1599},[33426],{"type":20,"tag":157,"props":33427,"children":33428},{},[33429],{"type":25,"value":16182},{"type":20,"tag":157,"props":33431,"children":33432},{"class":159,"line":1608},[33433],{"type":20,"tag":157,"props":33434,"children":33435},{},[33436],{"type":25,"value":16190},{"type":20,"tag":157,"props":33438,"children":33439},{"class":159,"line":1617},[33440],{"type":20,"tag":157,"props":33441,"children":33442},{},[33443],{"type":25,"value":33444},"    \u003C!-- 数据源 -->\n",{"type":20,"tag":157,"props":33446,"children":33447},{"class":159,"line":1626},[33448],{"type":20,"tag":157,"props":33449,"children":33450},{},[33451],{"type":25,"value":16072},{"type":20,"tag":157,"props":33453,"children":33454},{"class":159,"line":1634},[33455],{"type":20,"tag":157,"props":33456,"children":33457},{},[33458],{"type":25,"value":33459},"        \u003CgroupId>com.alibaba\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":33461,"children":33462},{"class":159,"line":1642},[33463],{"type":20,"tag":157,"props":33464,"children":33465},{},[33466],{"type":25,"value":33467},"        \u003CartifactId>druid\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":33469,"children":33470},{"class":159,"line":1650},[33471],{"type":20,"tag":157,"props":33472,"children":33473},{},[33474],{"type":25,"value":33475},"        \u003Cversion>1.0.31\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":33477,"children":33478},{"class":159,"line":1659},[33479],{"type":20,"tag":157,"props":33480,"children":33481},{},[33482],{"type":25,"value":16190},{"type":20,"tag":157,"props":33484,"children":33485},{"class":159,"line":1668},[33486],{"type":20,"tag":157,"props":33487,"children":33488},{},[33489],{"type":25,"value":16198},{"type":20,"tag":5719,"props":33491,"children":33492},{"start":169},[33493],{"type":20,"tag":48,"props":33494,"children":33495},{},[33496,33498],{"type":25,"value":33497},"创建",{"type":20,"tag":84,"props":33499,"children":33501},{"className":33500},[],[33502],{"type":25,"value":33503},"jdbc.properties",{"type":20,"tag":126,"props":33505,"children":33506},{"className":28770,"code":28771,"language":28772,"meta":8,"style":8},[33507],{"type":20,"tag":84,"props":33508,"children":33509},{"__ignoreMap":8},[33510,33517,33524,33531],{"type":20,"tag":157,"props":33511,"children":33512},{"class":159,"line":160},[33513],{"type":20,"tag":157,"props":33514,"children":33515},{},[33516],{"type":25,"value":28784},{"type":20,"tag":157,"props":33518,"children":33519},{"class":159,"line":169},[33520],{"type":20,"tag":157,"props":33521,"children":33522},{},[33523],{"type":25,"value":28792},{"type":20,"tag":157,"props":33525,"children":33526},{"class":159,"line":179},[33527],{"type":20,"tag":157,"props":33528,"children":33529},{},[33530],{"type":25,"value":28800},{"type":20,"tag":157,"props":33532,"children":33533},{"class":159,"line":188},[33534],{"type":20,"tag":157,"props":33535,"children":33536},{},[33537],{"type":25,"value":28808},{"type":20,"tag":5719,"props":33539,"children":33540},{"start":179},[33541],{"type":20,"tag":48,"props":33542,"children":33543},{},[33544],{"type":25,"value":33545},"配置spring配置文件",{"type":20,"tag":126,"props":33547,"children":33549},{"className":17052,"code":33548,"language":17054,"meta":8,"style":8},"\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 http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n\n    \u003Ccontext:property-placeholder location=\"jdbc-properties.properties\"\u002F>\n\n    \u003Cbean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\">\n        \u003Cproperty name=\"driverClassName\" value=\"${jdbc.driver}\"\u002F>\n        \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n        \u003Cproperty name=\"username\" value=\"${jdbc.username}\"\u002F>\n        \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n    \u003C\u002Fbean>\n\n    \u003Cbean class=\"org.springframework.jdbc.core.JdbcTemplate\">\n        \u003Cproperty name=\"dataSource\" ref=\"dataSource\"\u002F>\n    \u003C\u002Fbean>\n\n\u003C\u002Fbeans>\n",[33550],{"type":20,"tag":84,"props":33551,"children":33552},{"__ignoreMap":8},[33553,33560,33567,33574,33581,33589,33596,33603,33610,33617,33624,33631,33638,33645,33652,33659,33667,33675,33682,33689],{"type":20,"tag":157,"props":33554,"children":33555},{"class":159,"line":160},[33556],{"type":20,"tag":157,"props":33557,"children":33558},{},[33559],{"type":25,"value":23638},{"type":20,"tag":157,"props":33561,"children":33562},{"class":159,"line":169},[33563],{"type":20,"tag":157,"props":33564,"children":33565},{},[33566],{"type":25,"value":26182},{"type":20,"tag":157,"props":33568,"children":33569},{"class":159,"line":179},[33570],{"type":20,"tag":157,"props":33571,"children":33572},{},[33573],{"type":25,"value":26190},{"type":20,"tag":157,"props":33575,"children":33576},{"class":159,"line":188},[33577],{"type":20,"tag":157,"props":33578,"children":33579},{},[33580],{"type":25,"value":28852},{"type":20,"tag":157,"props":33582,"children":33583},{"class":159,"line":196},[33584],{"type":20,"tag":157,"props":33585,"children":33586},{},[33587],{"type":25,"value":33588},"       xsi:schemaLocation=\"http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n",{"type":20,"tag":157,"props":33590,"children":33591},{"class":159,"line":204},[33592],{"type":20,"tag":157,"props":33593,"children":33594},{"emptyLinePlaceholder":173},[33595],{"type":25,"value":176},{"type":20,"tag":157,"props":33597,"children":33598},{"class":159,"line":213},[33599],{"type":20,"tag":157,"props":33600,"children":33601},{},[33602],{"type":25,"value":28915},{"type":20,"tag":157,"props":33604,"children":33605},{"class":159,"line":222},[33606],{"type":20,"tag":157,"props":33607,"children":33608},{"emptyLinePlaceholder":173},[33609],{"type":25,"value":176},{"type":20,"tag":157,"props":33611,"children":33612},{"class":159,"line":440},[33613],{"type":20,"tag":157,"props":33614,"children":33615},{},[33616],{"type":25,"value":28930},{"type":20,"tag":157,"props":33618,"children":33619},{"class":159,"line":448},[33620],{"type":20,"tag":157,"props":33621,"children":33622},{},[33623],{"type":25,"value":28938},{"type":20,"tag":157,"props":33625,"children":33626},{"class":159,"line":456},[33627],{"type":20,"tag":157,"props":33628,"children":33629},{},[33630],{"type":25,"value":28946},{"type":20,"tag":157,"props":33632,"children":33633},{"class":159,"line":465},[33634],{"type":20,"tag":157,"props":33635,"children":33636},{},[33637],{"type":25,"value":28954},{"type":20,"tag":157,"props":33639,"children":33640},{"class":159,"line":474},[33641],{"type":20,"tag":157,"props":33642,"children":33643},{},[33644],{"type":25,"value":28962},{"type":20,"tag":157,"props":33646,"children":33647},{"class":159,"line":483},[33648],{"type":20,"tag":157,"props":33649,"children":33650},{},[33651],{"type":25,"value":28970},{"type":20,"tag":157,"props":33653,"children":33654},{"class":159,"line":491},[33655],{"type":20,"tag":157,"props":33656,"children":33657},{"emptyLinePlaceholder":173},[33658],{"type":25,"value":176},{"type":20,"tag":157,"props":33660,"children":33661},{"class":159,"line":499},[33662],{"type":20,"tag":157,"props":33663,"children":33664},{},[33665],{"type":25,"value":33666},"    \u003Cbean class=\"org.springframework.jdbc.core.JdbcTemplate\">\n",{"type":20,"tag":157,"props":33668,"children":33669},{"class":159,"line":508},[33670],{"type":20,"tag":157,"props":33671,"children":33672},{},[33673],{"type":25,"value":33674},"        \u003Cproperty name=\"dataSource\" ref=\"dataSource\"\u002F>\n",{"type":20,"tag":157,"props":33676,"children":33677},{"class":159,"line":517},[33678],{"type":20,"tag":157,"props":33679,"children":33680},{},[33681],{"type":25,"value":28970},{"type":20,"tag":157,"props":33683,"children":33684},{"class":159,"line":1499},[33685],{"type":20,"tag":157,"props":33686,"children":33687},{"emptyLinePlaceholder":173},[33688],{"type":25,"value":176},{"type":20,"tag":157,"props":33690,"children":33691},{"class":159,"line":1507},[33692],{"type":20,"tag":157,"props":33693,"children":33694},{},[33695],{"type":25,"value":26276},{"type":20,"tag":5719,"props":33697,"children":33698},{"start":188},[33699],{"type":20,"tag":48,"props":33700,"children":33701},{},[33702],{"type":25,"value":33703},"测试",{"type":20,"tag":126,"props":33705,"children":33707},{"className":16050,"code":33706,"language":16052,"meta":8,"style":8},"package com.wangkun.spring.jdbc;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.jdbc.core.BeanPropertyRowMapper;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport java.util.List;\nimport java.util.stream.Stream;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(\"classpath:spring-jdbc.xml\")\npublic class TestJDBCTemplate {\n\n    @Autowired\n    private JdbcTemplate jdbcTemplate;\n\n    \u002F**\n     * 新增\n     *\u002F\n    @Test\n    public void testInsetUser() {\n        String sql = \"insert into t_user values (null, ?, ?, ?, ?, ?)\";\n        jdbcTemplate.update(sql, \"root\", \"123\", \"23\", \"女\", \"123.qq.com\");\n    }\n\n    \u002F**\n     * 根据id查用户\n     *\u002F\n    @Test\n    public void testGetUserById() {\n        String sql = \"select * from t_user where id = ?\";\n        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper\u003C>(User.class), 1);\n        System.out.println(user);\n    }\n\n    \u002F**\n     * 查询所有用户\n     *\u002F\n    @Test\n    public void testGetAllUser() {\n        String sql = \"select * from t_user\";\n        List\u003CUser> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper\u003C>(User.class));\n\n        for (User user : list) {\n            System.out.println(user);\n        }\n    }\n\n    \u002F**\n     * 查询一共有多少条数据\n     *\u002F\n    @Test\n    public void testGetAllCount() {\n        String sql = \"select count(*) from t_user\";\n        Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);\n        System.out.println(integer);\n    }\n}\n",[33708],{"type":20,"tag":84,"props":33709,"children":33710},{"__ignoreMap":8},[33711,33719,33726,33733,33741,33749,33757,33765,33773,33781,33788,33795,33803,33810,33818,33826,33834,33841,33848,33856,33863,33870,33878,33885,33892,33900,33908,33916,33923,33930,33937,33945,33952,33959,33967,33975,33983,33990,33997,34004,34011,34019,34026,34033,34041,34049,34057,34064,34072,34080,34087,34094,34101,34108,34116,34123,34130,34138,34146,34154,34162,34169],{"type":20,"tag":157,"props":33712,"children":33713},{"class":159,"line":160},[33714],{"type":20,"tag":157,"props":33715,"children":33716},{},[33717],{"type":25,"value":33718},"package com.wangkun.spring.jdbc;\n",{"type":20,"tag":157,"props":33720,"children":33721},{"class":159,"line":169},[33722],{"type":20,"tag":157,"props":33723,"children":33724},{"emptyLinePlaceholder":173},[33725],{"type":25,"value":176},{"type":20,"tag":157,"props":33727,"children":33728},{"class":159,"line":179},[33729],{"type":20,"tag":157,"props":33730,"children":33731},{},[33732],{"type":25,"value":16795},{"type":20,"tag":157,"props":33734,"children":33735},{"class":159,"line":188},[33736],{"type":20,"tag":157,"props":33737,"children":33738},{},[33739],{"type":25,"value":33740},"import org.junit.runner.RunWith;\n",{"type":20,"tag":157,"props":33742,"children":33743},{"class":159,"line":196},[33744],{"type":20,"tag":157,"props":33745,"children":33746},{},[33747],{"type":25,"value":33748},"import org.springframework.beans.factory.annotation.Autowired;\n",{"type":20,"tag":157,"props":33750,"children":33751},{"class":159,"line":204},[33752],{"type":20,"tag":157,"props":33753,"children":33754},{},[33755],{"type":25,"value":33756},"import org.springframework.jdbc.core.BeanPropertyRowMapper;\n",{"type":20,"tag":157,"props":33758,"children":33759},{"class":159,"line":213},[33760],{"type":20,"tag":157,"props":33761,"children":33762},{},[33763],{"type":25,"value":33764},"import org.springframework.jdbc.core.JdbcTemplate;\n",{"type":20,"tag":157,"props":33766,"children":33767},{"class":159,"line":222},[33768],{"type":20,"tag":157,"props":33769,"children":33770},{},[33771],{"type":25,"value":33772},"import org.springframework.test.context.ContextConfiguration;\n",{"type":20,"tag":157,"props":33774,"children":33775},{"class":159,"line":440},[33776],{"type":20,"tag":157,"props":33777,"children":33778},{},[33779],{"type":25,"value":33780},"import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n",{"type":20,"tag":157,"props":33782,"children":33783},{"class":159,"line":448},[33784],{"type":20,"tag":157,"props":33785,"children":33786},{"emptyLinePlaceholder":173},[33787],{"type":25,"value":176},{"type":20,"tag":157,"props":33789,"children":33790},{"class":159,"line":456},[33791],{"type":20,"tag":157,"props":33792,"children":33793},{},[33794],{"type":25,"value":24608},{"type":20,"tag":157,"props":33796,"children":33797},{"class":159,"line":465},[33798],{"type":20,"tag":157,"props":33799,"children":33800},{},[33801],{"type":25,"value":33802},"import java.util.stream.Stream;\n",{"type":20,"tag":157,"props":33804,"children":33805},{"class":159,"line":474},[33806],{"type":20,"tag":157,"props":33807,"children":33808},{"emptyLinePlaceholder":173},[33809],{"type":25,"value":176},{"type":20,"tag":157,"props":33811,"children":33812},{"class":159,"line":483},[33813],{"type":20,"tag":157,"props":33814,"children":33815},{},[33816],{"type":25,"value":33817},"@RunWith(SpringJUnit4ClassRunner.class)\n",{"type":20,"tag":157,"props":33819,"children":33820},{"class":159,"line":491},[33821],{"type":20,"tag":157,"props":33822,"children":33823},{},[33824],{"type":25,"value":33825},"@ContextConfiguration(\"classpath:spring-jdbc.xml\")\n",{"type":20,"tag":157,"props":33827,"children":33828},{"class":159,"line":499},[33829],{"type":20,"tag":157,"props":33830,"children":33831},{},[33832],{"type":25,"value":33833},"public class TestJDBCTemplate {\n",{"type":20,"tag":157,"props":33835,"children":33836},{"class":159,"line":508},[33837],{"type":20,"tag":157,"props":33838,"children":33839},{"emptyLinePlaceholder":173},[33840],{"type":25,"value":176},{"type":20,"tag":157,"props":33842,"children":33843},{"class":159,"line":517},[33844],{"type":20,"tag":157,"props":33845,"children":33846},{},[33847],{"type":25,"value":31025},{"type":20,"tag":157,"props":33849,"children":33850},{"class":159,"line":1499},[33851],{"type":20,"tag":157,"props":33852,"children":33853},{},[33854],{"type":25,"value":33855},"    private JdbcTemplate jdbcTemplate;\n",{"type":20,"tag":157,"props":33857,"children":33858},{"class":159,"line":1507},[33859],{"type":20,"tag":157,"props":33860,"children":33861},{"emptyLinePlaceholder":173},[33862],{"type":25,"value":176},{"type":20,"tag":157,"props":33864,"children":33865},{"class":159,"line":1515},[33866],{"type":20,"tag":157,"props":33867,"children":33868},{},[33869],{"type":25,"value":24638},{"type":20,"tag":157,"props":33871,"children":33872},{"class":159,"line":1523},[33873],{"type":20,"tag":157,"props":33874,"children":33875},{},[33876],{"type":25,"value":33877},"     * 新增\n",{"type":20,"tag":157,"props":33879,"children":33880},{"class":159,"line":1532},[33881],{"type":20,"tag":157,"props":33882,"children":33883},{},[33884],{"type":25,"value":24654},{"type":20,"tag":157,"props":33886,"children":33887},{"class":159,"line":1541},[33888],{"type":20,"tag":157,"props":33889,"children":33890},{},[33891],{"type":25,"value":16841},{"type":20,"tag":157,"props":33893,"children":33894},{"class":159,"line":1550},[33895],{"type":20,"tag":157,"props":33896,"children":33897},{},[33898],{"type":25,"value":33899},"    public void testInsetUser() {\n",{"type":20,"tag":157,"props":33901,"children":33902},{"class":159,"line":1558},[33903],{"type":20,"tag":157,"props":33904,"children":33905},{},[33906],{"type":25,"value":33907},"        String sql = \"insert into t_user values (null, ?, ?, ?, ?, ?)\";\n",{"type":20,"tag":157,"props":33909,"children":33910},{"class":159,"line":1566},[33911],{"type":20,"tag":157,"props":33912,"children":33913},{},[33914],{"type":25,"value":33915},"        jdbcTemplate.update(sql, \"root\", \"123\", \"23\", \"女\", \"123.qq.com\");\n",{"type":20,"tag":157,"props":33917,"children":33918},{"class":159,"line":1574},[33919],{"type":20,"tag":157,"props":33920,"children":33921},{},[33922],{"type":25,"value":872},{"type":20,"tag":157,"props":33924,"children":33925},{"class":159,"line":1582},[33926],{"type":20,"tag":157,"props":33927,"children":33928},{"emptyLinePlaceholder":173},[33929],{"type":25,"value":176},{"type":20,"tag":157,"props":33931,"children":33932},{"class":159,"line":1591},[33933],{"type":20,"tag":157,"props":33934,"children":33935},{},[33936],{"type":25,"value":24638},{"type":20,"tag":157,"props":33938,"children":33939},{"class":159,"line":1599},[33940],{"type":20,"tag":157,"props":33941,"children":33942},{},[33943],{"type":25,"value":33944},"     * 根据id查用户\n",{"type":20,"tag":157,"props":33946,"children":33947},{"class":159,"line":1608},[33948],{"type":20,"tag":157,"props":33949,"children":33950},{},[33951],{"type":25,"value":24654},{"type":20,"tag":157,"props":33953,"children":33954},{"class":159,"line":1617},[33955],{"type":20,"tag":157,"props":33956,"children":33957},{},[33958],{"type":25,"value":16841},{"type":20,"tag":157,"props":33960,"children":33961},{"class":159,"line":1626},[33962],{"type":20,"tag":157,"props":33963,"children":33964},{},[33965],{"type":25,"value":33966},"    public void testGetUserById() {\n",{"type":20,"tag":157,"props":33968,"children":33969},{"class":159,"line":1634},[33970],{"type":20,"tag":157,"props":33971,"children":33972},{},[33973],{"type":25,"value":33974},"        String sql = \"select * from t_user where id = ?\";\n",{"type":20,"tag":157,"props":33976,"children":33977},{"class":159,"line":1642},[33978],{"type":20,"tag":157,"props":33979,"children":33980},{},[33981],{"type":25,"value":33982},"        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper\u003C>(User.class), 1);\n",{"type":20,"tag":157,"props":33984,"children":33985},{"class":159,"line":1650},[33986],{"type":20,"tag":157,"props":33987,"children":33988},{},[33989],{"type":25,"value":18724},{"type":20,"tag":157,"props":33991,"children":33992},{"class":159,"line":1659},[33993],{"type":20,"tag":157,"props":33994,"children":33995},{},[33996],{"type":25,"value":872},{"type":20,"tag":157,"props":33998,"children":33999},{"class":159,"line":1668},[34000],{"type":20,"tag":157,"props":34001,"children":34002},{"emptyLinePlaceholder":173},[34003],{"type":25,"value":176},{"type":20,"tag":157,"props":34005,"children":34006},{"class":159,"line":1677},[34007],{"type":20,"tag":157,"props":34008,"children":34009},{},[34010],{"type":25,"value":24638},{"type":20,"tag":157,"props":34012,"children":34013},{"class":159,"line":1685},[34014],{"type":20,"tag":157,"props":34015,"children":34016},{},[34017],{"type":25,"value":34018},"     * 查询所有用户\n",{"type":20,"tag":157,"props":34020,"children":34021},{"class":159,"line":1693},[34022],{"type":20,"tag":157,"props":34023,"children":34024},{},[34025],{"type":25,"value":24654},{"type":20,"tag":157,"props":34027,"children":34028},{"class":159,"line":1701},[34029],{"type":20,"tag":157,"props":34030,"children":34031},{},[34032],{"type":25,"value":16841},{"type":20,"tag":157,"props":34034,"children":34035},{"class":159,"line":1710},[34036],{"type":20,"tag":157,"props":34037,"children":34038},{},[34039],{"type":25,"value":34040},"    public void testGetAllUser() {\n",{"type":20,"tag":157,"props":34042,"children":34043},{"class":159,"line":23976},[34044],{"type":20,"tag":157,"props":34045,"children":34046},{},[34047],{"type":25,"value":34048},"        String sql = \"select * from t_user\";\n",{"type":20,"tag":157,"props":34050,"children":34051},{"class":159,"line":23985},[34052],{"type":20,"tag":157,"props":34053,"children":34054},{},[34055],{"type":25,"value":34056},"        List\u003CUser> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper\u003C>(User.class));\n",{"type":20,"tag":157,"props":34058,"children":34059},{"class":159,"line":23994},[34060],{"type":20,"tag":157,"props":34061,"children":34062},{"emptyLinePlaceholder":173},[34063],{"type":25,"value":176},{"type":20,"tag":157,"props":34065,"children":34066},{"class":159,"line":24003},[34067],{"type":20,"tag":157,"props":34068,"children":34069},{},[34070],{"type":25,"value":34071},"        for (User user : list) {\n",{"type":20,"tag":157,"props":34073,"children":34074},{"class":159,"line":24012},[34075],{"type":20,"tag":157,"props":34076,"children":34077},{},[34078],{"type":25,"value":34079},"            System.out.println(user);\n",{"type":20,"tag":157,"props":34081,"children":34082},{"class":159,"line":24021},[34083],{"type":20,"tag":157,"props":34084,"children":34085},{},[34086],{"type":25,"value":24820},{"type":20,"tag":157,"props":34088,"children":34089},{"class":159,"line":24030},[34090],{"type":20,"tag":157,"props":34091,"children":34092},{},[34093],{"type":25,"value":872},{"type":20,"tag":157,"props":34095,"children":34096},{"class":159,"line":24039},[34097],{"type":20,"tag":157,"props":34098,"children":34099},{"emptyLinePlaceholder":173},[34100],{"type":25,"value":176},{"type":20,"tag":157,"props":34102,"children":34103},{"class":159,"line":24048},[34104],{"type":20,"tag":157,"props":34105,"children":34106},{},[34107],{"type":25,"value":24638},{"type":20,"tag":157,"props":34109,"children":34110},{"class":159,"line":24057},[34111],{"type":20,"tag":157,"props":34112,"children":34113},{},[34114],{"type":25,"value":34115},"     * 查询一共有多少条数据\n",{"type":20,"tag":157,"props":34117,"children":34118},{"class":159,"line":24066},[34119],{"type":20,"tag":157,"props":34120,"children":34121},{},[34122],{"type":25,"value":24654},{"type":20,"tag":157,"props":34124,"children":34125},{"class":159,"line":24075},[34126],{"type":20,"tag":157,"props":34127,"children":34128},{},[34129],{"type":25,"value":16841},{"type":20,"tag":157,"props":34131,"children":34132},{"class":159,"line":24084},[34133],{"type":20,"tag":157,"props":34134,"children":34135},{},[34136],{"type":25,"value":34137},"    public void testGetAllCount() {\n",{"type":20,"tag":157,"props":34139,"children":34140},{"class":159,"line":24093},[34141],{"type":20,"tag":157,"props":34142,"children":34143},{},[34144],{"type":25,"value":34145},"        String sql = \"select count(*) from t_user\";\n",{"type":20,"tag":157,"props":34147,"children":34148},{"class":159,"line":24102},[34149],{"type":20,"tag":157,"props":34150,"children":34151},{},[34152],{"type":25,"value":34153},"        Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);\n",{"type":20,"tag":157,"props":34155,"children":34156},{"class":159,"line":24111},[34157],{"type":20,"tag":157,"props":34158,"children":34159},{},[34160],{"type":25,"value":34161},"        System.out.println(integer);\n",{"type":20,"tag":157,"props":34163,"children":34164},{"class":159,"line":24119},[34165],{"type":20,"tag":157,"props":34166,"children":34167},{},[34168],{"type":25,"value":872},{"type":20,"tag":157,"props":34170,"children":34171},{"class":159,"line":24128},[34172],{"type":20,"tag":157,"props":34173,"children":34174},{},[34175],{"type":25,"value":943},{"type":20,"tag":11085,"props":34177,"children":34179},{"id":34178},"_42-声明式事务概念",[34180],{"type":25,"value":34181},"4.2 声明式事务概念",{"type":20,"tag":18942,"props":34183,"children":34185},{"id":34184},"_421-编程式事务",[34186],{"type":25,"value":34187},"4.2.1 编程式事务",{"type":20,"tag":6665,"props":34189,"children":34190},{},[34191],{"type":20,"tag":21,"props":34192,"children":34193},{},[34194],{"type":25,"value":34195},"事务功能的相关操作全部通过自己编写代码来实现",{"type":20,"tag":21,"props":34197,"children":34198},{},[34199],{"type":25,"value":34200},"编程式的实现方式存在缺陷：",{"type":20,"tag":44,"props":34202,"children":34203},{},[34204,34209],{"type":20,"tag":48,"props":34205,"children":34206},{},[34207],{"type":25,"value":34208},"细节没有被屏蔽：具体操作过程中，所有细节都需要程序员自己来完成，比较繁琐。",{"type":20,"tag":48,"props":34210,"children":34211},{},[34212],{"type":25,"value":34213},"代码复用性不高：如果没有有效抽取出来，每次实现功能都需要自己编写代码，代码就没有得到复用",{"type":20,"tag":18942,"props":34215,"children":34217},{"id":34216},"_422-声明式事务",[34218],{"type":25,"value":34219},"4.2.2 声明式事务",{"type":20,"tag":6665,"props":34221,"children":34222},{},[34223],{"type":20,"tag":21,"props":34224,"children":34225},{},[34226],{"type":25,"value":34227},"既然事务控制的代码有规律可循，代码的结构基本是确定的，所以框架就可以将固定模式的代码抽取出来，进行相关的封装。封装起来后，我们只需要在配置文件中进行简单的配置即可完成操作。",{"type":20,"tag":21,"props":34229,"children":34230},{},[34231],{"type":20,"tag":33,"props":34232,"children":34233},{},[34234],{"type":25,"value":34235},"优点：",{"type":20,"tag":5719,"props":34237,"children":34238},{},[34239,34244,34249],{"type":20,"tag":48,"props":34240,"children":34241},{},[34242],{"type":25,"value":34243},"提高开发效率",{"type":20,"tag":48,"props":34245,"children":34246},{},[34247],{"type":25,"value":34248},"消除了冗余的代码",{"type":20,"tag":48,"props":34250,"children":34251},{},[34252],{"type":25,"value":34253},"框架会综合考虑相关领域中在实际开发环境下有可能遇到的各种问题，进行了健壮性、性能等各个方面的优化",{"type":20,"tag":21,"props":34255,"children":34256},{},[34257],{"type":20,"tag":33,"props":34258,"children":34259},{},[34260],{"type":25,"value":20163},{"type":20,"tag":21,"props":34262,"children":34263},{},[34264,34269,34270,34275],{"type":20,"tag":33,"props":34265,"children":34266},{},[34267],{"type":25,"value":34268},"编程式",{"type":25,"value":146},{"type":20,"tag":33,"props":34271,"children":34272},{},[34273],{"type":25,"value":34274},"自己写代码",{"type":25,"value":34276},"实现功能",{"type":20,"tag":21,"props":34278,"children":34279},{},[34280,34285,34287,34292,34294,34299],{"type":20,"tag":33,"props":34281,"children":34282},{},[34283],{"type":25,"value":34284},"声明式",{"type":25,"value":34286},"：通过",{"type":20,"tag":33,"props":34288,"children":34289},{},[34290],{"type":25,"value":34291},"配置",{"type":25,"value":34293},"让",{"type":20,"tag":33,"props":34295,"children":34296},{},[34297],{"type":25,"value":34298},"框架",{"type":25,"value":34276},{"type":20,"tag":11085,"props":34301,"children":34303},{"id":34302},"_43-基于注解的声明式事务",[34304],{"type":25,"value":34305},"4.3 基于注解的声明式事务",{"type":20,"tag":18942,"props":34307,"children":34309},{"id":34308},"_431-准备工作",[34310],{"type":25,"value":34311},"4.3.1 准备工作",{"type":20,"tag":5719,"props":34313,"children":34314},{},[34315],{"type":20,"tag":48,"props":34316,"children":34317},{},[34318],{"type":25,"value":17049},{"type":20,"tag":126,"props":34320,"children":34321},{"className":17052,"code":33203,"language":17054,"meta":8,"style":8},[34322],{"type":20,"tag":84,"props":34323,"children":34324},{"__ignoreMap":8},[34325,34332,34339,34346,34353,34360,34367,34374,34381,34388,34395,34402,34409,34416,34423,34430,34437,34444,34451,34458,34465,34472,34479,34486,34493,34500,34507,34514,34521,34528,34535,34542,34549,34556,34563,34570,34577,34584,34591],{"type":20,"tag":157,"props":34326,"children":34327},{"class":159,"line":160},[34328],{"type":20,"tag":157,"props":34329,"children":34330},{},[34331],{"type":25,"value":25950},{"type":20,"tag":157,"props":34333,"children":34334},{"class":159,"line":169},[34335],{"type":20,"tag":157,"props":34336,"children":34337},{},[34338],{"type":25,"value":25958},{"type":20,"tag":157,"props":34340,"children":34341},{"class":159,"line":179},[34342],{"type":20,"tag":157,"props":34343,"children":34344},{},[34345],{"type":25,"value":16072},{"type":20,"tag":157,"props":34347,"children":34348},{"class":159,"line":188},[34349],{"type":20,"tag":157,"props":34350,"children":34351},{},[34352],{"type":25,"value":25973},{"type":20,"tag":157,"props":34354,"children":34355},{"class":159,"line":196},[34356],{"type":20,"tag":157,"props":34357,"children":34358},{},[34359],{"type":25,"value":25981},{"type":20,"tag":157,"props":34361,"children":34362},{"class":159,"line":204},[34363],{"type":20,"tag":157,"props":34364,"children":34365},{},[34366],{"type":25,"value":25989},{"type":20,"tag":157,"props":34368,"children":34369},{"class":159,"line":213},[34370],{"type":20,"tag":157,"props":34371,"children":34372},{},[34373],{"type":25,"value":16190},{"type":20,"tag":157,"props":34375,"children":34376},{"class":159,"line":222},[34377],{"type":20,"tag":157,"props":34378,"children":34379},{},[34380],{"type":25,"value":33264},{"type":20,"tag":157,"props":34382,"children":34383},{"class":159,"line":440},[34384],{"type":20,"tag":157,"props":34385,"children":34386},{},[34387],{"type":25,"value":16072},{"type":20,"tag":157,"props":34389,"children":34390},{"class":159,"line":448},[34391],{"type":20,"tag":157,"props":34392,"children":34393},{},[34394],{"type":25,"value":25973},{"type":20,"tag":157,"props":34396,"children":34397},{"class":159,"line":456},[34398],{"type":20,"tag":157,"props":34399,"children":34400},{},[34401],{"type":25,"value":33286},{"type":20,"tag":157,"props":34403,"children":34404},{"class":159,"line":465},[34405],{"type":20,"tag":157,"props":34406,"children":34407},{},[34408],{"type":25,"value":25989},{"type":20,"tag":157,"props":34410,"children":34411},{"class":159,"line":474},[34412],{"type":20,"tag":157,"props":34413,"children":34414},{},[34415],{"type":25,"value":16190},{"type":20,"tag":157,"props":34417,"children":34418},{"class":159,"line":483},[34419],{"type":20,"tag":157,"props":34420,"children":34421},{},[34422],{"type":25,"value":33308},{"type":20,"tag":157,"props":34424,"children":34425},{"class":159,"line":491},[34426],{"type":20,"tag":157,"props":34427,"children":34428},{},[34429],{"type":25,"value":16072},{"type":20,"tag":157,"props":34431,"children":34432},{"class":159,"line":499},[34433],{"type":20,"tag":157,"props":34434,"children":34435},{},[34436],{"type":25,"value":25973},{"type":20,"tag":157,"props":34438,"children":34439},{"class":159,"line":508},[34440],{"type":20,"tag":157,"props":34441,"children":34442},{},[34443],{"type":25,"value":33330},{"type":20,"tag":157,"props":34445,"children":34446},{"class":159,"line":517},[34447],{"type":20,"tag":157,"props":34448,"children":34449},{},[34450],{"type":25,"value":25989},{"type":20,"tag":157,"props":34452,"children":34453},{"class":159,"line":1499},[34454],{"type":20,"tag":157,"props":34455,"children":34456},{},[34457],{"type":25,"value":16190},{"type":20,"tag":157,"props":34459,"children":34460},{"class":159,"line":1507},[34461],{"type":20,"tag":157,"props":34462,"children":34463},{},[34464],{"type":25,"value":26004},{"type":20,"tag":157,"props":34466,"children":34467},{"class":159,"line":1515},[34468],{"type":20,"tag":157,"props":34469,"children":34470},{},[34471],{"type":25,"value":16072},{"type":20,"tag":157,"props":34473,"children":34474},{"class":159,"line":1523},[34475],{"type":20,"tag":157,"props":34476,"children":34477},{},[34478],{"type":25,"value":16119},{"type":20,"tag":157,"props":34480,"children":34481},{"class":159,"line":1532},[34482],{"type":20,"tag":157,"props":34483,"children":34484},{},[34485],{"type":25,"value":16127},{"type":20,"tag":157,"props":34487,"children":34488},{"class":159,"line":1541},[34489],{"type":20,"tag":157,"props":34490,"children":34491},{},[34492],{"type":25,"value":16135},{"type":20,"tag":157,"props":34494,"children":34495},{"class":159,"line":1550},[34496],{"type":20,"tag":157,"props":34497,"children":34498},{},[34499],{"type":25,"value":16143},{"type":20,"tag":157,"props":34501,"children":34502},{"class":159,"line":1558},[34503],{"type":20,"tag":157,"props":34504,"children":34505},{},[34506],{"type":25,"value":16190},{"type":20,"tag":157,"props":34508,"children":34509},{"class":159,"line":1566},[34510],{"type":20,"tag":157,"props":34511,"children":34512},{},[34513],{"type":25,"value":33401},{"type":20,"tag":157,"props":34515,"children":34516},{"class":159,"line":1574},[34517],{"type":20,"tag":157,"props":34518,"children":34519},{},[34520],{"type":25,"value":16072},{"type":20,"tag":157,"props":34522,"children":34523},{"class":159,"line":1582},[34524],{"type":20,"tag":157,"props":34525,"children":34526},{},[34527],{"type":25,"value":16166},{"type":20,"tag":157,"props":34529,"children":34530},{"class":159,"line":1591},[34531],{"type":20,"tag":157,"props":34532,"children":34533},{},[34534],{"type":25,"value":16174},{"type":20,"tag":157,"props":34536,"children":34537},{"class":159,"line":1599},[34538],{"type":20,"tag":157,"props":34539,"children":34540},{},[34541],{"type":25,"value":16182},{"type":20,"tag":157,"props":34543,"children":34544},{"class":159,"line":1608},[34545],{"type":20,"tag":157,"props":34546,"children":34547},{},[34548],{"type":25,"value":16190},{"type":20,"tag":157,"props":34550,"children":34551},{"class":159,"line":1617},[34552],{"type":20,"tag":157,"props":34553,"children":34554},{},[34555],{"type":25,"value":33444},{"type":20,"tag":157,"props":34557,"children":34558},{"class":159,"line":1626},[34559],{"type":20,"tag":157,"props":34560,"children":34561},{},[34562],{"type":25,"value":16072},{"type":20,"tag":157,"props":34564,"children":34565},{"class":159,"line":1634},[34566],{"type":20,"tag":157,"props":34567,"children":34568},{},[34569],{"type":25,"value":33459},{"type":20,"tag":157,"props":34571,"children":34572},{"class":159,"line":1642},[34573],{"type":20,"tag":157,"props":34574,"children":34575},{},[34576],{"type":25,"value":33467},{"type":20,"tag":157,"props":34578,"children":34579},{"class":159,"line":1650},[34580],{"type":20,"tag":157,"props":34581,"children":34582},{},[34583],{"type":25,"value":33475},{"type":20,"tag":157,"props":34585,"children":34586},{"class":159,"line":1659},[34587],{"type":20,"tag":157,"props":34588,"children":34589},{},[34590],{"type":25,"value":16190},{"type":20,"tag":157,"props":34592,"children":34593},{"class":159,"line":1668},[34594],{"type":20,"tag":157,"props":34595,"children":34596},{},[34597],{"type":25,"value":16198},{"type":20,"tag":5719,"props":34599,"children":34600},{"start":169},[34601],{"type":20,"tag":48,"props":34602,"children":34603},{},[34604],{"type":25,"value":33503},{"type":20,"tag":126,"props":34606,"children":34607},{"className":28770,"code":28771,"language":28772,"meta":8,"style":8},[34608],{"type":20,"tag":84,"props":34609,"children":34610},{"__ignoreMap":8},[34611,34618,34625,34632],{"type":20,"tag":157,"props":34612,"children":34613},{"class":159,"line":160},[34614],{"type":20,"tag":157,"props":34615,"children":34616},{},[34617],{"type":25,"value":28784},{"type":20,"tag":157,"props":34619,"children":34620},{"class":159,"line":169},[34621],{"type":20,"tag":157,"props":34622,"children":34623},{},[34624],{"type":25,"value":28792},{"type":20,"tag":157,"props":34626,"children":34627},{"class":159,"line":179},[34628],{"type":20,"tag":157,"props":34629,"children":34630},{},[34631],{"type":25,"value":28800},{"type":20,"tag":157,"props":34633,"children":34634},{"class":159,"line":188},[34635],{"type":20,"tag":157,"props":34636,"children":34637},{},[34638],{"type":25,"value":28808},{"type":20,"tag":5719,"props":34640,"children":34641},{"start":179},[34642],{"type":20,"tag":48,"props":34643,"children":34644},{},[34645],{"type":25,"value":33545},{"type":20,"tag":126,"props":34647,"children":34649},{"className":17052,"code":34648,"language":17054,"meta":8,"style":8},"\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 http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n\n    \u003C!--扫描组件，将组件交给spring管理-->\n    \u003Ccontext:component-scan base-package=\"com.wangkun.spring.jdbc\"\u002F>\n\n    \u003C!--引入外部文件-->\n    \u003Ccontext:property-placeholder location=\"jdbc-properties.properties\"\u002F>\n\n    \u003C!--配置数据源-->\n    \u003Cbean id=\"dataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\">\n        \u003Cproperty name=\"driverClassName\" value=\"${jdbc.driver}\"\u002F>\n        \u003Cproperty name=\"url\" value=\"${jdbc.url}\"\u002F>\n        \u003Cproperty name=\"username\" value=\"${jdbc.username}\"\u002F>\n        \u003Cproperty name=\"password\" value=\"${jdbc.password}\"\u002F>\n    \u003C\u002Fbean>\n\n    \u003C!--配置 JDBCTemplate-->\n    \u003Cbean class=\"org.springframework.jdbc.core.JdbcTemplate\">\n        \u003Cproperty name=\"dataSource\" ref=\"dataSource\"\u002F>\n    \u003C\u002Fbean>\n\u003C\u002Fbeans>\n",[34650],{"type":20,"tag":84,"props":34651,"children":34652},{"__ignoreMap":8},[34653,34660,34667,34674,34681,34688,34695,34703,34711,34718,34726,34733,34740,34748,34755,34762,34769,34776,34783,34790,34797,34805,34812,34819,34826],{"type":20,"tag":157,"props":34654,"children":34655},{"class":159,"line":160},[34656],{"type":20,"tag":157,"props":34657,"children":34658},{},[34659],{"type":25,"value":23638},{"type":20,"tag":157,"props":34661,"children":34662},{"class":159,"line":169},[34663],{"type":20,"tag":157,"props":34664,"children":34665},{},[34666],{"type":25,"value":26182},{"type":20,"tag":157,"props":34668,"children":34669},{"class":159,"line":179},[34670],{"type":20,"tag":157,"props":34671,"children":34672},{},[34673],{"type":25,"value":26190},{"type":20,"tag":157,"props":34675,"children":34676},{"class":159,"line":188},[34677],{"type":20,"tag":157,"props":34678,"children":34679},{},[34680],{"type":25,"value":28852},{"type":20,"tag":157,"props":34682,"children":34683},{"class":159,"line":196},[34684],{"type":20,"tag":157,"props":34685,"children":34686},{},[34687],{"type":25,"value":33588},{"type":20,"tag":157,"props":34689,"children":34690},{"class":159,"line":204},[34691],{"type":20,"tag":157,"props":34692,"children":34693},{"emptyLinePlaceholder":173},[34694],{"type":25,"value":176},{"type":20,"tag":157,"props":34696,"children":34697},{"class":159,"line":213},[34698],{"type":20,"tag":157,"props":34699,"children":34700},{},[34701],{"type":25,"value":34702},"    \u003C!--扫描组件，将组件交给spring管理-->\n",{"type":20,"tag":157,"props":34704,"children":34705},{"class":159,"line":222},[34706],{"type":20,"tag":157,"props":34707,"children":34708},{},[34709],{"type":25,"value":34710},"    \u003Ccontext:component-scan base-package=\"com.wangkun.spring.jdbc\"\u002F>\n",{"type":20,"tag":157,"props":34712,"children":34713},{"class":159,"line":440},[34714],{"type":20,"tag":157,"props":34715,"children":34716},{"emptyLinePlaceholder":173},[34717],{"type":25,"value":176},{"type":20,"tag":157,"props":34719,"children":34720},{"class":159,"line":448},[34721],{"type":20,"tag":157,"props":34722,"children":34723},{},[34724],{"type":25,"value":34725},"    \u003C!--引入外部文件-->\n",{"type":20,"tag":157,"props":34727,"children":34728},{"class":159,"line":456},[34729],{"type":20,"tag":157,"props":34730,"children":34731},{},[34732],{"type":25,"value":28915},{"type":20,"tag":157,"props":34734,"children":34735},{"class":159,"line":465},[34736],{"type":20,"tag":157,"props":34737,"children":34738},{"emptyLinePlaceholder":173},[34739],{"type":25,"value":176},{"type":20,"tag":157,"props":34741,"children":34742},{"class":159,"line":474},[34743],{"type":20,"tag":157,"props":34744,"children":34745},{},[34746],{"type":25,"value":34747},"    \u003C!--配置数据源-->\n",{"type":20,"tag":157,"props":34749,"children":34750},{"class":159,"line":483},[34751],{"type":20,"tag":157,"props":34752,"children":34753},{},[34754],{"type":25,"value":28930},{"type":20,"tag":157,"props":34756,"children":34757},{"class":159,"line":491},[34758],{"type":20,"tag":157,"props":34759,"children":34760},{},[34761],{"type":25,"value":28938},{"type":20,"tag":157,"props":34763,"children":34764},{"class":159,"line":499},[34765],{"type":20,"tag":157,"props":34766,"children":34767},{},[34768],{"type":25,"value":28946},{"type":20,"tag":157,"props":34770,"children":34771},{"class":159,"line":508},[34772],{"type":20,"tag":157,"props":34773,"children":34774},{},[34775],{"type":25,"value":28954},{"type":20,"tag":157,"props":34777,"children":34778},{"class":159,"line":517},[34779],{"type":20,"tag":157,"props":34780,"children":34781},{},[34782],{"type":25,"value":28962},{"type":20,"tag":157,"props":34784,"children":34785},{"class":159,"line":1499},[34786],{"type":20,"tag":157,"props":34787,"children":34788},{},[34789],{"type":25,"value":28970},{"type":20,"tag":157,"props":34791,"children":34792},{"class":159,"line":1507},[34793],{"type":20,"tag":157,"props":34794,"children":34795},{"emptyLinePlaceholder":173},[34796],{"type":25,"value":176},{"type":20,"tag":157,"props":34798,"children":34799},{"class":159,"line":1515},[34800],{"type":20,"tag":157,"props":34801,"children":34802},{},[34803],{"type":25,"value":34804},"    \u003C!--配置 JDBCTemplate-->\n",{"type":20,"tag":157,"props":34806,"children":34807},{"class":159,"line":1523},[34808],{"type":20,"tag":157,"props":34809,"children":34810},{},[34811],{"type":25,"value":33666},{"type":20,"tag":157,"props":34813,"children":34814},{"class":159,"line":1532},[34815],{"type":20,"tag":157,"props":34816,"children":34817},{},[34818],{"type":25,"value":33674},{"type":20,"tag":157,"props":34820,"children":34821},{"class":159,"line":1541},[34822],{"type":20,"tag":157,"props":34823,"children":34824},{},[34825],{"type":25,"value":28970},{"type":20,"tag":157,"props":34827,"children":34828},{"class":159,"line":1550},[34829],{"type":20,"tag":157,"props":34830,"children":34831},{},[34832],{"type":25,"value":26276},{"type":20,"tag":5719,"props":34834,"children":34835},{"start":188},[34836],{"type":20,"tag":48,"props":34837,"children":34838},{},[34839],{"type":25,"value":34840},"创建数据库",{"type":20,"tag":126,"props":34842,"children":34846},{"className":34843,"code":34844,"language":34845,"meta":8,"style":8},"language-sql shiki shiki-themes github-dark","CREATE TABLE `t_book` (\n    `book_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',\n    `book_name` varchar(20) DEFAULT NULL COMMENT '图书名称',\n    `price` int(11) DEFAULT NULL COMMENT '价格',\n    `stock` int(10) unsigned DEFAULT NULL COMMENT '库存（无符号）',\n    PRIMARY KEY (`book_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;\ninsert into `t_book`(`book_id`,`book_name`,`price`,`stock`) values (1,'斗破苍穹',80,100),(2,'斗罗大陆',50,100);\nCREATE TABLE `t_user` (\n    `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',\n    `username` varchar(20) DEFAULT NULL COMMENT '用户名',\n    `balance` int(10) unsigned DEFAULT NULL COMMENT '余额（无符号）',\n    PRIMARY KEY (`user_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\ninsert into `t_user`(`user_id`,`username`,`balance`) values (1,'admin',50);\n","sql",[34847],{"type":20,"tag":84,"props":34848,"children":34849},{"__ignoreMap":8},[34850,34858,34866,34874,34882,34890,34898,34906,34914,34922,34930,34938,34946,34954,34962],{"type":20,"tag":157,"props":34851,"children":34852},{"class":159,"line":160},[34853],{"type":20,"tag":157,"props":34854,"children":34855},{},[34856],{"type":25,"value":34857},"CREATE TABLE `t_book` (\n",{"type":20,"tag":157,"props":34859,"children":34860},{"class":159,"line":169},[34861],{"type":20,"tag":157,"props":34862,"children":34863},{},[34864],{"type":25,"value":34865},"    `book_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',\n",{"type":20,"tag":157,"props":34867,"children":34868},{"class":159,"line":179},[34869],{"type":20,"tag":157,"props":34870,"children":34871},{},[34872],{"type":25,"value":34873},"    `book_name` varchar(20) DEFAULT NULL COMMENT '图书名称',\n",{"type":20,"tag":157,"props":34875,"children":34876},{"class":159,"line":188},[34877],{"type":20,"tag":157,"props":34878,"children":34879},{},[34880],{"type":25,"value":34881},"    `price` int(11) DEFAULT NULL COMMENT '价格',\n",{"type":20,"tag":157,"props":34883,"children":34884},{"class":159,"line":196},[34885],{"type":20,"tag":157,"props":34886,"children":34887},{},[34888],{"type":25,"value":34889},"    `stock` int(10) unsigned DEFAULT NULL COMMENT '库存（无符号）',\n",{"type":20,"tag":157,"props":34891,"children":34892},{"class":159,"line":204},[34893],{"type":20,"tag":157,"props":34894,"children":34895},{},[34896],{"type":25,"value":34897},"    PRIMARY KEY (`book_id`)\n",{"type":20,"tag":157,"props":34899,"children":34900},{"class":159,"line":213},[34901],{"type":20,"tag":157,"props":34902,"children":34903},{},[34904],{"type":25,"value":34905},") ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;\n",{"type":20,"tag":157,"props":34907,"children":34908},{"class":159,"line":222},[34909],{"type":20,"tag":157,"props":34910,"children":34911},{},[34912],{"type":25,"value":34913},"insert into `t_book`(`book_id`,`book_name`,`price`,`stock`) values (1,'斗破苍穹',80,100),(2,'斗罗大陆',50,100);\n",{"type":20,"tag":157,"props":34915,"children":34916},{"class":159,"line":440},[34917],{"type":20,"tag":157,"props":34918,"children":34919},{},[34920],{"type":25,"value":34921},"CREATE TABLE `t_user` (\n",{"type":20,"tag":157,"props":34923,"children":34924},{"class":159,"line":448},[34925],{"type":20,"tag":157,"props":34926,"children":34927},{},[34928],{"type":25,"value":34929},"    `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',\n",{"type":20,"tag":157,"props":34931,"children":34932},{"class":159,"line":456},[34933],{"type":20,"tag":157,"props":34934,"children":34935},{},[34936],{"type":25,"value":34937},"    `username` varchar(20) DEFAULT NULL COMMENT '用户名',\n",{"type":20,"tag":157,"props":34939,"children":34940},{"class":159,"line":465},[34941],{"type":20,"tag":157,"props":34942,"children":34943},{},[34944],{"type":25,"value":34945},"    `balance` int(10) unsigned DEFAULT NULL COMMENT '余额（无符号）',\n",{"type":20,"tag":157,"props":34947,"children":34948},{"class":159,"line":474},[34949],{"type":20,"tag":157,"props":34950,"children":34951},{},[34952],{"type":25,"value":34953},"    PRIMARY KEY (`user_id`)\n",{"type":20,"tag":157,"props":34955,"children":34956},{"class":159,"line":483},[34957],{"type":20,"tag":157,"props":34958,"children":34959},{},[34960],{"type":25,"value":34961},") ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\n",{"type":20,"tag":157,"props":34963,"children":34964},{"class":159,"line":491},[34965],{"type":20,"tag":157,"props":34966,"children":34967},{},[34968],{"type":25,"value":34969},"insert into `t_user`(`user_id`,`username`,`balance`) values (1,'admin',50);\n",{"type":20,"tag":5719,"props":34971,"children":34972},{"start":196},[34973,34978],{"type":20,"tag":48,"props":34974,"children":34975},{},[34976],{"type":25,"value":34977},"写Controller、Service、Dao三层结构",{"type":20,"tag":48,"props":34979,"children":34980},{},[34981],{"type":25,"value":34982},"在Spring配置文件中加入配置",{"type":20,"tag":126,"props":34984,"children":34986},{"className":17052,"code":34985,"language":17054,"meta":8,"style":8},"\u003C!--配置 JDBCTemplate-->\n\u003Cbean class=\"org.springframework.jdbc.core.JdbcTemplate\">\n    \u003Cproperty name=\"dataSource\" ref=\"dataSource\"\u002F>\n\u003C\u002Fbean>\n\n\u003C!-- 配置事务管理器 -->\n\u003Cbean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n    \u003Cproperty name=\"dataSource\" ref=\"dataSource\"\u002F>\n\u003C\u002Fbean>\n\n\u003C!-- 开启事务的注解驱动，将使用@Transactional注解所标识的方法或类中所有的方法使用事务进行管理 -->\n\u003Ctx:annotation-driven transaction-manager=\"transactionManager\"\u002F>\n",[34987],{"type":20,"tag":84,"props":34988,"children":34989},{"__ignoreMap":8},[34990,34998,35006,35014,35021,35028,35036,35044,35051,35058,35065,35073],{"type":20,"tag":157,"props":34991,"children":34992},{"class":159,"line":160},[34993],{"type":20,"tag":157,"props":34994,"children":34995},{},[34996],{"type":25,"value":34997},"\u003C!--配置 JDBCTemplate-->\n",{"type":20,"tag":157,"props":34999,"children":35000},{"class":159,"line":169},[35001],{"type":20,"tag":157,"props":35002,"children":35003},{},[35004],{"type":25,"value":35005},"\u003Cbean class=\"org.springframework.jdbc.core.JdbcTemplate\">\n",{"type":20,"tag":157,"props":35007,"children":35008},{"class":159,"line":179},[35009],{"type":20,"tag":157,"props":35010,"children":35011},{},[35012],{"type":25,"value":35013},"    \u003Cproperty name=\"dataSource\" ref=\"dataSource\"\u002F>\n",{"type":20,"tag":157,"props":35015,"children":35016},{"class":159,"line":188},[35017],{"type":20,"tag":157,"props":35018,"children":35019},{},[35020],{"type":25,"value":26774},{"type":20,"tag":157,"props":35022,"children":35023},{"class":159,"line":196},[35024],{"type":20,"tag":157,"props":35025,"children":35026},{"emptyLinePlaceholder":173},[35027],{"type":25,"value":176},{"type":20,"tag":157,"props":35029,"children":35030},{"class":159,"line":204},[35031],{"type":20,"tag":157,"props":35032,"children":35033},{},[35034],{"type":25,"value":35035},"\u003C!-- 配置事务管理器 -->\n",{"type":20,"tag":157,"props":35037,"children":35038},{"class":159,"line":213},[35039],{"type":20,"tag":157,"props":35040,"children":35041},{},[35042],{"type":25,"value":35043},"\u003Cbean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n",{"type":20,"tag":157,"props":35045,"children":35046},{"class":159,"line":222},[35047],{"type":20,"tag":157,"props":35048,"children":35049},{},[35050],{"type":25,"value":35013},{"type":20,"tag":157,"props":35052,"children":35053},{"class":159,"line":440},[35054],{"type":20,"tag":157,"props":35055,"children":35056},{},[35057],{"type":25,"value":26774},{"type":20,"tag":157,"props":35059,"children":35060},{"class":159,"line":448},[35061],{"type":20,"tag":157,"props":35062,"children":35063},{"emptyLinePlaceholder":173},[35064],{"type":25,"value":176},{"type":20,"tag":157,"props":35066,"children":35067},{"class":159,"line":456},[35068],{"type":20,"tag":157,"props":35069,"children":35070},{},[35071],{"type":25,"value":35072},"\u003C!-- 开启事务的注解驱动，将使用@Transactional注解所标识的方法或类中所有的方法使用事务进行管理 -->\n",{"type":20,"tag":157,"props":35074,"children":35075},{"class":159,"line":465},[35076],{"type":20,"tag":157,"props":35077,"children":35078},{},[35079],{"type":25,"value":35080},"\u003Ctx:annotation-driven transaction-manager=\"transactionManager\"\u002F>\n",{"type":20,"tag":5719,"props":35082,"children":35083},{"start":213},[35084,35105],{"type":20,"tag":48,"props":35085,"children":35086},{},[35087,35089,35092,35094,35100,35103],{"type":25,"value":35088},"添加事务注解",{"type":20,"tag":9908,"props":35090,"children":35091},{},[],{"type":25,"value":35093},"\n因为service层表示业务处理层，一个方法表示一个完成的功能，因此处理事务一般在service层处理在BookServiceImpl的buyBook()添加注解 ",{"type":20,"tag":84,"props":35095,"children":35097},{"className":35096},[],[35098],{"type":25,"value":35099},"@Transactional",{"type":20,"tag":9908,"props":35101,"children":35102},{},[],{"type":25,"value":35104},"\n结果：因为使用了Spring的声明式事务，更新库存和更新余额都没有执行；只有全部成功才会执行",{"type":20,"tag":48,"props":35106,"children":35107},{},[35108,35110],{"type":25,"value":35109},"@Transactional注解标识的位置\n",{"type":20,"tag":44,"props":35111,"children":35112},{},[35113,35118],{"type":20,"tag":48,"props":35114,"children":35115},{},[35116],{"type":25,"value":35117},"标识在方法上，只会影响该方法",{"type":20,"tag":48,"props":35119,"children":35120},{},[35121],{"type":25,"value":35122},"标识在类上，会影响类中所有的方法",{"type":20,"tag":1863,"props":35124,"children":35126},{"id":35125},"spring-mvc",[35127],{"type":25,"value":25653},{"type":20,"tag":28,"props":35129,"children":35131},{"id":35130},"_1-springmvc-简介",[35132],{"type":25,"value":35133},"1. SpringMVC 简介",{"type":20,"tag":11085,"props":35135,"children":35137},{"id":35136},"_11-什么是mvc",[35138],{"type":25,"value":35139},"1.1 什么是MVC",{"type":20,"tag":6665,"props":35141,"children":35142},{},[35143,35148],{"type":20,"tag":21,"props":35144,"children":35145},{},[35146],{"type":25,"value":35147},"MVC是一种软件架构的思想，将软件按照：控制器、模型、视图 来划分",{"type":20,"tag":5719,"props":35149,"children":35150},{},[35151,35156,35174],{"type":20,"tag":48,"props":35152,"children":35153},{},[35154],{"type":25,"value":35155},"View：视图层，指前端的页面",{"type":20,"tag":48,"props":35157,"children":35158},{},[35159,35161],{"type":25,"value":35160},"Model：模型层，指工程中的JavaBean，作用是处理数据。包括两类：\n",{"type":20,"tag":44,"props":35162,"children":35163},{},[35164,35169],{"type":20,"tag":48,"props":35165,"children":35166},{},[35167],{"type":25,"value":35168},"实体类Bean：专门存储业务数据，如：User，Student",{"type":20,"tag":48,"props":35170,"children":35171},{},[35172],{"type":25,"value":35173},"业务处理的Bean：指Service，Dao对象，专门处理业务逻辑与数据访问",{"type":20,"tag":48,"props":35175,"children":35176},{},[35177],{"type":25,"value":35178},"Controller：控制层，接收请求与响应请求",{"type":20,"tag":21,"props":35180,"children":35181},{},[35182],{"type":25,"value":35183},"MVC的工作流程：用户通过视图层发送请求到达控制层，服务器进行请求分发，经过模型层（Service > Dao）处理，处理完毕后将结果返回Controller，Controller再根据请求处理的结果找到相应的View视图，渲染数据后最终响应给浏览器",{"type":20,"tag":11085,"props":35185,"children":35187},{"id":35186},"_12-什么是springmvc",[35188],{"type":25,"value":35189},"1.2 什么是SpringMVC",{"type":20,"tag":21,"props":35191,"children":35192},{},[35193],{"type":25,"value":35194},"SpringMVC是Spring的一个后续产品，是Spring的一个子项目",{"type":20,"tag":21,"props":35196,"children":35197},{},[35198,35200,35205],{"type":25,"value":35199},"SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后，目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的",{"type":20,"tag":33,"props":35201,"children":35202},{},[35203],{"type":25,"value":35204},"首选方案",{"type":25,"value":110},{"type":20,"tag":6665,"props":35207,"children":35208},{},[35209,35214],{"type":20,"tag":21,"props":35210,"children":35211},{},[35212],{"type":25,"value":35213},"**注：**三层架构分为表述层（或表示层）、业务逻辑层、数据访问层",{"type":20,"tag":21,"props":35215,"children":35216},{},[35217,35219,35224,35225],{"type":25,"value":35218},"表述层表示 ",{"type":20,"tag":33,"props":35220,"children":35221},{},[35222],{"type":25,"value":35223},"前台页面",{"type":25,"value":7043},{"type":20,"tag":33,"props":35226,"children":35227},{},[35228],{"type":25,"value":35229},"后台servlet",{"type":20,"tag":11085,"props":35231,"children":35233},{"id":35232},"_13-spring-mvc的特点",[35234],{"type":25,"value":35235},"1.3 Spring MVC的特点",{"type":20,"tag":44,"props":35237,"children":35238},{},[35239,35255,35260,35277,35287,35299],{"type":20,"tag":48,"props":35240,"children":35241},{},[35242,35246,35248,35253],{"type":20,"tag":33,"props":35243,"children":35244},{},[35245],{"type":25,"value":25477},{"type":25,"value":35247}," ",{"type":20,"tag":33,"props":35249,"children":35250},{},[35251],{"type":25,"value":35252},"家族原生产品",{"type":25,"value":35254},"，与 IOC 容器等基础设施无缝对接",{"type":20,"tag":48,"props":35256,"children":35257},{},[35258],{"type":25,"value":35259},"基于原生的Servlet，通过了功能强大的前端控制器DispatcherServlet，对请求和响应进行统一处理",{"type":20,"tag":48,"props":35261,"children":35262},{},[35263,35265,35270,35272],{"type":25,"value":35264},"表述层各细分领域需要解决的问题",{"type":20,"tag":33,"props":35266,"children":35267},{},[35268],{"type":25,"value":35269},"全方位覆盖",{"type":25,"value":35271},"，提供",{"type":20,"tag":33,"props":35273,"children":35274},{},[35275],{"type":25,"value":35276},"全面解决方案",{"type":20,"tag":48,"props":35278,"children":35279},{},[35280,35285],{"type":20,"tag":33,"props":35281,"children":35282},{},[35283],{"type":25,"value":35284},"代码清新简洁",{"type":25,"value":35286},"，大幅度提升开发效率",{"type":20,"tag":48,"props":35288,"children":35289},{},[35290,35292,35297],{"type":25,"value":35291},"内部组件化程度高，可插拔式组件",{"type":20,"tag":33,"props":35293,"children":35294},{},[35295],{"type":25,"value":35296},"即插即用",{"type":25,"value":35298},"，想要什么功能配置相应组件即可",{"type":20,"tag":48,"props":35300,"children":35301},{},[35302,35307],{"type":20,"tag":33,"props":35303,"children":35304},{},[35305],{"type":25,"value":35306},"性能卓著",{"type":25,"value":35308},"，尤其适合现代大型、超大型互联网项目要求",{"type":20,"tag":28,"props":35310,"children":35312},{"id":35311},"_2-案例入门",[35313],{"type":25,"value":35314},"2 案例入门",{"type":20,"tag":11085,"props":35316,"children":35318},{"id":35317},"_21-创建maven工程",[35319],{"type":25,"value":35320},"2.1 创建Maven工程",{"type":20,"tag":5719,"props":35322,"children":35323},{},[35324,35329,35334],{"type":20,"tag":48,"props":35325,"children":35326},{},[35327],{"type":25,"value":35328},"添加web模块",{"type":20,"tag":48,"props":35330,"children":35331},{},[35332],{"type":25,"value":35333},"打包方式war包",{"type":20,"tag":48,"props":35335,"children":35336},{},[35337],{"type":25,"value":16047},{"type":20,"tag":126,"props":35339,"children":35341},{"className":17052,"code":35340,"language":17054,"meta":8,"style":8},"\u003Cdependencies>\n    \u003C!-- SpringMVC -->\n    \u003Cdependency>\n        \u003CgroupId>org.springframework\u003C\u002FgroupId>\n        \u003CartifactId>spring-webmvc\u003C\u002FartifactId>\n        \u003Cversion>5.3.1\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- 日志 -->\n    \u003Cdependency>\n        \u003CgroupId>ch.qos.logback\u003C\u002FgroupId>\n        \u003CartifactId>logback-classic\u003C\u002FartifactId>\n        \u003Cversion>1.2.3\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n    \u003C!-- ServletAPI -->\n    \u003Cdependency>\n        \u003CgroupId>javax.servlet\u003C\u002FgroupId>\n        \u003CartifactId>javax.servlet-api\u003C\u002FartifactId>\n        \u003Cversion>3.1.0\u003C\u002Fversion>\n        \u003Cscope>provided\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n    \u003C!-- Spring5和Thymeleaf整合包 -->\n    \u003Cdependency>\n        \u003CgroupId>org.thymeleaf\u003C\u002FgroupId>\n        \u003CartifactId>thymeleaf-spring5\u003C\u002FartifactId>\n        \u003Cversion>3.0.12.RELEASE\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n",[35342],{"type":20,"tag":84,"props":35343,"children":35344},{"__ignoreMap":8},[35345,35352,35360,35367,35374,35382,35389,35396,35404,35411,35419,35427,35435,35442,35450,35457,35465,35473,35481,35489,35496,35504,35511,35519,35527,35535,35542],{"type":20,"tag":157,"props":35346,"children":35347},{"class":159,"line":160},[35348],{"type":20,"tag":157,"props":35349,"children":35350},{},[35351],{"type":25,"value":25950},{"type":20,"tag":157,"props":35353,"children":35354},{"class":159,"line":169},[35355],{"type":20,"tag":157,"props":35356,"children":35357},{},[35358],{"type":25,"value":35359},"    \u003C!-- SpringMVC -->\n",{"type":20,"tag":157,"props":35361,"children":35362},{"class":159,"line":179},[35363],{"type":20,"tag":157,"props":35364,"children":35365},{},[35366],{"type":25,"value":16072},{"type":20,"tag":157,"props":35368,"children":35369},{"class":159,"line":188},[35370],{"type":20,"tag":157,"props":35371,"children":35372},{},[35373],{"type":25,"value":25973},{"type":20,"tag":157,"props":35375,"children":35376},{"class":159,"line":196},[35377],{"type":20,"tag":157,"props":35378,"children":35379},{},[35380],{"type":25,"value":35381},"        \u003CartifactId>spring-webmvc\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":35383,"children":35384},{"class":159,"line":204},[35385],{"type":20,"tag":157,"props":35386,"children":35387},{},[35388],{"type":25,"value":25989},{"type":20,"tag":157,"props":35390,"children":35391},{"class":159,"line":213},[35392],{"type":20,"tag":157,"props":35393,"children":35394},{},[35395],{"type":25,"value":16190},{"type":20,"tag":157,"props":35397,"children":35398},{"class":159,"line":222},[35399],{"type":20,"tag":157,"props":35400,"children":35401},{},[35402],{"type":25,"value":35403},"    \u003C!-- 日志 -->\n",{"type":20,"tag":157,"props":35405,"children":35406},{"class":159,"line":440},[35407],{"type":20,"tag":157,"props":35408,"children":35409},{},[35410],{"type":25,"value":16072},{"type":20,"tag":157,"props":35412,"children":35413},{"class":159,"line":448},[35414],{"type":20,"tag":157,"props":35415,"children":35416},{},[35417],{"type":25,"value":35418},"        \u003CgroupId>ch.qos.logback\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":35420,"children":35421},{"class":159,"line":456},[35422],{"type":20,"tag":157,"props":35423,"children":35424},{},[35425],{"type":25,"value":35426},"        \u003CartifactId>logback-classic\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":35428,"children":35429},{"class":159,"line":465},[35430],{"type":20,"tag":157,"props":35431,"children":35432},{},[35433],{"type":25,"value":35434},"        \u003Cversion>1.2.3\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":35436,"children":35437},{"class":159,"line":474},[35438],{"type":20,"tag":157,"props":35439,"children":35440},{},[35441],{"type":25,"value":16190},{"type":20,"tag":157,"props":35443,"children":35444},{"class":159,"line":483},[35445],{"type":20,"tag":157,"props":35446,"children":35447},{},[35448],{"type":25,"value":35449},"    \u003C!-- ServletAPI -->\n",{"type":20,"tag":157,"props":35451,"children":35452},{"class":159,"line":491},[35453],{"type":20,"tag":157,"props":35454,"children":35455},{},[35456],{"type":25,"value":16072},{"type":20,"tag":157,"props":35458,"children":35459},{"class":159,"line":499},[35460],{"type":20,"tag":157,"props":35461,"children":35462},{},[35463],{"type":25,"value":35464},"        \u003CgroupId>javax.servlet\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":35466,"children":35467},{"class":159,"line":508},[35468],{"type":20,"tag":157,"props":35469,"children":35470},{},[35471],{"type":25,"value":35472},"        \u003CartifactId>javax.servlet-api\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":35474,"children":35475},{"class":159,"line":517},[35476],{"type":20,"tag":157,"props":35477,"children":35478},{},[35479],{"type":25,"value":35480},"        \u003Cversion>3.1.0\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":35482,"children":35483},{"class":159,"line":1499},[35484],{"type":20,"tag":157,"props":35485,"children":35486},{},[35487],{"type":25,"value":35488},"        \u003Cscope>provided\u003C\u002Fscope>\n",{"type":20,"tag":157,"props":35490,"children":35491},{"class":159,"line":1507},[35492],{"type":20,"tag":157,"props":35493,"children":35494},{},[35495],{"type":25,"value":16190},{"type":20,"tag":157,"props":35497,"children":35498},{"class":159,"line":1515},[35499],{"type":20,"tag":157,"props":35500,"children":35501},{},[35502],{"type":25,"value":35503},"    \u003C!-- Spring5和Thymeleaf整合包 -->\n",{"type":20,"tag":157,"props":35505,"children":35506},{"class":159,"line":1523},[35507],{"type":20,"tag":157,"props":35508,"children":35509},{},[35510],{"type":25,"value":16072},{"type":20,"tag":157,"props":35512,"children":35513},{"class":159,"line":1532},[35514],{"type":20,"tag":157,"props":35515,"children":35516},{},[35517],{"type":25,"value":35518},"        \u003CgroupId>org.thymeleaf\u003C\u002FgroupId>\n",{"type":20,"tag":157,"props":35520,"children":35521},{"class":159,"line":1541},[35522],{"type":20,"tag":157,"props":35523,"children":35524},{},[35525],{"type":25,"value":35526},"        \u003CartifactId>thymeleaf-spring5\u003C\u002FartifactId>\n",{"type":20,"tag":157,"props":35528,"children":35529},{"class":159,"line":1550},[35530],{"type":20,"tag":157,"props":35531,"children":35532},{},[35533],{"type":25,"value":35534},"        \u003Cversion>3.0.12.RELEASE\u003C\u002Fversion>\n",{"type":20,"tag":157,"props":35536,"children":35537},{"class":159,"line":1558},[35538],{"type":20,"tag":157,"props":35539,"children":35540},{},[35541],{"type":25,"value":16190},{"type":20,"tag":157,"props":35543,"children":35544},{"class":159,"line":1566},[35545],{"type":20,"tag":157,"props":35546,"children":35547},{},[35548],{"type":25,"value":16198},{"type":20,"tag":11085,"props":35550,"children":35552},{"id":35551},"_22-配置webxml",[35553],{"type":25,"value":35554},"2.2 配置web.xml",{"type":20,"tag":6665,"props":35556,"children":35557},{},[35558,35563,35568],{"type":20,"tag":21,"props":35559,"children":35560},{},[35561],{"type":25,"value":35562},"注册SpringMVC的前端控制器DispatcherServlet",{"type":20,"tag":21,"props":35564,"children":35565},{},[35566],{"type":25,"value":35567},"url-pattern中\u002F和\u002F*的区别",{"type":20,"tag":44,"props":35569,"children":35570},{},[35571,35576],{"type":20,"tag":48,"props":35572,"children":35573},{},[35574],{"type":25,"value":35575},"\u002F : 匹配浏览器想服务器发送所有请求（不包括.jsp）",{"type":20,"tag":48,"props":35577,"children":35578},{},[35579],{"type":25,"value":35580},"\u002F*：匹配浏览器想服务器发送所有请求（包括.jsp）",{"type":20,"tag":126,"props":35582,"children":35584},{"className":17052,"code":35583,"language":17054,"meta":8,"style":8},"\u003C!DOCTYPE web-app PUBLIC\n        \"-\u002F\u002FSun Microsystems, Inc.\u002F\u002FDTD Web Application 2.3\u002F\u002FEN\"\n        \"http:\u002F\u002Fjava.sun.com\u002Fdtd\u002Fweb-app_2_3.dtd\" >\n\n\u003Cweb-app>\n    \u003Cdisplay-name>Archetype Created Web Application\u003C\u002Fdisplay-name>\n\n    \u003Cservlet>\n        \u003Cservlet-name>SpringMVC\u003C\u002Fservlet-name>\n        \u003Cservlet-class>org.springframework.web.servlet.DispatcherServlet\u003C\u002Fservlet-class>\n\n        \u003C!-- 设置SpringMVC配置文件的位置 -->\n        \u003Cinit-param>\n            \u003Cparam-name>contextConfigLocation\u003C\u002Fparam-name>\n            \u003Cparam-value>classpath:springmvc.xml\u003C\u002Fparam-value>\n        \u003C\u002Finit-param>\n      \n        \u003C!-- 将servlet初始化时间提前到服务器启动时 -->\n        \u003Cload-on-startup>1\u003C\u002Fload-on-startup>\n    \u003C\u002Fservlet>\n\n    \u003Cservlet-mapping>\n        \u003Cservlet-name>SpringMVC\u003C\u002Fservlet-name>\n        \u003Curl-pattern>\u002F\u003C\u002Furl-pattern>\n    \u003C\u002Fservlet-mapping>\n\u003C\u002Fweb-app>\n",[35585],{"type":20,"tag":84,"props":35586,"children":35587},{"__ignoreMap":8},[35588,35596,35604,35612,35619,35627,35635,35642,35650,35658,35666,35673,35681,35689,35697,35705,35713,35720,35728,35736,35744,35751,35759,35766,35774,35782],{"type":20,"tag":157,"props":35589,"children":35590},{"class":159,"line":160},[35591],{"type":20,"tag":157,"props":35592,"children":35593},{},[35594],{"type":25,"value":35595},"\u003C!DOCTYPE web-app PUBLIC\n",{"type":20,"tag":157,"props":35597,"children":35598},{"class":159,"line":169},[35599],{"type":20,"tag":157,"props":35600,"children":35601},{},[35602],{"type":25,"value":35603},"        \"-\u002F\u002FSun Microsystems, Inc.\u002F\u002FDTD Web Application 2.3\u002F\u002FEN\"\n",{"type":20,"tag":157,"props":35605,"children":35606},{"class":159,"line":179},[35607],{"type":20,"tag":157,"props":35608,"children":35609},{},[35610],{"type":25,"value":35611},"        \"http:\u002F\u002Fjava.sun.com\u002Fdtd\u002Fweb-app_2_3.dtd\" >\n",{"type":20,"tag":157,"props":35613,"children":35614},{"class":159,"line":188},[35615],{"type":20,"tag":157,"props":35616,"children":35617},{"emptyLinePlaceholder":173},[35618],{"type":25,"value":176},{"type":20,"tag":157,"props":35620,"children":35621},{"class":159,"line":196},[35622],{"type":20,"tag":157,"props":35623,"children":35624},{},[35625],{"type":25,"value":35626},"\u003Cweb-app>\n",{"type":20,"tag":157,"props":35628,"children":35629},{"class":159,"line":204},[35630],{"type":20,"tag":157,"props":35631,"children":35632},{},[35633],{"type":25,"value":35634},"    \u003Cdisplay-name>Archetype Created Web Application\u003C\u002Fdisplay-name>\n",{"type":20,"tag":157,"props":35636,"children":35637},{"class":159,"line":213},[35638],{"type":20,"tag":157,"props":35639,"children":35640},{"emptyLinePlaceholder":173},[35641],{"type":25,"value":176},{"type":20,"tag":157,"props":35643,"children":35644},{"class":159,"line":222},[35645],{"type":20,"tag":157,"props":35646,"children":35647},{},[35648],{"type":25,"value":35649},"    \u003Cservlet>\n",{"type":20,"tag":157,"props":35651,"children":35652},{"class":159,"line":440},[35653],{"type":20,"tag":157,"props":35654,"children":35655},{},[35656],{"type":25,"value":35657},"        \u003Cservlet-name>SpringMVC\u003C\u002Fservlet-name>\n",{"type":20,"tag":157,"props":35659,"children":35660},{"class":159,"line":448},[35661],{"type":20,"tag":157,"props":35662,"children":35663},{},[35664],{"type":25,"value":35665},"        \u003Cservlet-class>org.springframework.web.servlet.DispatcherServlet\u003C\u002Fservlet-class>\n",{"type":20,"tag":157,"props":35667,"children":35668},{"class":159,"line":456},[35669],{"type":20,"tag":157,"props":35670,"children":35671},{"emptyLinePlaceholder":173},[35672],{"type":25,"value":176},{"type":20,"tag":157,"props":35674,"children":35675},{"class":159,"line":465},[35676],{"type":20,"tag":157,"props":35677,"children":35678},{},[35679],{"type":25,"value":35680},"        \u003C!-- 设置SpringMVC配置文件的位置 -->\n",{"type":20,"tag":157,"props":35682,"children":35683},{"class":159,"line":474},[35684],{"type":20,"tag":157,"props":35685,"children":35686},{},[35687],{"type":25,"value":35688},"        \u003Cinit-param>\n",{"type":20,"tag":157,"props":35690,"children":35691},{"class":159,"line":483},[35692],{"type":20,"tag":157,"props":35693,"children":35694},{},[35695],{"type":25,"value":35696},"            \u003Cparam-name>contextConfigLocation\u003C\u002Fparam-name>\n",{"type":20,"tag":157,"props":35698,"children":35699},{"class":159,"line":491},[35700],{"type":20,"tag":157,"props":35701,"children":35702},{},[35703],{"type":25,"value":35704},"            \u003Cparam-value>classpath:springmvc.xml\u003C\u002Fparam-value>\n",{"type":20,"tag":157,"props":35706,"children":35707},{"class":159,"line":499},[35708],{"type":20,"tag":157,"props":35709,"children":35710},{},[35711],{"type":25,"value":35712},"        \u003C\u002Finit-param>\n",{"type":20,"tag":157,"props":35714,"children":35715},{"class":159,"line":508},[35716],{"type":20,"tag":157,"props":35717,"children":35718},{},[35719],{"type":25,"value":31056},{"type":20,"tag":157,"props":35721,"children":35722},{"class":159,"line":517},[35723],{"type":20,"tag":157,"props":35724,"children":35725},{},[35726],{"type":25,"value":35727},"        \u003C!-- 将servlet初始化时间提前到服务器启动时 -->\n",{"type":20,"tag":157,"props":35729,"children":35730},{"class":159,"line":1499},[35731],{"type":20,"tag":157,"props":35732,"children":35733},{},[35734],{"type":25,"value":35735},"        \u003Cload-on-startup>1\u003C\u002Fload-on-startup>\n",{"type":20,"tag":157,"props":35737,"children":35738},{"class":159,"line":1507},[35739],{"type":20,"tag":157,"props":35740,"children":35741},{},[35742],{"type":25,"value":35743},"    \u003C\u002Fservlet>\n",{"type":20,"tag":157,"props":35745,"children":35746},{"class":159,"line":1515},[35747],{"type":20,"tag":157,"props":35748,"children":35749},{"emptyLinePlaceholder":173},[35750],{"type":25,"value":176},{"type":20,"tag":157,"props":35752,"children":35753},{"class":159,"line":1523},[35754],{"type":20,"tag":157,"props":35755,"children":35756},{},[35757],{"type":25,"value":35758},"    \u003Cservlet-mapping>\n",{"type":20,"tag":157,"props":35760,"children":35761},{"class":159,"line":1532},[35762],{"type":20,"tag":157,"props":35763,"children":35764},{},[35765],{"type":25,"value":35657},{"type":20,"tag":157,"props":35767,"children":35768},{"class":159,"line":1541},[35769],{"type":20,"tag":157,"props":35770,"children":35771},{},[35772],{"type":25,"value":35773},"        \u003Curl-pattern>\u002F\u003C\u002Furl-pattern>\n",{"type":20,"tag":157,"props":35775,"children":35776},{"class":159,"line":1550},[35777],{"type":20,"tag":157,"props":35778,"children":35779},{},[35780],{"type":25,"value":35781},"    \u003C\u002Fservlet-mapping>\n",{"type":20,"tag":157,"props":35783,"children":35784},{"class":159,"line":1558},[35785],{"type":20,"tag":157,"props":35786,"children":35787},{},[35788],{"type":25,"value":35789},"\u003C\u002Fweb-app>\n",{"type":20,"tag":21,"props":35791,"children":35792},{},[35793],{"type":20,"tag":33,"props":35794,"children":35795},{},[35796],{"type":25,"value":35797},"拓展配置：",{"type":20,"tag":44,"props":35799,"children":35800},{},[35801,35806],{"type":20,"tag":48,"props":35802,"children":35803},{},[35804],{"type":25,"value":35805},"可通过init-param标签设置SpringMVC配置文件的位置和名称",{"type":20,"tag":48,"props":35807,"children":35808},{},[35809],{"type":25,"value":35810},"通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间",{"type":20,"tag":11085,"props":35812,"children":35814},{"id":35813},"_23-创建请求控制器",[35815],{"type":25,"value":35816},"2.3 创建请求控制器",{"type":20,"tag":21,"props":35818,"children":35819},{},[35820],{"type":25,"value":35821},"由于前端控制器对浏览器发送的请求进行了统一的处理，但是具体的请求有不同的处理过程，因此需要创建处理具体请求的类，即请求控制器",{"type":20,"tag":21,"props":35823,"children":35824},{},[35825],{"type":25,"value":35826},"请求控制器中每一个处理请求的方法成为控制器方法",{"type":20,"tag":21,"props":35828,"children":35829},{},[35830],{"type":25,"value":35831},"因为SpringMVC的控制器由一个POJO（普通的Java类）担任，因此需要通过@Controller注解将其标识为一个控制层组件，交给Spring的IOC容器管理，此时SpringMVC才能够识别控制器的存在",{"type":20,"tag":126,"props":35833,"children":35835},{"className":16050,"code":35834,"language":16052,"meta":8,"style":8},"@Controller\npublic class HelloController {\n\n    @RequestMapping(\"\u002F\")\n    public String protal() {\n        return \"index\";\n    }\n\n    @RequestMapping(\"\u002Fabout\")\n    public String about() {\n        return \"about\";\n    }\n}\n",[35836],{"type":20,"tag":84,"props":35837,"children":35838},{"__ignoreMap":8},[35839,35846,35854,35861,35869,35877,35885,35892,35899,35907,35915,35923,35930],{"type":20,"tag":157,"props":35840,"children":35841},{"class":159,"line":160},[35842],{"type":20,"tag":157,"props":35843,"children":35844},{},[35845],{"type":25,"value":31003},{"type":20,"tag":157,"props":35847,"children":35848},{"class":159,"line":169},[35849],{"type":20,"tag":157,"props":35850,"children":35851},{},[35852],{"type":25,"value":35853},"public class HelloController {\n",{"type":20,"tag":157,"props":35855,"children":35856},{"class":159,"line":179},[35857],{"type":20,"tag":157,"props":35858,"children":35859},{"emptyLinePlaceholder":173},[35860],{"type":25,"value":176},{"type":20,"tag":157,"props":35862,"children":35863},{"class":159,"line":188},[35864],{"type":20,"tag":157,"props":35865,"children":35866},{},[35867],{"type":25,"value":35868},"    @RequestMapping(\"\u002F\")\n",{"type":20,"tag":157,"props":35870,"children":35871},{"class":159,"line":196},[35872],{"type":20,"tag":157,"props":35873,"children":35874},{},[35875],{"type":25,"value":35876},"    public String protal() {\n",{"type":20,"tag":157,"props":35878,"children":35879},{"class":159,"line":204},[35880],{"type":20,"tag":157,"props":35881,"children":35882},{},[35883],{"type":25,"value":35884},"        return \"index\";\n",{"type":20,"tag":157,"props":35886,"children":35887},{"class":159,"line":213},[35888],{"type":20,"tag":157,"props":35889,"children":35890},{},[35891],{"type":25,"value":872},{"type":20,"tag":157,"props":35893,"children":35894},{"class":159,"line":222},[35895],{"type":20,"tag":157,"props":35896,"children":35897},{"emptyLinePlaceholder":173},[35898],{"type":25,"value":176},{"type":20,"tag":157,"props":35900,"children":35901},{"class":159,"line":440},[35902],{"type":20,"tag":157,"props":35903,"children":35904},{},[35905],{"type":25,"value":35906},"    @RequestMapping(\"\u002Fabout\")\n",{"type":20,"tag":157,"props":35908,"children":35909},{"class":159,"line":448},[35910],{"type":20,"tag":157,"props":35911,"children":35912},{},[35913],{"type":25,"value":35914},"    public String about() {\n",{"type":20,"tag":157,"props":35916,"children":35917},{"class":159,"line":456},[35918],{"type":20,"tag":157,"props":35919,"children":35920},{},[35921],{"type":25,"value":35922},"        return \"about\";\n",{"type":20,"tag":157,"props":35924,"children":35925},{"class":159,"line":465},[35926],{"type":20,"tag":157,"props":35927,"children":35928},{},[35929],{"type":25,"value":872},{"type":20,"tag":157,"props":35931,"children":35932},{"class":159,"line":474},[35933],{"type":20,"tag":157,"props":35934,"children":35935},{},[35936],{"type":25,"value":943},{"type":20,"tag":11085,"props":35938,"children":35940},{"id":35939},"_24-创建springmvc配置文件",[35941],{"type":25,"value":35942},"2.4 创建SpringMVC配置文件",{"type":20,"tag":126,"props":35944,"children":35946},{"className":17052,"code":35945,"language":17054,"meta":8,"style":8},"\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 http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fbeans\u002Fspring-beans.xsd http:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext https:\u002F\u002Fwww.springframework.org\u002Fschema\u002Fcontext\u002Fspring-context.xsd\">\n\n\n    \u003C!-- 自动扫描包 -->\n    \u003Ccontext:component-scan base-package=\"com.wangkun.controller\"\u002F>\n\n    \u003C!-- 配置Thymeleaf视图解析器 -->\n    \u003Cbean id=\"viewResolver\" class=\"org.thymeleaf.spring5.view.ThymeleafViewResolver\">\n        \u003Cproperty name=\"order\" value=\"1\"\u002F>\n        \u003Cproperty name=\"characterEncoding\" value=\"UTF-8\"\u002F>\n        \u003Cproperty name=\"templateEngine\">\n            \u003Cbean class=\"org.thymeleaf.spring5.SpringTemplateEngine\">\n                \u003Cproperty name=\"templateResolver\">\n                    \u003Cbean class=\"org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver\">\n                        \u003C!-- 视图前缀 -->\n                        \u003Cproperty name=\"prefix\" value=\"\u002FWEB-INF\u002Ftemplates\u002F\"\u002F>\n                        \u003C!-- 视图后缀 -->\n                        \u003Cproperty name=\"suffix\" value=\".html\"\u002F>\n                        \u003Cproperty name=\"templateMode\" value=\"HTML5\"\u002F>\n                        \u003Cproperty name=\"characterEncoding\" value=\"UTF-8\"\u002F>\n                    \u003C\u002Fbean>\n                \u003C\u002Fproperty>\n            \u003C\u002Fbean>\n        \u003C\u002Fproperty>\n    \u003C\u002Fbean>\n\n\u003C\u002Fbeans>\n",[35947],{"type":20,"tag":84,"props":35948,"children":35949},{"__ignoreMap":8},[35950,35957,35964,35971,35978,35985,35992,35999,36007,36015,36022,36030,36038,36046,36054,36062,36070,36078,36086,36094,36102,36110,36118,36126,36134,36142,36150,36158,36166,36173,36180],{"type":20,"tag":157,"props":35951,"children":35952},{"class":159,"line":160},[35953],{"type":20,"tag":157,"props":35954,"children":35955},{},[35956],{"type":25,"value":23638},{"type":20,"tag":157,"props":35958,"children":35959},{"class":159,"line":169},[35960],{"type":20,"tag":157,"props":35961,"children":35962},{},[35963],{"type":25,"value":26182},{"type":20,"tag":157,"props":35965,"children":35966},{"class":159,"line":179},[35967],{"type":20,"tag":157,"props":35968,"children":35969},{},[35970],{"type":25,"value":26190},{"type":20,"tag":157,"props":35972,"children":35973},{"class":159,"line":188},[35974],{"type":20,"tag":157,"props":35975,"children":35976},{},[35977],{"type":25,"value":28852},{"type":20,"tag":157,"props":35979,"children":35980},{"class":159,"line":196},[35981],{"type":20,"tag":157,"props":35982,"children":35983},{},[35984],{"type":25,"value":33588},{"type":20,"tag":157,"props":35986,"children":35987},{"class":159,"line":204},[35988],{"type":20,"tag":157,"props":35989,"children":35990},{"emptyLinePlaceholder":173},[35991],{"type":25,"value":176},{"type":20,"tag":157,"props":35993,"children":35994},{"class":159,"line":213},[35995],{"type":20,"tag":157,"props":35996,"children":35997},{"emptyLinePlaceholder":173},[35998],{"type":25,"value":176},{"type":20,"tag":157,"props":36000,"children":36001},{"class":159,"line":222},[36002],{"type":20,"tag":157,"props":36003,"children":36004},{},[36005],{"type":25,"value":36006},"    \u003C!-- 自动扫描包 -->\n",{"type":20,"tag":157,"props":36008,"children":36009},{"class":159,"line":440},[36010],{"type":20,"tag":157,"props":36011,"children":36012},{},[36013],{"type":25,"value":36014},"    \u003Ccontext:component-scan base-package=\"com.wangkun.controller\"\u002F>\n",{"type":20,"tag":157,"props":36016,"children":36017},{"class":159,"line":448},[36018],{"type":20,"tag":157,"props":36019,"children":36020},{"emptyLinePlaceholder":173},[36021],{"type":25,"value":176},{"type":20,"tag":157,"props":36023,"children":36024},{"class":159,"line":456},[36025],{"type":20,"tag":157,"props":36026,"children":36027},{},[36028],{"type":25,"value":36029},"    \u003C!-- 配置Thymeleaf视图解析器 -->\n",{"type":20,"tag":157,"props":36031,"children":36032},{"class":159,"line":465},[36033],{"type":20,"tag":157,"props":36034,"children":36035},{},[36036],{"type":25,"value":36037},"    \u003Cbean id=\"viewResolver\" class=\"org.thymeleaf.spring5.view.ThymeleafViewResolver\">\n",{"type":20,"tag":157,"props":36039,"children":36040},{"class":159,"line":474},[36041],{"type":20,"tag":157,"props":36042,"children":36043},{},[36044],{"type":25,"value":36045},"        \u003Cproperty name=\"order\" value=\"1\"\u002F>\n",{"type":20,"tag":157,"props":36047,"children":36048},{"class":159,"line":483},[36049],{"type":20,"tag":157,"props":36050,"children":36051},{},[36052],{"type":25,"value":36053},"        \u003Cproperty name=\"characterEncoding\" value=\"UTF-8\"\u002F>\n",{"type":20,"tag":157,"props":36055,"children":36056},{"class":159,"line":491},[36057],{"type":20,"tag":157,"props":36058,"children":36059},{},[36060],{"type":25,"value":36061},"        \u003Cproperty name=\"templateEngine\">\n",{"type":20,"tag":157,"props":36063,"children":36064},{"class":159,"line":499},[36065],{"type":20,"tag":157,"props":36066,"children":36067},{},[36068],{"type":25,"value":36069},"            \u003Cbean class=\"org.thymeleaf.spring5.SpringTemplateEngine\">\n",{"type":20,"tag":157,"props":36071,"children":36072},{"class":159,"line":508},[36073],{"type":20,"tag":157,"props":36074,"children":36075},{},[36076],{"type":25,"value":36077},"                \u003Cproperty name=\"templateResolver\">\n",{"type":20,"tag":157,"props":36079,"children":36080},{"class":159,"line":517},[36081],{"type":20,"tag":157,"props":36082,"children":36083},{},[36084],{"type":25,"value":36085},"                    \u003Cbean class=\"org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver\">\n",{"type":20,"tag":157,"props":36087,"children":36088},{"class":159,"line":1499},[36089],{"type":20,"tag":157,"props":36090,"children":36091},{},[36092],{"type":25,"value":36093},"                        \u003C!-- 视图前缀 -->\n",{"type":20,"tag":157,"props":36095,"children":36096},{"class":159,"line":1507},[36097],{"type":20,"tag":157,"props":36098,"children":36099},{},[36100],{"type":25,"value":36101},"                        \u003Cproperty name=\"prefix\" value=\"\u002FWEB-INF\u002Ftemplates\u002F\"\u002F>\n",{"type":20,"tag":157,"props":36103,"children":36104},{"class":159,"line":1515},[36105],{"type":20,"tag":157,"props":36106,"children":36107},{},[36108],{"type":25,"value":36109},"                        \u003C!-- 视图后缀 -->\n",{"type":20,"tag":157,"props":36111,"children":36112},{"class":159,"line":1523},[36113],{"type":20,"tag":157,"props":36114,"children":36115},{},[36116],{"type":25,"value":36117},"                        \u003Cproperty name=\"suffix\" value=\".html\"\u002F>\n",{"type":20,"tag":157,"props":36119,"children":36120},{"class":159,"line":1532},[36121],{"type":20,"tag":157,"props":36122,"children":36123},{},[36124],{"type":25,"value":36125},"                        \u003Cproperty name=\"templateMode\" value=\"HTML5\"\u002F>\n",{"type":20,"tag":157,"props":36127,"children":36128},{"class":159,"line":1541},[36129],{"type":20,"tag":157,"props":36130,"children":36131},{},[36132],{"type":25,"value":36133},"                        \u003Cproperty name=\"characterEncoding\" value=\"UTF-8\"\u002F>\n",{"type":20,"tag":157,"props":36135,"children":36136},{"class":159,"line":1550},[36137],{"type":20,"tag":157,"props":36138,"children":36139},{},[36140],{"type":25,"value":36141},"                    \u003C\u002Fbean>\n",{"type":20,"tag":157,"props":36143,"children":36144},{"class":159,"line":1558},[36145],{"type":20,"tag":157,"props":36146,"children":36147},{},[36148],{"type":25,"value":36149},"                \u003C\u002Fproperty>\n",{"type":20,"tag":157,"props":36151,"children":36152},{"class":159,"line":1566},[36153],{"type":20,"tag":157,"props":36154,"children":36155},{},[36156],{"type":25,"value":36157},"            \u003C\u002Fbean>\n",{"type":20,"tag":157,"props":36159,"children":36160},{"class":159,"line":1574},[36161],{"type":20,"tag":157,"props":36162,"children":36163},{},[36164],{"type":25,"value":36165},"        \u003C\u002Fproperty>\n",{"type":20,"tag":157,"props":36167,"children":36168},{"class":159,"line":1582},[36169],{"type":20,"tag":157,"props":36170,"children":36171},{},[36172],{"type":25,"value":28970},{"type":20,"tag":157,"props":36174,"children":36175},{"class":159,"line":1591},[36176],{"type":20,"tag":157,"props":36177,"children":36178},{"emptyLinePlaceholder":173},[36179],{"type":25,"value":176},{"type":20,"tag":157,"props":36181,"children":36182},{"class":159,"line":1599},[36183],{"type":20,"tag":157,"props":36184,"children":36185},{},[36186],{"type":25,"value":26276},{"type":20,"tag":11085,"props":36188,"children":36190},{"id":36189},"_25-总结",[36191],{"type":25,"value":36192},"2.5 总结",{"type":20,"tag":21,"props":36194,"children":36195},{},[36196],{"type":25,"value":36197},"**自己理解：**用户请求服务器，如果路径符合前端控制器的url-pattern，就会被DispatchServlet所控制，然后读取SpringMVC配置文件，根据所匹配到的方法的返回值，去寻找资源",{"type":20,"tag":21,"props":36199,"children":36200},{},[36201],{"type":25,"value":36202},"**较准确的解释：**浏览器发送请求，若请求地址符合前端控制器的url-pattern，该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件，通过扫描组件找到控制器，将请求地址和控制器中@RequestMapping注解的value属性值进行匹配，若匹配成功，该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称，该视图名称会被视图解析器解析，加上前缀和后缀组成视图的路径通过Thymeleaf对视图进行渲染，最终转发到视图所对应页面",{"type":20,"tag":28,"props":36204,"children":36206},{"id":36205},"_3-requestmappering注解",[36207],{"type":25,"value":36208},"3. @RequestMappering注解",{"type":20,"tag":11085,"props":36210,"children":36212},{"id":36211},"_31-requestmappering注解的功能",[36213],{"type":25,"value":36214},"3.1 @RequestMappering注解的功能",{"type":20,"tag":21,"props":36216,"children":36217},{},[36218],{"type":25,"value":36219},"从注解名称上我们可以看到，@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来，建立映射关系。",{"type":20,"tag":21,"props":36221,"children":36222},{},[36223],{"type":25,"value":36224},"SpringMVC 接收到指定的请求，就会来找到在映射关系中对应的控制器方法来处理这个请求。",{"type":20,"tag":11085,"props":36226,"children":36228},{"id":36227},"_32-requestmappering注解的位置",[36229],{"type":25,"value":36230},"3.2 @RequestMappering注解的位置",{"type":20,"tag":44,"props":36232,"children":36233},{},[36234,36239],{"type":20,"tag":48,"props":36235,"children":36236},{},[36237],{"type":25,"value":36238},"@RequestMapping标识一个类：设置映射请求的请求路径的初始信息",{"type":20,"tag":48,"props":36240,"children":36241},{},[36242],{"type":25,"value":36243},"@RequestMapping标识一个方法：设置映射请求请求路径的具体信息",{"type":20,"tag":126,"props":36245,"children":36247},{"className":16050,"code":36246,"language":16052,"meta":8,"style":8},"package com.wangkun.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@Controller\n@RequestMapping(\"\u002Ftest\")\npublic class TestRequestMappingController {\n\n    @RequestMapping(\"\u002F\")\n    public String home() {\n        return \"index\";\n    }\n\n    @RequestMapping(\"\u002Fabout\")\n    public String about() {\n        return \"about\";\n    }\n  \n}\n",[36248],{"type":20,"tag":84,"props":36249,"children":36250},{"__ignoreMap":8},[36251,36259,36266,36274,36282,36289,36296,36304,36312,36319,36326,36334,36341,36348,36355,36362,36369,36376,36383,36390],{"type":20,"tag":157,"props":36252,"children":36253},{"class":159,"line":160},[36254],{"type":20,"tag":157,"props":36255,"children":36256},{},[36257],{"type":25,"value":36258},"package com.wangkun.controller;\n",{"type":20,"tag":157,"props":36260,"children":36261},{"class":159,"line":169},[36262],{"type":20,"tag":157,"props":36263,"children":36264},{"emptyLinePlaceholder":173},[36265],{"type":25,"value":176},{"type":20,"tag":157,"props":36267,"children":36268},{"class":159,"line":179},[36269],{"type":20,"tag":157,"props":36270,"children":36271},{},[36272],{"type":25,"value":36273},"import org.springframework.stereotype.Controller;\n",{"type":20,"tag":157,"props":36275,"children":36276},{"class":159,"line":188},[36277],{"type":20,"tag":157,"props":36278,"children":36279},{},[36280],{"type":25,"value":36281},"import org.springframework.web.bind.annotation.RequestMapping;\n",{"type":20,"tag":157,"props":36283,"children":36284},{"class":159,"line":196},[36285],{"type":20,"tag":157,"props":36286,"children":36287},{"emptyLinePlaceholder":173},[36288],{"type":25,"value":176},{"type":20,"tag":157,"props":36290,"children":36291},{"class":159,"line":204},[36292],{"type":20,"tag":157,"props":36293,"children":36294},{},[36295],{"type":25,"value":31003},{"type":20,"tag":157,"props":36297,"children":36298},{"class":159,"line":213},[36299],{"type":20,"tag":157,"props":36300,"children":36301},{},[36302],{"type":25,"value":36303},"@RequestMapping(\"\u002Ftest\")\n",{"type":20,"tag":157,"props":36305,"children":36306},{"class":159,"line":222},[36307],{"type":20,"tag":157,"props":36308,"children":36309},{},[36310],{"type":25,"value":36311},"public class TestRequestMappingController {\n",{"type":20,"tag":157,"props":36313,"children":36314},{"class":159,"line":440},[36315],{"type":20,"tag":157,"props":36316,"children":36317},{"emptyLinePlaceholder":173},[36318],{"type":25,"value":176},{"type":20,"tag":157,"props":36320,"children":36321},{"class":159,"line":448},[36322],{"type":20,"tag":157,"props":36323,"children":36324},{},[36325],{"type":25,"value":35868},{"type":20,"tag":157,"props":36327,"children":36328},{"class":159,"line":456},[36329],{"type":20,"tag":157,"props":36330,"children":36331},{},[36332],{"type":25,"value":36333},"    public String home() {\n",{"type":20,"tag":157,"props":36335,"children":36336},{"class":159,"line":465},[36337],{"type":20,"tag":157,"props":36338,"children":36339},{},[36340],{"type":25,"value":35884},{"type":20,"tag":157,"props":36342,"children":36343},{"class":159,"line":474},[36344],{"type":20,"tag":157,"props":36345,"children":36346},{},[36347],{"type":25,"value":872},{"type":20,"tag":157,"props":36349,"children":36350},{"class":159,"line":483},[36351],{"type":20,"tag":157,"props":36352,"children":36353},{"emptyLinePlaceholder":173},[36354],{"type":25,"value":176},{"type":20,"tag":157,"props":36356,"children":36357},{"class":159,"line":491},[36358],{"type":20,"tag":157,"props":36359,"children":36360},{},[36361],{"type":25,"value":35906},{"type":20,"tag":157,"props":36363,"children":36364},{"class":159,"line":499},[36365],{"type":20,"tag":157,"props":36366,"children":36367},{},[36368],{"type":25,"value":35914},{"type":20,"tag":157,"props":36370,"children":36371},{"class":159,"line":508},[36372],{"type":20,"tag":157,"props":36373,"children":36374},{},[36375],{"type":25,"value":35922},{"type":20,"tag":157,"props":36377,"children":36378},{"class":159,"line":517},[36379],{"type":20,"tag":157,"props":36380,"children":36381},{},[36382],{"type":25,"value":872},{"type":20,"tag":157,"props":36384,"children":36385},{"class":159,"line":1499},[36386],{"type":20,"tag":157,"props":36387,"children":36388},{},[36389],{"type":25,"value":17278},{"type":20,"tag":157,"props":36391,"children":36392},{"class":159,"line":1507},[36393],{"type":20,"tag":157,"props":36394,"children":36395},{},[36396],{"type":25,"value":943},{"type":20,"tag":11085,"props":36398,"children":36400},{"id":36399},"_33-获取参数",[36401],{"type":25,"value":36402},"3.3 获取参数",{"type":20,"tag":18942,"props":36404,"children":36406},{"id":36405},"_331-获取普通参数",[36407],{"type":25,"value":36408},"3.3.1 获取普通参数",{"type":20,"tag":126,"props":36410,"children":36412},{"className":16050,"code":36411,"language":16052,"meta":8,"style":8},"@RequestMapping(\"\u002Fparam\")\npublic String getParam(String username, String password) {\n    System.out.println(\"用户名：\" + username + \"密码：\" + password);\n    return \"about\";\n}\n",[36413],{"type":20,"tag":84,"props":36414,"children":36415},{"__ignoreMap":8},[36416,36424,36432,36440,36448],{"type":20,"tag":157,"props":36417,"children":36418},{"class":159,"line":160},[36419],{"type":20,"tag":157,"props":36420,"children":36421},{},[36422],{"type":25,"value":36423},"@RequestMapping(\"\u002Fparam\")\n",{"type":20,"tag":157,"props":36425,"children":36426},{"class":159,"line":169},[36427],{"type":20,"tag":157,"props":36428,"children":36429},{},[36430],{"type":25,"value":36431},"public String getParam(String username, String password) {\n",{"type":20,"tag":157,"props":36433,"children":36434},{"class":159,"line":179},[36435],{"type":20,"tag":157,"props":36436,"children":36437},{},[36438],{"type":25,"value":36439},"    System.out.println(\"用户名：\" + username + \"密码：\" + password);\n",{"type":20,"tag":157,"props":36441,"children":36442},{"class":159,"line":188},[36443],{"type":20,"tag":157,"props":36444,"children":36445},{},[36446],{"type":25,"value":36447},"    return \"about\";\n",{"type":20,"tag":157,"props":36449,"children":36450},{"class":159,"line":196},[36451],{"type":20,"tag":157,"props":36452,"children":36453},{},[36454],{"type":25,"value":943},{"type":20,"tag":21,"props":36456,"children":36457},{},[36458],{"type":25,"value":36459},"3.3.2 获取实体类对象",{"type":20,"tag":21,"props":36461,"children":36462},{},[36463],{"type":20,"tag":33,"props":36464,"children":36465},{},[36466],{"type":25,"value":36467},"实体类",{"type":20,"tag":126,"props":36469,"children":36471},{"className":16050,"code":36470,"language":16052,"meta":8,"style":8},"public class User {\n    private Integer id;\n\n    private String username;\n\n    private String password;\n}\n",[36472],{"type":20,"tag":84,"props":36473,"children":36474},{"__ignoreMap":8},[36475,36482,36489,36496,36503,36510,36517],{"type":20,"tag":157,"props":36476,"children":36477},{"class":159,"line":160},[36478],{"type":20,"tag":157,"props":36479,"children":36480},{},[36481],{"type":25,"value":29194},{"type":20,"tag":157,"props":36483,"children":36484},{"class":159,"line":169},[36485],{"type":20,"tag":157,"props":36486,"children":36487},{},[36488],{"type":25,"value":29202},{"type":20,"tag":157,"props":36490,"children":36491},{"class":159,"line":179},[36492],{"type":20,"tag":157,"props":36493,"children":36494},{"emptyLinePlaceholder":173},[36495],{"type":25,"value":176},{"type":20,"tag":157,"props":36497,"children":36498},{"class":159,"line":188},[36499],{"type":20,"tag":157,"props":36500,"children":36501},{},[36502],{"type":25,"value":29210},{"type":20,"tag":157,"props":36504,"children":36505},{"class":159,"line":196},[36506],{"type":20,"tag":157,"props":36507,"children":36508},{"emptyLinePlaceholder":173},[36509],{"type":25,"value":176},{"type":20,"tag":157,"props":36511,"children":36512},{"class":159,"line":204},[36513],{"type":20,"tag":157,"props":36514,"children":36515},{},[36516],{"type":25,"value":29218},{"type":20,"tag":157,"props":36518,"children":36519},{"class":159,"line":213},[36520],{"type":20,"tag":157,"props":36521,"children":36522},{},[36523],{"type":25,"value":943},{"type":20,"tag":21,"props":36525,"children":36526},{},[36527],{"type":20,"tag":33,"props":36528,"children":36529},{},[36530],{"type":25,"value":36531},"获取参数",{"type":20,"tag":126,"props":36533,"children":36535},{"className":16050,"code":36534,"language":16052,"meta":8,"style":8},"@RequestMapping(\"\u002Fparam\u002Fpojo\")\npublic String getParamUser(User user) {\n\n    System.out.println(user);\n    return \"about\";\n\n}\n",[36536],{"type":20,"tag":84,"props":36537,"children":36538},{"__ignoreMap":8},[36539,36547,36555,36562,36569,36576,36583],{"type":20,"tag":157,"props":36540,"children":36541},{"class":159,"line":160},[36542],{"type":20,"tag":157,"props":36543,"children":36544},{},[36545],{"type":25,"value":36546},"@RequestMapping(\"\u002Fparam\u002Fpojo\")\n",{"type":20,"tag":157,"props":36548,"children":36549},{"class":159,"line":169},[36550],{"type":20,"tag":157,"props":36551,"children":36552},{},[36553],{"type":25,"value":36554},"public String getParamUser(User user) {\n",{"type":20,"tag":157,"props":36556,"children":36557},{"class":159,"line":179},[36558],{"type":20,"tag":157,"props":36559,"children":36560},{"emptyLinePlaceholder":173},[36561],{"type":25,"value":176},{"type":20,"tag":157,"props":36563,"children":36564},{"class":159,"line":188},[36565],{"type":20,"tag":157,"props":36566,"children":36567},{},[36568],{"type":25,"value":18042},{"type":20,"tag":157,"props":36570,"children":36571},{"class":159,"line":196},[36572],{"type":20,"tag":157,"props":36573,"children":36574},{},[36575],{"type":25,"value":36447},{"type":20,"tag":157,"props":36577,"children":36578},{"class":159,"line":204},[36579],{"type":20,"tag":157,"props":36580,"children":36581},{"emptyLinePlaceholder":173},[36582],{"type":25,"value":176},{"type":20,"tag":157,"props":36584,"children":36585},{"class":159,"line":213},[36586],{"type":20,"tag":157,"props":36587,"children":36588},{},[36589],{"type":25,"value":943},{"type":20,"tag":11085,"props":36591,"children":36593},{"id":36592},"_34-解决参数乱码",[36594],{"type":25,"value":36595},"3.4 解决参数乱码",{"type":20,"tag":21,"props":36597,"children":36598},{},[36599],{"type":20,"tag":33,"props":36600,"children":36601},{},[36602],{"type":25,"value":36603},"web.xml",{"type":20,"tag":126,"props":36605,"children":36607},{"className":17052,"code":36606,"language":17054,"meta":8,"style":8},"\u003C!-- 配置Spring的编码过滤器 -->\n\u003Cfilter>\n    \u003Cfilter-name>CharacterEncodingFilter\u003C\u002Ffilter-name>\n    \u003Cfilter-class>org.springframework.web.filter.CharacterEncodingFilter\u003C\u002Ffilter-class>\n    \u003Cinit-param>\n        \u003Cparam-name>encoding\u003C\u002Fparam-name>\n        \u003Cparam-value>UTF-8\u003C\u002Fparam-value>\n    \u003C\u002Finit-param>\n    \u003Cinit-param>\n        \u003Cparam-name>forceEncoding\u003C\u002Fparam-name>\n        \u003Cparam-value>true\u003C\u002Fparam-value>\n    \u003C\u002Finit-param>\n\u003C\u002Ffilter>\n\u003Cfilter-mapping>\n    \u003Cfilter-name>CharacterEncodingFilter\u003C\u002Ffilter-name>\n    \u003Curl-pattern>\u002F*\u003C\u002Furl-pattern>\n\u003C\u002Ffilter-mapping>\n",[36608],{"type":20,"tag":84,"props":36609,"children":36610},{"__ignoreMap":8},[36611,36619,36627,36635,36643,36651,36659,36667,36675,36682,36690,36698,36705,36713,36721,36728,36736],{"type":20,"tag":157,"props":36612,"children":36613},{"class":159,"line":160},[36614],{"type":20,"tag":157,"props":36615,"children":36616},{},[36617],{"type":25,"value":36618},"\u003C!-- 配置Spring的编码过滤器 -->\n",{"type":20,"tag":157,"props":36620,"children":36621},{"class":159,"line":169},[36622],{"type":20,"tag":157,"props":36623,"children":36624},{},[36625],{"type":25,"value":36626},"\u003Cfilter>\n",{"type":20,"tag":157,"props":36628,"children":36629},{"class":159,"line":179},[36630],{"type":20,"tag":157,"props":36631,"children":36632},{},[36633],{"type":25,"value":36634},"    \u003Cfilter-name>CharacterEncodingFilter\u003C\u002Ffilter-name>\n",{"type":20,"tag":157,"props":36636,"children":36637},{"class":159,"line":188},[36638],{"type":20,"tag":157,"props":36639,"children":36640},{},[36641],{"type":25,"value":36642},"    \u003Cfilter-class>org.springframework.web.filter.CharacterEncodingFilter\u003C\u002Ffilter-class>\n",{"type":20,"tag":157,"props":36644,"children":36645},{"class":159,"line":196},[36646],{"type":20,"tag":157,"props":36647,"children":36648},{},[36649],{"type":25,"value":36650},"    \u003Cinit-param>\n",{"type":20,"tag":157,"props":36652,"children":36653},{"class":159,"line":204},[36654],{"type":20,"tag":157,"props":36655,"children":36656},{},[36657],{"type":25,"value":36658},"        \u003Cparam-name>encoding\u003C\u002Fparam-name>\n",{"type":20,"tag":157,"props":36660,"children":36661},{"class":159,"line":213},[36662],{"type":20,"tag":157,"props":36663,"children":36664},{},[36665],{"type":25,"value":36666},"        \u003Cparam-value>UTF-8\u003C\u002Fparam-value>\n",{"type":20,"tag":157,"props":36668,"children":36669},{"class":159,"line":222},[36670],{"type":20,"tag":157,"props":36671,"children":36672},{},[36673],{"type":25,"value":36674},"    \u003C\u002Finit-param>\n",{"type":20,"tag":157,"props":36676,"children":36677},{"class":159,"line":440},[36678],{"type":20,"tag":157,"props":36679,"children":36680},{},[36681],{"type":25,"value":36650},{"type":20,"tag":157,"props":36683,"children":36684},{"class":159,"line":448},[36685],{"type":20,"tag":157,"props":36686,"children":36687},{},[36688],{"type":25,"value":36689},"        \u003Cparam-name>forceEncoding\u003C\u002Fparam-name>\n",{"type":20,"tag":157,"props":36691,"children":36692},{"class":159,"line":456},[36693],{"type":20,"tag":157,"props":36694,"children":36695},{},[36696],{"type":25,"value":36697},"        \u003Cparam-value>true\u003C\u002Fparam-value>\n",{"type":20,"tag":157,"props":36699,"children":36700},{"class":159,"line":465},[36701],{"type":20,"tag":157,"props":36702,"children":36703},{},[36704],{"type":25,"value":36674},{"type":20,"tag":157,"props":36706,"children":36707},{"class":159,"line":474},[36708],{"type":20,"tag":157,"props":36709,"children":36710},{},[36711],{"type":25,"value":36712},"\u003C\u002Ffilter>\n",{"type":20,"tag":157,"props":36714,"children":36715},{"class":159,"line":483},[36716],{"type":20,"tag":157,"props":36717,"children":36718},{},[36719],{"type":25,"value":36720},"\u003Cfilter-mapping>\n",{"type":20,"tag":157,"props":36722,"children":36723},{"class":159,"line":491},[36724],{"type":20,"tag":157,"props":36725,"children":36726},{},[36727],{"type":25,"value":36634},{"type":20,"tag":157,"props":36729,"children":36730},{"class":159,"line":499},[36731],{"type":20,"tag":157,"props":36732,"children":36733},{},[36734],{"type":25,"value":36735},"    \u003Curl-pattern>\u002F*\u003C\u002Furl-pattern>\n",{"type":20,"tag":157,"props":36737,"children":36738},{"class":159,"line":508},[36739],{"type":20,"tag":157,"props":36740,"children":36741},{},[36742],{"type":25,"value":36743},"\u003C\u002Ffilter-mapping>\n",{"type":20,"tag":28,"props":36745,"children":36747},{"id":36746},"_4-域对象共享数据",[36748],{"type":25,"value":36749},"4. 域对象共享数据",{"type":20,"tag":11085,"props":36751,"children":36753},{"id":36752},"_41-请求域共享数据",[36754],{"type":25,"value":36755},"4.1 请求域共享数据",{"type":20,"tag":21,"props":36757,"children":36758},{},[36759],{"type":20,"tag":33,"props":36760,"children":36761},{},[36762],{"type":25,"value":36763},"Controller层",{"type":20,"tag":126,"props":36765,"children":36767},{"className":16050,"code":36766,"language":16052,"meta":8,"style":8},"@Controller\npublic class TestScopeController {\n\n    @RequestMapping(\"\u002Ftest\u002Fmodel\")\n    public String testMode(Model model) {\n        model.addAttribute(\"testRequestScope\", \"hello,Model\");\n        return \"about\";\n    }\n}\n",[36768],{"type":20,"tag":84,"props":36769,"children":36770},{"__ignoreMap":8},[36771,36778,36786,36793,36801,36809,36817,36824,36831],{"type":20,"tag":157,"props":36772,"children":36773},{"class":159,"line":160},[36774],{"type":20,"tag":157,"props":36775,"children":36776},{},[36777],{"type":25,"value":31003},{"type":20,"tag":157,"props":36779,"children":36780},{"class":159,"line":169},[36781],{"type":20,"tag":157,"props":36782,"children":36783},{},[36784],{"type":25,"value":36785},"public class TestScopeController {\n",{"type":20,"tag":157,"props":36787,"children":36788},{"class":159,"line":179},[36789],{"type":20,"tag":157,"props":36790,"children":36791},{"emptyLinePlaceholder":173},[36792],{"type":25,"value":176},{"type":20,"tag":157,"props":36794,"children":36795},{"class":159,"line":188},[36796],{"type":20,"tag":157,"props":36797,"children":36798},{},[36799],{"type":25,"value":36800},"    @RequestMapping(\"\u002Ftest\u002Fmodel\")\n",{"type":20,"tag":157,"props":36802,"children":36803},{"class":159,"line":196},[36804],{"type":20,"tag":157,"props":36805,"children":36806},{},[36807],{"type":25,"value":36808},"    public String testMode(Model model) {\n",{"type":20,"tag":157,"props":36810,"children":36811},{"class":159,"line":204},[36812],{"type":20,"tag":157,"props":36813,"children":36814},{},[36815],{"type":25,"value":36816},"        model.addAttribute(\"testRequestScope\", \"hello,Model\");\n",{"type":20,"tag":157,"props":36818,"children":36819},{"class":159,"line":213},[36820],{"type":20,"tag":157,"props":36821,"children":36822},{},[36823],{"type":25,"value":35922},{"type":20,"tag":157,"props":36825,"children":36826},{"class":159,"line":222},[36827],{"type":20,"tag":157,"props":36828,"children":36829},{},[36830],{"type":25,"value":872},{"type":20,"tag":157,"props":36832,"children":36833},{"class":159,"line":440},[36834],{"type":20,"tag":157,"props":36835,"children":36836},{},[36837],{"type":25,"value":943},{"type":20,"tag":21,"props":36839,"children":36840},{},[36841],{"type":20,"tag":33,"props":36842,"children":36843},{},[36844],{"type":25,"value":36845},"about.html",{"type":20,"tag":126,"props":36847,"children":36851},{"className":36848,"code":36849,"language":36850,"meta":8,"style":8},"language-html shiki shiki-themes github-dark","\u003Cp th:text=\"${testRequestScope}\">\u003C\u002Fp>  \u002F\u002F hello,Model\n","html",[36852],{"type":20,"tag":84,"props":36853,"children":36854},{"__ignoreMap":8},[36855],{"type":20,"tag":157,"props":36856,"children":36857},{"class":159,"line":160},[36858,36863,36867,36872,36876,36881,36886,36890],{"type":20,"tag":157,"props":36859,"children":36860},{"style":892},[36861],{"type":25,"value":36862},"\u003C",{"type":20,"tag":157,"props":36864,"children":36865},{"style":5667},[36866],{"type":25,"value":21},{"type":20,"tag":157,"props":36868,"children":36869},{"style":248},[36870],{"type":25,"value":36871}," th:text",{"type":20,"tag":157,"props":36873,"children":36874},{"style":892},[36875],{"type":25,"value":2261},{"type":20,"tag":157,"props":36877,"children":36878},{"style":254},[36879],{"type":25,"value":36880},"\"${testRequestScope}\"",{"type":20,"tag":157,"props":36882,"children":36883},{"style":892},[36884],{"type":25,"value":36885},">\u003C\u002F",{"type":20,"tag":157,"props":36887,"children":36888},{"style":5667},[36889],{"type":25,"value":21},{"type":20,"tag":157,"props":36891,"children":36892},{"style":892},[36893],{"type":25,"value":36894},">  \u002F\u002F hello,Model\n",{"type":20,"tag":11085,"props":36896,"children":36898},{"id":36897},"_42-会话域应用域共享数据",[36899],{"type":25,"value":36900},"4.2 会话域、应用域共享数据",{"type":20,"tag":21,"props":36902,"children":36903},{},[36904],{"type":20,"tag":33,"props":36905,"children":36906},{},[36907],{"type":25,"value":36763},{"type":20,"tag":126,"props":36909,"children":36911},{"className":16050,"code":36910,"language":16052,"meta":8,"style":8},"\u002F\u002F 会话域\n@RequestMapping(\"\u002Ftest\u002Fsession\")\npublic String testSession(HttpSession session) {\n    session.setAttribute(\"testScopeSession\", \"hello,session\");\n    return \"about\";\n}\n\n\u002F\u002F 应用域\n@RequestMapping(\"\u002Ftest\u002Fapplication\")\npublic String testApplication(HttpSession session) {\n    ServletContext application = session.getServletContext();\n    application.setAttribute(\"testScopeApplication\", \"hello,application\");\n    return \"about\";\n}\n",[36912],{"type":20,"tag":84,"props":36913,"children":36914},{"__ignoreMap":8},[36915,36923,36931,36939,36947,36954,36961,36968,36976,36984,36992,37000,37008,37015],{"type":20,"tag":157,"props":36916,"children":36917},{"class":159,"line":160},[36918],{"type":20,"tag":157,"props":36919,"children":36920},{},[36921],{"type":25,"value":36922},"\u002F\u002F 会话域\n",{"type":20,"tag":157,"props":36924,"children":36925},{"class":159,"line":169},[36926],{"type":20,"tag":157,"props":36927,"children":36928},{},[36929],{"type":25,"value":36930},"@RequestMapping(\"\u002Ftest\u002Fsession\")\n",{"type":20,"tag":157,"props":36932,"children":36933},{"class":159,"line":179},[36934],{"type":20,"tag":157,"props":36935,"children":36936},{},[36937],{"type":25,"value":36938},"public String testSession(HttpSession session) {\n",{"type":20,"tag":157,"props":36940,"children":36941},{"class":159,"line":188},[36942],{"type":20,"tag":157,"props":36943,"children":36944},{},[36945],{"type":25,"value":36946},"    session.setAttribute(\"testScopeSession\", \"hello,session\");\n",{"type":20,"tag":157,"props":36948,"children":36949},{"class":159,"line":196},[36950],{"type":20,"tag":157,"props":36951,"children":36952},{},[36953],{"type":25,"value":36447},{"type":20,"tag":157,"props":36955,"children":36956},{"class":159,"line":204},[36957],{"type":20,"tag":157,"props":36958,"children":36959},{},[36960],{"type":25,"value":943},{"type":20,"tag":157,"props":36962,"children":36963},{"class":159,"line":213},[36964],{"type":20,"tag":157,"props":36965,"children":36966},{"emptyLinePlaceholder":173},[36967],{"type":25,"value":176},{"type":20,"tag":157,"props":36969,"children":36970},{"class":159,"line":222},[36971],{"type":20,"tag":157,"props":36972,"children":36973},{},[36974],{"type":25,"value":36975},"\u002F\u002F 应用域\n",{"type":20,"tag":157,"props":36977,"children":36978},{"class":159,"line":440},[36979],{"type":20,"tag":157,"props":36980,"children":36981},{},[36982],{"type":25,"value":36983},"@RequestMapping(\"\u002Ftest\u002Fapplication\")\n",{"type":20,"tag":157,"props":36985,"children":36986},{"class":159,"line":448},[36987],{"type":20,"tag":157,"props":36988,"children":36989},{},[36990],{"type":25,"value":36991},"public String testApplication(HttpSession session) {\n",{"type":20,"tag":157,"props":36993,"children":36994},{"class":159,"line":456},[36995],{"type":20,"tag":157,"props":36996,"children":36997},{},[36998],{"type":25,"value":36999},"    ServletContext application = session.getServletContext();\n",{"type":20,"tag":157,"props":37001,"children":37002},{"class":159,"line":465},[37003],{"type":20,"tag":157,"props":37004,"children":37005},{},[37006],{"type":25,"value":37007},"    application.setAttribute(\"testScopeApplication\", \"hello,application\");\n",{"type":20,"tag":157,"props":37009,"children":37010},{"class":159,"line":474},[37011],{"type":20,"tag":157,"props":37012,"children":37013},{},[37014],{"type":25,"value":36447},{"type":20,"tag":157,"props":37016,"children":37017},{"class":159,"line":483},[37018],{"type":20,"tag":157,"props":37019,"children":37020},{},[37021],{"type":25,"value":943},{"type":20,"tag":21,"props":37023,"children":37024},{},[37025],{"type":20,"tag":33,"props":37026,"children":37027},{},[37028],{"type":25,"value":36845},{"type":20,"tag":126,"props":37030,"children":37032},{"className":36848,"code":37031,"language":36850,"meta":8,"style":8},"\u003Cp th:text=\"${testRequestScope}\">\u003C\u002Fp>\n\u003Cp th:text=\"${session.testScopeSession}\">\u003C\u002Fp>\n\u003Cp th:text=\"${application.testScopeApplication}\">\u003C\u002Fp>\n",[37033],{"type":20,"tag":84,"props":37034,"children":37035},{"__ignoreMap":8},[37036,37071,37107],{"type":20,"tag":157,"props":37037,"children":37038},{"class":159,"line":160},[37039,37043,37047,37051,37055,37059,37063,37067],{"type":20,"tag":157,"props":37040,"children":37041},{"style":892},[37042],{"type":25,"value":36862},{"type":20,"tag":157,"props":37044,"children":37045},{"style":5667},[37046],{"type":25,"value":21},{"type":20,"tag":157,"props":37048,"children":37049},{"style":248},[37050],{"type":25,"value":36871},{"type":20,"tag":157,"props":37052,"children":37053},{"style":892},[37054],{"type":25,"value":2261},{"type":20,"tag":157,"props":37056,"children":37057},{"style":254},[37058],{"type":25,"value":36880},{"type":20,"tag":157,"props":37060,"children":37061},{"style":892},[37062],{"type":25,"value":36885},{"type":20,"tag":157,"props":37064,"children":37065},{"style":5667},[37066],{"type":25,"value":21},{"type":20,"tag":157,"props":37068,"children":37069},{"style":892},[37070],{"type":25,"value":30657},{"type":20,"tag":157,"props":37072,"children":37073},{"class":159,"line":169},[37074,37078,37082,37086,37090,37095,37099,37103],{"type":20,"tag":157,"props":37075,"children":37076},{"style":892},[37077],{"type":25,"value":36862},{"type":20,"tag":157,"props":37079,"children":37080},{"style":5667},[37081],{"type":25,"value":21},{"type":20,"tag":157,"props":37083,"children":37084},{"style":248},[37085],{"type":25,"value":36871},{"type":20,"tag":157,"props":37087,"children":37088},{"style":892},[37089],{"type":25,"value":2261},{"type":20,"tag":157,"props":37091,"children":37092},{"style":254},[37093],{"type":25,"value":37094},"\"${session.testScopeSession}\"",{"type":20,"tag":157,"props":37096,"children":37097},{"style":892},[37098],{"type":25,"value":36885},{"type":20,"tag":157,"props":37100,"children":37101},{"style":5667},[37102],{"type":25,"value":21},{"type":20,"tag":157,"props":37104,"children":37105},{"style":892},[37106],{"type":25,"value":30657},{"type":20,"tag":157,"props":37108,"children":37109},{"class":159,"line":179},[37110,37114,37118,37122,37126,37131,37135,37139],{"type":20,"tag":157,"props":37111,"children":37112},{"style":892},[37113],{"type":25,"value":36862},{"type":20,"tag":157,"props":37115,"children":37116},{"style":5667},[37117],{"type":25,"value":21},{"type":20,"tag":157,"props":37119,"children":37120},{"style":248},[37121],{"type":25,"value":36871},{"type":20,"tag":157,"props":37123,"children":37124},{"style":892},[37125],{"type":25,"value":2261},{"type":20,"tag":157,"props":37127,"children":37128},{"style":254},[37129],{"type":25,"value":37130},"\"${application.testScopeApplication}\"",{"type":20,"tag":157,"props":37132,"children":37133},{"style":892},[37134],{"type":25,"value":36885},{"type":20,"tag":157,"props":37136,"children":37137},{"style":5667},[37138],{"type":25,"value":21},{"type":20,"tag":157,"props":37140,"children":37141},{"style":892},[37142],{"type":25,"value":30657},{"type":20,"tag":28,"props":37144,"children":37146},{"id":37145},"_5-restful",[37147],{"type":25,"value":37148},"5. RESTful",{"type":20,"tag":1785,"props":37150,"children":37151},{},[37152],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":37154},[37155,37156,37169,37175],{"id":15766,"depth":179,"text":15766},{"id":15784,"depth":169,"text":15787,"children":37157},[37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168],{"id":15803,"depth":179,"text":15806},{"id":15958,"depth":179,"text":15961},{"id":17348,"depth":179,"text":17351},{"id":17693,"depth":179,"text":17696},{"id":18333,"depth":179,"text":18336},{"id":19312,"depth":179,"text":19315},{"id":20171,"depth":179,"text":20174},{"id":22453,"depth":179,"text":22456},{"id":23402,"depth":179,"text":23405},{"id":23581,"depth":179,"text":23584},{"id":25133,"depth":179,"text":25136},{"id":25474,"depth":169,"text":25477,"children":37170},[37171,37172,37173,37174],{"id":25480,"depth":179,"text":25483},{"id":25661,"depth":179,"text":25664},{"id":31088,"depth":179,"text":31091},{"id":33167,"depth":179,"text":33170},{"id":35125,"depth":169,"text":25653,"children":37176},[37177,37178,37179,37180,37181],{"id":35130,"depth":179,"text":35133},{"id":35311,"depth":179,"text":35314},{"id":36205,"depth":179,"text":36208},{"id":36746,"depth":179,"text":36749},{"id":37145,"depth":179,"text":37148},"content:articles:backend:SSM.md","articles\u002Fbackend\u002FSSM.md","articles\u002Fbackend\u002FSSM",{"_path":37186,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":37187,"description":37188,"date":15754,"tags":37189,"body":37190,"_type":1800,"_id":38809,"_source":1802,"_file":38810,"_stem":38811,"_extension":1805},"\u002Farticles\u002Fbackend\u002Ftomcat-servlet","Tomcat + Servlet 基础入门：从环境搭建到请求响应全解析","系统讲解 Tomcat 服务器配置与启动、Servlet 开发与部署、生命周期管理、线程安全及 Request\u002FResponse\u002FCookie\u002FSession\u002FServletContext 等核心对象的使用方法。",[14],{"type":17,"children":37191,"toc":38797},[37192,37197,37202,37207,37212,37217,37222,37228,37236,37240,37245,37250,37256,37357,37362,37441,37446,37454,37459,37480,37527,37532,37539,37545,37553,37558,37563,37586,37593,37599,37620,37626,37647,37686,37692,37713,37719,37748,37754,37790,37796,37804,37915,37919,37926,37931,37939,37945,37951,37959,37966,37972,37985,37995,38005,38013,38018,38026,38031,38039,38090,38098,38127,38132,38140,38146,38154,38160,38168,38174,38182,38188,38194,38219,38224,38232,38237,38245,38253,38258,38266,38274,38281,38286,38294,38302,38310,38318,38324,38332,38340,38348,38354,38377,38383,38391,38399,38405,38413,38419,38426,38444,38452,38470,38476,38482,38490,38503,38509,38517,38524,38531,38544,38549,38554,38562,38567,38575,38580,38588,38593,38601,38606,38619,38627,38640,38646,38654,38662,38670,38678,38685,38690,38698,38703,38711,38719,38727,38735,38743,38751,38759,38767,38775,38779],{"type":20,"tag":21,"props":37193,"children":37194},{},[37195],{"type":25,"value":37196},"jdbc是后端与数据库的交互",{"type":20,"tag":21,"props":37198,"children":37199},{},[37200],{"type":25,"value":37201},"Tomcat + Servlet是客户端与后端（服务端）的交互",{"type":20,"tag":21,"props":37203,"children":37204},{},[37205],{"type":25,"value":37206},"Tomcat开启web服务器，Servlet根据请求路径进行动态资源分发",{"type":20,"tag":21,"props":37208,"children":37209},{},[37210],{"type":25,"value":37211},"Tomcat实现给客户端呈现静态页面",{"type":20,"tag":21,"props":37213,"children":37214},{},[37215],{"type":25,"value":37216},"Tomcat + Servlet实现根据客户端请求的资源地址和请求方法响应不同的页面",{"type":20,"tag":21,"props":37218,"children":37219},{},[37220],{"type":25,"value":37221},"JDBC + Tomcat + Servlet实现根据客户端请求的资源地址和请求方法响应不同的页面，并且可以去数据库去请求数据",{"type":20,"tag":1863,"props":37223,"children":37225},{"id":37224},"tomcat",[37226],{"type":25,"value":37227},"Tomcat",{"type":20,"tag":21,"props":37229,"children":37230},{},[37231],{"type":20,"tag":11159,"props":37232,"children":37235},{"alt":37233,"src":37234},"image.png","https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F2a128c6c13e945ebbabb8384510e264c~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":28,"props":37237,"children":37238},{"id":25842},[37239],{"type":25,"value":25842},{"type":20,"tag":21,"props":37241,"children":37242},{},[37243],{"type":25,"value":37244},"Tomcat是Apache开源组织共享的Jakarta项目中的一个核心项目，Tomcat开源免费、支持Java中的动态网页技术Servlet和JAP规范，因此Java开发者多使用Tomcat",{"type":20,"tag":21,"props":37246,"children":37247},{},[37248],{"type":25,"value":37249},"Tomcat在企业主流使用8.5和9，我们的学习主要基于8.5.72版本；各个版本之间的最大区别就是对于JavaEE版本及Servlet规范的支持、依赖的JDK版本。Tomcat8.x全面支持Servlet3.x规范及JavaEE4规范",{"type":20,"tag":11085,"props":37251,"children":37253},{"id":37252},"tomcat的目录结构",[37254],{"type":25,"value":37255},"Tomcat的目录结构",{"type":20,"tag":44,"props":37257,"children":37258},{},[37259,37273,37287,37301,37315,37329,37343],{"type":20,"tag":48,"props":37260,"children":37261},{},[37262,37271],{"type":20,"tag":33,"props":37263,"children":37264},{},[37265],{"type":20,"tag":84,"props":37266,"children":37268},{"className":37267},[],[37269],{"type":25,"value":37270},"bin：",{"type":25,"value":37272}," 存放可执行二进制文件（startup.bat用于启动Tomcat、shutdown.bat用于停止Tomcat）",{"type":20,"tag":48,"props":37274,"children":37275},{},[37276,37285],{"type":20,"tag":33,"props":37277,"children":37278},{},[37279],{"type":20,"tag":84,"props":37280,"children":37282},{"className":37281},[],[37283],{"type":25,"value":37284},"conf:",{"type":25,"value":37286}," 存放Tomcat的配置文件（server.xml可以配置Tomcat的端口，web.xml）",{"type":20,"tag":48,"props":37288,"children":37289},{},[37290,37299],{"type":20,"tag":33,"props":37291,"children":37292},{},[37293],{"type":20,"tag":84,"props":37294,"children":37296},{"className":37295},[],[37297],{"type":25,"value":37298},"lib：",{"type":25,"value":37300}," 存放Tomcat服务器运行web项目所需的基础类库",{"type":20,"tag":48,"props":37302,"children":37303},{},[37304,37313],{"type":20,"tag":33,"props":37305,"children":37306},{},[37307],{"type":20,"tag":84,"props":37308,"children":37310},{"className":37309},[],[37311],{"type":25,"value":37312},"logs：",{"type":25,"value":37314}," 存放了Tomcat服务器运行日志、记录了服务器启动、运行异常及关闭等操作的记录",{"type":20,"tag":48,"props":37316,"children":37317},{},[37318,37327],{"type":20,"tag":33,"props":37319,"children":37320},{},[37321],{"type":20,"tag":84,"props":37322,"children":37324},{"className":37323},[],[37325],{"type":25,"value":37326},"temp：",{"type":25,"value":37328}," 临时目录，存放Tomcat运行过程中产生的临时文件",{"type":20,"tag":48,"props":37330,"children":37331},{},[37332,37341],{"type":20,"tag":33,"props":37333,"children":37334},{},[37335],{"type":20,"tag":84,"props":37336,"children":37338},{"className":37337},[],[37339],{"type":25,"value":37340},"webapps：",{"type":25,"value":37342}," 存放Tomcat管理的web项目的目录，此目录中默认部署了Tomcat管理器等几个web项目",{"type":20,"tag":48,"props":37344,"children":37345},{},[37346,37355],{"type":20,"tag":33,"props":37347,"children":37348},{},[37349],{"type":20,"tag":84,"props":37350,"children":37352},{"className":37351},[],[37353],{"type":25,"value":37354},"work:",{"type":25,"value":37356}," Tomcat可以运行动态网页，动态网页就是在服务器上将数据加载到网页生成的页面，次目录就是存放Tomcat生成的文件",{"type":20,"tag":28,"props":37358,"children":37360},{"id":37359},"启动",[37361],{"type":25,"value":37359},{"type":20,"tag":5719,"props":37363,"children":37364},{},[37365,37393,37417],{"type":20,"tag":48,"props":37366,"children":37367},{},[37368,37370,37375,37377,37383,37385,37391],{"type":25,"value":37369},"进入",{"type":20,"tag":84,"props":37371,"children":37373},{"className":37372},[],[37374],{"type":25,"value":37224},{"type":25,"value":37376},"的",{"type":20,"tag":84,"props":37378,"children":37380},{"className":37379},[],[37381],{"type":25,"value":37382},"bin",{"type":25,"value":37384},"目录：",{"type":20,"tag":84,"props":37386,"children":37388},{"className":37387},[],[37389],{"type":25,"value":37390},"cd \u002FLibrary\u002FTomcat\u002Fbin",{"type":25,"value":37392}," 或者打开Tomcat文件夹，把bin文件夹直接拖拉到终端，当然前提是先输入cd+空格",{"type":20,"tag":48,"props":37394,"children":37395},{},[37396,37398,37404,37412,37415],{"type":25,"value":37397},"启动服务：",{"type":20,"tag":84,"props":37399,"children":37401},{"className":37400},[],[37402],{"type":25,"value":37403},"sudo sh .\u002Fstartup.sh",{"type":20,"tag":126,"props":37405,"children":37407},{"code":37406},"Using CATALINA_BASE:   \u002FLibrary\u002FTomcat\nUsing CATALINA_HOME:   \u002FLibrary\u002FTomcat\nUsing CATALINA_TMPDIR: \u002FLibrary\u002FTomcat\u002Ftemp\nUsing JRE_HOME:        \u002FLibrary\u002FJava\u002FJavaVirtualMachines\u002Fjdk-18.0.2.1.jdk\u002FContents\u002FHome\nUsing CLASSPATH:       \u002FLibrary\u002FTomcat\u002Fbin\u002Fbootstrap.jar:\u002FLibrary\u002FTomcat\u002Fbin\u002Ftomcat-juli.jar\nUsing CATALINA_OPTS:\nTomcat started.\n",[37408],{"type":20,"tag":84,"props":37409,"children":37410},{"__ignoreMap":8},[37411],{"type":25,"value":37406},{"type":20,"tag":9908,"props":37413,"children":37414},{},[],{"type":25,"value":37416},"出现这个就代表启动成功",{"type":20,"tag":48,"props":37418,"children":37419},{},[37420,37422,37428,37436,37439],{"type":25,"value":37421},"关闭服务：",{"type":20,"tag":84,"props":37423,"children":37425},{"className":37424},[],[37426],{"type":25,"value":37427},"sh .\u002Fshutdown.sh",{"type":20,"tag":126,"props":37429,"children":37431},{"code":37430},"Using CATALINA_BASE:   \u002FLibrary\u002FTomcat\nUsing CATALINA_HOME:   \u002FLibrary\u002FTomcat\nUsing CATALINA_TMPDIR: \u002FLibrary\u002FTomcat\u002Ftemp\nUsing JRE_HOME:        \u002FLibrary\u002FJava\u002FJavaVirtualMachines\u002Fjdk-18.0.2.1.jdk\u002FContents\u002FHome\nUsing CLASSPATH:       \u002FLibrary\u002FTomcat\u002Fbin\u002Fbootstrap.jar:\u002FLibrary\u002FTomcat\u002Fbin\u002Ftomcat-juli.jar\nUsing CATALINA_OPTS:   \nNOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base\u002Fjava.lang=ALL-UNNAMED --add-opens=java.base\u002Fjava.io=ALL-UNNAMED --add-opens=java.base\u002Fjava.util=ALL-UNNAMED --add-opens=java.base\u002Fjava.util.concurrent=ALL-UNNAMED --add-opens=java.rmi\u002Fsun.rmi.transport=ALL-UNNAMED\n",[37432],{"type":20,"tag":84,"props":37433,"children":37434},{"__ignoreMap":8},[37435],{"type":25,"value":37430},{"type":20,"tag":9908,"props":37437,"children":37438},{},[],{"type":25,"value":37440},"出现这个就代表关闭成功",{"type":20,"tag":28,"props":37442,"children":37444},{"id":37443},"web项目部署",[37445],{"type":25,"value":37443},{"type":20,"tag":6665,"props":37447,"children":37448},{},[37449],{"type":20,"tag":21,"props":37450,"children":37451},{},[37452],{"type":25,"value":37453},"web项目部署：将web项目交给Tomcat管理，当用户访问Tomcat时，Tomcat可以将web项目中的资源响应给用户浏览器",{"type":20,"tag":21,"props":37455,"children":37456},{},[37457],{"type":25,"value":37458},"方法：直接将web项目拷贝到Tomcat的webapps目录",{"type":20,"tag":21,"props":37460,"children":37461},{},[37462,37464,37470,37472,37478],{"type":25,"value":37463},"打开网站：",{"type":20,"tag":101,"props":37465,"children":37468},{"href":37466,"rel":37467},"http:\u002F\u002Fhost-ip:tomcat-port\u002Fweb-Path\u002F",[105],[37469],{"type":25,"value":37466},{"type":25,"value":37471}," (test地址：",{"type":20,"tag":101,"props":37473,"children":37476},{"href":37474,"rel":37475},"http:\u002F\u002Flocalhost:8080\u002Ftest\u002Findex.html",[105],[37477],{"type":25,"value":37474},{"type":25,"value":37479},")",{"type":20,"tag":44,"props":37481,"children":37482},{},[37483,37494,37505,37516],{"type":20,"tag":48,"props":37484,"children":37485},{},[37486,37492],{"type":20,"tag":84,"props":37487,"children":37489},{"className":37488},[],[37490],{"type":25,"value":37491},"http:\u002F\u002F",{"type":25,"value":37493},"：web服务的htpp传输协议",{"type":20,"tag":48,"props":37495,"children":37496},{},[37497,37503],{"type":20,"tag":84,"props":37498,"children":37500},{"className":37499},[],[37501],{"type":25,"value":37502},"host-ip",{"type":25,"value":37504},"：服务器所在计算机的IP",{"type":20,"tag":48,"props":37506,"children":37507},{},[37508,37514],{"type":20,"tag":84,"props":37509,"children":37511},{"className":37510},[],[37512],{"type":25,"value":37513},"tomcat-port",{"type":25,"value":37515},"：Tomcat服务器占用的网络端口（默认8080，可以在conf.server.xml中修改端口）",{"type":20,"tag":48,"props":37517,"children":37518},{},[37519,37525],{"type":20,"tag":84,"props":37520,"children":37522},{"className":37521},[],[37523],{"type":25,"value":37524},"web-Path",{"type":25,"value":37526},"：Tomcat中部署的web项目的访问路径",{"type":20,"tag":21,"props":37528,"children":37529},{},[37530],{"type":25,"value":37531},"示例图：",{"type":20,"tag":21,"props":37533,"children":37534},{},[37535],{"type":20,"tag":11159,"props":37536,"children":37538},{"alt":37233,"src":37537},"https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fd8f3de0b25d242e4909df5431808a216~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":1863,"props":37540,"children":37542},{"id":37541},"servlet",[37543],{"type":25,"value":37544},"Servlet",{"type":20,"tag":6665,"props":37546,"children":37547},{},[37548],{"type":20,"tag":21,"props":37549,"children":37550},{},[37551],{"type":25,"value":37552},"Servlet是服务器端的Java程序、能够接收HTTP请求、处理HTTP请求、并对HTTP请求进行相应的动态网页技术。",{"type":20,"tag":21,"props":37554,"children":37555},{},[37556],{"type":25,"value":37557},"Servlet是JavaEE（JavaWeb）规范的一个重要组成部分",{"type":20,"tag":21,"props":37559,"children":37560},{},[37561],{"type":25,"value":37562},"Servlet的作用：",{"type":20,"tag":44,"props":37564,"children":37565},{},[37566,37571,37576,37581],{"type":20,"tag":48,"props":37567,"children":37568},{},[37569],{"type":25,"value":37570},"接收客户端的HTTP请求（浏览器）",{"type":20,"tag":48,"props":37572,"children":37573},{},[37574],{"type":25,"value":37575},"根据用户请求进行数据处理",{"type":20,"tag":48,"props":37577,"children":37578},{},[37579],{"type":25,"value":37580},"动态生成网页（网页中的数据是根据客户端请求动态改变的）",{"type":20,"tag":48,"props":37582,"children":37583},{},[37584],{"type":25,"value":37585},"将生成的包含动态数据的网页响应给客户端",{"type":20,"tag":21,"props":37587,"children":37588},{},[37589],{"type":20,"tag":11159,"props":37590,"children":37592},{"alt":37233,"src":37591},"https:\u002F\u002Fp6-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F6f1fcae32304435cb32c37ccb568177f~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":28,"props":37594,"children":37596},{"id":37595},"创建java-web工程",[37597],{"type":25,"value":37598},"创建Java Web工程",{"type":20,"tag":6665,"props":37600,"children":37601},{},[37602,37607],{"type":20,"tag":21,"props":37603,"children":37604},{},[37605],{"type":25,"value":37606},"Servlet是JavaEE规范的一部分，Servlet的开发需要依赖JavaEE环境，之前创建的单纯的Java应用已经不能满足Serclet开发所需的环境需求，我们要创建Java Web工程",{"type":20,"tag":44,"props":37608,"children":37609},{},[37610,37615],{"type":20,"tag":48,"props":37611,"children":37612},{},[37613],{"type":25,"value":37614},"Java工程：只引入JDK的标准库（JavaSE）",{"type":20,"tag":48,"props":37616,"children":37617},{},[37618],{"type":25,"value":37619},"Java Web工程：引入了Java企业级开发环境（JavaEE）",{"type":20,"tag":11085,"props":37621,"children":37623},{"id":37622},"创建servlet类",[37624],{"type":25,"value":37625},"创建Servlet类",{"type":20,"tag":6665,"props":37627,"children":37628},{},[37629,37634],{"type":20,"tag":21,"props":37630,"children":37631},{},[37632],{"type":25,"value":37633},"Servlet是一个java程序，是一个能够接收HTTP请求的Java类，因此需要实现HTTP请求",{"type":20,"tag":21,"props":37635,"children":37636},{},[37637,37639,37645],{"type":25,"value":37638},"在JavaEE库中有一个类",{"type":20,"tag":84,"props":37640,"children":37642},{"className":37641},[],[37643],{"type":25,"value":37644},"javax.servlet.http.HttpServlet",{"type":25,"value":37646},"实现了HTTP协议，我们创建的类只要继承这个HttpServlet类，就实现了HTTP协议，就能接受HTTP请求",{"type":20,"tag":5719,"props":37648,"children":37649},{"start":10630},[37650,37660,37673],{"type":20,"tag":48,"props":37651,"children":37652},{},[37653,37655],{"type":25,"value":37654},"创建一个类继承",{"type":20,"tag":84,"props":37656,"children":37658},{"className":37657},[],[37659],{"type":25,"value":37644},{"type":20,"tag":48,"props":37661,"children":37662},{},[37663,37665,37671],{"type":25,"value":37664},"继承HttpServlet的类就能够接收HTTP请求，我们把这样的类称之为Servlet类，类似",{"type":20,"tag":84,"props":37666,"children":37668},{"className":37667},[],[37669],{"type":25,"value":37670},"****Servlet",{"type":25,"value":37672},"格式命名",{"type":20,"tag":48,"props":37674,"children":37675},{},[37676,37678,37684],{"type":25,"value":37677},"在我们创建的Servlet类中，重写",{"type":20,"tag":84,"props":37679,"children":37681},{"className":37680},[],[37682],{"type":25,"value":37683},"doPost\u002FdoGet",{"type":25,"value":37685},"用于处理用户不同的请求",{"type":20,"tag":11085,"props":37687,"children":37689},{"id":37688},"配置servlet类的url",[37690],{"type":25,"value":37691},"配置Servlet类的URL",{"type":20,"tag":6665,"props":37693,"children":37694},{},[37695,37700],{"type":20,"tag":21,"props":37696,"children":37697},{},[37698],{"type":25,"value":37699},"Servlet创建完成之后，需要配置url访问路径，然后将web项目运行在Tomcat之上，就能够通过配重的url访问Servlet类。Servlet自3.0规范开始支持两种配置方式",{"type":20,"tag":44,"props":37701,"children":37702},{},[37703,37708],{"type":20,"tag":48,"props":37704,"children":37705},{},[37706],{"type":25,"value":37707},"基于web.xml配置文件进行配置",{"type":20,"tag":48,"props":37709,"children":37710},{},[37711],{"type":25,"value":37712},"基于注解配置",{"type":20,"tag":18942,"props":37714,"children":37716},{"id":37715},"基于webxml配置servlet",[37717],{"type":25,"value":37718},"基于web.xml配置Servlet",{"type":20,"tag":44,"props":37720,"children":37721},{},[37722,37735],{"type":20,"tag":48,"props":37723,"children":37724},{},[37725,37727,37733],{"type":25,"value":37726},"打开Java Web工程中",{"type":20,"tag":84,"props":37728,"children":37730},{"className":37729},[],[37731],{"type":25,"value":37732},"web\u002FWEB_INF\u002Fweb.xml",{"type":25,"value":37734},"文件",{"type":20,"tag":48,"props":37736,"children":37737},{},[37738,37740],{"type":25,"value":37739},"配置如下",{"type":20,"tag":126,"props":37741,"children":37743},{"code":37742},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cweb-app xmlns=\"http:\u002F\u002Fxmlns.jcp.org\u002Fxml\u002Fns\u002Fjavaee\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fxmlns.jcp.org\u002Fxml\u002Fns\u002Fjavaee http:\u002F\u002Fxmlns.jcp.org\u002Fxml\u002Fns\u002Fjavaee\u002Fweb-app_4_0.xsd\"\n         version=\"4.0\">\n​\n    \u003C!--  servlet标签：配置类标签  -->\n    \u003Cservlet>\n        \u003Cservlet-name>BookListServlet\u003C\u002Fservlet-name>\n        \u003Cservlet-class>com.example.learnservlet.BookListServlet\u003C\u002Fservlet-class>\n    \u003C\u002Fservlet>\n \n    \u003C!--servlet-mapping标签：配置url-->\n    \u003Cservlet-mapping>\n        \u003C!--  通过name与上面servlet标签进行匹配，展示响应的类-->\n        \u003Cservlet-name>BookListServlet\u003C\u002Fservlet-name>\n        \u003C!--  用户通过此url来访问对应的类  -->\n        \u003Curl-pattern>\u002Fbook-list\u003C\u002Furl-pattern>\n    \u003C\u002Fservlet-mapping>\n\u003C\u002Fweb-app>\n",[37744],{"type":20,"tag":84,"props":37745,"children":37746},{"__ignoreMap":8},[37747],{"type":25,"value":37742},{"type":20,"tag":18942,"props":37749,"children":37751},{"id":37750},"基于注解配置servlet",[37752],{"type":25,"value":37753},"基于注解配置Servlet",{"type":20,"tag":44,"props":37755,"children":37756},{},[37757,37778],{"type":20,"tag":48,"props":37758,"children":37759},{},[37760,37762,37768,37770,37776],{"type":25,"value":37761},"在创建的Servlet类上添加",{"type":20,"tag":84,"props":37763,"children":37765},{"className":37764},[],[37766],{"type":25,"value":37767},"@WebServlet",{"type":25,"value":37769},"注解，在注解后的参数中配置url，url也必须是以",{"type":20,"tag":84,"props":37771,"children":37773},{"className":37772},[],[37774],{"type":25,"value":37775},"\u002F",{"type":25,"value":37777},"开头",{"type":20,"tag":48,"props":37779,"children":37780},{},[37781,37782],{"type":25,"value":37739},{"type":20,"tag":126,"props":37783,"children":37785},{"code":37784},"\u002F\u002F 注解\n@WebServlet(\"\u002Fbook-query\")\npublic class BookQueryServlet extends HttpServlet {\n​\n    @Override\n    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        \u002F\u002F super.doGet(req, resp);\n        System.out.println(\"BookQueryServlet===========doGet\");\n    }\n​\n    @Override\n    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        \u002F\u002F super.doPost(req, resp);\n        System.out.println(\"BookQueryServlet===========doPost\");\n    }\n  \n}\n",[37786],{"type":20,"tag":84,"props":37787,"children":37788},{"__ignoreMap":8},[37789],{"type":25,"value":37784},{"type":20,"tag":11085,"props":37791,"children":37793},{"id":37792},"idea部署web项目",[37794],{"type":25,"value":37795},"IDEA部署web项目",{"type":20,"tag":6665,"props":37797,"children":37798},{},[37799],{"type":20,"tag":21,"props":37800,"children":37801},{},[37802],{"type":25,"value":37803},"IDEA版本：2022.2",{"type":20,"tag":5719,"props":37805,"children":37806},{},[37807,37819,37831,37843,37855,37881],{"type":20,"tag":48,"props":37808,"children":37809},{},[37810,37812,37815],{"type":25,"value":37811},"配置项目",{"type":20,"tag":9908,"props":37813,"children":37814},{},[],{"type":20,"tag":11159,"props":37816,"children":37818},{"alt":37233,"src":37817},"https:\u002F\u002Fp1-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F05ca05b138804d18ae8fae36d8073045~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":48,"props":37820,"children":37821},{},[37822,37824,37827],{"type":25,"value":37823},"部署项目",{"type":20,"tag":9908,"props":37825,"children":37826},{},[],{"type":20,"tag":11159,"props":37828,"children":37830},{"alt":37233,"src":37829},"https:\u002F\u002Fp3-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Ffc1c0358fa2542e0b81d62dde42bb574~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":48,"props":37832,"children":37833},{},[37834,37836,37839],{"type":25,"value":37835},"配置web项目的访问路径",{"type":20,"tag":9908,"props":37837,"children":37838},{},[],{"type":20,"tag":11159,"props":37840,"children":37842},{"alt":37233,"src":37841},"https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fb2cb26f6bf1244f8ae48ebe77139d872~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":48,"props":37844,"children":37845},{},[37846,37848,37851],{"type":25,"value":37847},"添加展示的页面",{"type":20,"tag":9908,"props":37849,"children":37850},{},[],{"type":20,"tag":11159,"props":37852,"children":37854},{"alt":37233,"src":37853},"https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F8e047ac0021241ae98678ae804066822~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":48,"props":37856,"children":37857},{},[37858,37860],{"type":25,"value":37859},"启动Tomcat",{"type":20,"tag":6665,"props":37861,"children":37862},{},[37863,37868],{"type":20,"tag":21,"props":37864,"children":37865},{},[37866],{"type":25,"value":37867},"点击IDEA启动按钮即可",{"type":20,"tag":44,"props":37869,"children":37870},{},[37871,37876],{"type":20,"tag":48,"props":37872,"children":37873},{},[37874],{"type":25,"value":37875},"播放按钮：直接运行",{"type":20,"tag":48,"props":37877,"children":37878},{},[37879],{"type":25,"value":37880},"甲壳虫：debug运行",{"type":20,"tag":48,"props":37882,"children":37883},{},[37884,37886],{"type":25,"value":37885},"Tomcat启动完成",{"type":20,"tag":44,"props":37887,"children":37888},{},[37889,37894,37899,37903],{"type":20,"tag":48,"props":37890,"children":37891},{},[37892],{"type":25,"value":37893},"构建web项目",{"type":20,"tag":48,"props":37895,"children":37896},{},[37897],{"type":25,"value":37898},"将web项目拷贝到Tomcat",{"type":20,"tag":48,"props":37900,"children":37901},{},[37902],{"type":25,"value":37859},{"type":20,"tag":48,"props":37904,"children":37905},{},[37906,37908,37914],{"type":25,"value":37907},"打开浏览器，访问当前项目首页（如：",{"type":20,"tag":101,"props":37909,"children":37912},{"href":37910,"rel":37911},"http:\u002F\u002Flocalhost:8080\u002Fdemo1\u002Fbook-list",[105],[37913],{"type":25,"value":37910},{"type":25,"value":31179},{"type":20,"tag":21,"props":37916,"children":37917},{},[37918],{"type":25,"value":37531},{"type":20,"tag":21,"props":37920,"children":37921},{},[37922],{"type":20,"tag":11159,"props":37923,"children":37925},{"alt":37233,"src":37924},"https:\u002F\u002Fp1-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F5f808dc099a94197a4c6e251bfbda9f7~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":11085,"props":37927,"children":37929},{"id":37928},"响应给客户端数据",[37930],{"type":25,"value":37928},{"type":20,"tag":126,"props":37932,"children":37934},{"code":37933},"@WebServlet(\"\u002Fbook-query\")\npublic class BookQueryServlet extends HttpServlet {\n​\n    @Override\n    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        \u002F\u002F super.doGet(req, resp);\n        System.out.println(\"BookQueryServlet===========doGet\");\n​\n        \u002F\u002F 1. 接收到浏览器请求时传递的图书ID（bookId）\n        String bookId = req.getParameter(\"bookId\");\n​\n        \u002F\u002F 2. 根据bid查询数据库图书编（伪代码）\n        Map\u003CString, Book> bookMap = new HashMap\u003C>();\n        bookMap.put(\"1001\", new Book(\"1001\", \"Java\", \"张三\", 111.2, \"\u002Fsrc\"));\n        bookMap.put(\"1002\", new Book(\"1002\", \"JavaScript\", \"李四\", 110.2, \"\u002Fsrc\"));\n        bookMap.put(\"1003\", new Book(\"1003\", \"Go\", \"王五\", 210.2, \"\u002Fsrc\"));\n​\n        Book book = bookMap.get(bookId);\n        System.out.println(book.getBookAuthor());\n        \u002F\u002F 3. 将网页响应给浏览器\n        PrintWriter writer = resp.getWriter();\n        writer.println(book.getBookId() + \"  bookId\");\n        writer.println(book.getBookName() + \"   bookName\");\n        writer.println(book.getBookAuthor() + \"  bookAuthor\");\n        writer.println(book.getBookPrice() + \"   bookPrice\");\n        writer.println(book.getBookImgPath() + \"   bookImgPath\");\n        writer.flush();\n        writer.close();\n    }\n​\n    @Override\n    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        \u002F\u002F super.doPost(req, resp);\n        System.out.println(\"BookQueryServlet===========doPost\");\n    }\n}\n",[37935],{"type":20,"tag":84,"props":37936,"children":37937},{"__ignoreMap":8},[37938],{"type":25,"value":37933},{"type":20,"tag":28,"props":37940,"children":37942},{"id":37941},"servlet原理解析",[37943],{"type":25,"value":37944},"Servlet原理解析",{"type":20,"tag":11085,"props":37946,"children":37948},{"id":37947},"servlet响应流程",[37949],{"type":25,"value":37950},"Servlet响应流程",{"type":20,"tag":6665,"props":37952,"children":37953},{},[37954],{"type":20,"tag":21,"props":37955,"children":37956},{},[37957],{"type":25,"value":37958},"Servlet是Tomcat上的一个资源",{"type":20,"tag":21,"props":37960,"children":37961},{},[37962],{"type":20,"tag":11159,"props":37963,"children":37965},{"alt":37233,"src":37964},"https:\u002F\u002Fp3-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fe668014a438646cc80f9b30ede6dc8dc~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":11085,"props":37967,"children":37969},{"id":37968},"servlet实例的生命周期",[37970],{"type":25,"value":37971},"Servlet实例的生命周期",{"type":20,"tag":6665,"props":37973,"children":37974},{},[37975,37980],{"type":20,"tag":21,"props":37976,"children":37977},{},[37978],{"type":25,"value":37979},"当客户端的请求到达Tomcat，Tomcat会创建一个线程来接收、处理、响应客户端请求，客户端在请求某个Servlet类时，线程需要通过这个Servlet类的实例来调用Servlet方法，调用doGet\u002FdoPost...方法来处理响应请求，最后调用destroy销毁实例",{"type":20,"tag":21,"props":37981,"children":37982},{},[37983],{"type":25,"value":37984},"servlet实例的生命周期的是一个Servlet类的实例从创建到销毁的过程：加载 ==> 初始化 ==> 服务 ==> 销毁",{"type":20,"tag":21,"props":37986,"children":37987},{},[37988,37993],{"type":20,"tag":33,"props":37989,"children":37990},{},[37991],{"type":25,"value":37992},"加载：",{"type":25,"value":37994}," 用户请求Servlet的时候，Servlet容器会检查是否已经加载并实例化该Servlet类，如果没有就会加载并初始化Servlet类。",{"type":20,"tag":21,"props":37996,"children":37997},{},[37998,38003],{"type":20,"tag":33,"props":37999,"children":38000},{},[38001],{"type":25,"value":38002},"初始化：",{"type":25,"value":38004}," Servlet实例创建成功，Servlet容器就会调用Serlvet的init方法，在这个方法中，Servlet可以做一些初始化的事情，如：读取配置文件，连接数据库，创建数据库连接池。",{"type":20,"tag":21,"props":38006,"children":38007},{},[38008],{"type":20,"tag":33,"props":38009,"children":38010},{},[38011],{"type":25,"value":38012},"服务：",{"type":20,"tag":21,"props":38014,"children":38015},{},[38016],{"type":25,"value":38017},"请求到达Servlet，容器就会调用Servlet的service方法，在这个方法中，Servlet可以根据请求方法去调用不同的方法，如：doGet\u002FdoPost。，然后生成相应的响应。",{"type":20,"tag":21,"props":38019,"children":38020},{},[38021],{"type":20,"tag":33,"props":38022,"children":38023},{},[38024],{"type":25,"value":38025},"销毁：",{"type":20,"tag":21,"props":38027,"children":38028},{},[38029],{"type":25,"value":38030},"当关闭服务器时，容器就是调用Servlet上的destroy方法，用来销毁Servlet实例，在这个方法中，可以用来做一些收尾的工作，比如：释放资源、关闭数据库连接、关闭线程等。",{"type":20,"tag":126,"props":38032,"children":38034},{"code":38033},"public class BookListServlet extends HttpServlet {\n  \n    \u002F\u002F 初始化\n    @Override\n    public void init(ServletConfig config) throws ServletException {\n        System.out.println(\"初始化Servlet\");\n        super.init(config);\n    }\n      \n    \u002F\u002F 2. 服务 GenericServlet类上的\n    @Override\n    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {\n        super.service(req, res);\n    }\n​\n    \u002F\u002F 3. 服务 HttpServlet类上的\n    @Override\n    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        super.service(req, resp);\n    }\n​\n    \u002F\u002F 4. 处理请求\n    @Override\n    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n        \u002F\u002F 在这里可以进行jdbc的数据库操作\n        System.out.println(\"BookListServlet==========doGet\");\n    }\n  \n    \u002F\u002F  5. 销毁\n    @Override\n    public void destroy() {\n        System.out.println(\"实例被销毁了\");\n    }\n}\n",[38035],{"type":20,"tag":84,"props":38036,"children":38037},{"__ignoreMap":8},[38038],{"type":25,"value":38033},{"type":20,"tag":5719,"props":38040,"children":38041},{"start":10630},[38042,38047,38069],{"type":20,"tag":48,"props":38043,"children":38044},{},[38045],{"type":25,"value":38046},"Servlet类是单实例多线程的，一个Servlet类自始至终只会创建一个对象",{"type":20,"tag":48,"props":38048,"children":38049},{},[38050,38052,38057,38063,38064,38067],{"type":25,"value":38051},"如果当前Servlet类",{"type":20,"tag":33,"props":38053,"children":38054},{},[38055],{"type":25,"value":38056},"没有配置",{"type":20,"tag":84,"props":38058,"children":38060},{"className":38059},[],[38061],{"type":25,"value":38062},"\u003Cload-on-startup>1\u003C\u002Fload-on-startup>",{"type":25,"value":146},{"type":20,"tag":9908,"props":38065,"children":38066},{},[],{"type":25,"value":38068},"当客户端第一次请求Servlet时，创建当前Servlet类的实例，然后使用这个实例调用service(ServletRequest、ServletResponse)方法--service(HttpServletRequest、HttpServletResponse)方法--doGet\u002FdoPost处理客户端请求；当客户端请求再次到达时将不会重新创建Servlet实力，直接视同第一次创建的实例调用方法进行响应",{"type":20,"tag":48,"props":38070,"children":38071},{},[38072,38073,38083,38085,38088],{"type":25,"value":38051},{"type":20,"tag":33,"props":38074,"children":38075},{},[38076,38078],{"type":25,"value":38077},"配置了",{"type":20,"tag":84,"props":38079,"children":38081},{"className":38080},[],[38082],{"type":25,"value":38062},{"type":25,"value":38084}," ：",{"type":20,"tag":9908,"props":38086,"children":38087},{},[],{"type":25,"value":38089},"当服务器启动时就会创建Servlet类的实例，无论客户端是第一次请求这个Servlet类，还是再次请求都不会创建Servlet类实例，直接使用服务器启动时创建的Servlet实例来接收、处理、响应客户端请求",{"type":20,"tag":21,"props":38091,"children":38092},{},[38093],{"type":20,"tag":33,"props":38094,"children":38095},{},[38096],{"type":25,"value":38097},"配置load-on-startup的两种方式：",{"type":20,"tag":44,"props":38099,"children":38100},{},[38101,38114],{"type":20,"tag":48,"props":38102,"children":38103},{},[38104,38106],{"type":25,"value":38105},"xml配置",{"type":20,"tag":126,"props":38107,"children":38109},{"code":38108},"\u003C!--  servlet标签：配置类标签  -->\n\u003Cservlet>\n    \u003Cservlet-name>BookListServlet\u003C\u002Fservlet-name>\n    \u003Cservlet-class>com.example.learnservlet.BookListServlet\u003C\u002Fservlet-class>\n    \u003C!-- 如果有多个Serlvet都配置了load-on-startup，里面的数字就是在服务器中创建实例的顺序-->\n    \u003Cload-on-startup>1\u003C\u002Fload-on-startup>\n\u003C\u002Fservlet>\n​\n\u003C!--servlet-mapping标签：配置url-->\n\u003Cservlet-mapping>\n    \u003C!--  通过name与上面servlet标签进行匹配，展示响应的类-->\n    \u003Cservlet-name>BookListServlet\u003C\u002Fservlet-name>\n    \u003C!--  用户通过此url来访问对应的类  -->\n    \u003Curl-pattern>\u002Fbook-list\u003C\u002Furl-pattern>\n\u003C\u002Fservlet-mapping>\n",[38110],{"type":20,"tag":84,"props":38111,"children":38112},{"__ignoreMap":8},[38113],{"type":25,"value":38108},{"type":20,"tag":48,"props":38115,"children":38116},{},[38117,38119],{"type":25,"value":38118},"注解配置",{"type":20,"tag":126,"props":38120,"children":38122},{"code":38121},"@WebServlet(value = \"\u002Fbook-query\",loadOnStartup = 1)\n",[38123],{"type":20,"tag":84,"props":38124,"children":38125},{"__ignoreMap":8},[38126],{"type":25,"value":38121},{"type":20,"tag":11085,"props":38128,"children":38130},{"id":38129},"线程安全问题",[38131],{"type":25,"value":38129},{"type":20,"tag":6665,"props":38133,"children":38134},{},[38135],{"type":20,"tag":21,"props":38136,"children":38137},{},[38138],{"type":25,"value":38139},"因为Servlet实例是单例模式，当多个客户端并发访问同一个Servlet类时，Tomcat会创建多个线程，多个线程会使用同一个Servlet实例，有可能会导致线程安全问题",{"type":20,"tag":18942,"props":38141,"children":38143},{"id":38142},"方案一实现singlethreadmode接口",[38144],{"type":25,"value":38145},"方案一：实现SingleThreadMode接口",{"type":20,"tag":6665,"props":38147,"children":38148},{},[38149],{"type":20,"tag":21,"props":38150,"children":38151},{},[38152],{"type":25,"value":38153},"我们可以让Servlet类实现SingleThreadMode接口，每个线程都会创建servlet实例，避免了多线程使用通过Servlet实例的请求，但是使用这种方式会导致对客户端的请求响应效率变低，增加了服务器因频繁创建和销毁Serlvet实例的开销，因为此种方式不建议使用，已经过时",{"type":20,"tag":18942,"props":38155,"children":38157},{"id":38156},"方案二使用syncchron同步锁",[38158],{"type":25,"value":38159},"方案二：使用syncchron同步锁",{"type":20,"tag":126,"props":38161,"children":38163},{"code":38162},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {\n    synchronized (this) {\n        \u002F\u002F 业务代码\n    }\n}\n",[38164],{"type":20,"tag":84,"props":38165,"children":38166},{"__ignoreMap":8},[38167],{"type":25,"value":38162},{"type":20,"tag":18942,"props":38169,"children":38171},{"id":38170},"建议在servlet实例中尽量不使用成员变量",[38172],{"type":25,"value":38173},"建议：在Servlet实例中尽量不使用成员变量",{"type":20,"tag":6665,"props":38175,"children":38176},{},[38177],{"type":20,"tag":21,"props":38178,"children":38179},{},[38180],{"type":25,"value":38181},"如果将变量定义为成员变量，则这个变量在多个线程中是共享的，就有可能因为多个线程同时修改这个变量导致并发问题，因此我们可以将变量定义在处理业务的doXxx方法中，定义为局部变量之后，每个线程都有属于自己的局部变量",{"type":20,"tag":28,"props":38183,"children":38185},{"id":38184},"servlet开发技术",[38186],{"type":25,"value":38187},"Servlet开发技术",{"type":20,"tag":11085,"props":38189,"children":38191},{"id":38190},"request对象",[38192],{"type":25,"value":38193},"Request对象",{"type":20,"tag":6665,"props":38195,"children":38196},{},[38197,38209,38214],{"type":20,"tag":21,"props":38198,"children":38199},{},[38200,38202,38208],{"type":25,"value":38201},"也就是",{"type":20,"tag":84,"props":38203,"children":38205},{"className":38204},[],[38206],{"type":25,"value":38207},"(HttpServletRequest)",{"type":25,"value":16567},{"type":20,"tag":21,"props":38210,"children":38211},{},[38212],{"type":25,"value":38213},"我们在Servlet类中的doGet\u002FdoPost\u002FdoXxx方法中通过request对象接收客户端请求信息",{"type":20,"tag":21,"props":38215,"children":38216},{},[38217],{"type":25,"value":38218},"客户端向服务器发送的请求信息都会被封装到request对象，request(HttpServeltRequest类)提供了多个方法可以用于获取http请求中的数据",{"type":20,"tag":18942,"props":38220,"children":38222},{"id":38221},"get请求",[38223],{"type":25,"value":38221},{"type":20,"tag":126,"props":38225,"children":38227},{"code":38226},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n    System.out.println(\"get请求\");\n​\n    \u002F* 获取请求行数据 *\u002F\n    \u002F\u002F 获取请求方法\n    String method = req.getMethod();\n    \u002F\u002F 获取请求url\n    String requestURI = req.getRequestURI();\n    \u002F\u002F 获取请求行中url参数，根据参数的key获取参数的value\n    String k1 = req.getParameter(\"k1\");\n    \u002F\u002F 获取客户端提交数据的协议及版本\n    String protocol = req.getProtocol();\n​\n    \u002F* 获取请求头数据 *\u002F\n    \u002F\u002F 获取请求头中所有key\n    Enumeration\u003CString> headerNames = req.getHeaderNames();\n    while (headerNames.hasMoreElements()) {\n        String key = headerNames.nextElement();\n        String header = req.getHeader(key);\n​\n        \u002F\u002F 打印结果\n        System.out.println(\"key\" + key);\n        System.out.println(\"header\" + header);\n    }\n​\n    \u002F\u002F 打印结果\n    System.out.println(\"getMethod======\" + method);  \u002F\u002F getMethod======GET\n    System.out.println(\"getRequestURI======\" + requestURI);  \u002F\u002F getRequestURI======\u002Fdemo1\u002Ftest\n    System.out.println(\"getParameter======\" + k1);  \u002F\u002F getParameter======v1\n    System.out.println(\"getProtocol======\" + protocol);  \u002F\u002F getProtocol======HTTP\u002F1.1s\n}\n",[38228],{"type":20,"tag":84,"props":38229,"children":38230},{"__ignoreMap":8},[38231],{"type":25,"value":38226},{"type":20,"tag":18942,"props":38233,"children":38235},{"id":38234},"post请求",[38236],{"type":25,"value":38234},{"type":20,"tag":6665,"props":38238,"children":38239},{},[38240],{"type":20,"tag":21,"props":38241,"children":38242},{},[38243],{"type":25,"value":38244},"post请求也可以用req.getParameter(\"key\")接收参数",{"type":20,"tag":126,"props":38246,"children":38248},{"code":38247},"@Override\nprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    \u002F* 获取请求正文 *\u002F\n    ServletInputStream inputStream = req.getInputStream();\n    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));\n​\n    \u002F\u002F 读取请求正文\n    String s = reader.readLine();\n    System.out.println(s);\n  \n    \u002F* 也可以用getParameter接收参数*\u002F\n    String firstname = req.getParameter(\"firstname\");\n    String lastname = req.getParameter(\"lastname\");\n​\n    System.out.println(firstname);\n    System.out.println(lastname);\n}\n",[38249],{"type":20,"tag":84,"props":38250,"children":38251},{"__ignoreMap":8},[38252],{"type":25,"value":38247},{"type":20,"tag":18942,"props":38254,"children":38256},{"id":38255},"request对象处理中文乱码问题",[38257],{"type":25,"value":38255},{"type":20,"tag":6665,"props":38259,"children":38260},{},[38261],{"type":20,"tag":21,"props":38262,"children":38263},{},[38264],{"type":25,"value":38265},"客户端向服务器的Serlvet类提交数据中包含中文，可能会出现中文乱码",{"type":20,"tag":21,"props":38267,"children":38268},{},[38269],{"type":20,"tag":33,"props":38270,"children":38271},{},[38272],{"type":25,"value":38273},"1. 为什么会出现乱码",{"type":20,"tag":21,"props":38275,"children":38276},{},[38277],{"type":20,"tag":11159,"props":38278,"children":38280},{"alt":37233,"src":38279},"https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fcd065e1db89149808a515cae41024ebc~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":21,"props":38282,"children":38283},{},[38284],{"type":25,"value":38285},"客户端提交的数据通过网络发送给服务器，传输的过程数据通常会进行编码，服务器会对数据进行解码；如果服务器使用的解码方法与网页的编码方式不同，将会导致服务器的解码出现乱码",{"type":20,"tag":21,"props":38287,"children":38288},{},[38289],{"type":20,"tag":33,"props":38290,"children":38291},{},[38292],{"type":25,"value":38293},"2. get方式提交数据的乱码问题",{"type":20,"tag":126,"props":38295,"children":38297},{"code":38296},"\u003CConnector port=\"8080\" protocol=\"HTTP\u002F1.1\"\n           connectionTimeout=\"20000\"\n           redirectPort=\"8443\"\n     URIEncoding=\"utf-8\" \u002F>\n",[38298],{"type":20,"tag":84,"props":38299,"children":38300},{"__ignoreMap":8},[38301],{"type":25,"value":38296},{"type":20,"tag":21,"props":38303,"children":38304},{},[38305],{"type":20,"tag":33,"props":38306,"children":38307},{},[38308],{"type":25,"value":38309},"3. post方式提交数据的乱码问题",{"type":20,"tag":126,"props":38311,"children":38313},{"code":38312},"@Override\nprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    \u002F* 处理中文乱码问题*\u002F\n    req.setCharacterEncoding(\"utf-8\");\n​\n    \u002F* 也可以用getParameter接收参数 *\u002F\n    String firstname = req.getParameter(\"firstname\");\n    String lastname = req.getParameter(\"lastname\");\n​\n    System.out.println(firstname);\n    System.out.println(lastname);\n}\n",[38314],{"type":20,"tag":84,"props":38315,"children":38316},{"__ignoreMap":8},[38317],{"type":25,"value":38312},{"type":20,"tag":11085,"props":38319,"children":38321},{"id":38320},"response对象",[38322],{"type":25,"value":38323},"Response对象",{"type":20,"tag":6665,"props":38325,"children":38326},{},[38327],{"type":20,"tag":21,"props":38328,"children":38329},{},[38330],{"type":25,"value":38331},"Servlet类中doGet\u002FdoPost等方法都有一个HttpServletResponse对象，用于响应客户端请求",{"type":20,"tag":21,"props":38333,"children":38334},{},[38335],{"type":20,"tag":33,"props":38336,"children":38337},{},[38338],{"type":25,"value":38339},"常用方法：",{"type":20,"tag":126,"props":38341,"children":38343},{"code":38342},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n    \u002F* 设置状态行*\u002F\n    resp.setStatus(200);\n​\n    \u002F* 设置响应头 *\u002F\n    \u002F\u002F 设置响应客户端的数据格式\n    resp.setContentType(\"text\u002Fhtml\");\n    \u002F\u002F 设置响应客户端的数据长度(一般无需设置)\n    \u002F\u002F resp.setContentLength(1024);\n    \u002F\u002F 设置其他响应头属性\n    resp.setHeader(\"connection\", \"keep-alive\");\n​\n    \u002F* 设置响应正文 *\u002F\n    \u002F\u002F 设置响应客户端的数据编码格式\n    resp.setCharacterEncoding(\"utf-8\");\n    \u002F\u002F 通过response对象获取输出流\n    \u002F\u002F 字节流（如果要响应文件数据给客户端，则需要使用字节流）\n    \u002F\u002F ServletOutputStream outputStream = resp.getOutputStream();\n    \u002F\u002F 字符流（如果响应文本数据-HTML文档，则使用字符流）\n    PrintWriter writer = resp.getWriter();\n    \u002F\u002F 通过流学出的数据，就会以响应正文的形式传输给客户端浏览器，如果浏览器可以识别数据，则直接显示\n    writer.println(\"我是响应内容\");\n    writer.flush();\n    writer.close();\n}\n",[38344],{"type":20,"tag":84,"props":38345,"children":38346},{"__ignoreMap":8},[38347],{"type":25,"value":38342},{"type":20,"tag":11085,"props":38349,"children":38351},{"id":38350},"cookie的使用",[38352],{"type":25,"value":38353},"Cookie的使用",{"type":20,"tag":44,"props":38355,"children":38356},{},[38357,38362,38367,38372],{"type":20,"tag":48,"props":38358,"children":38359},{},[38360],{"type":25,"value":38361},"Cookie是在浏览器在访问web服务器上的某个资源时，由web服务器在响应浏览器时通过响应头附带给浏览器并且存储在浏览端的一小段数据",{"type":20,"tag":48,"props":38363,"children":38364},{},[38365],{"type":25,"value":38366},"一旦浏览器保存来自某个服务器的Cookie，浏览器再次访问该服务器，会通过请求头将Cookie传递给web服务器",{"type":20,"tag":48,"props":38368,"children":38369},{},[38370],{"type":25,"value":38371},"浏览器访问服务器的时候，只会携带当前服务器存储在浏览器的Cookie",{"type":20,"tag":48,"props":38373,"children":38374},{},[38375],{"type":25,"value":38376},"Cookie中缓存的数据是以键值对存储的（key-value）",{"type":20,"tag":18942,"props":38378,"children":38380},{"id":38379},"将cookie写给浏览器",[38381],{"type":25,"value":38382},"将Cookie写给浏览器",{"type":20,"tag":6665,"props":38384,"children":38385},{},[38386],{"type":20,"tag":21,"props":38387,"children":38388},{},[38389],{"type":25,"value":38390},"服务器可以向浏览器存储多个Cookie",{"type":20,"tag":126,"props":38392,"children":38394},{"code":38393},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {\n​\n    \u002F* 创建Cookie *\u002F\n    Cookie cookie = new Cookie(\"key1\", \"value1\");\n​\n    \u002F* 设置生命周期 *\u002F\n    \u002F\u002F 1. 设置>0，表示Cookie有效时间，单位s\n    \u002F\u002F 2. 设置=0，表示浏览器关闭销毁Cookie\n    \u002F\u002F 3. 设置-1，表示内存存储\n    cookie.setMaxAge(24 * 60 * 60);\n​\n    \u002F* 将Cookie响应给客户端 *\u002F\n    resp.addCookie(cookie);\n​\n    \u002F* 设置响应信息 *\u002F\n    resp.setContentType(\"text\u002Fhtml\");\n    resp.setHeader(\"connection\", \"keep-alive\");\n​\n    resp.setCharacterEncoding(\"utf-8\");\n    PrintWriter writer = resp.getWriter();\n    \u002F\u002F 通过流学出的数据，就会以响应正文的形式传输给客户端浏览器，如果浏览器可以识别数据，则直接显示\n    writer.println(\"我是响应内容\");\n    writer.flush();\n    writer.close();\n}\n",[38395],{"type":20,"tag":84,"props":38396,"children":38397},{"__ignoreMap":8},[38398],{"type":25,"value":38393},{"type":20,"tag":18942,"props":38400,"children":38402},{"id":38401},"从浏览器请求中读取cookie",[38403],{"type":25,"value":38404},"从浏览器请求中读取Cookie",{"type":20,"tag":126,"props":38406,"children":38408},{"code":38407},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {\n​\n    Cookie[] cookies = req.getCookies();\n    for (Cookie cookie : cookies) {\n        if (Objects.equals(cookie.getName(), \"key1\")) {\n            System.out.println(\"存储的Cookie为\" + cookie.getValue());\n        }\n​\n    }\n}\n",[38409],{"type":20,"tag":84,"props":38410,"children":38411},{"__ignoreMap":8},[38412],{"type":25,"value":38407},{"type":20,"tag":18942,"props":38414,"children":38416},{"id":38415},"cookie的优点与限制",[38417],{"type":25,"value":38418},"Cookie的优点与限制",{"type":20,"tag":21,"props":38420,"children":38421},{},[38422],{"type":20,"tag":33,"props":38423,"children":38424},{},[38425],{"type":25,"value":34235},{"type":20,"tag":44,"props":38427,"children":38428},{},[38429,38434,38439],{"type":20,"tag":48,"props":38430,"children":38431},{},[38432],{"type":25,"value":38433},"可以配置过期时间",{"type":20,"tag":48,"props":38435,"children":38436},{},[38437],{"type":25,"value":38438},"简洁，cookie中存储的是最简单的键值对格式的文本数据",{"type":20,"tag":48,"props":38440,"children":38441},{},[38442],{"type":25,"value":38443},"数据的持久性，保存到浏览器中的cookie在过期之前是持久存储的",{"type":20,"tag":21,"props":38445,"children":38446},{},[38447],{"type":20,"tag":33,"props":38448,"children":38449},{},[38450],{"type":25,"value":38451},"缺点：",{"type":20,"tag":44,"props":38453,"children":38454},{},[38455,38460,38465],{"type":20,"tag":48,"props":38456,"children":38457},{},[38458],{"type":25,"value":38459},"存储数据的大小，大多数浏览器支持4K、8K的数据存储",{"type":20,"tag":48,"props":38461,"children":38462},{},[38463],{"type":25,"value":38464},"用户可以通过浏览器设置禁用Cookie，限制Cookie的使用场景",{"type":20,"tag":48,"props":38466,"children":38467},{},[38468],{"type":25,"value":38469},"Cookie存储在客户端浏览器中，有被篡改的风险，有潜在的安全隐患",{"type":20,"tag":11085,"props":38471,"children":38473},{"id":38472},"session对象",[38474],{"type":25,"value":38475},"Session对象",{"type":20,"tag":18942,"props":38477,"children":38479},{"id":38478},"session概述",[38480],{"type":25,"value":38481},"Session概述",{"type":20,"tag":6665,"props":38483,"children":38484},{},[38485],{"type":20,"tag":21,"props":38486,"children":38487},{},[38488],{"type":25,"value":38489},"Session对象，就是当浏览器向服务器发送请求建立连接后，由服务器穿件的存储在服务器用于记录用户状态的对象",{"type":20,"tag":44,"props":38491,"children":38492},{},[38493,38498],{"type":20,"tag":48,"props":38494,"children":38495},{},[38496],{"type":25,"value":38497},"服务器会为每个客户端连接分配一个Session对象，存储在服务器上",{"type":20,"tag":48,"props":38499,"children":38500},{},[38501],{"type":25,"value":38502},"同一个浏览器发送多次请求，同属于一次回话，共享同一个Session对象",{"type":20,"tag":18942,"props":38504,"children":38506},{"id":38505},"session原理",[38507],{"type":25,"value":38508},"Session原理",{"type":20,"tag":6665,"props":38510,"children":38511},{},[38512],{"type":20,"tag":21,"props":38513,"children":38514},{},[38515],{"type":25,"value":38516},"HTTP是无状态，同一个浏览器可以借助Cookie实现多次请求共享一个Session",{"type":20,"tag":21,"props":38518,"children":38519},{},[38520],{"type":20,"tag":11159,"props":38521,"children":38523},{"alt":37233,"src":38522},"https:\u002F\u002Fp3-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F60d1ba32358b4aca8de31250d250ab19~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":21,"props":38525,"children":38526},{},[38527],{"type":20,"tag":33,"props":38528,"children":38529},{},[38530],{"type":25,"value":38508},{"type":20,"tag":5719,"props":38532,"children":38533},{"start":10630},[38534,38539],{"type":20,"tag":48,"props":38535,"children":38536},{},[38537],{"type":25,"value":38538},"当客户端浏览器第一次请求服务器的时候，服务器会为客户端创建一个Session对象，同时将sessionID通过Cookie响应给客户端，并存储在客户端",{"type":20,"tag":48,"props":38540,"children":38541},{},[38542],{"type":25,"value":38543},"当客户端再次请求服务器的时候，请求头上会携带着存储着sessionID的cookie，服务器接收请求之后获取sessionID，通过这个sessionID获取第一次连接创建的Session对象",{"type":20,"tag":18942,"props":38545,"children":38547},{"id":38546},"session的数据操作",[38548],{"type":25,"value":38546},{"type":20,"tag":20294,"props":38550,"children":38552},{"id":38551},"生成session",[38553],{"type":25,"value":38551},{"type":20,"tag":126,"props":38555,"children":38557},{"code":38556},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) {\n    doPost(req, resp);\n}\n​\n@Override\nprotected void doPost(HttpServletRequest req, HttpServletResponse resp) {\n    \u002F* 1. 获取当前用户连接 *\u002F\n    HttpSession session = req.getSession();\n    \u002F* 2. 为当前连接生成sessionId *\u002F\n    String sessionId = session.getId();\n    session.setAttribute(\"key1\", sessionId);\n    System.out.println(\"sessionId\" + sessionId);\n}\n",[38558],{"type":20,"tag":84,"props":38559,"children":38560},{"__ignoreMap":8},[38561],{"type":25,"value":38556},{"type":20,"tag":20294,"props":38563,"children":38565},{"id":38564},"获取session",[38566],{"type":25,"value":38564},{"type":20,"tag":126,"props":38568,"children":38570},{"code":38569},"@Override\nprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n    \u002F* 获取连接 *\u002F\n    HttpSession session = req.getSession();\n​\n    \u002F* 取数据 *\u002F\n    String s1 = (String) session.getAttribute(\"key1\");\n    System.out.println(\"SecondSessionServlet===  \" + s1);\n}\n",[38571],{"type":20,"tag":84,"props":38572,"children":38573},{"__ignoreMap":8},[38574],{"type":25,"value":38569},{"type":20,"tag":20294,"props":38576,"children":38578},{"id":38577},"修改session",[38579],{"type":25,"value":38577},{"type":20,"tag":126,"props":38581,"children":38583},{"code":38582},"@Override\nprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n    \u002F* 获取连接 *\u002F\n    HttpSession session = req.getSession();\n​\n    \u002F* 修改数据 *\u002F\n    session.setAttribute(\"key1\", \"修改后的session\");\n}\n",[38584],{"type":20,"tag":84,"props":38585,"children":38586},{"__ignoreMap":8},[38587],{"type":25,"value":38582},{"type":20,"tag":20294,"props":38589,"children":38591},{"id":38590},"删除session",[38592],{"type":25,"value":38590},{"type":20,"tag":126,"props":38594,"children":38596},{"code":38595},"@Override\nprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n    \u002F* 获取连接 *\u002F\n    HttpSession session = req.getSession();\n​\n    \u002F* 删除数据 *\u002F\n    session.removeAttribute(\"key1\");\n}\n",[38597],{"type":20,"tag":84,"props":38598,"children":38599},{"__ignoreMap":8},[38600],{"type":25,"value":38595},{"type":20,"tag":18942,"props":38602,"children":38604},{"id":38603},"session对象失效",[38605],{"type":25,"value":38603},{"type":20,"tag":6665,"props":38607,"children":38608},{},[38609,38614],{"type":20,"tag":21,"props":38610,"children":38611},{},[38612],{"type":25,"value":38613},"一个客户端的多次请求正常情况下获取到的是同一个session对象，也正是因为多次请求获取的同一个session对象才实现了session中存储的用户状态可以作用于请求",{"type":20,"tag":21,"props":38615,"children":38616},{},[38617],{"type":25,"value":38618},"如果session失效，将会导致session失效后的请求无法获取之前的session对象，也就是说多次请求获取的不是同一个session",{"type":20,"tag":21,"props":38620,"children":38621},{},[38622],{"type":20,"tag":33,"props":38623,"children":38624},{},[38625],{"type":25,"value":38626},"导致session失效的原因有两种：",{"type":20,"tag":44,"props":38628,"children":38629},{},[38630,38635],{"type":20,"tag":48,"props":38631,"children":38632},{},[38633],{"type":25,"value":38634},"客户端禁用Cookie，或者客户端在两次请求之间清楚了cookie，将导致下一次请求无法获取上一次请求的创建的session对象",{"type":20,"tag":48,"props":38636,"children":38637},{},[38638],{"type":25,"value":38639},"session是有生命周期的，当客户端请求服务器会为此创建session对象，如果客户端两次请求的间隔时间 > session过期时间（默认30min），服务器会将之前创建的session对象销毁",{"type":20,"tag":11085,"props":38641,"children":38643},{"id":38642},"servletcontext对象",[38644],{"type":25,"value":38645},"ServletContext对象",{"type":20,"tag":6665,"props":38647,"children":38648},{},[38649],{"type":20,"tag":21,"props":38650,"children":38651},{},[38652],{"type":25,"value":38653},"也叫application对象。是JavaWeb项目的全局对象，包含当前web项目在web服务器中的信息，同事他也是一个域对象，可以实现访问当前web项目的所有用户之间的数据共享",{"type":20,"tag":44,"props":38655,"children":38656},{},[38657],{"type":20,"tag":48,"props":38658,"children":38659},{},[38660],{"type":25,"value":38661},"Request对象作用于一个用户请求，获取用户数据",{"type":20,"tag":44,"props":38663,"children":38664},{},[38665],{"type":20,"tag":48,"props":38666,"children":38667},{},[38668],{"type":25,"value":38669},"session对象作用于一个用户的多个请求，实现数据共享",{"type":20,"tag":44,"props":38671,"children":38672},{},[38673],{"type":20,"tag":48,"props":38674,"children":38675},{},[38676],{"type":25,"value":38677},"ServletContext对象作用于整个web项目，实现多个用户之间数据共享",{"type":20,"tag":21,"props":38679,"children":38680},{},[38681],{"type":20,"tag":11159,"props":38682,"children":38684},{"alt":37233,"src":38683},"https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fa5c3029cd2d84e36bf0ab24011dad897~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":18942,"props":38686,"children":38688},{"id":38687},"获取wen应用信息",[38689],{"type":25,"value":38687},{"type":20,"tag":126,"props":38691,"children":38693},{"code":38692},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    ServletContext servletContext = getServletContext();\n​\n    \u002F* 1. 获取当前web应用在web服务器上的访问路径 *\u002F\n    String contextPath = servletContext.getContextPath();\n    \u002F* 2. 获取web项目在服务器上的绝对路径 *\u002F\n    String realPath = servletContext.getRealPath(\"\u002Ffiles\");\n​\n    System.out.println(realPath);\n    System.out.println(\"contextPath\" + contextPath);\n}\n",[38694],{"type":20,"tag":84,"props":38695,"children":38696},{"__ignoreMap":8},[38697],{"type":25,"value":38692},{"type":20,"tag":18942,"props":38699,"children":38701},{"id":38700},"实现全局数据贡献",[38702],{"type":25,"value":38700},{"type":20,"tag":21,"props":38704,"children":38705},{},[38706],{"type":20,"tag":33,"props":38707,"children":38708},{},[38709],{"type":25,"value":38710},"存储数据",{"type":20,"tag":126,"props":38712,"children":38714},{"code":38713},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    String param = req.getParameter(\"param\");\n​\n    ServletContext servletContext = getServletContext();\n  \n    \u002F* 通过application全局对象存储数据 *\u002F\n    servletContext.setAttribute(\"aKey\", param);\n}\n",[38715],{"type":20,"tag":84,"props":38716,"children":38717},{"__ignoreMap":8},[38718],{"type":25,"value":38713},{"type":20,"tag":21,"props":38720,"children":38721},{},[38722],{"type":20,"tag":33,"props":38723,"children":38724},{},[38725],{"type":25,"value":38726},"取数据",{"type":20,"tag":6665,"props":38728,"children":38729},{},[38730],{"type":20,"tag":21,"props":38731,"children":38732},{},[38733],{"type":25,"value":38734},"取数据的时候你会发现无论用什么浏览器去访问这个地址，都可以取到相同的数据！",{"type":20,"tag":126,"props":38736,"children":38738},{"code":38737},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    ServletContext servletContext = getServletContext();\n​\n    \u002F* 获取通过全局对象存储的值 *\u002F\n    String aKey = (String) servletContext.getAttribute(\"aKey\");\n    System.out.println(aKey);\n}\n",[38739],{"type":20,"tag":84,"props":38740,"children":38741},{"__ignoreMap":8},[38742],{"type":25,"value":38737},{"type":20,"tag":21,"props":38744,"children":38745},{},[38746],{"type":20,"tag":33,"props":38747,"children":38748},{},[38749],{"type":25,"value":38750},"修改数据",{"type":20,"tag":126,"props":38752,"children":38754},{"code":38753},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    ServletContext servletContext = getServletContext();\n​\n    \u002F* 修改全局对象的数据 *\u002F\n    servletContext.setAttribute(\"aKey\",\"我是修改过后的数据\");\n}\n",[38755],{"type":20,"tag":84,"props":38756,"children":38757},{"__ignoreMap":8},[38758],{"type":25,"value":38753},{"type":20,"tag":21,"props":38760,"children":38761},{},[38762],{"type":20,"tag":33,"props":38763,"children":38764},{},[38765],{"type":25,"value":38766},"删数据",{"type":20,"tag":126,"props":38768,"children":38770},{"code":38769},"@Override\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n​\n    ServletContext servletContext = getServletContext();\n​\n    \u002F* 删除全局对象指定的数据 *\u002F\n    servletContext.removeAttribute(\"aKey\");\n}\n",[38771],{"type":20,"tag":84,"props":38772,"children":38773},{"__ignoreMap":8},[38774],{"type":25,"value":38769},{"type":20,"tag":18942,"props":38776,"children":38777},{"id":10044},[38778],{"type":25,"value":20163},{"type":20,"tag":44,"props":38780,"children":38781},{},[38782,38787,38792],{"type":20,"tag":48,"props":38783,"children":38784},{},[38785],{"type":25,"value":38786},"ServletContext是当前web项目的全局上下文对象，可以被多个用户请求共享",{"type":20,"tag":48,"props":38788,"children":38789},{},[38790],{"type":25,"value":38791},"ServletContext是服务器启动的时候创建的，当服务器关闭或者将项目从服务器移出时销毁ServletContext对象",{"type":20,"tag":48,"props":38793,"children":38794},{},[38795],{"type":25,"value":38796},"ServletContext可以实现在线人数统计等需要全局存储的场景",{"title":8,"searchDepth":169,"depth":169,"links":38798},[38799,38804],{"id":37224,"depth":169,"text":37227,"children":38800},[38801,38802,38803],{"id":25842,"depth":179,"text":25842},{"id":37359,"depth":179,"text":37359},{"id":37443,"depth":179,"text":37443},{"id":37541,"depth":169,"text":37544,"children":38805},[38806,38807,38808],{"id":37595,"depth":179,"text":37598},{"id":37941,"depth":179,"text":37944},{"id":38184,"depth":179,"text":38187},"content:articles:backend:tomcat-servlet.md","articles\u002Fbackend\u002Ftomcat-servlet.md","articles\u002Fbackend\u002Ftomcat-servlet",{"_path":38813,"_dir":15199,"_draft":7,"_partial":7,"_locale":8,"title":38814,"description":38815,"date":15754,"tags":38816,"body":38817,"_type":1800,"_id":55437,"_source":1802,"_file":55438,"_stem":55439,"_extension":1805},"\u002Farticles\u002Ffrontend\u002Fvue3typescript","Vue3 与 TypeScript 全面学习笔记","涵盖 Vue3 核心特性、组合式API、Vue Router、TypeScript 类型系统及两者配合使用的完整学习笔记",[14],{"type":17,"children":38818,"toc":55340},[38819,38824,38849,38854,38859,39068,39074,39079,39090,39096,39105,39110,39135,39139,39147,39152,39221,39226,39267,39275,39280,39744,39749,40008,40014,40019,40241,40246,40372,40377,40382,40387,40395,40439,40444,40452,40457,40465,40494,40502,40743,40749,40762,40854,40862,41002,41007,41060,41066,41129,41135,41140,41153,41158,41174,41179,41187,41253,41261,41266,41319,41324,41359,41364,41372,41614,41622,41865,41871,41879,42387,42392,42400,42405,42817,42825,43120,43125,44164,44169,44182,44796,44802,44815,45519,45524,45532,45959,46226,46231,46433,46439,46445,46453,46705,46710,46718,47012,47018,47026,47039,47449,47453,47578,47584,47589,47602,47610,47908,47916,48161,48167,48175,48180,48452,48460,48772,48778,48783,48803,48821,48826,48834,48879,48884,48898,48903,48933,48938,48943,49423,49428,49480,49485,49490,49495,49500,49508,49659,49667,49806,49812,49817,49835,49846,49852,49865,49965,49973,50065,50070,50219,50225,50230,50241,50369,50374,50379,50409,50414,50419,50449,50454,50462,50467,50472,50664,50669,50674,50719,50724,50729,50797,50802,50807,50815,51105,51110,51264,51269,51809,51814,51822,51827,51850,51855,51898,51903,51916,51939,51944,51949,52443,52448,52509,52514,52519,52527,52549,52553,52686,52690,52892,52897,52905,52980,52985,52993,53292,53300,53507,53512,53520,53639,53647,53776,53781,53789,53851,53856,53860,53873,54104,54109,54117,54125,54227,54232,54237,54245,54276,54283,54347,54353,54359,54380,54444,54450,54458,54478,54484,54492,54498,54503,54509,54562,54568,54574,54803,54809,54984,54990,55140,55146,55151,55232,55237,55330,55336],{"type":20,"tag":15759,"props":38820,"children":38822},{"id":38821},"vue-router打开新的页签",[38823],{"type":25,"value":38821},{"type":20,"tag":126,"props":38825,"children":38829},{"className":38826,"code":38827,"language":38828,"meta":8,"style":8},"language-plain shiki shiki-themes github-dark","const url = router.resolve('\u002FproTemperature')\nwindow.open(url.href, '_blank')\n","plain",[38830],{"type":20,"tag":84,"props":38831,"children":38832},{"__ignoreMap":8},[38833,38841],{"type":20,"tag":157,"props":38834,"children":38835},{"class":159,"line":160},[38836],{"type":20,"tag":157,"props":38837,"children":38838},{},[38839],{"type":25,"value":38840},"const url = router.resolve('\u002FproTemperature')\n",{"type":20,"tag":157,"props":38842,"children":38843},{"class":159,"line":169},[38844],{"type":20,"tag":157,"props":38845,"children":38846},{},[38847],{"type":25,"value":38848},"window.open(url.href, '_blank')\n",{"type":20,"tag":15759,"props":38850,"children":38852},{"id":38851},"uniapp",[38853],{"type":25,"value":38851},{"type":20,"tag":1863,"props":38855,"children":38857},{"id":38856},"样式穿透",[38858],{"type":25,"value":38856},{"type":20,"tag":126,"props":38860,"children":38864},{"className":38861,"code":38862,"language":38863,"meta":8,"style":8},"language-css shiki shiki-themes github-dark","::v-deep {\n  .select-annual {\n    .uni-select {\n      min-width: 150rpx;\n      background-color: #fff;\n      border: none;\n      border-radius: 0;\n      border-bottom-left-radius: 35rpx;\n      border-top-left-radius: 35rpx;\n    }\n  }\n}\n","css",[38865],{"type":20,"tag":84,"props":38866,"children":38867},{"__ignoreMap":8},[38868,38886,38903,38920,38942,38964,38985,39005,39026,39046,39053,39061],{"type":20,"tag":157,"props":38869,"children":38870},{"class":159,"line":160},[38871,38876,38881],{"type":20,"tag":157,"props":38872,"children":38873},{"style":892},[38874],{"type":25,"value":38875},"::",{"type":20,"tag":157,"props":38877,"children":38878},{"style":5667},[38879],{"type":25,"value":38880},"v-deep",{"type":20,"tag":157,"props":38882,"children":38883},{"style":892},[38884],{"type":25,"value":38885}," {\n",{"type":20,"tag":157,"props":38887,"children":38888},{"class":159,"line":169},[38889,38894,38899],{"type":20,"tag":157,"props":38890,"children":38891},{"style":892},[38892],{"type":25,"value":38893},"  .",{"type":20,"tag":157,"props":38895,"children":38896},{"style":260},[38897],{"type":25,"value":38898},"select-annual",{"type":20,"tag":157,"props":38900,"children":38901},{"style":892},[38902],{"type":25,"value":38885},{"type":20,"tag":157,"props":38904,"children":38905},{"class":159,"line":179},[38906,38911,38916],{"type":20,"tag":157,"props":38907,"children":38908},{"style":892},[38909],{"type":25,"value":38910},"    .",{"type":20,"tag":157,"props":38912,"children":38913},{"style":260},[38914],{"type":25,"value":38915},"uni-select",{"type":20,"tag":157,"props":38917,"children":38918},{"style":892},[38919],{"type":25,"value":38885},{"type":20,"tag":157,"props":38921,"children":38922},{"class":159,"line":188},[38923,38928,38932,38937],{"type":20,"tag":157,"props":38924,"children":38925},{"style":260},[38926],{"type":25,"value":38927},"      min-width",{"type":20,"tag":157,"props":38929,"children":38930},{"style":892},[38931],{"type":25,"value":908},{"type":20,"tag":157,"props":38933,"children":38934},{"style":260},[38935],{"type":25,"value":38936},"150",{"type":20,"tag":157,"props":38938,"children":38939},{"style":892},[38940],{"type":25,"value":38941},"rpx;\n",{"type":20,"tag":157,"props":38943,"children":38944},{"class":159,"line":196},[38945,38950,38954,38959],{"type":20,"tag":157,"props":38946,"children":38947},{"style":260},[38948],{"type":25,"value":38949},"      background-color",{"type":20,"tag":157,"props":38951,"children":38952},{"style":892},[38953],{"type":25,"value":908},{"type":20,"tag":157,"props":38955,"children":38956},{"style":260},[38957],{"type":25,"value":38958},"#fff",{"type":20,"tag":157,"props":38960,"children":38961},{"style":892},[38962],{"type":25,"value":38963},";\n",{"type":20,"tag":157,"props":38965,"children":38966},{"class":159,"line":204},[38967,38972,38976,38981],{"type":20,"tag":157,"props":38968,"children":38969},{"style":260},[38970],{"type":25,"value":38971},"      border",{"type":20,"tag":157,"props":38973,"children":38974},{"style":892},[38975],{"type":25,"value":908},{"type":20,"tag":157,"props":38977,"children":38978},{"style":260},[38979],{"type":25,"value":38980},"none",{"type":20,"tag":157,"props":38982,"children":38983},{"style":892},[38984],{"type":25,"value":38963},{"type":20,"tag":157,"props":38986,"children":38987},{"class":159,"line":213},[38988,38993,38997,39001],{"type":20,"tag":157,"props":38989,"children":38990},{"style":260},[38991],{"type":25,"value":38992},"      border-radius",{"type":20,"tag":157,"props":38994,"children":38995},{"style":892},[38996],{"type":25,"value":908},{"type":20,"tag":157,"props":38998,"children":38999},{"style":260},[39000],{"type":25,"value":10387},{"type":20,"tag":157,"props":39002,"children":39003},{"style":892},[39004],{"type":25,"value":38963},{"type":20,"tag":157,"props":39006,"children":39007},{"class":159,"line":222},[39008,39013,39017,39022],{"type":20,"tag":157,"props":39009,"children":39010},{"style":260},[39011],{"type":25,"value":39012},"      border-bottom-left-radius",{"type":20,"tag":157,"props":39014,"children":39015},{"style":892},[39016],{"type":25,"value":908},{"type":20,"tag":157,"props":39018,"children":39019},{"style":260},[39020],{"type":25,"value":39021},"35",{"type":20,"tag":157,"props":39023,"children":39024},{"style":892},[39025],{"type":25,"value":38941},{"type":20,"tag":157,"props":39027,"children":39028},{"class":159,"line":440},[39029,39034,39038,39042],{"type":20,"tag":157,"props":39030,"children":39031},{"style":260},[39032],{"type":25,"value":39033},"      border-top-left-radius",{"type":20,"tag":157,"props":39035,"children":39036},{"style":892},[39037],{"type":25,"value":908},{"type":20,"tag":157,"props":39039,"children":39040},{"style":260},[39041],{"type":25,"value":39021},{"type":20,"tag":157,"props":39043,"children":39044},{"style":892},[39045],{"type":25,"value":38941},{"type":20,"tag":157,"props":39047,"children":39048},{"class":159,"line":448},[39049],{"type":20,"tag":157,"props":39050,"children":39051},{"style":892},[39052],{"type":25,"value":872},{"type":20,"tag":157,"props":39054,"children":39055},{"class":159,"line":456},[39056],{"type":20,"tag":157,"props":39057,"children":39058},{"style":892},[39059],{"type":25,"value":39060},"  }\n",{"type":20,"tag":157,"props":39062,"children":39063},{"class":159,"line":465},[39064],{"type":20,"tag":157,"props":39065,"children":39066},{"style":892},[39067],{"type":25,"value":943},{"type":20,"tag":15759,"props":39069,"children":39071},{"id":39070},"vue3",[39072],{"type":25,"value":39073},"Vue3",{"type":20,"tag":1863,"props":39075,"children":39077},{"id":39076},"vue3小技巧",[39078],{"type":25,"value":39076},{"type":20,"tag":28,"props":39080,"children":39082},{"id":39081},"getcurrentinstance获取全局变量",[39083],{"type":20,"tag":39084,"props":39085,"children":39087},"font",{"style":39086},"color:rgb(34, 34, 38);",[39088],{"type":25,"value":39089},"getCurrentInstance获取全局变量",{"type":20,"tag":11085,"props":39091,"children":39093},{"id":39092},"在maints中定义全局变量",[39094],{"type":25,"value":39095},"在main.ts中定义全局变量",{"type":20,"tag":21,"props":39097,"children":39098},{},[39099],{"type":20,"tag":84,"props":39100,"children":39102},{"className":39101},[],[39103],{"type":25,"value":39104},"app.config.globalProperties.$api = '111'",{"type":20,"tag":11085,"props":39106,"children":39108},{"id":39107},"在页面中使用",[39109],{"type":25,"value":39107},{"type":20,"tag":126,"props":39111,"children":39115},{"className":39112,"code":39113,"language":39114,"meta":8,"style":8},"language-vue shiki shiki-themes github-dark","const { proxy } = getCurrentInstance() as ComponentInternalInstance;\nconsole.log(proxy.$api)\n","vue",[39116],{"type":20,"tag":84,"props":39117,"children":39118},{"__ignoreMap":8},[39119,39127],{"type":20,"tag":157,"props":39120,"children":39121},{"class":159,"line":160},[39122],{"type":20,"tag":157,"props":39123,"children":39124},{"style":892},[39125],{"type":25,"value":39126},"const { proxy } = getCurrentInstance() as ComponentInternalInstance;\n",{"type":20,"tag":157,"props":39128,"children":39129},{"class":159,"line":169},[39130],{"type":20,"tag":157,"props":39131,"children":39132},{"style":892},[39133],{"type":25,"value":39134},"console.log(proxy.$api)\n",{"type":20,"tag":28,"props":39136,"children":39137},{"id":25765},[39138],{"type":25,"value":25765},{"type":20,"tag":6665,"props":39140,"children":39141},{},[39142],{"type":20,"tag":21,"props":39143,"children":39144},{},[39145],{"type":25,"value":39146},"后代组件改变值，父组件也会跟着改变",{"type":20,"tag":21,"props":39148,"children":39149},{},[39150],{"type":25,"value":39151},"provide：",{"type":20,"tag":126,"props":39153,"children":39157},{"className":39154,"code":39155,"language":39156,"meta":8,"style":8},"language-javascript shiki shiki-themes github-dark","const message = ref('hello')\nprovide('message', message)\n","javascript",[39158],{"type":20,"tag":84,"props":39159,"children":39160},{"__ignoreMap":8},[39161,39199],{"type":20,"tag":157,"props":39162,"children":39163},{"class":159,"line":160},[39164,39170,39175,39180,39185,39190,39195],{"type":20,"tag":157,"props":39165,"children":39167},{"style":39166},"--shiki-default:#F97583",[39168],{"type":25,"value":39169},"const",{"type":20,"tag":157,"props":39171,"children":39172},{"style":260},[39173],{"type":25,"value":39174}," message",{"type":20,"tag":157,"props":39176,"children":39177},{"style":39166},[39178],{"type":25,"value":39179}," =",{"type":20,"tag":157,"props":39181,"children":39182},{"style":248},[39183],{"type":25,"value":39184}," ref",{"type":20,"tag":157,"props":39186,"children":39187},{"style":892},[39188],{"type":25,"value":39189},"(",{"type":20,"tag":157,"props":39191,"children":39192},{"style":254},[39193],{"type":25,"value":39194},"'hello'",{"type":20,"tag":157,"props":39196,"children":39197},{"style":892},[39198],{"type":25,"value":8926},{"type":20,"tag":157,"props":39200,"children":39201},{"class":159,"line":169},[39202,39207,39211,39216],{"type":20,"tag":157,"props":39203,"children":39204},{"style":248},[39205],{"type":25,"value":39206},"provide",{"type":20,"tag":157,"props":39208,"children":39209},{"style":892},[39210],{"type":25,"value":39189},{"type":20,"tag":157,"props":39212,"children":39213},{"style":254},[39214],{"type":25,"value":39215},"'message'",{"type":20,"tag":157,"props":39217,"children":39218},{"style":892},[39219],{"type":25,"value":39220},", message)\n",{"type":20,"tag":21,"props":39222,"children":39223},{},[39224],{"type":25,"value":39225},"inject：",{"type":20,"tag":126,"props":39227,"children":39229},{"className":39154,"code":39228,"language":39156,"meta":8,"style":8},"let message = inject('message')\n",[39230],{"type":20,"tag":84,"props":39231,"children":39232},{"__ignoreMap":8},[39233],{"type":20,"tag":157,"props":39234,"children":39235},{"class":159,"line":160},[39236,39241,39246,39250,39255,39259,39263],{"type":20,"tag":157,"props":39237,"children":39238},{"style":39166},[39239],{"type":25,"value":39240},"let",{"type":20,"tag":157,"props":39242,"children":39243},{"style":892},[39244],{"type":25,"value":39245}," message ",{"type":20,"tag":157,"props":39247,"children":39248},{"style":39166},[39249],{"type":25,"value":2261},{"type":20,"tag":157,"props":39251,"children":39252},{"style":248},[39253],{"type":25,"value":39254}," inject",{"type":20,"tag":157,"props":39256,"children":39257},{"style":892},[39258],{"type":25,"value":39189},{"type":20,"tag":157,"props":39260,"children":39261},{"style":254},[39262],{"type":25,"value":39215},{"type":20,"tag":157,"props":39264,"children":39265},{"style":892},[39266],{"type":25,"value":8926},{"type":20,"tag":28,"props":39268,"children":39270},{"id":39269},"小技巧",[39271,39274],{"type":20,"tag":1785,"props":39272,"children":39273},{},[],{"type":25,"value":39269},{"type":20,"tag":21,"props":39276,"children":39277},{},[39278],{"type":25,"value":39279},"属性名与css相同，属性值就是css属性值",{"type":20,"tag":126,"props":39281,"children":39283},{"className":39112,"code":39282,"language":39114,"meta":8,"style":8},"\u003Cscript setup>\n  const color = ref(\"green\");\n  const backgroundColor = ref(\"red\");\n\n  function changeColor() {\n    color.value = color.value === \"green\" ? \"pink\" : \"green\";\n    backgroundColor.value = backgroundColor.value === \"red\" ? \"blue\" : \"red\";\n  }\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"test-container\">\n    \u003Cp :style=\"{ color, backgroundColor }\" style=\"width: 100%; height: 300px\" @click=\"changeColor\">我会变颜色\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n",[39284],{"type":20,"tag":84,"props":39285,"children":39286},{"__ignoreMap":8},[39287,39308,39343,39376,39383,39401,39451,39498,39505,39521,39528,39544,39575,39713,39729],{"type":20,"tag":157,"props":39288,"children":39289},{"class":159,"line":160},[39290,39294,39299,39304],{"type":20,"tag":157,"props":39291,"children":39292},{"style":892},[39293],{"type":25,"value":36862},{"type":20,"tag":157,"props":39295,"children":39296},{"style":5667},[39297],{"type":25,"value":39298},"script",{"type":20,"tag":157,"props":39300,"children":39301},{"style":248},[39302],{"type":25,"value":39303}," setup",{"type":20,"tag":157,"props":39305,"children":39306},{"style":892},[39307],{"type":25,"value":30657},{"type":20,"tag":157,"props":39309,"children":39310},{"class":159,"line":169},[39311,39316,39321,39325,39329,39333,39338],{"type":20,"tag":157,"props":39312,"children":39313},{"style":39166},[39314],{"type":25,"value":39315},"  const",{"type":20,"tag":157,"props":39317,"children":39318},{"style":260},[39319],{"type":25,"value":39320}," color",{"type":20,"tag":157,"props":39322,"children":39323},{"style":39166},[39324],{"type":25,"value":39179},{"type":20,"tag":157,"props":39326,"children":39327},{"style":248},[39328],{"type":25,"value":39184},{"type":20,"tag":157,"props":39330,"children":39331},{"style":892},[39332],{"type":25,"value":39189},{"type":20,"tag":157,"props":39334,"children":39335},{"style":254},[39336],{"type":25,"value":39337},"\"green\"",{"type":20,"tag":157,"props":39339,"children":39340},{"style":892},[39341],{"type":25,"value":39342},");\n",{"type":20,"tag":157,"props":39344,"children":39345},{"class":159,"line":179},[39346,39350,39355,39359,39363,39367,39372],{"type":20,"tag":157,"props":39347,"children":39348},{"style":39166},[39349],{"type":25,"value":39315},{"type":20,"tag":157,"props":39351,"children":39352},{"style":260},[39353],{"type":25,"value":39354}," backgroundColor",{"type":20,"tag":157,"props":39356,"children":39357},{"style":39166},[39358],{"type":25,"value":39179},{"type":20,"tag":157,"props":39360,"children":39361},{"style":248},[39362],{"type":25,"value":39184},{"type":20,"tag":157,"props":39364,"children":39365},{"style":892},[39366],{"type":25,"value":39189},{"type":20,"tag":157,"props":39368,"children":39369},{"style":254},[39370],{"type":25,"value":39371},"\"red\"",{"type":20,"tag":157,"props":39373,"children":39374},{"style":892},[39375],{"type":25,"value":39342},{"type":20,"tag":157,"props":39377,"children":39378},{"class":159,"line":188},[39379],{"type":20,"tag":157,"props":39380,"children":39381},{"emptyLinePlaceholder":173},[39382],{"type":25,"value":176},{"type":20,"tag":157,"props":39384,"children":39385},{"class":159,"line":196},[39386,39391,39396],{"type":20,"tag":157,"props":39387,"children":39388},{"style":39166},[39389],{"type":25,"value":39390},"  function",{"type":20,"tag":157,"props":39392,"children":39393},{"style":248},[39394],{"type":25,"value":39395}," changeColor",{"type":20,"tag":157,"props":39397,"children":39398},{"style":892},[39399],{"type":25,"value":39400},"() {\n",{"type":20,"tag":157,"props":39402,"children":39403},{"class":159,"line":204},[39404,39409,39413,39418,39423,39428,39433,39438,39443,39447],{"type":20,"tag":157,"props":39405,"children":39406},{"style":892},[39407],{"type":25,"value":39408},"    color.value ",{"type":20,"tag":157,"props":39410,"children":39411},{"style":39166},[39412],{"type":25,"value":2261},{"type":20,"tag":157,"props":39414,"children":39415},{"style":892},[39416],{"type":25,"value":39417}," color.value ",{"type":20,"tag":157,"props":39419,"children":39420},{"style":39166},[39421],{"type":25,"value":39422},"===",{"type":20,"tag":157,"props":39424,"children":39425},{"style":254},[39426],{"type":25,"value":39427}," \"green\"",{"type":20,"tag":157,"props":39429,"children":39430},{"style":39166},[39431],{"type":25,"value":39432}," ?",{"type":20,"tag":157,"props":39434,"children":39435},{"style":254},[39436],{"type":25,"value":39437}," \"pink\"",{"type":20,"tag":157,"props":39439,"children":39440},{"style":39166},[39441],{"type":25,"value":39442}," :",{"type":20,"tag":157,"props":39444,"children":39445},{"style":254},[39446],{"type":25,"value":39427},{"type":20,"tag":157,"props":39448,"children":39449},{"style":892},[39450],{"type":25,"value":38963},{"type":20,"tag":157,"props":39452,"children":39453},{"class":159,"line":213},[39454,39459,39463,39468,39472,39477,39481,39486,39490,39494],{"type":20,"tag":157,"props":39455,"children":39456},{"style":892},[39457],{"type":25,"value":39458},"    backgroundColor.value ",{"type":20,"tag":157,"props":39460,"children":39461},{"style":39166},[39462],{"type":25,"value":2261},{"type":20,"tag":157,"props":39464,"children":39465},{"style":892},[39466],{"type":25,"value":39467}," backgroundColor.value ",{"type":20,"tag":157,"props":39469,"children":39470},{"style":39166},[39471],{"type":25,"value":39422},{"type":20,"tag":157,"props":39473,"children":39474},{"style":254},[39475],{"type":25,"value":39476}," \"red\"",{"type":20,"tag":157,"props":39478,"children":39479},{"style":39166},[39480],{"type":25,"value":39432},{"type":20,"tag":157,"props":39482,"children":39483},{"style":254},[39484],{"type":25,"value":39485}," \"blue\"",{"type":20,"tag":157,"props":39487,"children":39488},{"style":39166},[39489],{"type":25,"value":39442},{"type":20,"tag":157,"props":39491,"children":39492},{"style":254},[39493],{"type":25,"value":39476},{"type":20,"tag":157,"props":39495,"children":39496},{"style":892},[39497],{"type":25,"value":38963},{"type":20,"tag":157,"props":39499,"children":39500},{"class":159,"line":222},[39501],{"type":20,"tag":157,"props":39502,"children":39503},{"style":892},[39504],{"type":25,"value":39060},{"type":20,"tag":157,"props":39506,"children":39507},{"class":159,"line":440},[39508,39513,39517],{"type":20,"tag":157,"props":39509,"children":39510},{"style":892},[39511],{"type":25,"value":39512},"\u003C\u002F",{"type":20,"tag":157,"props":39514,"children":39515},{"style":5667},[39516],{"type":25,"value":39298},{"type":20,"tag":157,"props":39518,"children":39519},{"style":892},[39520],{"type":25,"value":30657},{"type":20,"tag":157,"props":39522,"children":39523},{"class":159,"line":448},[39524],{"type":20,"tag":157,"props":39525,"children":39526},{"emptyLinePlaceholder":173},[39527],{"type":25,"value":176},{"type":20,"tag":157,"props":39529,"children":39530},{"class":159,"line":456},[39531,39535,39540],{"type":20,"tag":157,"props":39532,"children":39533},{"style":892},[39534],{"type":25,"value":36862},{"type":20,"tag":157,"props":39536,"children":39537},{"style":5667},[39538],{"type":25,"value":39539},"template",{"type":20,"tag":157,"props":39541,"children":39542},{"style":892},[39543],{"type":25,"value":30657},{"type":20,"tag":157,"props":39545,"children":39546},{"class":159,"line":465},[39547,39552,39557,39562,39566,39571],{"type":20,"tag":157,"props":39548,"children":39549},{"style":892},[39550],{"type":25,"value":39551},"  \u003C",{"type":20,"tag":157,"props":39553,"children":39554},{"style":5667},[39555],{"type":25,"value":39556},"div",{"type":20,"tag":157,"props":39558,"children":39559},{"style":248},[39560],{"type":25,"value":39561}," class",{"type":20,"tag":157,"props":39563,"children":39564},{"style":892},[39565],{"type":25,"value":2261},{"type":20,"tag":157,"props":39567,"children":39568},{"style":254},[39569],{"type":25,"value":39570},"\"test-container\"",{"type":20,"tag":157,"props":39572,"children":39573},{"style":892},[39574],{"type":25,"value":30657},{"type":20,"tag":157,"props":39576,"children":39577},{"class":159,"line":474},[39578,39583,39587,39591,39595,39599,39604,39609,39613,39618,39622,39626,39631,39635,39640,39645,39650,39655,39659,39664,39669,39673,39678,39683,39687,39691,39696,39700,39705,39709],{"type":20,"tag":157,"props":39579,"children":39580},{"style":892},[39581],{"type":25,"value":39582},"    \u003C",{"type":20,"tag":157,"props":39584,"children":39585},{"style":5667},[39586],{"type":25,"value":21},{"type":20,"tag":157,"props":39588,"children":39589},{"style":892},[39590],{"type":25,"value":39442},{"type":20,"tag":157,"props":39592,"children":39593},{"style":248},[39594],{"type":25,"value":1785},{"type":20,"tag":157,"props":39596,"children":39597},{"style":892},[39598],{"type":25,"value":2261},{"type":20,"tag":157,"props":39600,"children":39601},{"style":254},[39602],{"type":25,"value":39603},"\"",{"type":20,"tag":157,"props":39605,"children":39606},{"style":892},[39607],{"type":25,"value":39608},"{ color, backgroundColor }",{"type":20,"tag":157,"props":39610,"children":39611},{"style":254},[39612],{"type":25,"value":39603},{"type":20,"tag":157,"props":39614,"children":39615},{"style":248},[39616],{"type":25,"value":39617}," style",{"type":20,"tag":157,"props":39619,"children":39620},{"style":892},[39621],{"type":25,"value":2261},{"type":20,"tag":157,"props":39623,"children":39624},{"style":254},[39625],{"type":25,"value":39603},{"type":20,"tag":157,"props":39627,"children":39628},{"style":260},[39629],{"type":25,"value":39630},"width",{"type":20,"tag":157,"props":39632,"children":39633},{"style":892},[39634],{"type":25,"value":908},{"type":20,"tag":157,"props":39636,"children":39637},{"style":260},[39638],{"type":25,"value":39639},"100",{"type":20,"tag":157,"props":39641,"children":39642},{"style":39166},[39643],{"type":25,"value":39644},"%",{"type":20,"tag":157,"props":39646,"children":39647},{"style":892},[39648],{"type":25,"value":39649},"; ",{"type":20,"tag":157,"props":39651,"children":39652},{"style":260},[39653],{"type":25,"value":39654},"height",{"type":20,"tag":157,"props":39656,"children":39657},{"style":892},[39658],{"type":25,"value":908},{"type":20,"tag":157,"props":39660,"children":39661},{"style":260},[39662],{"type":25,"value":39663},"300",{"type":20,"tag":157,"props":39665,"children":39666},{"style":39166},[39667],{"type":25,"value":39668},"px",{"type":20,"tag":157,"props":39670,"children":39671},{"style":254},[39672],{"type":25,"value":39603},{"type":20,"tag":157,"props":39674,"children":39675},{"style":892},[39676],{"type":25,"value":39677}," @",{"type":20,"tag":157,"props":39679,"children":39680},{"style":248},[39681],{"type":25,"value":39682},"click",{"type":20,"tag":157,"props":39684,"children":39685},{"style":892},[39686],{"type":25,"value":2261},{"type":20,"tag":157,"props":39688,"children":39689},{"style":254},[39690],{"type":25,"value":39603},{"type":20,"tag":157,"props":39692,"children":39693},{"style":892},[39694],{"type":25,"value":39695},"changeColor",{"type":20,"tag":157,"props":39697,"children":39698},{"style":254},[39699],{"type":25,"value":39603},{"type":20,"tag":157,"props":39701,"children":39702},{"style":892},[39703],{"type":25,"value":39704},">我会变颜色\u003C\u002F",{"type":20,"tag":157,"props":39706,"children":39707},{"style":5667},[39708],{"type":25,"value":21},{"type":20,"tag":157,"props":39710,"children":39711},{"style":892},[39712],{"type":25,"value":30657},{"type":20,"tag":157,"props":39714,"children":39715},{"class":159,"line":483},[39716,39721,39725],{"type":20,"tag":157,"props":39717,"children":39718},{"style":892},[39719],{"type":25,"value":39720},"  \u003C\u002F",{"type":20,"tag":157,"props":39722,"children":39723},{"style":5667},[39724],{"type":25,"value":39556},{"type":20,"tag":157,"props":39726,"children":39727},{"style":892},[39728],{"type":25,"value":30657},{"type":20,"tag":157,"props":39730,"children":39731},{"class":159,"line":491},[39732,39736,39740],{"type":20,"tag":157,"props":39733,"children":39734},{"style":892},[39735],{"type":25,"value":39512},{"type":20,"tag":157,"props":39737,"children":39738},{"style":5667},[39739],{"type":25,"value":39539},{"type":20,"tag":157,"props":39741,"children":39742},{"style":892},[39743],{"type":25,"value":30657},{"type":20,"tag":28,"props":39745,"children":39747},{"id":39746},"ref模板引用",[39748],{"type":25,"value":39746},{"type":20,"tag":126,"props":39750,"children":39752},{"className":39112,"code":39751,"language":39114,"meta":8,"style":8},"\u003Cscript setup lang=\"ts\">\n  import { ref, onMounted } from 'vue'\n\n  const el = ref\u003CHTMLInputElement | null>(null)\n    \n  onMounted(() => {\n    el.value?.focus()\n  })\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cinput ref=\"el\" \u002F>\n\u003C\u002Ftemplate>\n",[39753],{"type":20,"tag":84,"props":39754,"children":39755},{"__ignoreMap":8},[39756,39789,39812,39819,39871,39878,39900,39918,39926,39941,39948,39963,39993],{"type":20,"tag":157,"props":39757,"children":39758},{"class":159,"line":160},[39759,39763,39767,39771,39776,39780,39785],{"type":20,"tag":157,"props":39760,"children":39761},{"style":892},[39762],{"type":25,"value":36862},{"type":20,"tag":157,"props":39764,"children":39765},{"style":5667},[39766],{"type":25,"value":39298},{"type":20,"tag":157,"props":39768,"children":39769},{"style":248},[39770],{"type":25,"value":39303},{"type":20,"tag":157,"props":39772,"children":39773},{"style":248},[39774],{"type":25,"value":39775}," lang",{"type":20,"tag":157,"props":39777,"children":39778},{"style":892},[39779],{"type":25,"value":2261},{"type":20,"tag":157,"props":39781,"children":39782},{"style":254},[39783],{"type":25,"value":39784},"\"ts\"",{"type":20,"tag":157,"props":39786,"children":39787},{"style":892},[39788],{"type":25,"value":30657},{"type":20,"tag":157,"props":39790,"children":39791},{"class":159,"line":169},[39792,39797,39802,39807],{"type":20,"tag":157,"props":39793,"children":39794},{"style":39166},[39795],{"type":25,"value":39796},"  import",{"type":20,"tag":157,"props":39798,"children":39799},{"style":892},[39800],{"type":25,"value":39801}," { ref, onMounted } ",{"type":20,"tag":157,"props":39803,"children":39804},{"style":39166},[39805],{"type":25,"value":39806},"from",{"type":20,"tag":157,"props":39808,"children":39809},{"style":254},[39810],{"type":25,"value":39811}," 'vue'\n",{"type":20,"tag":157,"props":39813,"children":39814},{"class":159,"line":179},[39815],{"type":20,"tag":157,"props":39816,"children":39817},{"emptyLinePlaceholder":173},[39818],{"type":25,"value":176},{"type":20,"tag":157,"props":39820,"children":39821},{"class":159,"line":188},[39822,39826,39831,39835,39839,39843,39848,39853,39858,39863,39867],{"type":20,"tag":157,"props":39823,"children":39824},{"style":39166},[39825],{"type":25,"value":39315},{"type":20,"tag":157,"props":39827,"children":39828},{"style":260},[39829],{"type":25,"value":39830}," el",{"type":20,"tag":157,"props":39832,"children":39833},{"style":39166},[39834],{"type":25,"value":39179},{"type":20,"tag":157,"props":39836,"children":39837},{"style":248},[39838],{"type":25,"value":39184},{"type":20,"tag":157,"props":39840,"children":39841},{"style":892},[39842],{"type":25,"value":36862},{"type":20,"tag":157,"props":39844,"children":39845},{"style":248},[39846],{"type":25,"value":39847},"HTMLInputElement",{"type":20,"tag":157,"props":39849,"children":39850},{"style":39166},[39851],{"type":25,"value":39852}," |",{"type":20,"tag":157,"props":39854,"children":39855},{"style":260},[39856],{"type":25,"value":39857}," null",{"type":20,"tag":157,"props":39859,"children":39860},{"style":892},[39861],{"type":25,"value":39862},">(",{"type":20,"tag":157,"props":39864,"children":39865},{"style":260},[39866],{"type":25,"value":26856},{"type":20,"tag":157,"props":39868,"children":39869},{"style":892},[39870],{"type":25,"value":8926},{"type":20,"tag":157,"props":39872,"children":39873},{"class":159,"line":196},[39874],{"type":20,"tag":157,"props":39875,"children":39876},{"style":892},[39877],{"type":25,"value":30680},{"type":20,"tag":157,"props":39879,"children":39880},{"class":159,"line":204},[39881,39886,39891,39896],{"type":20,"tag":157,"props":39882,"children":39883},{"style":248},[39884],{"type":25,"value":39885},"  onMounted",{"type":20,"tag":157,"props":39887,"children":39888},{"style":892},[39889],{"type":25,"value":39890},"(() ",{"type":20,"tag":157,"props":39892,"children":39893},{"style":39166},[39894],{"type":25,"value":39895},"=>",{"type":20,"tag":157,"props":39897,"children":39898},{"style":892},[39899],{"type":25,"value":38885},{"type":20,"tag":157,"props":39901,"children":39902},{"class":159,"line":213},[39903,39908,39913],{"type":20,"tag":157,"props":39904,"children":39905},{"style":892},[39906],{"type":25,"value":39907},"    el.value?.",{"type":20,"tag":157,"props":39909,"children":39910},{"style":248},[39911],{"type":25,"value":39912},"focus",{"type":20,"tag":157,"props":39914,"children":39915},{"style":892},[39916],{"type":25,"value":39917},"()\n",{"type":20,"tag":157,"props":39919,"children":39920},{"class":159,"line":222},[39921],{"type":20,"tag":157,"props":39922,"children":39923},{"style":892},[39924],{"type":25,"value":39925},"  })\n",{"type":20,"tag":157,"props":39927,"children":39928},{"class":159,"line":440},[39929,39933,39937],{"type":20,"tag":157,"props":39930,"children":39931},{"style":892},[39932],{"type":25,"value":39512},{"type":20,"tag":157,"props":39934,"children":39935},{"style":5667},[39936],{"type":25,"value":39298},{"type":20,"tag":157,"props":39938,"children":39939},{"style":892},[39940],{"type":25,"value":30657},{"type":20,"tag":157,"props":39942,"children":39943},{"class":159,"line":448},[39944],{"type":20,"tag":157,"props":39945,"children":39946},{"emptyLinePlaceholder":173},[39947],{"type":25,"value":176},{"type":20,"tag":157,"props":39949,"children":39950},{"class":159,"line":456},[39951,39955,39959],{"type":20,"tag":157,"props":39952,"children":39953},{"style":892},[39954],{"type":25,"value":36862},{"type":20,"tag":157,"props":39956,"children":39957},{"style":5667},[39958],{"type":25,"value":39539},{"type":20,"tag":157,"props":39960,"children":39961},{"style":892},[39962],{"type":25,"value":30657},{"type":20,"tag":157,"props":39964,"children":39965},{"class":159,"line":465},[39966,39970,39975,39979,39983,39988],{"type":20,"tag":157,"props":39967,"children":39968},{"style":892},[39969],{"type":25,"value":39551},{"type":20,"tag":157,"props":39971,"children":39972},{"style":5667},[39973],{"type":25,"value":39974},"input",{"type":20,"tag":157,"props":39976,"children":39977},{"style":248},[39978],{"type":25,"value":39184},{"type":20,"tag":157,"props":39980,"children":39981},{"style":892},[39982],{"type":25,"value":2261},{"type":20,"tag":157,"props":39984,"children":39985},{"style":254},[39986],{"type":25,"value":39987},"\"el\"",{"type":20,"tag":157,"props":39989,"children":39990},{"style":892},[39991],{"type":25,"value":39992}," \u002F>\n",{"type":20,"tag":157,"props":39994,"children":39995},{"class":159,"line":474},[39996,40000,40004],{"type":20,"tag":157,"props":39997,"children":39998},{"style":892},[39999],{"type":25,"value":39512},{"type":20,"tag":157,"props":40001,"children":40002},{"style":5667},[40003],{"type":25,"value":39539},{"type":20,"tag":157,"props":40005,"children":40006},{"style":892},[40007],{"type":25,"value":30657},{"type":20,"tag":28,"props":40009,"children":40011},{"id":40010},"watcheffect",[40012],{"type":25,"value":40013},"watchEffect",{"type":20,"tag":21,"props":40015,"children":40016},{},[40017],{"type":25,"value":40018},"使用watch",{"type":20,"tag":126,"props":40020,"children":40022},{"className":39154,"code":40021,"language":39156,"meta":8,"style":8},"const todoId = ref(1)\nconst data = ref(null)\n\nwatch(todoId, async () => {\n  const response = await fetch(\n    `https:\u002F\u002Fjsonplaceholder.typicode.com\u002Ftodos\u002F${todoId.value}`\n  )\n  data.value = await response.json()\n}, { immediate: true })\n",[40023],{"type":20,"tag":84,"props":40024,"children":40025},{"__ignoreMap":8},[40026,40058,40090,40097,40127,40158,40186,40194,40223],{"type":20,"tag":157,"props":40027,"children":40028},{"class":159,"line":160},[40029,40033,40038,40042,40046,40050,40054],{"type":20,"tag":157,"props":40030,"children":40031},{"style":39166},[40032],{"type":25,"value":39169},{"type":20,"tag":157,"props":40034,"children":40035},{"style":260},[40036],{"type":25,"value":40037}," todoId",{"type":20,"tag":157,"props":40039,"children":40040},{"style":39166},[40041],{"type":25,"value":39179},{"type":20,"tag":157,"props":40043,"children":40044},{"style":248},[40045],{"type":25,"value":39184},{"type":20,"tag":157,"props":40047,"children":40048},{"style":892},[40049],{"type":25,"value":39189},{"type":20,"tag":157,"props":40051,"children":40052},{"style":260},[40053],{"type":25,"value":10379},{"type":20,"tag":157,"props":40055,"children":40056},{"style":892},[40057],{"type":25,"value":8926},{"type":20,"tag":157,"props":40059,"children":40060},{"class":159,"line":169},[40061,40065,40070,40074,40078,40082,40086],{"type":20,"tag":157,"props":40062,"children":40063},{"style":39166},[40064],{"type":25,"value":39169},{"type":20,"tag":157,"props":40066,"children":40067},{"style":260},[40068],{"type":25,"value":40069}," data",{"type":20,"tag":157,"props":40071,"children":40072},{"style":39166},[40073],{"type":25,"value":39179},{"type":20,"tag":157,"props":40075,"children":40076},{"style":248},[40077],{"type":25,"value":39184},{"type":20,"tag":157,"props":40079,"children":40080},{"style":892},[40081],{"type":25,"value":39189},{"type":20,"tag":157,"props":40083,"children":40084},{"style":260},[40085],{"type":25,"value":26856},{"type":20,"tag":157,"props":40087,"children":40088},{"style":892},[40089],{"type":25,"value":8926},{"type":20,"tag":157,"props":40091,"children":40092},{"class":159,"line":179},[40093],{"type":20,"tag":157,"props":40094,"children":40095},{"emptyLinePlaceholder":173},[40096],{"type":25,"value":176},{"type":20,"tag":157,"props":40098,"children":40099},{"class":159,"line":188},[40100,40105,40110,40114,40119,40123],{"type":20,"tag":157,"props":40101,"children":40102},{"style":248},[40103],{"type":25,"value":40104},"watch",{"type":20,"tag":157,"props":40106,"children":40107},{"style":892},[40108],{"type":25,"value":40109},"(todoId, ",{"type":20,"tag":157,"props":40111,"children":40112},{"style":39166},[40113],{"type":25,"value":1349},{"type":20,"tag":157,"props":40115,"children":40116},{"style":892},[40117],{"type":25,"value":40118}," () ",{"type":20,"tag":157,"props":40120,"children":40121},{"style":39166},[40122],{"type":25,"value":39895},{"type":20,"tag":157,"props":40124,"children":40125},{"style":892},[40126],{"type":25,"value":38885},{"type":20,"tag":157,"props":40128,"children":40129},{"class":159,"line":196},[40130,40134,40139,40143,40148,40153],{"type":20,"tag":157,"props":40131,"children":40132},{"style":39166},[40133],{"type":25,"value":39315},{"type":20,"tag":157,"props":40135,"children":40136},{"style":260},[40137],{"type":25,"value":40138}," response",{"type":20,"tag":157,"props":40140,"children":40141},{"style":39166},[40142],{"type":25,"value":39179},{"type":20,"tag":157,"props":40144,"children":40145},{"style":39166},[40146],{"type":25,"value":40147}," await",{"type":20,"tag":157,"props":40149,"children":40150},{"style":248},[40151],{"type":25,"value":40152}," fetch",{"type":20,"tag":157,"props":40154,"children":40155},{"style":892},[40156],{"type":25,"value":40157},"(\n",{"type":20,"tag":157,"props":40159,"children":40160},{"class":159,"line":204},[40161,40166,40171,40176,40181],{"type":20,"tag":157,"props":40162,"children":40163},{"style":254},[40164],{"type":25,"value":40165},"    `https:\u002F\u002Fjsonplaceholder.typicode.com\u002Ftodos\u002F${",{"type":20,"tag":157,"props":40167,"children":40168},{"style":892},[40169],{"type":25,"value":40170},"todoId",{"type":20,"tag":157,"props":40172,"children":40173},{"style":254},[40174],{"type":25,"value":40175},".",{"type":20,"tag":157,"props":40177,"children":40178},{"style":892},[40179],{"type":25,"value":40180},"value",{"type":20,"tag":157,"props":40182,"children":40183},{"style":254},[40184],{"type":25,"value":40185},"}`\n",{"type":20,"tag":157,"props":40187,"children":40188},{"class":159,"line":213},[40189],{"type":20,"tag":157,"props":40190,"children":40191},{"style":892},[40192],{"type":25,"value":40193},"  )\n",{"type":20,"tag":157,"props":40195,"children":40196},{"class":159,"line":222},[40197,40202,40206,40210,40215,40219],{"type":20,"tag":157,"props":40198,"children":40199},{"style":892},[40200],{"type":25,"value":40201},"  data.value ",{"type":20,"tag":157,"props":40203,"children":40204},{"style":39166},[40205],{"type":25,"value":2261},{"type":20,"tag":157,"props":40207,"children":40208},{"style":39166},[40209],{"type":25,"value":40147},{"type":20,"tag":157,"props":40211,"children":40212},{"style":892},[40213],{"type":25,"value":40214}," response.",{"type":20,"tag":157,"props":40216,"children":40217},{"style":248},[40218],{"type":25,"value":881},{"type":20,"tag":157,"props":40220,"children":40221},{"style":892},[40222],{"type":25,"value":39917},{"type":20,"tag":157,"props":40224,"children":40225},{"class":159,"line":440},[40226,40231,40236],{"type":20,"tag":157,"props":40227,"children":40228},{"style":892},[40229],{"type":25,"value":40230},"}, { immediate: ",{"type":20,"tag":157,"props":40232,"children":40233},{"style":260},[40234],{"type":25,"value":40235},"true",{"type":20,"tag":157,"props":40237,"children":40238},{"style":892},[40239],{"type":25,"value":40240}," })\n",{"type":20,"tag":21,"props":40242,"children":40243},{},[40244],{"type":25,"value":40245},"使用watchEffect，会自动追踪依赖项，天生拥有immediate属性",{"type":20,"tag":126,"props":40247,"children":40249},{"className":39154,"code":40248,"language":39156,"meta":8,"style":8},"watchEffect(async () => {\n  const response = await fetch(\n    `https:\u002F\u002Fjsonplaceholder.typicode.com\u002Ftodos\u002F${todoId.value}`\n  )\n  data.value = await response.json()\n})\n",[40250],{"type":20,"tag":84,"props":40251,"children":40252},{"__ignoreMap":8},[40253,40280,40307,40330,40337,40364],{"type":20,"tag":157,"props":40254,"children":40255},{"class":159,"line":160},[40256,40260,40264,40268,40272,40276],{"type":20,"tag":157,"props":40257,"children":40258},{"style":248},[40259],{"type":25,"value":40013},{"type":20,"tag":157,"props":40261,"children":40262},{"style":892},[40263],{"type":25,"value":39189},{"type":20,"tag":157,"props":40265,"children":40266},{"style":39166},[40267],{"type":25,"value":1349},{"type":20,"tag":157,"props":40269,"children":40270},{"style":892},[40271],{"type":25,"value":40118},{"type":20,"tag":157,"props":40273,"children":40274},{"style":39166},[40275],{"type":25,"value":39895},{"type":20,"tag":157,"props":40277,"children":40278},{"style":892},[40279],{"type":25,"value":38885},{"type":20,"tag":157,"props":40281,"children":40282},{"class":159,"line":169},[40283,40287,40291,40295,40299,40303],{"type":20,"tag":157,"props":40284,"children":40285},{"style":39166},[40286],{"type":25,"value":39315},{"type":20,"tag":157,"props":40288,"children":40289},{"style":260},[40290],{"type":25,"value":40138},{"type":20,"tag":157,"props":40292,"children":40293},{"style":39166},[40294],{"type":25,"value":39179},{"type":20,"tag":157,"props":40296,"children":40297},{"style":39166},[40298],{"type":25,"value":40147},{"type":20,"tag":157,"props":40300,"children":40301},{"style":248},[40302],{"type":25,"value":40152},{"type":20,"tag":157,"props":40304,"children":40305},{"style":892},[40306],{"type":25,"value":40157},{"type":20,"tag":157,"props":40308,"children":40309},{"class":159,"line":179},[40310,40314,40318,40322,40326],{"type":20,"tag":157,"props":40311,"children":40312},{"style":254},[40313],{"type":25,"value":40165},{"type":20,"tag":157,"props":40315,"children":40316},{"style":892},[40317],{"type":25,"value":40170},{"type":20,"tag":157,"props":40319,"children":40320},{"style":254},[40321],{"type":25,"value":40175},{"type":20,"tag":157,"props":40323,"children":40324},{"style":892},[40325],{"type":25,"value":40180},{"type":20,"tag":157,"props":40327,"children":40328},{"style":254},[40329],{"type":25,"value":40185},{"type":20,"tag":157,"props":40331,"children":40332},{"class":159,"line":188},[40333],{"type":20,"tag":157,"props":40334,"children":40335},{"style":892},[40336],{"type":25,"value":40193},{"type":20,"tag":157,"props":40338,"children":40339},{"class":159,"line":196},[40340,40344,40348,40352,40356,40360],{"type":20,"tag":157,"props":40341,"children":40342},{"style":892},[40343],{"type":25,"value":40201},{"type":20,"tag":157,"props":40345,"children":40346},{"style":39166},[40347],{"type":25,"value":2261},{"type":20,"tag":157,"props":40349,"children":40350},{"style":39166},[40351],{"type":25,"value":40147},{"type":20,"tag":157,"props":40353,"children":40354},{"style":892},[40355],{"type":25,"value":40214},{"type":20,"tag":157,"props":40357,"children":40358},{"style":248},[40359],{"type":25,"value":881},{"type":20,"tag":157,"props":40361,"children":40362},{"style":892},[40363],{"type":25,"value":39917},{"type":20,"tag":157,"props":40365,"children":40366},{"class":159,"line":204},[40367],{"type":20,"tag":157,"props":40368,"children":40369},{"style":892},[40370],{"type":25,"value":40371},"})\n",{"type":20,"tag":28,"props":40373,"children":40375},{"id":40374},"v-if与v-for",[40376],{"type":25,"value":40374},{"type":20,"tag":21,"props":40378,"children":40379},{},[40380],{"type":25,"value":40381},"vue3中v-if比v-for优先级高",{"type":20,"tag":28,"props":40383,"children":40385},{"id":40384},"类与样式绑定",[40386],{"type":25,"value":40384},{"type":20,"tag":21,"props":40388,"children":40389},{},[40390],{"type":20,"tag":33,"props":40391,"children":40392},{},[40393],{"type":25,"value":40394},"最佳实践：使用数组，需要条件判断属性名的时候，在数组中嵌套对象，可以结合计算计算属性使用",{"type":20,"tag":126,"props":40396,"children":40398},{"className":36848,"code":40397,"language":36850,"meta":8,"style":8},"\u003Cdiv :class=\"[{ active: isActive }, errorClass]\">\u003C\u002Fdiv>\n",[40399],{"type":20,"tag":84,"props":40400,"children":40401},{"__ignoreMap":8},[40402],{"type":20,"tag":157,"props":40403,"children":40404},{"class":159,"line":160},[40405,40409,40413,40418,40422,40427,40431,40435],{"type":20,"tag":157,"props":40406,"children":40407},{"style":892},[40408],{"type":25,"value":36862},{"type":20,"tag":157,"props":40410,"children":40411},{"style":5667},[40412],{"type":25,"value":39556},{"type":20,"tag":157,"props":40414,"children":40415},{"style":248},[40416],{"type":25,"value":40417}," :class",{"type":20,"tag":157,"props":40419,"children":40420},{"style":892},[40421],{"type":25,"value":2261},{"type":20,"tag":157,"props":40423,"children":40424},{"style":254},[40425],{"type":25,"value":40426},"\"[{ active: isActive }, errorClass]\"",{"type":20,"tag":157,"props":40428,"children":40429},{"style":892},[40430],{"type":25,"value":36885},{"type":20,"tag":157,"props":40432,"children":40433},{"style":5667},[40434],{"type":25,"value":39556},{"type":20,"tag":157,"props":40436,"children":40437},{"style":892},[40438],{"type":25,"value":30657},{"type":20,"tag":28,"props":40440,"children":40442},{"id":40441},"计算属性",[40443],{"type":25,"value":40441},{"type":20,"tag":5719,"props":40445,"children":40446},{},[40447],{"type":20,"tag":48,"props":40448,"children":40449},{},[40450],{"type":25,"value":40451},"不要在计算属性中修改原数据",{"type":20,"tag":28,"props":40453,"children":40455},{"id":40454},"强制视图刷新",[40456],{"type":25,"value":40454},{"type":20,"tag":21,"props":40458,"children":40459},{},[40460],{"type":20,"tag":33,"props":40461,"children":40462},{},[40463],{"type":25,"value":40464},"vue2：",{"type":20,"tag":126,"props":40466,"children":40468},{"className":39154,"code":40467,"language":39156,"meta":8,"style":8},"this.$forceUpdate();\n",[40469],{"type":20,"tag":84,"props":40470,"children":40471},{"__ignoreMap":8},[40472],{"type":20,"tag":157,"props":40473,"children":40474},{"class":159,"line":160},[40475,40480,40484,40489],{"type":20,"tag":157,"props":40476,"children":40477},{"style":260},[40478],{"type":25,"value":40479},"this",{"type":20,"tag":157,"props":40481,"children":40482},{"style":892},[40483],{"type":25,"value":40175},{"type":20,"tag":157,"props":40485,"children":40486},{"style":248},[40487],{"type":25,"value":40488},"$forceUpdate",{"type":20,"tag":157,"props":40490,"children":40491},{"style":892},[40492],{"type":25,"value":40493},"();\n",{"type":20,"tag":21,"props":40495,"children":40496},{},[40497],{"type":20,"tag":33,"props":40498,"children":40499},{},[40500],{"type":25,"value":40501},"vue3：",{"type":20,"tag":126,"props":40503,"children":40505},{"className":39154,"code":40504,"language":39156,"meta":8,"style":8},"import { getCurrentInstance, ComponentInternalInstance } from \"vue\";\nsetup(){\n\u002F\u002F解构赋值 设置别名that  也可不写  :that  直接ctx\n\u002F\u002Fctx 得到普通对象\n\u002F\u002Fproxy得到响应式对象\n\u002F\u002F 推荐使用第二种proxy 严谨写法\n\u002F\u002F 第一种写法\n    let {ctx:that, proxy}:any = getCurrentInstance()\n    that.$forceUpdate()\n    \n\u002F\u002F 第二种写法\n    const { proxy } = getCurrentInstance() as ComponentInternalInstance\n    proxy!.$forceUpdate()\n}\n",[40506],{"type":20,"tag":84,"props":40507,"children":40508},{"__ignoreMap":8},[40509,40535,40548,40556,40564,40572,40580,40588,40634,40650,40657,40665,40711,40736],{"type":20,"tag":157,"props":40510,"children":40511},{"class":159,"line":160},[40512,40517,40522,40526,40531],{"type":20,"tag":157,"props":40513,"children":40514},{"style":39166},[40515],{"type":25,"value":40516},"import",{"type":20,"tag":157,"props":40518,"children":40519},{"style":892},[40520],{"type":25,"value":40521}," { getCurrentInstance, ComponentInternalInstance } ",{"type":20,"tag":157,"props":40523,"children":40524},{"style":39166},[40525],{"type":25,"value":39806},{"type":20,"tag":157,"props":40527,"children":40528},{"style":254},[40529],{"type":25,"value":40530}," \"vue\"",{"type":20,"tag":157,"props":40532,"children":40533},{"style":892},[40534],{"type":25,"value":38963},{"type":20,"tag":157,"props":40536,"children":40537},{"class":159,"line":169},[40538,40543],{"type":20,"tag":157,"props":40539,"children":40540},{"style":248},[40541],{"type":25,"value":40542},"setup",{"type":20,"tag":157,"props":40544,"children":40545},{"style":892},[40546],{"type":25,"value":40547},"(){\n",{"type":20,"tag":157,"props":40549,"children":40550},{"class":159,"line":179},[40551],{"type":20,"tag":157,"props":40552,"children":40553},{"style":9628},[40554],{"type":25,"value":40555},"\u002F\u002F解构赋值 设置别名that  也可不写  :that  直接ctx\n",{"type":20,"tag":157,"props":40557,"children":40558},{"class":159,"line":188},[40559],{"type":20,"tag":157,"props":40560,"children":40561},{"style":9628},[40562],{"type":25,"value":40563},"\u002F\u002Fctx 得到普通对象\n",{"type":20,"tag":157,"props":40565,"children":40566},{"class":159,"line":196},[40567],{"type":20,"tag":157,"props":40568,"children":40569},{"style":9628},[40570],{"type":25,"value":40571},"\u002F\u002Fproxy得到响应式对象\n",{"type":20,"tag":157,"props":40573,"children":40574},{"class":159,"line":204},[40575],{"type":20,"tag":157,"props":40576,"children":40577},{"style":9628},[40578],{"type":25,"value":40579},"\u002F\u002F 推荐使用第二种proxy 严谨写法\n",{"type":20,"tag":157,"props":40581,"children":40582},{"class":159,"line":213},[40583],{"type":20,"tag":157,"props":40584,"children":40585},{"style":9628},[40586],{"type":25,"value":40587},"\u002F\u002F 第一种写法\n",{"type":20,"tag":157,"props":40589,"children":40590},{"class":159,"line":222},[40591,40596,40601,40606,40611,40616,40621,40625,40630],{"type":20,"tag":157,"props":40592,"children":40593},{"style":39166},[40594],{"type":25,"value":40595},"    let",{"type":20,"tag":157,"props":40597,"children":40598},{"style":892},[40599],{"type":25,"value":40600}," {",{"type":20,"tag":157,"props":40602,"children":40603},{"style":6410},[40604],{"type":25,"value":40605},"ctx",{"type":20,"tag":157,"props":40607,"children":40608},{"style":892},[40609],{"type":25,"value":40610},":that, proxy}",{"type":20,"tag":157,"props":40612,"children":40613},{"style":39166},[40614],{"type":25,"value":40615},":",{"type":20,"tag":157,"props":40617,"children":40618},{"style":260},[40619],{"type":25,"value":40620},"any",{"type":20,"tag":157,"props":40622,"children":40623},{"style":39166},[40624],{"type":25,"value":39179},{"type":20,"tag":157,"props":40626,"children":40627},{"style":248},[40628],{"type":25,"value":40629}," getCurrentInstance",{"type":20,"tag":157,"props":40631,"children":40632},{"style":892},[40633],{"type":25,"value":39917},{"type":20,"tag":157,"props":40635,"children":40636},{"class":159,"line":440},[40637,40642,40646],{"type":20,"tag":157,"props":40638,"children":40639},{"style":892},[40640],{"type":25,"value":40641},"    that.",{"type":20,"tag":157,"props":40643,"children":40644},{"style":248},[40645],{"type":25,"value":40488},{"type":20,"tag":157,"props":40647,"children":40648},{"style":892},[40649],{"type":25,"value":39917},{"type":20,"tag":157,"props":40651,"children":40652},{"class":159,"line":448},[40653],{"type":20,"tag":157,"props":40654,"children":40655},{"style":892},[40656],{"type":25,"value":30680},{"type":20,"tag":157,"props":40658,"children":40659},{"class":159,"line":456},[40660],{"type":20,"tag":157,"props":40661,"children":40662},{"style":9628},[40663],{"type":25,"value":40664},"\u002F\u002F 第二种写法\n",{"type":20,"tag":157,"props":40666,"children":40667},{"class":159,"line":465},[40668,40673,40678,40683,40688,40692,40696,40701,40706],{"type":20,"tag":157,"props":40669,"children":40670},{"style":39166},[40671],{"type":25,"value":40672},"    const",{"type":20,"tag":157,"props":40674,"children":40675},{"style":892},[40676],{"type":25,"value":40677}," { ",{"type":20,"tag":157,"props":40679,"children":40680},{"style":260},[40681],{"type":25,"value":40682},"proxy",{"type":20,"tag":157,"props":40684,"children":40685},{"style":892},[40686],{"type":25,"value":40687}," } ",{"type":20,"tag":157,"props":40689,"children":40690},{"style":39166},[40691],{"type":25,"value":2261},{"type":20,"tag":157,"props":40693,"children":40694},{"style":248},[40695],{"type":25,"value":40629},{"type":20,"tag":157,"props":40697,"children":40698},{"style":892},[40699],{"type":25,"value":40700},"() ",{"type":20,"tag":157,"props":40702,"children":40703},{"style":39166},[40704],{"type":25,"value":40705},"as",{"type":20,"tag":157,"props":40707,"children":40708},{"style":248},[40709],{"type":25,"value":40710}," ComponentInternalInstance\n",{"type":20,"tag":157,"props":40712,"children":40713},{"class":159,"line":474},[40714,40719,40724,40728,40732],{"type":20,"tag":157,"props":40715,"children":40716},{"style":892},[40717],{"type":25,"value":40718},"    proxy",{"type":20,"tag":157,"props":40720,"children":40721},{"style":39166},[40722],{"type":25,"value":40723},"!",{"type":20,"tag":157,"props":40725,"children":40726},{"style":892},[40727],{"type":25,"value":40175},{"type":20,"tag":157,"props":40729,"children":40730},{"style":248},[40731],{"type":25,"value":40488},{"type":20,"tag":157,"props":40733,"children":40734},{"style":892},[40735],{"type":25,"value":39917},{"type":20,"tag":157,"props":40737,"children":40738},{"class":159,"line":483},[40739],{"type":20,"tag":157,"props":40740,"children":40741},{"style":892},[40742],{"type":25,"value":943},{"type":20,"tag":28,"props":40744,"children":40746},{"id":40745},"reactive的局限性",[40747],{"type":25,"value":40748},"reactive()的局限性",{"type":20,"tag":5719,"props":40750,"children":40751},{},[40752,40757],{"type":20,"tag":48,"props":40753,"children":40754},{},[40755],{"type":25,"value":40756},"只能用于对象、数组、Map、Set这样的集合类型，不能用于原始类型",{"type":20,"tag":48,"props":40758,"children":40759},{},[40760],{"type":25,"value":40761},"不能替换整个对象",{"type":20,"tag":126,"props":40763,"children":40765},{"className":39154,"code":40764,"language":39156,"meta":8,"style":8},"let state = reactive({ count: 0 })\n\n\u002F\u002F 上面的 ({ count: 0 }) 引用将不再被追踪\n\u002F\u002F 响应性连接已丢失！\nstate = reactive({ count: 1 })\n",[40766],{"type":20,"tag":84,"props":40767,"children":40768},{"__ignoreMap":8},[40769,40803,40810,40818,40826],{"type":20,"tag":157,"props":40770,"children":40771},{"class":159,"line":160},[40772,40776,40781,40785,40790,40795,40799],{"type":20,"tag":157,"props":40773,"children":40774},{"style":39166},[40775],{"type":25,"value":39240},{"type":20,"tag":157,"props":40777,"children":40778},{"style":892},[40779],{"type":25,"value":40780}," state ",{"type":20,"tag":157,"props":40782,"children":40783},{"style":39166},[40784],{"type":25,"value":2261},{"type":20,"tag":157,"props":40786,"children":40787},{"style":248},[40788],{"type":25,"value":40789}," reactive",{"type":20,"tag":157,"props":40791,"children":40792},{"style":892},[40793],{"type":25,"value":40794},"({ count: ",{"type":20,"tag":157,"props":40796,"children":40797},{"style":260},[40798],{"type":25,"value":10387},{"type":20,"tag":157,"props":40800,"children":40801},{"style":892},[40802],{"type":25,"value":40240},{"type":20,"tag":157,"props":40804,"children":40805},{"class":159,"line":169},[40806],{"type":20,"tag":157,"props":40807,"children":40808},{"emptyLinePlaceholder":173},[40809],{"type":25,"value":176},{"type":20,"tag":157,"props":40811,"children":40812},{"class":159,"line":179},[40813],{"type":20,"tag":157,"props":40814,"children":40815},{"style":9628},[40816],{"type":25,"value":40817},"\u002F\u002F 上面的 ({ count: 0 }) 引用将不再被追踪\n",{"type":20,"tag":157,"props":40819,"children":40820},{"class":159,"line":188},[40821],{"type":20,"tag":157,"props":40822,"children":40823},{"style":9628},[40824],{"type":25,"value":40825},"\u002F\u002F 响应性连接已丢失！\n",{"type":20,"tag":157,"props":40827,"children":40828},{"class":159,"line":196},[40829,40834,40838,40842,40846,40850],{"type":20,"tag":157,"props":40830,"children":40831},{"style":892},[40832],{"type":25,"value":40833},"state ",{"type":20,"tag":157,"props":40835,"children":40836},{"style":39166},[40837],{"type":25,"value":2261},{"type":20,"tag":157,"props":40839,"children":40840},{"style":248},[40841],{"type":25,"value":40789},{"type":20,"tag":157,"props":40843,"children":40844},{"style":892},[40845],{"type":25,"value":40794},{"type":20,"tag":157,"props":40847,"children":40848},{"style":260},[40849],{"type":25,"value":10379},{"type":20,"tag":157,"props":40851,"children":40852},{"style":892},[40853],{"type":25,"value":40240},{"type":20,"tag":5719,"props":40855,"children":40856},{"start":179},[40857],{"type":20,"tag":48,"props":40858,"children":40859},{},[40860],{"type":25,"value":40861},"解构之后会失去响应式",{"type":20,"tag":126,"props":40863,"children":40865},{"className":39154,"code":40864,"language":39156,"meta":8,"style":8},"const state = reactive({ count: 0 })\n\n\u002F\u002F 当解构时，count 已经与 state.count 断开连接\nlet { count } = state\n\u002F\u002F 不会影响原始的 state\ncount++\n\n\u002F\u002F 该函数接收到的是一个普通的数字\n\u002F\u002F 并且无法追踪 state.count 的变化\n\u002F\u002F 我们必须传入整个对象以保持响应性\ncallSomeFunction(state.count)\n",[40866],{"type":20,"tag":84,"props":40867,"children":40868},{"__ignoreMap":8},[40869,40901,40908,40916,40937,40945,40958,40965,40973,40981,40989],{"type":20,"tag":157,"props":40870,"children":40871},{"class":159,"line":160},[40872,40876,40881,40885,40889,40893,40897],{"type":20,"tag":157,"props":40873,"children":40874},{"style":39166},[40875],{"type":25,"value":39169},{"type":20,"tag":157,"props":40877,"children":40878},{"style":260},[40879],{"type":25,"value":40880}," state",{"type":20,"tag":157,"props":40882,"children":40883},{"style":39166},[40884],{"type":25,"value":39179},{"type":20,"tag":157,"props":40886,"children":40887},{"style":248},[40888],{"type":25,"value":40789},{"type":20,"tag":157,"props":40890,"children":40891},{"style":892},[40892],{"type":25,"value":40794},{"type":20,"tag":157,"props":40894,"children":40895},{"style":260},[40896],{"type":25,"value":10387},{"type":20,"tag":157,"props":40898,"children":40899},{"style":892},[40900],{"type":25,"value":40240},{"type":20,"tag":157,"props":40902,"children":40903},{"class":159,"line":169},[40904],{"type":20,"tag":157,"props":40905,"children":40906},{"emptyLinePlaceholder":173},[40907],{"type":25,"value":176},{"type":20,"tag":157,"props":40909,"children":40910},{"class":159,"line":179},[40911],{"type":20,"tag":157,"props":40912,"children":40913},{"style":9628},[40914],{"type":25,"value":40915},"\u002F\u002F 当解构时，count 已经与 state.count 断开连接\n",{"type":20,"tag":157,"props":40917,"children":40918},{"class":159,"line":188},[40919,40923,40928,40932],{"type":20,"tag":157,"props":40920,"children":40921},{"style":39166},[40922],{"type":25,"value":39240},{"type":20,"tag":157,"props":40924,"children":40925},{"style":892},[40926],{"type":25,"value":40927}," { count } ",{"type":20,"tag":157,"props":40929,"children":40930},{"style":39166},[40931],{"type":25,"value":2261},{"type":20,"tag":157,"props":40933,"children":40934},{"style":892},[40935],{"type":25,"value":40936}," state\n",{"type":20,"tag":157,"props":40938,"children":40939},{"class":159,"line":196},[40940],{"type":20,"tag":157,"props":40941,"children":40942},{"style":9628},[40943],{"type":25,"value":40944},"\u002F\u002F 不会影响原始的 state\n",{"type":20,"tag":157,"props":40946,"children":40947},{"class":159,"line":204},[40948,40953],{"type":20,"tag":157,"props":40949,"children":40950},{"style":892},[40951],{"type":25,"value":40952},"count",{"type":20,"tag":157,"props":40954,"children":40955},{"style":39166},[40956],{"type":25,"value":40957},"++\n",{"type":20,"tag":157,"props":40959,"children":40960},{"class":159,"line":213},[40961],{"type":20,"tag":157,"props":40962,"children":40963},{"emptyLinePlaceholder":173},[40964],{"type":25,"value":176},{"type":20,"tag":157,"props":40966,"children":40967},{"class":159,"line":222},[40968],{"type":20,"tag":157,"props":40969,"children":40970},{"style":9628},[40971],{"type":25,"value":40972},"\u002F\u002F 该函数接收到的是一个普通的数字\n",{"type":20,"tag":157,"props":40974,"children":40975},{"class":159,"line":440},[40976],{"type":20,"tag":157,"props":40977,"children":40978},{"style":9628},[40979],{"type":25,"value":40980},"\u002F\u002F 并且无法追踪 state.count 的变化\n",{"type":20,"tag":157,"props":40982,"children":40983},{"class":159,"line":448},[40984],{"type":20,"tag":157,"props":40985,"children":40986},{"style":9628},[40987],{"type":25,"value":40988},"\u002F\u002F 我们必须传入整个对象以保持响应性\n",{"type":20,"tag":157,"props":40990,"children":40991},{"class":159,"line":456},[40992,40997],{"type":20,"tag":157,"props":40993,"children":40994},{"style":248},[40995],{"type":25,"value":40996},"callSomeFunction",{"type":20,"tag":157,"props":40998,"children":40999},{"style":892},[41000],{"type":25,"value":41001},"(state.count)\n",{"type":20,"tag":28,"props":41003,"children":41005},{"id":41004},"样式穿透-1",[41006],{"type":25,"value":38856},{"type":20,"tag":126,"props":41008,"children":41010},{"className":38861,"code":41009,"language":38863,"meta":8,"style":8},":deep(.el-input__wrapper) {\n  background-color: #07172e;\n}\n",[41011],{"type":20,"tag":84,"props":41012,"children":41013},{"__ignoreMap":8},[41014,41032,41053],{"type":20,"tag":157,"props":41015,"children":41016},{"class":159,"line":160},[41017,41022,41027],{"type":20,"tag":157,"props":41018,"children":41019},{"style":892},[41020],{"type":25,"value":41021},":deep(",{"type":20,"tag":157,"props":41023,"children":41024},{"style":248},[41025],{"type":25,"value":41026},".el-input__wrapper",{"type":20,"tag":157,"props":41028,"children":41029},{"style":892},[41030],{"type":25,"value":41031},") {\n",{"type":20,"tag":157,"props":41033,"children":41034},{"class":159,"line":169},[41035,41040,41044,41049],{"type":20,"tag":157,"props":41036,"children":41037},{"style":260},[41038],{"type":25,"value":41039},"  background-color",{"type":20,"tag":157,"props":41041,"children":41042},{"style":892},[41043],{"type":25,"value":908},{"type":20,"tag":157,"props":41045,"children":41046},{"style":260},[41047],{"type":25,"value":41048},"#07172e",{"type":20,"tag":157,"props":41050,"children":41051},{"style":892},[41052],{"type":25,"value":38963},{"type":20,"tag":157,"props":41054,"children":41055},{"class":159,"line":179},[41056],{"type":20,"tag":157,"props":41057,"children":41058},{"style":892},[41059],{"type":25,"value":943},{"type":20,"tag":28,"props":41061,"children":41063},{"id":41062},"静态资源-v-bind",[41064],{"type":25,"value":41065},"静态资源 + v-bind",{"type":20,"tag":126,"props":41067,"children":41069},{"className":39112,"code":41068,"language":39114,"meta":8,"style":8},"improt logo from \"@\u002Fassets\u002Flogo.png\"\n\n\u003Cimg :src=\"logo\" \u002F>\n",[41070],{"type":20,"tag":84,"props":41071,"children":41072},{"__ignoreMap":8},[41073,41081,41088],{"type":20,"tag":157,"props":41074,"children":41075},{"class":159,"line":160},[41076],{"type":20,"tag":157,"props":41077,"children":41078},{"style":892},[41079],{"type":25,"value":41080},"improt logo from \"@\u002Fassets\u002Flogo.png\"\n",{"type":20,"tag":157,"props":41082,"children":41083},{"class":159,"line":169},[41084],{"type":20,"tag":157,"props":41085,"children":41086},{"emptyLinePlaceholder":173},[41087],{"type":25,"value":176},{"type":20,"tag":157,"props":41089,"children":41090},{"class":159,"line":179},[41091,41095,41099,41103,41108,41112,41116,41121,41125],{"type":20,"tag":157,"props":41092,"children":41093},{"style":892},[41094],{"type":25,"value":36862},{"type":20,"tag":157,"props":41096,"children":41097},{"style":5667},[41098],{"type":25,"value":11159},{"type":20,"tag":157,"props":41100,"children":41101},{"style":892},[41102],{"type":25,"value":39442},{"type":20,"tag":157,"props":41104,"children":41105},{"style":248},[41106],{"type":25,"value":41107},"src",{"type":20,"tag":157,"props":41109,"children":41110},{"style":892},[41111],{"type":25,"value":2261},{"type":20,"tag":157,"props":41113,"children":41114},{"style":254},[41115],{"type":25,"value":39603},{"type":20,"tag":157,"props":41117,"children":41118},{"style":892},[41119],{"type":25,"value":41120},"logo",{"type":20,"tag":157,"props":41122,"children":41123},{"style":254},[41124],{"type":25,"value":39603},{"type":20,"tag":157,"props":41126,"children":41127},{"style":892},[41128],{"type":25,"value":39992},{"type":20,"tag":1863,"props":41130,"children":41132},{"id":41131},"选项式api",[41133],{"type":25,"value":41134},"选项式API",{"type":20,"tag":28,"props":41136,"children":41138},{"id":41137},"计算属性与监听器",[41139],{"type":25,"value":41137},{"type":20,"tag":44,"props":41141,"children":41142},{},[41143,41148],{"type":20,"tag":48,"props":41144,"children":41145},{},[41146],{"type":25,"value":41147},"计算属性适合多个值影响一个值；监听器适合一个值影响多个值",{"type":20,"tag":48,"props":41149,"children":41150},{},[41151],{"type":25,"value":41152},"计算属性不支持异步程序；监听器支持异步程序",{"type":20,"tag":28,"props":41154,"children":41156},{"id":41155},"类名与行内样式",[41157],{"type":25,"value":41155},{"type":20,"tag":44,"props":41159,"children":41160},{},[41161],{"type":20,"tag":48,"props":41162,"children":41163},{},[41164,41166,41172],{"type":25,"value":41165},"可以使用动态绑定",{"type":20,"tag":84,"props":41167,"children":41169},{"className":41168},[],[41170],{"type":25,"value":41171},"v-bind:",{"type":25,"value":41173}," + 字符串、数组、对象的方式设置样式",{"type":20,"tag":28,"props":41175,"children":41177},{"id":41176},"双向数据绑定",[41178],{"type":25,"value":41176},{"type":20,"tag":44,"props":41180,"children":41181},{},[41182],{"type":20,"tag":48,"props":41183,"children":41184},{},[41185],{"type":25,"value":41186},"通过动态绑定与事件绑定实现",{"type":20,"tag":126,"props":41188,"children":41190},{"className":36848,"code":41189,"language":36850,"meta":8,"style":8},"\u003Cimput type=\"text\" :value=\"message\" @input=\"message = $event.target.value\">\n",[41191],{"type":20,"tag":84,"props":41192,"children":41193},{"__ignoreMap":8},[41194],{"type":20,"tag":157,"props":41195,"children":41196},{"class":159,"line":160},[41197,41201,41207,41212,41216,41221,41226,41230,41235,41240,41244,41249],{"type":20,"tag":157,"props":41198,"children":41199},{"style":892},[41200],{"type":25,"value":36862},{"type":20,"tag":157,"props":41202,"children":41204},{"style":41203},"--shiki-default:#FDAEB7;--shiki-default-font-style:italic",[41205],{"type":25,"value":41206},"imput",{"type":20,"tag":157,"props":41208,"children":41209},{"style":248},[41210],{"type":25,"value":41211}," type",{"type":20,"tag":157,"props":41213,"children":41214},{"style":892},[41215],{"type":25,"value":2261},{"type":20,"tag":157,"props":41217,"children":41218},{"style":254},[41219],{"type":25,"value":41220},"\"text\"",{"type":20,"tag":157,"props":41222,"children":41223},{"style":248},[41224],{"type":25,"value":41225}," :value",{"type":20,"tag":157,"props":41227,"children":41228},{"style":892},[41229],{"type":25,"value":2261},{"type":20,"tag":157,"props":41231,"children":41232},{"style":254},[41233],{"type":25,"value":41234},"\"message\"",{"type":20,"tag":157,"props":41236,"children":41237},{"style":248},[41238],{"type":25,"value":41239}," @input",{"type":20,"tag":157,"props":41241,"children":41242},{"style":892},[41243],{"type":25,"value":2261},{"type":20,"tag":157,"props":41245,"children":41246},{"style":254},[41247],{"type":25,"value":41248},"\"message = $event.target.value\"",{"type":20,"tag":157,"props":41250,"children":41251},{"style":892},[41252],{"type":25,"value":30657},{"type":20,"tag":44,"props":41254,"children":41255},{},[41256],{"type":20,"tag":48,"props":41257,"children":41258},{},[41259],{"type":25,"value":41260},"输入框、多选框、单选框都可以双向数据绑定显示数据",{"type":20,"tag":28,"props":41262,"children":41264},{"id":41263},"生命周期钩子",[41265],{"type":25,"value":41263},{"type":20,"tag":44,"props":41267,"children":41268},{},[41269,41281,41300],{"type":20,"tag":48,"props":41270,"children":41271},{},[41272,41273,41279],{"type":25,"value":15000},{"type":20,"tag":84,"props":41274,"children":41276},{"className":41275},[],[41277],{"type":25,"value":41278},"create",{"type":25,"value":41280},"钩子中发AJAX请求",{"type":20,"tag":48,"props":41282,"children":41283},{},[41284,41290,41292,41298],{"type":20,"tag":84,"props":41285,"children":41287},{"className":41286},[],[41288],{"type":25,"value":41289},"beforeUpdate",{"type":25,"value":41291},"：数据更新了，但是DOM没有更新；",{"type":20,"tag":84,"props":41293,"children":41295},{"className":41294},[],[41296],{"type":25,"value":41297},"updated",{"type":25,"value":41299},"：数据和DOM都更新了",{"type":20,"tag":48,"props":41301,"children":41302},{},[41303,41309,41311,41317],{"type":20,"tag":84,"props":41304,"children":41306},{"className":41305},[],[41307],{"type":25,"value":41308},"beforeUnmount",{"type":25,"value":41310},"：数据和DOM都能访问到；",{"type":20,"tag":84,"props":41312,"children":41314},{"className":41313},[],[41315],{"type":25,"value":41316},"unmount",{"type":25,"value":41318},"：数据能访问，DOM访问不了",{"type":20,"tag":28,"props":41320,"children":41322},{"id":41321},"组件",[41323],{"type":25,"value":41321},{"type":20,"tag":44,"props":41325,"children":41326},{},[41327,41340],{"type":20,"tag":48,"props":41328,"children":41329},{},[41330,41332,41338],{"type":25,"value":41331},"可以通过",{"type":20,"tag":84,"props":41333,"children":41335},{"className":41334},[],[41336],{"type":25,"value":41337},"app.component(\"MyComponent\", {...})",{"type":25,"value":41339},"创建组件",{"type":20,"tag":48,"props":41341,"children":41342},{},[41343,41349,41351,41357],{"type":20,"tag":84,"props":41344,"children":41346},{"className":41345},[],[41347],{"type":25,"value":41348},"this.$attrs",{"type":25,"value":41350}," 、",{"type":20,"tag":84,"props":41352,"children":41354},{"className":41353},[],[41355],{"type":25,"value":41356},"this.$ref",{"type":25,"value":41358},"、自定义属性(父传子)、自定义事件(子传父)等都可以实现组件间通信",{"type":20,"tag":28,"props":41360,"children":41362},{"id":41361},"插槽",[41363],{"type":25,"value":41361},{"type":20,"tag":44,"props":41365,"children":41366},{},[41367],{"type":20,"tag":48,"props":41368,"children":41369},{},[41370],{"type":25,"value":41371},"具名插槽",{"type":20,"tag":126,"props":41373,"children":41375},{"className":39112,"code":41374,"language":39114,"meta":8,"style":8},"\u003Cmy-header>\n    \u003Ctemplate #logo>\n        \u003Ch2>logo\u003C\u002Fh2>\n    \u003C\u002Ftemplate>\n    \n    \u003Ctemplate #list>\n    \u003Cul>\n      \u003Cli>JavaScript\u003C\u002Fli>\n      \u003Cli>Java\u003C\u002Fli>\n      \u003Cli>Golang\u003C\u002Fli>\n      \u003Cli>Rust\u003C\u002Fli>\n    \u003C\u002Ful>\n    \u003C\u002Ftemplate>\n\u003C\u002Fmy-header>\n\n\n\u003Ctemplate>\n    \u003Cslot name=\"logo\"\u002F>\n    \u003Cslot name=\"list\"\u002F>\n\u003C\u002Ftemplate>\n",[41376],{"type":20,"tag":84,"props":41377,"children":41378},{"__ignoreMap":8},[41379,41395,41403,41411,41419,41426,41434,41442,41450,41458,41466,41474,41482,41489,41504,41511,41518,41533,41567,41599],{"type":20,"tag":157,"props":41380,"children":41381},{"class":159,"line":160},[41382,41386,41391],{"type":20,"tag":157,"props":41383,"children":41384},{"style":892},[41385],{"type":25,"value":36862},{"type":20,"tag":157,"props":41387,"children":41388},{"style":5667},[41389],{"type":25,"value":41390},"my-header",{"type":20,"tag":157,"props":41392,"children":41393},{"style":892},[41394],{"type":25,"value":30657},{"type":20,"tag":157,"props":41396,"children":41397},{"class":159,"line":169},[41398],{"type":20,"tag":157,"props":41399,"children":41400},{"style":892},[41401],{"type":25,"value":41402},"    \u003Ctemplate #logo>\n",{"type":20,"tag":157,"props":41404,"children":41405},{"class":159,"line":179},[41406],{"type":20,"tag":157,"props":41407,"children":41408},{"style":892},[41409],{"type":25,"value":41410},"        \u003Ch2>logo\u003C\u002Fh2>\n",{"type":20,"tag":157,"props":41412,"children":41413},{"class":159,"line":188},[41414],{"type":20,"tag":157,"props":41415,"children":41416},{"style":892},[41417],{"type":25,"value":41418},"    \u003C\u002Ftemplate>\n",{"type":20,"tag":157,"props":41420,"children":41421},{"class":159,"line":196},[41422],{"type":20,"tag":157,"props":41423,"children":41424},{"style":892},[41425],{"type":25,"value":30680},{"type":20,"tag":157,"props":41427,"children":41428},{"class":159,"line":204},[41429],{"type":20,"tag":157,"props":41430,"children":41431},{"style":892},[41432],{"type":25,"value":41433},"    \u003Ctemplate #list>\n",{"type":20,"tag":157,"props":41435,"children":41436},{"class":159,"line":213},[41437],{"type":20,"tag":157,"props":41438,"children":41439},{"style":892},[41440],{"type":25,"value":41441},"    \u003Cul>\n",{"type":20,"tag":157,"props":41443,"children":41444},{"class":159,"line":222},[41445],{"type":20,"tag":157,"props":41446,"children":41447},{"style":892},[41448],{"type":25,"value":41449},"      \u003Cli>JavaScript\u003C\u002Fli>\n",{"type":20,"tag":157,"props":41451,"children":41452},{"class":159,"line":440},[41453],{"type":20,"tag":157,"props":41454,"children":41455},{"style":892},[41456],{"type":25,"value":41457},"      \u003Cli>Java\u003C\u002Fli>\n",{"type":20,"tag":157,"props":41459,"children":41460},{"class":159,"line":448},[41461],{"type":20,"tag":157,"props":41462,"children":41463},{"style":892},[41464],{"type":25,"value":41465},"      \u003Cli>Golang\u003C\u002Fli>\n",{"type":20,"tag":157,"props":41467,"children":41468},{"class":159,"line":456},[41469],{"type":20,"tag":157,"props":41470,"children":41471},{"style":892},[41472],{"type":25,"value":41473},"      \u003Cli>Rust\u003C\u002Fli>\n",{"type":20,"tag":157,"props":41475,"children":41476},{"class":159,"line":465},[41477],{"type":20,"tag":157,"props":41478,"children":41479},{"style":892},[41480],{"type":25,"value":41481},"    \u003C\u002Ful>\n",{"type":20,"tag":157,"props":41483,"children":41484},{"class":159,"line":474},[41485],{"type":20,"tag":157,"props":41486,"children":41487},{"style":892},[41488],{"type":25,"value":41418},{"type":20,"tag":157,"props":41490,"children":41491},{"class":159,"line":483},[41492,41496,41500],{"type":20,"tag":157,"props":41493,"children":41494},{"style":892},[41495],{"type":25,"value":39512},{"type":20,"tag":157,"props":41497,"children":41498},{"style":5667},[41499],{"type":25,"value":41390},{"type":20,"tag":157,"props":41501,"children":41502},{"style":892},[41503],{"type":25,"value":30657},{"type":20,"tag":157,"props":41505,"children":41506},{"class":159,"line":491},[41507],{"type":20,"tag":157,"props":41508,"children":41509},{"emptyLinePlaceholder":173},[41510],{"type":25,"value":176},{"type":20,"tag":157,"props":41512,"children":41513},{"class":159,"line":499},[41514],{"type":20,"tag":157,"props":41515,"children":41516},{"emptyLinePlaceholder":173},[41517],{"type":25,"value":176},{"type":20,"tag":157,"props":41519,"children":41520},{"class":159,"line":508},[41521,41525,41529],{"type":20,"tag":157,"props":41522,"children":41523},{"style":892},[41524],{"type":25,"value":36862},{"type":20,"tag":157,"props":41526,"children":41527},{"style":5667},[41528],{"type":25,"value":39539},{"type":20,"tag":157,"props":41530,"children":41531},{"style":892},[41532],{"type":25,"value":30657},{"type":20,"tag":157,"props":41534,"children":41535},{"class":159,"line":517},[41536,41540,41545,41550,41554,41559,41563],{"type":20,"tag":157,"props":41537,"children":41538},{"style":892},[41539],{"type":25,"value":39582},{"type":20,"tag":157,"props":41541,"children":41542},{"style":5667},[41543],{"type":25,"value":41544},"slot",{"type":20,"tag":157,"props":41546,"children":41547},{"style":248},[41548],{"type":25,"value":41549}," name",{"type":20,"tag":157,"props":41551,"children":41552},{"style":892},[41553],{"type":25,"value":2261},{"type":20,"tag":157,"props":41555,"children":41556},{"style":254},[41557],{"type":25,"value":41558},"\"logo\"",{"type":20,"tag":157,"props":41560,"children":41561},{"style":41203},[41562],{"type":25,"value":37775},{"type":20,"tag":157,"props":41564,"children":41565},{"style":892},[41566],{"type":25,"value":30657},{"type":20,"tag":157,"props":41568,"children":41569},{"class":159,"line":1499},[41570,41574,41578,41582,41586,41591,41595],{"type":20,"tag":157,"props":41571,"children":41572},{"style":892},[41573],{"type":25,"value":39582},{"type":20,"tag":157,"props":41575,"children":41576},{"style":5667},[41577],{"type":25,"value":41544},{"type":20,"tag":157,"props":41579,"children":41580},{"style":248},[41581],{"type":25,"value":41549},{"type":20,"tag":157,"props":41583,"children":41584},{"style":892},[41585],{"type":25,"value":2261},{"type":20,"tag":157,"props":41587,"children":41588},{"style":254},[41589],{"type":25,"value":41590},"\"list\"",{"type":20,"tag":157,"props":41592,"children":41593},{"style":41203},[41594],{"type":25,"value":37775},{"type":20,"tag":157,"props":41596,"children":41597},{"style":892},[41598],{"type":25,"value":30657},{"type":20,"tag":157,"props":41600,"children":41601},{"class":159,"line":1507},[41602,41606,41610],{"type":20,"tag":157,"props":41603,"children":41604},{"style":892},[41605],{"type":25,"value":39512},{"type":20,"tag":157,"props":41607,"children":41608},{"style":5667},[41609],{"type":25,"value":39539},{"type":20,"tag":157,"props":41611,"children":41612},{"style":892},[41613],{"type":25,"value":30657},{"type":20,"tag":44,"props":41615,"children":41616},{},[41617],{"type":20,"tag":48,"props":41618,"children":41619},{},[41620],{"type":25,"value":41621},"作用域插槽",{"type":20,"tag":126,"props":41623,"children":41625},{"className":39112,"code":41624,"language":39114,"meta":8,"style":8},"\u003Cmy-header>\n    \u003Ctemplate #logo>\n        \u003Ch2>logo\u003C\u002Fh2>\n    \u003C\u002Ftemplate>\n    \n    \u003Ctemplate #list=\"{ list }\">\n    \u003Cul>\n      \u003Cli v-for=\"item in list\">\u003C\u002Fli>\n    \u003C\u002Ful>\n    \u003C\u002Ftemplate>\n\n\u003C\u002Fmy-header>\n\n\napp.component(\"MyHeader\", {\n    data() {\n        return {\n            list: [\"JavaScript\", \"Go\", \"Rust\"]\n        } \n    },\n    template: `\n      \u003Cheader>\n      \u003Cslot name=\"logo\"\u002F>\n      \u003Cslot name=\"list\" :list=\"list\"\u002F>\n      \u003C\u002Fheader>\n    `\n})\n",[41626],{"type":20,"tag":84,"props":41627,"children":41628},{"__ignoreMap":8},[41629,41644,41651,41658,41665,41672,41680,41687,41695,41702,41709,41716,41731,41738,41745,41753,41761,41769,41777,41785,41793,41801,41818,41826,41834,41850,41858],{"type":20,"tag":157,"props":41630,"children":41631},{"class":159,"line":160},[41632,41636,41640],{"type":20,"tag":157,"props":41633,"children":41634},{"style":892},[41635],{"type":25,"value":36862},{"type":20,"tag":157,"props":41637,"children":41638},{"style":5667},[41639],{"type":25,"value":41390},{"type":20,"tag":157,"props":41641,"children":41642},{"style":892},[41643],{"type":25,"value":30657},{"type":20,"tag":157,"props":41645,"children":41646},{"class":159,"line":169},[41647],{"type":20,"tag":157,"props":41648,"children":41649},{"style":892},[41650],{"type":25,"value":41402},{"type":20,"tag":157,"props":41652,"children":41653},{"class":159,"line":179},[41654],{"type":20,"tag":157,"props":41655,"children":41656},{"style":892},[41657],{"type":25,"value":41410},{"type":20,"tag":157,"props":41659,"children":41660},{"class":159,"line":188},[41661],{"type":20,"tag":157,"props":41662,"children":41663},{"style":892},[41664],{"type":25,"value":41418},{"type":20,"tag":157,"props":41666,"children":41667},{"class":159,"line":196},[41668],{"type":20,"tag":157,"props":41669,"children":41670},{"style":892},[41671],{"type":25,"value":30680},{"type":20,"tag":157,"props":41673,"children":41674},{"class":159,"line":204},[41675],{"type":20,"tag":157,"props":41676,"children":41677},{"style":892},[41678],{"type":25,"value":41679},"    \u003Ctemplate #list=\"{ list }\">\n",{"type":20,"tag":157,"props":41681,"children":41682},{"class":159,"line":213},[41683],{"type":20,"tag":157,"props":41684,"children":41685},{"style":892},[41686],{"type":25,"value":41441},{"type":20,"tag":157,"props":41688,"children":41689},{"class":159,"line":222},[41690],{"type":20,"tag":157,"props":41691,"children":41692},{"style":892},[41693],{"type":25,"value":41694},"      \u003Cli v-for=\"item in list\">\u003C\u002Fli>\n",{"type":20,"tag":157,"props":41696,"children":41697},{"class":159,"line":440},[41698],{"type":20,"tag":157,"props":41699,"children":41700},{"style":892},[41701],{"type":25,"value":41481},{"type":20,"tag":157,"props":41703,"children":41704},{"class":159,"line":448},[41705],{"type":20,"tag":157,"props":41706,"children":41707},{"style":892},[41708],{"type":25,"value":41418},{"type":20,"tag":157,"props":41710,"children":41711},{"class":159,"line":456},[41712],{"type":20,"tag":157,"props":41713,"children":41714},{"emptyLinePlaceholder":173},[41715],{"type":25,"value":176},{"type":20,"tag":157,"props":41717,"children":41718},{"class":159,"line":465},[41719,41723,41727],{"type":20,"tag":157,"props":41720,"children":41721},{"style":892},[41722],{"type":25,"value":39512},{"type":20,"tag":157,"props":41724,"children":41725},{"style":5667},[41726],{"type":25,"value":41390},{"type":20,"tag":157,"props":41728,"children":41729},{"style":892},[41730],{"type":25,"value":30657},{"type":20,"tag":157,"props":41732,"children":41733},{"class":159,"line":474},[41734],{"type":20,"tag":157,"props":41735,"children":41736},{"emptyLinePlaceholder":173},[41737],{"type":25,"value":176},{"type":20,"tag":157,"props":41739,"children":41740},{"class":159,"line":483},[41741],{"type":20,"tag":157,"props":41742,"children":41743},{"emptyLinePlaceholder":173},[41744],{"type":25,"value":176},{"type":20,"tag":157,"props":41746,"children":41747},{"class":159,"line":491},[41748],{"type":20,"tag":157,"props":41749,"children":41750},{"style":892},[41751],{"type":25,"value":41752},"app.component(\"MyHeader\", {\n",{"type":20,"tag":157,"props":41754,"children":41755},{"class":159,"line":499},[41756],{"type":20,"tag":157,"props":41757,"children":41758},{"style":892},[41759],{"type":25,"value":41760},"    data() {\n",{"type":20,"tag":157,"props":41762,"children":41763},{"class":159,"line":508},[41764],{"type":20,"tag":157,"props":41765,"children":41766},{"style":892},[41767],{"type":25,"value":41768},"        return {\n",{"type":20,"tag":157,"props":41770,"children":41771},{"class":159,"line":517},[41772],{"type":20,"tag":157,"props":41773,"children":41774},{"style":892},[41775],{"type":25,"value":41776},"            list: [\"JavaScript\", \"Go\", \"Rust\"]\n",{"type":20,"tag":157,"props":41778,"children":41779},{"class":159,"line":1499},[41780],{"type":20,"tag":157,"props":41781,"children":41782},{"style":892},[41783],{"type":25,"value":41784},"        } \n",{"type":20,"tag":157,"props":41786,"children":41787},{"class":159,"line":1507},[41788],{"type":20,"tag":157,"props":41789,"children":41790},{"style":892},[41791],{"type":25,"value":41792},"    },\n",{"type":20,"tag":157,"props":41794,"children":41795},{"class":159,"line":1515},[41796],{"type":20,"tag":157,"props":41797,"children":41798},{"style":892},[41799],{"type":25,"value":41800},"    template: `\n",{"type":20,"tag":157,"props":41802,"children":41803},{"class":159,"line":1523},[41804,41809,41814],{"type":20,"tag":157,"props":41805,"children":41806},{"style":892},[41807],{"type":25,"value":41808},"      \u003C",{"type":20,"tag":157,"props":41810,"children":41811},{"style":5667},[41812],{"type":25,"value":41813},"header",{"type":20,"tag":157,"props":41815,"children":41816},{"style":892},[41817],{"type":25,"value":30657},{"type":20,"tag":157,"props":41819,"children":41820},{"class":159,"line":1532},[41821],{"type":20,"tag":157,"props":41822,"children":41823},{"style":892},[41824],{"type":25,"value":41825},"      \u003Cslot name=\"logo\"\u002F>\n",{"type":20,"tag":157,"props":41827,"children":41828},{"class":159,"line":1541},[41829],{"type":20,"tag":157,"props":41830,"children":41831},{"style":892},[41832],{"type":25,"value":41833},"      \u003Cslot name=\"list\" :list=\"list\"\u002F>\n",{"type":20,"tag":157,"props":41835,"children":41836},{"class":159,"line":1550},[41837,41842,41846],{"type":20,"tag":157,"props":41838,"children":41839},{"style":892},[41840],{"type":25,"value":41841},"      \u003C\u002F",{"type":20,"tag":157,"props":41843,"children":41844},{"style":5667},[41845],{"type":25,"value":41813},{"type":20,"tag":157,"props":41847,"children":41848},{"style":892},[41849],{"type":25,"value":30657},{"type":20,"tag":157,"props":41851,"children":41852},{"class":159,"line":1558},[41853],{"type":20,"tag":157,"props":41854,"children":41855},{"style":892},[41856],{"type":25,"value":41857},"    `\n",{"type":20,"tag":157,"props":41859,"children":41860},{"class":159,"line":1566},[41861],{"type":20,"tag":157,"props":41862,"children":41863},{"style":892},[41864],{"type":25,"value":40371},{"type":20,"tag":28,"props":41866,"children":41868},{"id":41867},"nexttick",[41869],{"type":25,"value":41870},"nextTick",{"type":20,"tag":6665,"props":41872,"children":41873},{},[41874],{"type":20,"tag":21,"props":41875,"children":41876},{},[41877],{"type":25,"value":41878},"将回调推迟到下一个DOM更新周期之后执行。在更改了一些数据以等待DOM更新后立即使用它",{"type":20,"tag":126,"props":41880,"children":41882},{"className":39112,"code":41881,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Ch2>Hello nextTick\u003C\u002Fh2>\n  \u003Cp ref=\"message\">{{ message }}\u003C\u002Fp>\n\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  name: \"nextTick\",\n  data() {\n    return {\n      message: \"Hello Word\"\n    }\n  },\n  mounted() {\n    setTimeout(() => {\n      this.message = \"Hello Vue\"\n      console.log(this.$refs.message.innerHTML)  \u002F\u002F Hello Word\n      this.$nextTick(() => {\n        console.log(this.$refs.message.innerHTML)  \u002F\u002F Hello Vue\n      })\n    }, 1000)\n  },\n\n  updated() {\n    console.log(this.$refs.message.innerHTML)\n  }\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n\n\u003C\u002Fstyle>\n",[41883],{"type":20,"tag":84,"props":41884,"children":41885},{"__ignoreMap":8},[41886,41901,41925,41961,41968,41983,41990,42005,42022,42039,42051,42063,42076,42083,42091,42103,42123,42145,42176,42204,42233,42241,42258,42265,42272,42284,42309,42316,42323,42338,42345,42365,42372],{"type":20,"tag":157,"props":41887,"children":41888},{"class":159,"line":160},[41889,41893,41897],{"type":20,"tag":157,"props":41890,"children":41891},{"style":892},[41892],{"type":25,"value":36862},{"type":20,"tag":157,"props":41894,"children":41895},{"style":5667},[41896],{"type":25,"value":39539},{"type":20,"tag":157,"props":41898,"children":41899},{"style":892},[41900],{"type":25,"value":30657},{"type":20,"tag":157,"props":41902,"children":41903},{"class":159,"line":169},[41904,41908,41912,41917,41921],{"type":20,"tag":157,"props":41905,"children":41906},{"style":892},[41907],{"type":25,"value":39551},{"type":20,"tag":157,"props":41909,"children":41910},{"style":5667},[41911],{"type":25,"value":1863},{"type":20,"tag":157,"props":41913,"children":41914},{"style":892},[41915],{"type":25,"value":41916},">Hello nextTick\u003C\u002F",{"type":20,"tag":157,"props":41918,"children":41919},{"style":5667},[41920],{"type":25,"value":1863},{"type":20,"tag":157,"props":41922,"children":41923},{"style":892},[41924],{"type":25,"value":30657},{"type":20,"tag":157,"props":41926,"children":41927},{"class":159,"line":179},[41928,41932,41936,41940,41944,41948,41953,41957],{"type":20,"tag":157,"props":41929,"children":41930},{"style":892},[41931],{"type":25,"value":39551},{"type":20,"tag":157,"props":41933,"children":41934},{"style":5667},[41935],{"type":25,"value":21},{"type":20,"tag":157,"props":41937,"children":41938},{"style":248},[41939],{"type":25,"value":39184},{"type":20,"tag":157,"props":41941,"children":41942},{"style":892},[41943],{"type":25,"value":2261},{"type":20,"tag":157,"props":41945,"children":41946},{"style":254},[41947],{"type":25,"value":41234},{"type":20,"tag":157,"props":41949,"children":41950},{"style":892},[41951],{"type":25,"value":41952},">{{ message }}\u003C\u002F",{"type":20,"tag":157,"props":41954,"children":41955},{"style":5667},[41956],{"type":25,"value":21},{"type":20,"tag":157,"props":41958,"children":41959},{"style":892},[41960],{"type":25,"value":30657},{"type":20,"tag":157,"props":41962,"children":41963},{"class":159,"line":188},[41964],{"type":20,"tag":157,"props":41965,"children":41966},{"emptyLinePlaceholder":173},[41967],{"type":25,"value":176},{"type":20,"tag":157,"props":41969,"children":41970},{"class":159,"line":196},[41971,41975,41979],{"type":20,"tag":157,"props":41972,"children":41973},{"style":892},[41974],{"type":25,"value":39512},{"type":20,"tag":157,"props":41976,"children":41977},{"style":5667},[41978],{"type":25,"value":39539},{"type":20,"tag":157,"props":41980,"children":41981},{"style":892},[41982],{"type":25,"value":30657},{"type":20,"tag":157,"props":41984,"children":41985},{"class":159,"line":204},[41986],{"type":20,"tag":157,"props":41987,"children":41988},{"emptyLinePlaceholder":173},[41989],{"type":25,"value":176},{"type":20,"tag":157,"props":41991,"children":41992},{"class":159,"line":213},[41993,41997,42001],{"type":20,"tag":157,"props":41994,"children":41995},{"style":892},[41996],{"type":25,"value":36862},{"type":20,"tag":157,"props":41998,"children":41999},{"style":5667},[42000],{"type":25,"value":39298},{"type":20,"tag":157,"props":42002,"children":42003},{"style":892},[42004],{"type":25,"value":30657},{"type":20,"tag":157,"props":42006,"children":42007},{"class":159,"line":222},[42008,42013,42018],{"type":20,"tag":157,"props":42009,"children":42010},{"style":39166},[42011],{"type":25,"value":42012},"export",{"type":20,"tag":157,"props":42014,"children":42015},{"style":39166},[42016],{"type":25,"value":42017}," default",{"type":20,"tag":157,"props":42019,"children":42020},{"style":892},[42021],{"type":25,"value":38885},{"type":20,"tag":157,"props":42023,"children":42024},{"class":159,"line":440},[42025,42030,42035],{"type":20,"tag":157,"props":42026,"children":42027},{"style":892},[42028],{"type":25,"value":42029},"  name: ",{"type":20,"tag":157,"props":42031,"children":42032},{"style":254},[42033],{"type":25,"value":42034},"\"nextTick\"",{"type":20,"tag":157,"props":42036,"children":42037},{"style":892},[42038],{"type":25,"value":918},{"type":20,"tag":157,"props":42040,"children":42041},{"class":159,"line":448},[42042,42047],{"type":20,"tag":157,"props":42043,"children":42044},{"style":248},[42045],{"type":25,"value":42046},"  data",{"type":20,"tag":157,"props":42048,"children":42049},{"style":892},[42050],{"type":25,"value":39400},{"type":20,"tag":157,"props":42052,"children":42053},{"class":159,"line":456},[42054,42059],{"type":20,"tag":157,"props":42055,"children":42056},{"style":39166},[42057],{"type":25,"value":42058},"    return",{"type":20,"tag":157,"props":42060,"children":42061},{"style":892},[42062],{"type":25,"value":38885},{"type":20,"tag":157,"props":42064,"children":42065},{"class":159,"line":465},[42066,42071],{"type":20,"tag":157,"props":42067,"children":42068},{"style":892},[42069],{"type":25,"value":42070},"      message: ",{"type":20,"tag":157,"props":42072,"children":42073},{"style":254},[42074],{"type":25,"value":42075},"\"Hello Word\"\n",{"type":20,"tag":157,"props":42077,"children":42078},{"class":159,"line":474},[42079],{"type":20,"tag":157,"props":42080,"children":42081},{"style":892},[42082],{"type":25,"value":872},{"type":20,"tag":157,"props":42084,"children":42085},{"class":159,"line":483},[42086],{"type":20,"tag":157,"props":42087,"children":42088},{"style":892},[42089],{"type":25,"value":42090},"  },\n",{"type":20,"tag":157,"props":42092,"children":42093},{"class":159,"line":491},[42094,42099],{"type":20,"tag":157,"props":42095,"children":42096},{"style":248},[42097],{"type":25,"value":42098},"  mounted",{"type":20,"tag":157,"props":42100,"children":42101},{"style":892},[42102],{"type":25,"value":39400},{"type":20,"tag":157,"props":42104,"children":42105},{"class":159,"line":499},[42106,42111,42115,42119],{"type":20,"tag":157,"props":42107,"children":42108},{"style":248},[42109],{"type":25,"value":42110},"    setTimeout",{"type":20,"tag":157,"props":42112,"children":42113},{"style":892},[42114],{"type":25,"value":39890},{"type":20,"tag":157,"props":42116,"children":42117},{"style":39166},[42118],{"type":25,"value":39895},{"type":20,"tag":157,"props":42120,"children":42121},{"style":892},[42122],{"type":25,"value":38885},{"type":20,"tag":157,"props":42124,"children":42125},{"class":159,"line":508},[42126,42131,42136,42140],{"type":20,"tag":157,"props":42127,"children":42128},{"style":260},[42129],{"type":25,"value":42130},"      this",{"type":20,"tag":157,"props":42132,"children":42133},{"style":892},[42134],{"type":25,"value":42135},".message ",{"type":20,"tag":157,"props":42137,"children":42138},{"style":39166},[42139],{"type":25,"value":2261},{"type":20,"tag":157,"props":42141,"children":42142},{"style":254},[42143],{"type":25,"value":42144}," \"Hello Vue\"\n",{"type":20,"tag":157,"props":42146,"children":42147},{"class":159,"line":517},[42148,42153,42158,42162,42166,42171],{"type":20,"tag":157,"props":42149,"children":42150},{"style":892},[42151],{"type":25,"value":42152},"      console.",{"type":20,"tag":157,"props":42154,"children":42155},{"style":248},[42156],{"type":25,"value":42157},"log",{"type":20,"tag":157,"props":42159,"children":42160},{"style":892},[42161],{"type":25,"value":39189},{"type":20,"tag":157,"props":42163,"children":42164},{"style":260},[42165],{"type":25,"value":40479},{"type":20,"tag":157,"props":42167,"children":42168},{"style":892},[42169],{"type":25,"value":42170},".$refs.message.innerHTML)  ",{"type":20,"tag":157,"props":42172,"children":42173},{"style":9628},[42174],{"type":25,"value":42175},"\u002F\u002F Hello Word\n",{"type":20,"tag":157,"props":42177,"children":42178},{"class":159,"line":1499},[42179,42183,42187,42192,42196,42200],{"type":20,"tag":157,"props":42180,"children":42181},{"style":260},[42182],{"type":25,"value":42130},{"type":20,"tag":157,"props":42184,"children":42185},{"style":892},[42186],{"type":25,"value":40175},{"type":20,"tag":157,"props":42188,"children":42189},{"style":248},[42190],{"type":25,"value":42191},"$nextTick",{"type":20,"tag":157,"props":42193,"children":42194},{"style":892},[42195],{"type":25,"value":39890},{"type":20,"tag":157,"props":42197,"children":42198},{"style":39166},[42199],{"type":25,"value":39895},{"type":20,"tag":157,"props":42201,"children":42202},{"style":892},[42203],{"type":25,"value":38885},{"type":20,"tag":157,"props":42205,"children":42206},{"class":159,"line":1507},[42207,42212,42216,42220,42224,42228],{"type":20,"tag":157,"props":42208,"children":42209},{"style":892},[42210],{"type":25,"value":42211},"        console.",{"type":20,"tag":157,"props":42213,"children":42214},{"style":248},[42215],{"type":25,"value":42157},{"type":20,"tag":157,"props":42217,"children":42218},{"style":892},[42219],{"type":25,"value":39189},{"type":20,"tag":157,"props":42221,"children":42222},{"style":260},[42223],{"type":25,"value":40479},{"type":20,"tag":157,"props":42225,"children":42226},{"style":892},[42227],{"type":25,"value":42170},{"type":20,"tag":157,"props":42229,"children":42230},{"style":9628},[42231],{"type":25,"value":42232},"\u002F\u002F Hello Vue\n",{"type":20,"tag":157,"props":42234,"children":42235},{"class":159,"line":1515},[42236],{"type":20,"tag":157,"props":42237,"children":42238},{"style":892},[42239],{"type":25,"value":42240},"      })\n",{"type":20,"tag":157,"props":42242,"children":42243},{"class":159,"line":1523},[42244,42249,42254],{"type":20,"tag":157,"props":42245,"children":42246},{"style":892},[42247],{"type":25,"value":42248},"    }, ",{"type":20,"tag":157,"props":42250,"children":42251},{"style":260},[42252],{"type":25,"value":42253},"1000",{"type":20,"tag":157,"props":42255,"children":42256},{"style":892},[42257],{"type":25,"value":8926},{"type":20,"tag":157,"props":42259,"children":42260},{"class":159,"line":1532},[42261],{"type":20,"tag":157,"props":42262,"children":42263},{"style":892},[42264],{"type":25,"value":42090},{"type":20,"tag":157,"props":42266,"children":42267},{"class":159,"line":1541},[42268],{"type":20,"tag":157,"props":42269,"children":42270},{"emptyLinePlaceholder":173},[42271],{"type":25,"value":176},{"type":20,"tag":157,"props":42273,"children":42274},{"class":159,"line":1550},[42275,42280],{"type":20,"tag":157,"props":42276,"children":42277},{"style":248},[42278],{"type":25,"value":42279},"  updated",{"type":20,"tag":157,"props":42281,"children":42282},{"style":892},[42283],{"type":25,"value":39400},{"type":20,"tag":157,"props":42285,"children":42286},{"class":159,"line":1558},[42287,42292,42296,42300,42304],{"type":20,"tag":157,"props":42288,"children":42289},{"style":892},[42290],{"type":25,"value":42291},"    console.",{"type":20,"tag":157,"props":42293,"children":42294},{"style":248},[42295],{"type":25,"value":42157},{"type":20,"tag":157,"props":42297,"children":42298},{"style":892},[42299],{"type":25,"value":39189},{"type":20,"tag":157,"props":42301,"children":42302},{"style":260},[42303],{"type":25,"value":40479},{"type":20,"tag":157,"props":42305,"children":42306},{"style":892},[42307],{"type":25,"value":42308},".$refs.message.innerHTML)\n",{"type":20,"tag":157,"props":42310,"children":42311},{"class":159,"line":1566},[42312],{"type":20,"tag":157,"props":42313,"children":42314},{"style":892},[42315],{"type":25,"value":39060},{"type":20,"tag":157,"props":42317,"children":42318},{"class":159,"line":1574},[42319],{"type":20,"tag":157,"props":42320,"children":42321},{"style":892},[42322],{"type":25,"value":943},{"type":20,"tag":157,"props":42324,"children":42325},{"class":159,"line":1582},[42326,42330,42334],{"type":20,"tag":157,"props":42327,"children":42328},{"style":892},[42329],{"type":25,"value":39512},{"type":20,"tag":157,"props":42331,"children":42332},{"style":5667},[42333],{"type":25,"value":39298},{"type":20,"tag":157,"props":42335,"children":42336},{"style":892},[42337],{"type":25,"value":30657},{"type":20,"tag":157,"props":42339,"children":42340},{"class":159,"line":1591},[42341],{"type":20,"tag":157,"props":42342,"children":42343},{"emptyLinePlaceholder":173},[42344],{"type":25,"value":176},{"type":20,"tag":157,"props":42346,"children":42347},{"class":159,"line":1599},[42348,42352,42356,42361],{"type":20,"tag":157,"props":42349,"children":42350},{"style":892},[42351],{"type":25,"value":36862},{"type":20,"tag":157,"props":42353,"children":42354},{"style":5667},[42355],{"type":25,"value":1785},{"type":20,"tag":157,"props":42357,"children":42358},{"style":248},[42359],{"type":25,"value":42360}," scoped",{"type":20,"tag":157,"props":42362,"children":42363},{"style":892},[42364],{"type":25,"value":30657},{"type":20,"tag":157,"props":42366,"children":42367},{"class":159,"line":1608},[42368],{"type":20,"tag":157,"props":42369,"children":42370},{"emptyLinePlaceholder":173},[42371],{"type":25,"value":176},{"type":20,"tag":157,"props":42373,"children":42374},{"class":159,"line":1617},[42375,42379,42383],{"type":20,"tag":157,"props":42376,"children":42377},{"style":892},[42378],{"type":25,"value":39512},{"type":20,"tag":157,"props":42380,"children":42381},{"style":5667},[42382],{"type":25,"value":1785},{"type":20,"tag":157,"props":42384,"children":42385},{"style":892},[42386],{"type":25,"value":30657},{"type":20,"tag":28,"props":42388,"children":42390},{"id":42389},"自定义指令",[42391],{"type":25,"value":42389},{"type":20,"tag":21,"props":42393,"children":42394},{},[42395],{"type":20,"tag":33,"props":42396,"children":42397},{},[42398],{"type":25,"value":42399},"真是使用场景：",{"type":20,"tag":21,"props":42401,"children":42402},{},[42403],{"type":25,"value":42404},"前端根据后端传过来的权限，显示和隐藏组件",{"type":20,"tag":126,"props":42406,"children":42408},{"className":39112,"code":42407,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Ch2>自定义指令\u003C\u002Fh2>\n  \u003Cbutton v-auth=\"'edit'\">编辑\u003C\u002Fbutton>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  name: \"02_自定义指令\",\n  data() {\n    return {}\n  },\n  \u002F\u002F 注册局部自定义指令\n  directives: {\n    auth: (el, binding) => {\n      const auths = [\"edit\",\"add\"]\n      \u002F\u002F const auths = [\"add\"]\n      const res = auths.includes(binding.value)\n      \u002F\u002F 当有edit的权限，显示按钮；没有权限，隐藏按钮\n      if (!res) {\n        el.style.display = \"none\"\n      }\n    }\n  }\n}\n\u003C\u002Fscript>\n",[42409],{"type":20,"tag":84,"props":42410,"children":42411},{"__ignoreMap":8},[42412,42427,42451,42490,42505,42512,42527,42542,42558,42569,42581,42588,42596,42604,42645,42687,42695,42726,42734,42756,42773,42781,42788,42795,42802],{"type":20,"tag":157,"props":42413,"children":42414},{"class":159,"line":160},[42415,42419,42423],{"type":20,"tag":157,"props":42416,"children":42417},{"style":892},[42418],{"type":25,"value":36862},{"type":20,"tag":157,"props":42420,"children":42421},{"style":5667},[42422],{"type":25,"value":39539},{"type":20,"tag":157,"props":42424,"children":42425},{"style":892},[42426],{"type":25,"value":30657},{"type":20,"tag":157,"props":42428,"children":42429},{"class":159,"line":169},[42430,42434,42438,42443,42447],{"type":20,"tag":157,"props":42431,"children":42432},{"style":892},[42433],{"type":25,"value":39551},{"type":20,"tag":157,"props":42435,"children":42436},{"style":5667},[42437],{"type":25,"value":1863},{"type":20,"tag":157,"props":42439,"children":42440},{"style":892},[42441],{"type":25,"value":42442},">自定义指令\u003C\u002F",{"type":20,"tag":157,"props":42444,"children":42445},{"style":5667},[42446],{"type":25,"value":1863},{"type":20,"tag":157,"props":42448,"children":42449},{"style":892},[42450],{"type":25,"value":30657},{"type":20,"tag":157,"props":42452,"children":42453},{"class":159,"line":179},[42454,42458,42463,42468,42472,42477,42482,42486],{"type":20,"tag":157,"props":42455,"children":42456},{"style":892},[42457],{"type":25,"value":39551},{"type":20,"tag":157,"props":42459,"children":42460},{"style":5667},[42461],{"type":25,"value":42462},"button",{"type":20,"tag":157,"props":42464,"children":42465},{"style":248},[42466],{"type":25,"value":42467}," v-auth",{"type":20,"tag":157,"props":42469,"children":42470},{"style":892},[42471],{"type":25,"value":2261},{"type":20,"tag":157,"props":42473,"children":42474},{"style":254},[42475],{"type":25,"value":42476},"\"'edit'\"",{"type":20,"tag":157,"props":42478,"children":42479},{"style":892},[42480],{"type":25,"value":42481},">编辑\u003C\u002F",{"type":20,"tag":157,"props":42483,"children":42484},{"style":5667},[42485],{"type":25,"value":42462},{"type":20,"tag":157,"props":42487,"children":42488},{"style":892},[42489],{"type":25,"value":30657},{"type":20,"tag":157,"props":42491,"children":42492},{"class":159,"line":188},[42493,42497,42501],{"type":20,"tag":157,"props":42494,"children":42495},{"style":892},[42496],{"type":25,"value":39512},{"type":20,"tag":157,"props":42498,"children":42499},{"style":5667},[42500],{"type":25,"value":39539},{"type":20,"tag":157,"props":42502,"children":42503},{"style":892},[42504],{"type":25,"value":30657},{"type":20,"tag":157,"props":42506,"children":42507},{"class":159,"line":196},[42508],{"type":20,"tag":157,"props":42509,"children":42510},{"emptyLinePlaceholder":173},[42511],{"type":25,"value":176},{"type":20,"tag":157,"props":42513,"children":42514},{"class":159,"line":204},[42515,42519,42523],{"type":20,"tag":157,"props":42516,"children":42517},{"style":892},[42518],{"type":25,"value":36862},{"type":20,"tag":157,"props":42520,"children":42521},{"style":5667},[42522],{"type":25,"value":39298},{"type":20,"tag":157,"props":42524,"children":42525},{"style":892},[42526],{"type":25,"value":30657},{"type":20,"tag":157,"props":42528,"children":42529},{"class":159,"line":213},[42530,42534,42538],{"type":20,"tag":157,"props":42531,"children":42532},{"style":39166},[42533],{"type":25,"value":42012},{"type":20,"tag":157,"props":42535,"children":42536},{"style":39166},[42537],{"type":25,"value":42017},{"type":20,"tag":157,"props":42539,"children":42540},{"style":892},[42541],{"type":25,"value":38885},{"type":20,"tag":157,"props":42543,"children":42544},{"class":159,"line":222},[42545,42549,42554],{"type":20,"tag":157,"props":42546,"children":42547},{"style":892},[42548],{"type":25,"value":42029},{"type":20,"tag":157,"props":42550,"children":42551},{"style":254},[42552],{"type":25,"value":42553},"\"02_自定义指令\"",{"type":20,"tag":157,"props":42555,"children":42556},{"style":892},[42557],{"type":25,"value":918},{"type":20,"tag":157,"props":42559,"children":42560},{"class":159,"line":440},[42561,42565],{"type":20,"tag":157,"props":42562,"children":42563},{"style":248},[42564],{"type":25,"value":42046},{"type":20,"tag":157,"props":42566,"children":42567},{"style":892},[42568],{"type":25,"value":39400},{"type":20,"tag":157,"props":42570,"children":42571},{"class":159,"line":448},[42572,42576],{"type":20,"tag":157,"props":42573,"children":42574},{"style":39166},[42575],{"type":25,"value":42058},{"type":20,"tag":157,"props":42577,"children":42578},{"style":892},[42579],{"type":25,"value":42580}," {}\n",{"type":20,"tag":157,"props":42582,"children":42583},{"class":159,"line":456},[42584],{"type":20,"tag":157,"props":42585,"children":42586},{"style":892},[42587],{"type":25,"value":42090},{"type":20,"tag":157,"props":42589,"children":42590},{"class":159,"line":465},[42591],{"type":20,"tag":157,"props":42592,"children":42593},{"style":9628},[42594],{"type":25,"value":42595},"  \u002F\u002F 注册局部自定义指令\n",{"type":20,"tag":157,"props":42597,"children":42598},{"class":159,"line":474},[42599],{"type":20,"tag":157,"props":42600,"children":42601},{"style":892},[42602],{"type":25,"value":42603},"  directives: {\n",{"type":20,"tag":157,"props":42605,"children":42606},{"class":159,"line":483},[42607,42612,42617,42622,42627,42632,42637,42641],{"type":20,"tag":157,"props":42608,"children":42609},{"style":248},[42610],{"type":25,"value":42611},"    auth",{"type":20,"tag":157,"props":42613,"children":42614},{"style":892},[42615],{"type":25,"value":42616},": (",{"type":20,"tag":157,"props":42618,"children":42619},{"style":6410},[42620],{"type":25,"value":42621},"el",{"type":20,"tag":157,"props":42623,"children":42624},{"style":892},[42625],{"type":25,"value":42626},", ",{"type":20,"tag":157,"props":42628,"children":42629},{"style":6410},[42630],{"type":25,"value":42631},"binding",{"type":20,"tag":157,"props":42633,"children":42634},{"style":892},[42635],{"type":25,"value":42636},") ",{"type":20,"tag":157,"props":42638,"children":42639},{"style":39166},[42640],{"type":25,"value":39895},{"type":20,"tag":157,"props":42642,"children":42643},{"style":892},[42644],{"type":25,"value":38885},{"type":20,"tag":157,"props":42646,"children":42647},{"class":159,"line":491},[42648,42653,42658,42662,42667,42672,42677,42682],{"type":20,"tag":157,"props":42649,"children":42650},{"style":39166},[42651],{"type":25,"value":42652},"      const",{"type":20,"tag":157,"props":42654,"children":42655},{"style":260},[42656],{"type":25,"value":42657}," auths",{"type":20,"tag":157,"props":42659,"children":42660},{"style":39166},[42661],{"type":25,"value":39179},{"type":20,"tag":157,"props":42663,"children":42664},{"style":892},[42665],{"type":25,"value":42666}," [",{"type":20,"tag":157,"props":42668,"children":42669},{"style":254},[42670],{"type":25,"value":42671},"\"edit\"",{"type":20,"tag":157,"props":42673,"children":42674},{"style":892},[42675],{"type":25,"value":42676},",",{"type":20,"tag":157,"props":42678,"children":42679},{"style":254},[42680],{"type":25,"value":42681},"\"add\"",{"type":20,"tag":157,"props":42683,"children":42684},{"style":892},[42685],{"type":25,"value":42686},"]\n",{"type":20,"tag":157,"props":42688,"children":42689},{"class":159,"line":499},[42690],{"type":20,"tag":157,"props":42691,"children":42692},{"style":9628},[42693],{"type":25,"value":42694},"      \u002F\u002F const auths = [\"add\"]\n",{"type":20,"tag":157,"props":42696,"children":42697},{"class":159,"line":508},[42698,42702,42707,42711,42716,42721],{"type":20,"tag":157,"props":42699,"children":42700},{"style":39166},[42701],{"type":25,"value":42652},{"type":20,"tag":157,"props":42703,"children":42704},{"style":260},[42705],{"type":25,"value":42706}," res",{"type":20,"tag":157,"props":42708,"children":42709},{"style":39166},[42710],{"type":25,"value":39179},{"type":20,"tag":157,"props":42712,"children":42713},{"style":892},[42714],{"type":25,"value":42715}," auths.",{"type":20,"tag":157,"props":42717,"children":42718},{"style":248},[42719],{"type":25,"value":42720},"includes",{"type":20,"tag":157,"props":42722,"children":42723},{"style":892},[42724],{"type":25,"value":42725},"(binding.value)\n",{"type":20,"tag":157,"props":42727,"children":42728},{"class":159,"line":517},[42729],{"type":20,"tag":157,"props":42730,"children":42731},{"style":9628},[42732],{"type":25,"value":42733},"      \u002F\u002F 当有edit的权限，显示按钮；没有权限，隐藏按钮\n",{"type":20,"tag":157,"props":42735,"children":42736},{"class":159,"line":1499},[42737,42742,42747,42751],{"type":20,"tag":157,"props":42738,"children":42739},{"style":39166},[42740],{"type":25,"value":42741},"      if",{"type":20,"tag":157,"props":42743,"children":42744},{"style":892},[42745],{"type":25,"value":42746}," (",{"type":20,"tag":157,"props":42748,"children":42749},{"style":39166},[42750],{"type":25,"value":40723},{"type":20,"tag":157,"props":42752,"children":42753},{"style":892},[42754],{"type":25,"value":42755},"res) {\n",{"type":20,"tag":157,"props":42757,"children":42758},{"class":159,"line":1507},[42759,42764,42768],{"type":20,"tag":157,"props":42760,"children":42761},{"style":892},[42762],{"type":25,"value":42763},"        el.style.display ",{"type":20,"tag":157,"props":42765,"children":42766},{"style":39166},[42767],{"type":25,"value":2261},{"type":20,"tag":157,"props":42769,"children":42770},{"style":254},[42771],{"type":25,"value":42772}," \"none\"\n",{"type":20,"tag":157,"props":42774,"children":42775},{"class":159,"line":1515},[42776],{"type":20,"tag":157,"props":42777,"children":42778},{"style":892},[42779],{"type":25,"value":42780},"      }\n",{"type":20,"tag":157,"props":42782,"children":42783},{"class":159,"line":1523},[42784],{"type":20,"tag":157,"props":42785,"children":42786},{"style":892},[42787],{"type":25,"value":872},{"type":20,"tag":157,"props":42789,"children":42790},{"class":159,"line":1532},[42791],{"type":20,"tag":157,"props":42792,"children":42793},{"style":892},[42794],{"type":25,"value":39060},{"type":20,"tag":157,"props":42796,"children":42797},{"class":159,"line":1541},[42798],{"type":20,"tag":157,"props":42799,"children":42800},{"style":892},[42801],{"type":25,"value":943},{"type":20,"tag":157,"props":42803,"children":42804},{"class":159,"line":1550},[42805,42809,42813],{"type":20,"tag":157,"props":42806,"children":42807},{"style":892},[42808],{"type":25,"value":39512},{"type":20,"tag":157,"props":42810,"children":42811},{"style":5667},[42812],{"type":25,"value":39298},{"type":20,"tag":157,"props":42814,"children":42815},{"style":892},[42816],{"type":25,"value":30657},{"type":20,"tag":21,"props":42818,"children":42819},{},[42820],{"type":20,"tag":33,"props":42821,"children":42822},{},[42823],{"type":25,"value":42824},"全局自定义指令：",{"type":20,"tag":126,"props":42826,"children":42828},{"className":39154,"code":42827,"language":39156,"meta":8,"style":8},"import { createApp } from 'vue'\nimport '.\u002Fstyle.css'\nimport App from '.\u002Fcomponents\u002F02_自定义指令.vue'\n\nconst app = createApp(App)\n\napp.directive(\"auth\", (el, binding) => {\n    \u002F\u002F const auths = [\"edit\", \"add\"]\n    const auths = [\"add\"]\n    const res = auths.includes(binding.value)\n    \u002F\u002F 当有edit的权限，显示按钮；没有权限，隐藏按钮\n    if (!res) {\n        el.style.display = \"none\"\n    }\n})\napp.mount('#app')\n",[42829],{"type":20,"tag":84,"props":42830,"children":42831},{"__ignoreMap":8},[42832,42852,42864,42885,42892,42918,42925,42976,42984,43011,43038,43046,43066,43081,43088,43095],{"type":20,"tag":157,"props":42833,"children":42834},{"class":159,"line":160},[42835,42839,42844,42848],{"type":20,"tag":157,"props":42836,"children":42837},{"style":39166},[42838],{"type":25,"value":40516},{"type":20,"tag":157,"props":42840,"children":42841},{"style":892},[42842],{"type":25,"value":42843}," { createApp } ",{"type":20,"tag":157,"props":42845,"children":42846},{"style":39166},[42847],{"type":25,"value":39806},{"type":20,"tag":157,"props":42849,"children":42850},{"style":254},[42851],{"type":25,"value":39811},{"type":20,"tag":157,"props":42853,"children":42854},{"class":159,"line":169},[42855,42859],{"type":20,"tag":157,"props":42856,"children":42857},{"style":39166},[42858],{"type":25,"value":40516},{"type":20,"tag":157,"props":42860,"children":42861},{"style":254},[42862],{"type":25,"value":42863}," '.\u002Fstyle.css'\n",{"type":20,"tag":157,"props":42865,"children":42866},{"class":159,"line":179},[42867,42871,42876,42880],{"type":20,"tag":157,"props":42868,"children":42869},{"style":39166},[42870],{"type":25,"value":40516},{"type":20,"tag":157,"props":42872,"children":42873},{"style":892},[42874],{"type":25,"value":42875}," App ",{"type":20,"tag":157,"props":42877,"children":42878},{"style":39166},[42879],{"type":25,"value":39806},{"type":20,"tag":157,"props":42881,"children":42882},{"style":254},[42883],{"type":25,"value":42884}," '.\u002Fcomponents\u002F02_自定义指令.vue'\n",{"type":20,"tag":157,"props":42886,"children":42887},{"class":159,"line":188},[42888],{"type":20,"tag":157,"props":42889,"children":42890},{"emptyLinePlaceholder":173},[42891],{"type":25,"value":176},{"type":20,"tag":157,"props":42893,"children":42894},{"class":159,"line":196},[42895,42899,42904,42908,42913],{"type":20,"tag":157,"props":42896,"children":42897},{"style":39166},[42898],{"type":25,"value":39169},{"type":20,"tag":157,"props":42900,"children":42901},{"style":260},[42902],{"type":25,"value":42903}," app",{"type":20,"tag":157,"props":42905,"children":42906},{"style":39166},[42907],{"type":25,"value":39179},{"type":20,"tag":157,"props":42909,"children":42910},{"style":248},[42911],{"type":25,"value":42912}," createApp",{"type":20,"tag":157,"props":42914,"children":42915},{"style":892},[42916],{"type":25,"value":42917},"(App)\n",{"type":20,"tag":157,"props":42919,"children":42920},{"class":159,"line":204},[42921],{"type":20,"tag":157,"props":42922,"children":42923},{"emptyLinePlaceholder":173},[42924],{"type":25,"value":176},{"type":20,"tag":157,"props":42926,"children":42927},{"class":159,"line":213},[42928,42933,42938,42942,42947,42952,42956,42960,42964,42968,42972],{"type":20,"tag":157,"props":42929,"children":42930},{"style":892},[42931],{"type":25,"value":42932},"app.",{"type":20,"tag":157,"props":42934,"children":42935},{"style":248},[42936],{"type":25,"value":42937},"directive",{"type":20,"tag":157,"props":42939,"children":42940},{"style":892},[42941],{"type":25,"value":39189},{"type":20,"tag":157,"props":42943,"children":42944},{"style":254},[42945],{"type":25,"value":42946},"\"auth\"",{"type":20,"tag":157,"props":42948,"children":42949},{"style":892},[42950],{"type":25,"value":42951},", (",{"type":20,"tag":157,"props":42953,"children":42954},{"style":6410},[42955],{"type":25,"value":42621},{"type":20,"tag":157,"props":42957,"children":42958},{"style":892},[42959],{"type":25,"value":42626},{"type":20,"tag":157,"props":42961,"children":42962},{"style":6410},[42963],{"type":25,"value":42631},{"type":20,"tag":157,"props":42965,"children":42966},{"style":892},[42967],{"type":25,"value":42636},{"type":20,"tag":157,"props":42969,"children":42970},{"style":39166},[42971],{"type":25,"value":39895},{"type":20,"tag":157,"props":42973,"children":42974},{"style":892},[42975],{"type":25,"value":38885},{"type":20,"tag":157,"props":42977,"children":42978},{"class":159,"line":222},[42979],{"type":20,"tag":157,"props":42980,"children":42981},{"style":9628},[42982],{"type":25,"value":42983},"    \u002F\u002F const auths = [\"edit\", \"add\"]\n",{"type":20,"tag":157,"props":42985,"children":42986},{"class":159,"line":440},[42987,42991,42995,42999,43003,43007],{"type":20,"tag":157,"props":42988,"children":42989},{"style":39166},[42990],{"type":25,"value":40672},{"type":20,"tag":157,"props":42992,"children":42993},{"style":260},[42994],{"type":25,"value":42657},{"type":20,"tag":157,"props":42996,"children":42997},{"style":39166},[42998],{"type":25,"value":39179},{"type":20,"tag":157,"props":43000,"children":43001},{"style":892},[43002],{"type":25,"value":42666},{"type":20,"tag":157,"props":43004,"children":43005},{"style":254},[43006],{"type":25,"value":42681},{"type":20,"tag":157,"props":43008,"children":43009},{"style":892},[43010],{"type":25,"value":42686},{"type":20,"tag":157,"props":43012,"children":43013},{"class":159,"line":448},[43014,43018,43022,43026,43030,43034],{"type":20,"tag":157,"props":43015,"children":43016},{"style":39166},[43017],{"type":25,"value":40672},{"type":20,"tag":157,"props":43019,"children":43020},{"style":260},[43021],{"type":25,"value":42706},{"type":20,"tag":157,"props":43023,"children":43024},{"style":39166},[43025],{"type":25,"value":39179},{"type":20,"tag":157,"props":43027,"children":43028},{"style":892},[43029],{"type":25,"value":42715},{"type":20,"tag":157,"props":43031,"children":43032},{"style":248},[43033],{"type":25,"value":42720},{"type":20,"tag":157,"props":43035,"children":43036},{"style":892},[43037],{"type":25,"value":42725},{"type":20,"tag":157,"props":43039,"children":43040},{"class":159,"line":456},[43041],{"type":20,"tag":157,"props":43042,"children":43043},{"style":9628},[43044],{"type":25,"value":43045},"    \u002F\u002F 当有edit的权限，显示按钮；没有权限，隐藏按钮\n",{"type":20,"tag":157,"props":43047,"children":43048},{"class":159,"line":465},[43049,43054,43058,43062],{"type":20,"tag":157,"props":43050,"children":43051},{"style":39166},[43052],{"type":25,"value":43053},"    if",{"type":20,"tag":157,"props":43055,"children":43056},{"style":892},[43057],{"type":25,"value":42746},{"type":20,"tag":157,"props":43059,"children":43060},{"style":39166},[43061],{"type":25,"value":40723},{"type":20,"tag":157,"props":43063,"children":43064},{"style":892},[43065],{"type":25,"value":42755},{"type":20,"tag":157,"props":43067,"children":43068},{"class":159,"line":474},[43069,43073,43077],{"type":20,"tag":157,"props":43070,"children":43071},{"style":892},[43072],{"type":25,"value":42763},{"type":20,"tag":157,"props":43074,"children":43075},{"style":39166},[43076],{"type":25,"value":2261},{"type":20,"tag":157,"props":43078,"children":43079},{"style":254},[43080],{"type":25,"value":42772},{"type":20,"tag":157,"props":43082,"children":43083},{"class":159,"line":483},[43084],{"type":20,"tag":157,"props":43085,"children":43086},{"style":892},[43087],{"type":25,"value":872},{"type":20,"tag":157,"props":43089,"children":43090},{"class":159,"line":491},[43091],{"type":20,"tag":157,"props":43092,"children":43093},{"style":892},[43094],{"type":25,"value":40371},{"type":20,"tag":157,"props":43096,"children":43097},{"class":159,"line":499},[43098,43102,43107,43111,43116],{"type":20,"tag":157,"props":43099,"children":43100},{"style":892},[43101],{"type":25,"value":42932},{"type":20,"tag":157,"props":43103,"children":43104},{"style":248},[43105],{"type":25,"value":43106},"mount",{"type":20,"tag":157,"props":43108,"children":43109},{"style":892},[43110],{"type":25,"value":39189},{"type":20,"tag":157,"props":43112,"children":43113},{"style":254},[43114],{"type":25,"value":43115},"'#app'",{"type":20,"tag":157,"props":43117,"children":43118},{"style":892},[43119],{"type":25,"value":8926},{"type":20,"tag":28,"props":43121,"children":43123},{"id":43122},"transition动画",[43124],{"type":25,"value":43122},{"type":20,"tag":126,"props":43126,"children":43128},{"className":39112,"code":43127,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Ch2>transition\u003C\u002Fh2>\n  \u003Cbutton @click=\"isShow = !isShow\">点击切换状态\u003C\u002Fbutton>\n  \u003C!-- 先进后出 -->\n  \u003Ctransition name=\"fade\" mode=\"out-in\">\n    \u003Cdiv v-if=\"isShow\" class=\"box\">\u003C\u002Fdiv>\n    \u003Cdiv v-else class=\"box1\">\u003C\u002Fdiv>\n  \u003C\u002Ftransition>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  name: \"03_transition\",\n  data() {\n    return {\n      isShow: true\n    }\n  }\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n.box {\n  width: 200px;\n  height: 150px;\n  background-color: pink;\n}\n\n.box1 {\n  width: 200px;\n  height: 150px;\n  background-color: blue;\n}\n\n.fade-enter-from {\n  opacity: 1;\n  transform: translateX(200px);\n}\n\n.fade-enter-to {\n  opacity: 0;\n  transform: translateX(0);\n}\n\n.fade-enter-active {\n  transition: 2s;\n}\n\n.fade-leave-from {\n  opacity: 1;\n  transform: translateX(0);\n}\n\n.fade-leave-to {\n  opacity: 0;\n  transform: translateX(200px);\n}\n\n.fade-leave-active {\n  transition: 1s;\n}\n\n\u003C\u002Fstyle>\n",[43129],{"type":20,"tag":84,"props":43130,"children":43131},{"__ignoreMap":8},[43132,43147,43171,43234,43242,43285,43342,43383,43398,43413,43420,43435,43450,43466,43477,43488,43501,43508,43515,43522,43537,43544,43563,43575,43599,43623,43643,43650,43657,43669,43692,43715,43735,43742,43749,43761,43781,43814,43821,43828,43840,43859,43886,43893,43900,43912,43938,43945,43952,43964,43983,44010,44017,44024,44036,44055,44086,44093,44100,44112,44135,44142,44149],{"type":20,"tag":157,"props":43133,"children":43134},{"class":159,"line":160},[43135,43139,43143],{"type":20,"tag":157,"props":43136,"children":43137},{"style":892},[43138],{"type":25,"value":36862},{"type":20,"tag":157,"props":43140,"children":43141},{"style":5667},[43142],{"type":25,"value":39539},{"type":20,"tag":157,"props":43144,"children":43145},{"style":892},[43146],{"type":25,"value":30657},{"type":20,"tag":157,"props":43148,"children":43149},{"class":159,"line":169},[43150,43154,43158,43163,43167],{"type":20,"tag":157,"props":43151,"children":43152},{"style":892},[43153],{"type":25,"value":39551},{"type":20,"tag":157,"props":43155,"children":43156},{"style":5667},[43157],{"type":25,"value":1863},{"type":20,"tag":157,"props":43159,"children":43160},{"style":892},[43161],{"type":25,"value":43162},">transition\u003C\u002F",{"type":20,"tag":157,"props":43164,"children":43165},{"style":5667},[43166],{"type":25,"value":1863},{"type":20,"tag":157,"props":43168,"children":43169},{"style":892},[43170],{"type":25,"value":30657},{"type":20,"tag":157,"props":43172,"children":43173},{"class":159,"line":179},[43174,43178,43182,43186,43190,43194,43198,43203,43207,43212,43217,43221,43226,43230],{"type":20,"tag":157,"props":43175,"children":43176},{"style":892},[43177],{"type":25,"value":39551},{"type":20,"tag":157,"props":43179,"children":43180},{"style":5667},[43181],{"type":25,"value":42462},{"type":20,"tag":157,"props":43183,"children":43184},{"style":892},[43185],{"type":25,"value":39677},{"type":20,"tag":157,"props":43187,"children":43188},{"style":248},[43189],{"type":25,"value":39682},{"type":20,"tag":157,"props":43191,"children":43192},{"style":892},[43193],{"type":25,"value":2261},{"type":20,"tag":157,"props":43195,"children":43196},{"style":254},[43197],{"type":25,"value":39603},{"type":20,"tag":157,"props":43199,"children":43200},{"style":892},[43201],{"type":25,"value":43202},"isShow ",{"type":20,"tag":157,"props":43204,"children":43205},{"style":39166},[43206],{"type":25,"value":2261},{"type":20,"tag":157,"props":43208,"children":43209},{"style":39166},[43210],{"type":25,"value":43211}," !",{"type":20,"tag":157,"props":43213,"children":43214},{"style":892},[43215],{"type":25,"value":43216},"isShow",{"type":20,"tag":157,"props":43218,"children":43219},{"style":254},[43220],{"type":25,"value":39603},{"type":20,"tag":157,"props":43222,"children":43223},{"style":892},[43224],{"type":25,"value":43225},">点击切换状态\u003C\u002F",{"type":20,"tag":157,"props":43227,"children":43228},{"style":5667},[43229],{"type":25,"value":42462},{"type":20,"tag":157,"props":43231,"children":43232},{"style":892},[43233],{"type":25,"value":30657},{"type":20,"tag":157,"props":43235,"children":43236},{"class":159,"line":188},[43237],{"type":20,"tag":157,"props":43238,"children":43239},{"style":9628},[43240],{"type":25,"value":43241},"  \u003C!-- 先进后出 -->\n",{"type":20,"tag":157,"props":43243,"children":43244},{"class":159,"line":196},[43245,43249,43254,43258,43262,43267,43272,43276,43281],{"type":20,"tag":157,"props":43246,"children":43247},{"style":892},[43248],{"type":25,"value":39551},{"type":20,"tag":157,"props":43250,"children":43251},{"style":5667},[43252],{"type":25,"value":43253},"transition",{"type":20,"tag":157,"props":43255,"children":43256},{"style":248},[43257],{"type":25,"value":41549},{"type":20,"tag":157,"props":43259,"children":43260},{"style":892},[43261],{"type":25,"value":2261},{"type":20,"tag":157,"props":43263,"children":43264},{"style":254},[43265],{"type":25,"value":43266},"\"fade\"",{"type":20,"tag":157,"props":43268,"children":43269},{"style":248},[43270],{"type":25,"value":43271}," mode",{"type":20,"tag":157,"props":43273,"children":43274},{"style":892},[43275],{"type":25,"value":2261},{"type":20,"tag":157,"props":43277,"children":43278},{"style":254},[43279],{"type":25,"value":43280},"\"out-in\"",{"type":20,"tag":157,"props":43282,"children":43283},{"style":892},[43284],{"type":25,"value":30657},{"type":20,"tag":157,"props":43286,"children":43287},{"class":159,"line":204},[43288,43292,43296,43301,43305,43309,43313,43317,43321,43325,43330,43334,43338],{"type":20,"tag":157,"props":43289,"children":43290},{"style":892},[43291],{"type":25,"value":39582},{"type":20,"tag":157,"props":43293,"children":43294},{"style":5667},[43295],{"type":25,"value":39556},{"type":20,"tag":157,"props":43297,"children":43298},{"style":39166},[43299],{"type":25,"value":43300}," v-if",{"type":20,"tag":157,"props":43302,"children":43303},{"style":892},[43304],{"type":25,"value":2261},{"type":20,"tag":157,"props":43306,"children":43307},{"style":254},[43308],{"type":25,"value":39603},{"type":20,"tag":157,"props":43310,"children":43311},{"style":892},[43312],{"type":25,"value":43216},{"type":20,"tag":157,"props":43314,"children":43315},{"style":254},[43316],{"type":25,"value":39603},{"type":20,"tag":157,"props":43318,"children":43319},{"style":248},[43320],{"type":25,"value":39561},{"type":20,"tag":157,"props":43322,"children":43323},{"style":892},[43324],{"type":25,"value":2261},{"type":20,"tag":157,"props":43326,"children":43327},{"style":254},[43328],{"type":25,"value":43329},"\"box\"",{"type":20,"tag":157,"props":43331,"children":43332},{"style":892},[43333],{"type":25,"value":36885},{"type":20,"tag":157,"props":43335,"children":43336},{"style":5667},[43337],{"type":25,"value":39556},{"type":20,"tag":157,"props":43339,"children":43340},{"style":892},[43341],{"type":25,"value":30657},{"type":20,"tag":157,"props":43343,"children":43344},{"class":159,"line":213},[43345,43349,43353,43358,43362,43366,43371,43375,43379],{"type":20,"tag":157,"props":43346,"children":43347},{"style":892},[43348],{"type":25,"value":39582},{"type":20,"tag":157,"props":43350,"children":43351},{"style":5667},[43352],{"type":25,"value":39556},{"type":20,"tag":157,"props":43354,"children":43355},{"style":39166},[43356],{"type":25,"value":43357}," v-else",{"type":20,"tag":157,"props":43359,"children":43360},{"style":248},[43361],{"type":25,"value":39561},{"type":20,"tag":157,"props":43363,"children":43364},{"style":892},[43365],{"type":25,"value":2261},{"type":20,"tag":157,"props":43367,"children":43368},{"style":254},[43369],{"type":25,"value":43370},"\"box1\"",{"type":20,"tag":157,"props":43372,"children":43373},{"style":892},[43374],{"type":25,"value":36885},{"type":20,"tag":157,"props":43376,"children":43377},{"style":5667},[43378],{"type":25,"value":39556},{"type":20,"tag":157,"props":43380,"children":43381},{"style":892},[43382],{"type":25,"value":30657},{"type":20,"tag":157,"props":43384,"children":43385},{"class":159,"line":222},[43386,43390,43394],{"type":20,"tag":157,"props":43387,"children":43388},{"style":892},[43389],{"type":25,"value":39720},{"type":20,"tag":157,"props":43391,"children":43392},{"style":5667},[43393],{"type":25,"value":43253},{"type":20,"tag":157,"props":43395,"children":43396},{"style":892},[43397],{"type":25,"value":30657},{"type":20,"tag":157,"props":43399,"children":43400},{"class":159,"line":440},[43401,43405,43409],{"type":20,"tag":157,"props":43402,"children":43403},{"style":892},[43404],{"type":25,"value":39512},{"type":20,"tag":157,"props":43406,"children":43407},{"style":5667},[43408],{"type":25,"value":39539},{"type":20,"tag":157,"props":43410,"children":43411},{"style":892},[43412],{"type":25,"value":30657},{"type":20,"tag":157,"props":43414,"children":43415},{"class":159,"line":448},[43416],{"type":20,"tag":157,"props":43417,"children":43418},{"emptyLinePlaceholder":173},[43419],{"type":25,"value":176},{"type":20,"tag":157,"props":43421,"children":43422},{"class":159,"line":456},[43423,43427,43431],{"type":20,"tag":157,"props":43424,"children":43425},{"style":892},[43426],{"type":25,"value":36862},{"type":20,"tag":157,"props":43428,"children":43429},{"style":5667},[43430],{"type":25,"value":39298},{"type":20,"tag":157,"props":43432,"children":43433},{"style":892},[43434],{"type":25,"value":30657},{"type":20,"tag":157,"props":43436,"children":43437},{"class":159,"line":465},[43438,43442,43446],{"type":20,"tag":157,"props":43439,"children":43440},{"style":39166},[43441],{"type":25,"value":42012},{"type":20,"tag":157,"props":43443,"children":43444},{"style":39166},[43445],{"type":25,"value":42017},{"type":20,"tag":157,"props":43447,"children":43448},{"style":892},[43449],{"type":25,"value":38885},{"type":20,"tag":157,"props":43451,"children":43452},{"class":159,"line":474},[43453,43457,43462],{"type":20,"tag":157,"props":43454,"children":43455},{"style":892},[43456],{"type":25,"value":42029},{"type":20,"tag":157,"props":43458,"children":43459},{"style":254},[43460],{"type":25,"value":43461},"\"03_transition\"",{"type":20,"tag":157,"props":43463,"children":43464},{"style":892},[43465],{"type":25,"value":918},{"type":20,"tag":157,"props":43467,"children":43468},{"class":159,"line":483},[43469,43473],{"type":20,"tag":157,"props":43470,"children":43471},{"style":248},[43472],{"type":25,"value":42046},{"type":20,"tag":157,"props":43474,"children":43475},{"style":892},[43476],{"type":25,"value":39400},{"type":20,"tag":157,"props":43478,"children":43479},{"class":159,"line":491},[43480,43484],{"type":20,"tag":157,"props":43481,"children":43482},{"style":39166},[43483],{"type":25,"value":42058},{"type":20,"tag":157,"props":43485,"children":43486},{"style":892},[43487],{"type":25,"value":38885},{"type":20,"tag":157,"props":43489,"children":43490},{"class":159,"line":499},[43491,43496],{"type":20,"tag":157,"props":43492,"children":43493},{"style":892},[43494],{"type":25,"value":43495},"      isShow: ",{"type":20,"tag":157,"props":43497,"children":43498},{"style":260},[43499],{"type":25,"value":43500},"true\n",{"type":20,"tag":157,"props":43502,"children":43503},{"class":159,"line":508},[43504],{"type":20,"tag":157,"props":43505,"children":43506},{"style":892},[43507],{"type":25,"value":872},{"type":20,"tag":157,"props":43509,"children":43510},{"class":159,"line":517},[43511],{"type":20,"tag":157,"props":43512,"children":43513},{"style":892},[43514],{"type":25,"value":39060},{"type":20,"tag":157,"props":43516,"children":43517},{"class":159,"line":1499},[43518],{"type":20,"tag":157,"props":43519,"children":43520},{"style":892},[43521],{"type":25,"value":943},{"type":20,"tag":157,"props":43523,"children":43524},{"class":159,"line":1507},[43525,43529,43533],{"type":20,"tag":157,"props":43526,"children":43527},{"style":892},[43528],{"type":25,"value":39512},{"type":20,"tag":157,"props":43530,"children":43531},{"style":5667},[43532],{"type":25,"value":39298},{"type":20,"tag":157,"props":43534,"children":43535},{"style":892},[43536],{"type":25,"value":30657},{"type":20,"tag":157,"props":43538,"children":43539},{"class":159,"line":1515},[43540],{"type":20,"tag":157,"props":43541,"children":43542},{"emptyLinePlaceholder":173},[43543],{"type":25,"value":176},{"type":20,"tag":157,"props":43545,"children":43546},{"class":159,"line":1523},[43547,43551,43555,43559],{"type":20,"tag":157,"props":43548,"children":43549},{"style":892},[43550],{"type":25,"value":36862},{"type":20,"tag":157,"props":43552,"children":43553},{"style":5667},[43554],{"type":25,"value":1785},{"type":20,"tag":157,"props":43556,"children":43557},{"style":248},[43558],{"type":25,"value":42360},{"type":20,"tag":157,"props":43560,"children":43561},{"style":892},[43562],{"type":25,"value":30657},{"type":20,"tag":157,"props":43564,"children":43565},{"class":159,"line":1532},[43566,43571],{"type":20,"tag":157,"props":43567,"children":43568},{"style":248},[43569],{"type":25,"value":43570},".box",{"type":20,"tag":157,"props":43572,"children":43573},{"style":892},[43574],{"type":25,"value":38885},{"type":20,"tag":157,"props":43576,"children":43577},{"class":159,"line":1541},[43578,43583,43587,43591,43595],{"type":20,"tag":157,"props":43579,"children":43580},{"style":260},[43581],{"type":25,"value":43582},"  width",{"type":20,"tag":157,"props":43584,"children":43585},{"style":892},[43586],{"type":25,"value":908},{"type":20,"tag":157,"props":43588,"children":43589},{"style":260},[43590],{"type":25,"value":1150},{"type":20,"tag":157,"props":43592,"children":43593},{"style":39166},[43594],{"type":25,"value":39668},{"type":20,"tag":157,"props":43596,"children":43597},{"style":892},[43598],{"type":25,"value":38963},{"type":20,"tag":157,"props":43600,"children":43601},{"class":159,"line":1550},[43602,43607,43611,43615,43619],{"type":20,"tag":157,"props":43603,"children":43604},{"style":260},[43605],{"type":25,"value":43606},"  height",{"type":20,"tag":157,"props":43608,"children":43609},{"style":892},[43610],{"type":25,"value":908},{"type":20,"tag":157,"props":43612,"children":43613},{"style":260},[43614],{"type":25,"value":38936},{"type":20,"tag":157,"props":43616,"children":43617},{"style":39166},[43618],{"type":25,"value":39668},{"type":20,"tag":157,"props":43620,"children":43621},{"style":892},[43622],{"type":25,"value":38963},{"type":20,"tag":157,"props":43624,"children":43625},{"class":159,"line":1558},[43626,43630,43634,43639],{"type":20,"tag":157,"props":43627,"children":43628},{"style":260},[43629],{"type":25,"value":41039},{"type":20,"tag":157,"props":43631,"children":43632},{"style":892},[43633],{"type":25,"value":908},{"type":20,"tag":157,"props":43635,"children":43636},{"style":260},[43637],{"type":25,"value":43638},"pink",{"type":20,"tag":157,"props":43640,"children":43641},{"style":892},[43642],{"type":25,"value":38963},{"type":20,"tag":157,"props":43644,"children":43645},{"class":159,"line":1566},[43646],{"type":20,"tag":157,"props":43647,"children":43648},{"style":892},[43649],{"type":25,"value":943},{"type":20,"tag":157,"props":43651,"children":43652},{"class":159,"line":1574},[43653],{"type":20,"tag":157,"props":43654,"children":43655},{"emptyLinePlaceholder":173},[43656],{"type":25,"value":176},{"type":20,"tag":157,"props":43658,"children":43659},{"class":159,"line":1582},[43660,43665],{"type":20,"tag":157,"props":43661,"children":43662},{"style":248},[43663],{"type":25,"value":43664},".box1",{"type":20,"tag":157,"props":43666,"children":43667},{"style":892},[43668],{"type":25,"value":38885},{"type":20,"tag":157,"props":43670,"children":43671},{"class":159,"line":1591},[43672,43676,43680,43684,43688],{"type":20,"tag":157,"props":43673,"children":43674},{"style":260},[43675],{"type":25,"value":43582},{"type":20,"tag":157,"props":43677,"children":43678},{"style":892},[43679],{"type":25,"value":908},{"type":20,"tag":157,"props":43681,"children":43682},{"style":260},[43683],{"type":25,"value":1150},{"type":20,"tag":157,"props":43685,"children":43686},{"style":39166},[43687],{"type":25,"value":39668},{"type":20,"tag":157,"props":43689,"children":43690},{"style":892},[43691],{"type":25,"value":38963},{"type":20,"tag":157,"props":43693,"children":43694},{"class":159,"line":1599},[43695,43699,43703,43707,43711],{"type":20,"tag":157,"props":43696,"children":43697},{"style":260},[43698],{"type":25,"value":43606},{"type":20,"tag":157,"props":43700,"children":43701},{"style":892},[43702],{"type":25,"value":908},{"type":20,"tag":157,"props":43704,"children":43705},{"style":260},[43706],{"type":25,"value":38936},{"type":20,"tag":157,"props":43708,"children":43709},{"style":39166},[43710],{"type":25,"value":39668},{"type":20,"tag":157,"props":43712,"children":43713},{"style":892},[43714],{"type":25,"value":38963},{"type":20,"tag":157,"props":43716,"children":43717},{"class":159,"line":1608},[43718,43722,43726,43731],{"type":20,"tag":157,"props":43719,"children":43720},{"style":260},[43721],{"type":25,"value":41039},{"type":20,"tag":157,"props":43723,"children":43724},{"style":892},[43725],{"type":25,"value":908},{"type":20,"tag":157,"props":43727,"children":43728},{"style":260},[43729],{"type":25,"value":43730},"blue",{"type":20,"tag":157,"props":43732,"children":43733},{"style":892},[43734],{"type":25,"value":38963},{"type":20,"tag":157,"props":43736,"children":43737},{"class":159,"line":1617},[43738],{"type":20,"tag":157,"props":43739,"children":43740},{"style":892},[43741],{"type":25,"value":943},{"type":20,"tag":157,"props":43743,"children":43744},{"class":159,"line":1626},[43745],{"type":20,"tag":157,"props":43746,"children":43747},{"emptyLinePlaceholder":173},[43748],{"type":25,"value":176},{"type":20,"tag":157,"props":43750,"children":43751},{"class":159,"line":1634},[43752,43757],{"type":20,"tag":157,"props":43753,"children":43754},{"style":248},[43755],{"type":25,"value":43756},".fade-enter-from",{"type":20,"tag":157,"props":43758,"children":43759},{"style":892},[43760],{"type":25,"value":38885},{"type":20,"tag":157,"props":43762,"children":43763},{"class":159,"line":1642},[43764,43769,43773,43777],{"type":20,"tag":157,"props":43765,"children":43766},{"style":260},[43767],{"type":25,"value":43768},"  opacity",{"type":20,"tag":157,"props":43770,"children":43771},{"style":892},[43772],{"type":25,"value":908},{"type":20,"tag":157,"props":43774,"children":43775},{"style":260},[43776],{"type":25,"value":10379},{"type":20,"tag":157,"props":43778,"children":43779},{"style":892},[43780],{"type":25,"value":38963},{"type":20,"tag":157,"props":43782,"children":43783},{"class":159,"line":1650},[43784,43789,43793,43798,43802,43806,43810],{"type":20,"tag":157,"props":43785,"children":43786},{"style":260},[43787],{"type":25,"value":43788},"  transform",{"type":20,"tag":157,"props":43790,"children":43791},{"style":892},[43792],{"type":25,"value":908},{"type":20,"tag":157,"props":43794,"children":43795},{"style":260},[43796],{"type":25,"value":43797},"translateX",{"type":20,"tag":157,"props":43799,"children":43800},{"style":892},[43801],{"type":25,"value":39189},{"type":20,"tag":157,"props":43803,"children":43804},{"style":260},[43805],{"type":25,"value":1150},{"type":20,"tag":157,"props":43807,"children":43808},{"style":39166},[43809],{"type":25,"value":39668},{"type":20,"tag":157,"props":43811,"children":43812},{"style":892},[43813],{"type":25,"value":39342},{"type":20,"tag":157,"props":43815,"children":43816},{"class":159,"line":1659},[43817],{"type":20,"tag":157,"props":43818,"children":43819},{"style":892},[43820],{"type":25,"value":943},{"type":20,"tag":157,"props":43822,"children":43823},{"class":159,"line":1668},[43824],{"type":20,"tag":157,"props":43825,"children":43826},{"emptyLinePlaceholder":173},[43827],{"type":25,"value":176},{"type":20,"tag":157,"props":43829,"children":43830},{"class":159,"line":1677},[43831,43836],{"type":20,"tag":157,"props":43832,"children":43833},{"style":248},[43834],{"type":25,"value":43835},".fade-enter-to",{"type":20,"tag":157,"props":43837,"children":43838},{"style":892},[43839],{"type":25,"value":38885},{"type":20,"tag":157,"props":43841,"children":43842},{"class":159,"line":1685},[43843,43847,43851,43855],{"type":20,"tag":157,"props":43844,"children":43845},{"style":260},[43846],{"type":25,"value":43768},{"type":20,"tag":157,"props":43848,"children":43849},{"style":892},[43850],{"type":25,"value":908},{"type":20,"tag":157,"props":43852,"children":43853},{"style":260},[43854],{"type":25,"value":10387},{"type":20,"tag":157,"props":43856,"children":43857},{"style":892},[43858],{"type":25,"value":38963},{"type":20,"tag":157,"props":43860,"children":43861},{"class":159,"line":1693},[43862,43866,43870,43874,43878,43882],{"type":20,"tag":157,"props":43863,"children":43864},{"style":260},[43865],{"type":25,"value":43788},{"type":20,"tag":157,"props":43867,"children":43868},{"style":892},[43869],{"type":25,"value":908},{"type":20,"tag":157,"props":43871,"children":43872},{"style":260},[43873],{"type":25,"value":43797},{"type":20,"tag":157,"props":43875,"children":43876},{"style":892},[43877],{"type":25,"value":39189},{"type":20,"tag":157,"props":43879,"children":43880},{"style":260},[43881],{"type":25,"value":10387},{"type":20,"tag":157,"props":43883,"children":43884},{"style":892},[43885],{"type":25,"value":39342},{"type":20,"tag":157,"props":43887,"children":43888},{"class":159,"line":1701},[43889],{"type":20,"tag":157,"props":43890,"children":43891},{"style":892},[43892],{"type":25,"value":943},{"type":20,"tag":157,"props":43894,"children":43895},{"class":159,"line":1710},[43896],{"type":20,"tag":157,"props":43897,"children":43898},{"emptyLinePlaceholder":173},[43899],{"type":25,"value":176},{"type":20,"tag":157,"props":43901,"children":43902},{"class":159,"line":23976},[43903,43908],{"type":20,"tag":157,"props":43904,"children":43905},{"style":248},[43906],{"type":25,"value":43907},".fade-enter-active",{"type":20,"tag":157,"props":43909,"children":43910},{"style":892},[43911],{"type":25,"value":38885},{"type":20,"tag":157,"props":43913,"children":43914},{"class":159,"line":23985},[43915,43920,43924,43929,43934],{"type":20,"tag":157,"props":43916,"children":43917},{"style":260},[43918],{"type":25,"value":43919},"  transition",{"type":20,"tag":157,"props":43921,"children":43922},{"style":892},[43923],{"type":25,"value":908},{"type":20,"tag":157,"props":43925,"children":43926},{"style":260},[43927],{"type":25,"value":43928},"2",{"type":20,"tag":157,"props":43930,"children":43931},{"style":39166},[43932],{"type":25,"value":43933},"s",{"type":20,"tag":157,"props":43935,"children":43936},{"style":892},[43937],{"type":25,"value":38963},{"type":20,"tag":157,"props":43939,"children":43940},{"class":159,"line":23994},[43941],{"type":20,"tag":157,"props":43942,"children":43943},{"style":892},[43944],{"type":25,"value":943},{"type":20,"tag":157,"props":43946,"children":43947},{"class":159,"line":24003},[43948],{"type":20,"tag":157,"props":43949,"children":43950},{"emptyLinePlaceholder":173},[43951],{"type":25,"value":176},{"type":20,"tag":157,"props":43953,"children":43954},{"class":159,"line":24012},[43955,43960],{"type":20,"tag":157,"props":43956,"children":43957},{"style":248},[43958],{"type":25,"value":43959},".fade-leave-from",{"type":20,"tag":157,"props":43961,"children":43962},{"style":892},[43963],{"type":25,"value":38885},{"type":20,"tag":157,"props":43965,"children":43966},{"class":159,"line":24021},[43967,43971,43975,43979],{"type":20,"tag":157,"props":43968,"children":43969},{"style":260},[43970],{"type":25,"value":43768},{"type":20,"tag":157,"props":43972,"children":43973},{"style":892},[43974],{"type":25,"value":908},{"type":20,"tag":157,"props":43976,"children":43977},{"style":260},[43978],{"type":25,"value":10379},{"type":20,"tag":157,"props":43980,"children":43981},{"style":892},[43982],{"type":25,"value":38963},{"type":20,"tag":157,"props":43984,"children":43985},{"class":159,"line":24030},[43986,43990,43994,43998,44002,44006],{"type":20,"tag":157,"props":43987,"children":43988},{"style":260},[43989],{"type":25,"value":43788},{"type":20,"tag":157,"props":43991,"children":43992},{"style":892},[43993],{"type":25,"value":908},{"type":20,"tag":157,"props":43995,"children":43996},{"style":260},[43997],{"type":25,"value":43797},{"type":20,"tag":157,"props":43999,"children":44000},{"style":892},[44001],{"type":25,"value":39189},{"type":20,"tag":157,"props":44003,"children":44004},{"style":260},[44005],{"type":25,"value":10387},{"type":20,"tag":157,"props":44007,"children":44008},{"style":892},[44009],{"type":25,"value":39342},{"type":20,"tag":157,"props":44011,"children":44012},{"class":159,"line":24039},[44013],{"type":20,"tag":157,"props":44014,"children":44015},{"style":892},[44016],{"type":25,"value":943},{"type":20,"tag":157,"props":44018,"children":44019},{"class":159,"line":24048},[44020],{"type":20,"tag":157,"props":44021,"children":44022},{"emptyLinePlaceholder":173},[44023],{"type":25,"value":176},{"type":20,"tag":157,"props":44025,"children":44026},{"class":159,"line":24057},[44027,44032],{"type":20,"tag":157,"props":44028,"children":44029},{"style":248},[44030],{"type":25,"value":44031},".fade-leave-to",{"type":20,"tag":157,"props":44033,"children":44034},{"style":892},[44035],{"type":25,"value":38885},{"type":20,"tag":157,"props":44037,"children":44038},{"class":159,"line":24066},[44039,44043,44047,44051],{"type":20,"tag":157,"props":44040,"children":44041},{"style":260},[44042],{"type":25,"value":43768},{"type":20,"tag":157,"props":44044,"children":44045},{"style":892},[44046],{"type":25,"value":908},{"type":20,"tag":157,"props":44048,"children":44049},{"style":260},[44050],{"type":25,"value":10387},{"type":20,"tag":157,"props":44052,"children":44053},{"style":892},[44054],{"type":25,"value":38963},{"type":20,"tag":157,"props":44056,"children":44057},{"class":159,"line":24075},[44058,44062,44066,44070,44074,44078,44082],{"type":20,"tag":157,"props":44059,"children":44060},{"style":260},[44061],{"type":25,"value":43788},{"type":20,"tag":157,"props":44063,"children":44064},{"style":892},[44065],{"type":25,"value":908},{"type":20,"tag":157,"props":44067,"children":44068},{"style":260},[44069],{"type":25,"value":43797},{"type":20,"tag":157,"props":44071,"children":44072},{"style":892},[44073],{"type":25,"value":39189},{"type":20,"tag":157,"props":44075,"children":44076},{"style":260},[44077],{"type":25,"value":1150},{"type":20,"tag":157,"props":44079,"children":44080},{"style":39166},[44081],{"type":25,"value":39668},{"type":20,"tag":157,"props":44083,"children":44084},{"style":892},[44085],{"type":25,"value":39342},{"type":20,"tag":157,"props":44087,"children":44088},{"class":159,"line":24084},[44089],{"type":20,"tag":157,"props":44090,"children":44091},{"style":892},[44092],{"type":25,"value":943},{"type":20,"tag":157,"props":44094,"children":44095},{"class":159,"line":24093},[44096],{"type":20,"tag":157,"props":44097,"children":44098},{"emptyLinePlaceholder":173},[44099],{"type":25,"value":176},{"type":20,"tag":157,"props":44101,"children":44102},{"class":159,"line":24102},[44103,44108],{"type":20,"tag":157,"props":44104,"children":44105},{"style":248},[44106],{"type":25,"value":44107},".fade-leave-active",{"type":20,"tag":157,"props":44109,"children":44110},{"style":892},[44111],{"type":25,"value":38885},{"type":20,"tag":157,"props":44113,"children":44114},{"class":159,"line":24111},[44115,44119,44123,44127,44131],{"type":20,"tag":157,"props":44116,"children":44117},{"style":260},[44118],{"type":25,"value":43919},{"type":20,"tag":157,"props":44120,"children":44121},{"style":892},[44122],{"type":25,"value":908},{"type":20,"tag":157,"props":44124,"children":44125},{"style":260},[44126],{"type":25,"value":10379},{"type":20,"tag":157,"props":44128,"children":44129},{"style":39166},[44130],{"type":25,"value":43933},{"type":20,"tag":157,"props":44132,"children":44133},{"style":892},[44134],{"type":25,"value":38963},{"type":20,"tag":157,"props":44136,"children":44137},{"class":159,"line":24119},[44138],{"type":20,"tag":157,"props":44139,"children":44140},{"style":892},[44141],{"type":25,"value":943},{"type":20,"tag":157,"props":44143,"children":44144},{"class":159,"line":24128},[44145],{"type":20,"tag":157,"props":44146,"children":44147},{"emptyLinePlaceholder":173},[44148],{"type":25,"value":176},{"type":20,"tag":157,"props":44150,"children":44151},{"class":159,"line":24137},[44152,44156,44160],{"type":20,"tag":157,"props":44153,"children":44154},{"style":892},[44155],{"type":25,"value":39512},{"type":20,"tag":157,"props":44157,"children":44158},{"style":5667},[44159],{"type":25,"value":1785},{"type":20,"tag":157,"props":44161,"children":44162},{"style":892},[44163],{"type":25,"value":30657},{"type":20,"tag":28,"props":44165,"children":44167},{"id":44166},"component组件与keep-alive组件缓存",[44168],{"type":25,"value":44166},{"type":20,"tag":6665,"props":44170,"children":44171},{},[44172,44177],{"type":20,"tag":21,"props":44173,"children":44174},{},[44175],{"type":25,"value":44176},"渲染一个「元组件」为动态组件。依is的值，来决定哪个组件被渲染",{"type":20,"tag":21,"props":44178,"children":44179},{},[44180],{"type":25,"value":44181},"keep-alive 可以让动态组件保持状态，切出去再切回来，保持之前的状态",{"type":20,"tag":126,"props":44183,"children":44185},{"className":39112,"code":44184,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch2>动态组件\u003C\u002Fh2>\n    \u003Cbutton @click=\"nowCom = 'MyCom1'\">com1\u003C\u002Fbutton>\n    \u003Cbutton @click=\"nowCom = 'MyCom2'\">com2\u003C\u002Fbutton>\n    \u003Cbutton @click=\"nowCom = 'MyCom3'\">com3\u003C\u002Fbutton>\n    \u003Ckeep-alive>\n      \u003Ccomponent :is=\"nowCom\">\u003C\u002Fcomponent>\n    \u003C\u002Fkeep-alive>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nimport MyCom1 from '..\u002Fcomponents\u002FMyCom1.vue'\nimport MyCom2 from '..\u002Fcomponents\u002FMyCom2.vue'\nimport MyCom3 from '..\u002Fcomponents\u002FMyCom3.vue'\n\nexport default {\n  name: \"04_动态组件\",\n  data() {\n    return {\n      nowCom: 'MyCom1'\n    }\n  },\n  components: {\n    MyCom1,\n    MyCom2,\n    MyCom3\n  }\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n\n\u003C\u002Fstyle>\n",[44186],{"type":20,"tag":84,"props":44187,"children":44188},{"__ignoreMap":8},[44189,44204,44219,44243,44297,44350,44403,44419,44469,44485,44500,44515,44522,44537,44558,44579,44600,44607,44622,44638,44649,44660,44673,44680,44687,44695,44703,44711,44719,44726,44733,44748,44755,44774,44781],{"type":20,"tag":157,"props":44190,"children":44191},{"class":159,"line":160},[44192,44196,44200],{"type":20,"tag":157,"props":44193,"children":44194},{"style":892},[44195],{"type":25,"value":36862},{"type":20,"tag":157,"props":44197,"children":44198},{"style":5667},[44199],{"type":25,"value":39539},{"type":20,"tag":157,"props":44201,"children":44202},{"style":892},[44203],{"type":25,"value":30657},{"type":20,"tag":157,"props":44205,"children":44206},{"class":159,"line":169},[44207,44211,44215],{"type":20,"tag":157,"props":44208,"children":44209},{"style":892},[44210],{"type":25,"value":39551},{"type":20,"tag":157,"props":44212,"children":44213},{"style":5667},[44214],{"type":25,"value":39556},{"type":20,"tag":157,"props":44216,"children":44217},{"style":892},[44218],{"type":25,"value":30657},{"type":20,"tag":157,"props":44220,"children":44221},{"class":159,"line":179},[44222,44226,44230,44235,44239],{"type":20,"tag":157,"props":44223,"children":44224},{"style":892},[44225],{"type":25,"value":39582},{"type":20,"tag":157,"props":44227,"children":44228},{"style":5667},[44229],{"type":25,"value":1863},{"type":20,"tag":157,"props":44231,"children":44232},{"style":892},[44233],{"type":25,"value":44234},">动态组件\u003C\u002F",{"type":20,"tag":157,"props":44236,"children":44237},{"style":5667},[44238],{"type":25,"value":1863},{"type":20,"tag":157,"props":44240,"children":44241},{"style":892},[44242],{"type":25,"value":30657},{"type":20,"tag":157,"props":44244,"children":44245},{"class":159,"line":188},[44246,44250,44254,44258,44262,44266,44270,44275,44279,44284,44289,44293],{"type":20,"tag":157,"props":44247,"children":44248},{"style":892},[44249],{"type":25,"value":39582},{"type":20,"tag":157,"props":44251,"children":44252},{"style":5667},[44253],{"type":25,"value":42462},{"type":20,"tag":157,"props":44255,"children":44256},{"style":892},[44257],{"type":25,"value":39677},{"type":20,"tag":157,"props":44259,"children":44260},{"style":248},[44261],{"type":25,"value":39682},{"type":20,"tag":157,"props":44263,"children":44264},{"style":892},[44265],{"type":25,"value":2261},{"type":20,"tag":157,"props":44267,"children":44268},{"style":254},[44269],{"type":25,"value":39603},{"type":20,"tag":157,"props":44271,"children":44272},{"style":892},[44273],{"type":25,"value":44274},"nowCom ",{"type":20,"tag":157,"props":44276,"children":44277},{"style":39166},[44278],{"type":25,"value":2261},{"type":20,"tag":157,"props":44280,"children":44281},{"style":254},[44282],{"type":25,"value":44283}," 'MyCom1'\"",{"type":20,"tag":157,"props":44285,"children":44286},{"style":892},[44287],{"type":25,"value":44288},">com1\u003C\u002F",{"type":20,"tag":157,"props":44290,"children":44291},{"style":5667},[44292],{"type":25,"value":42462},{"type":20,"tag":157,"props":44294,"children":44295},{"style":892},[44296],{"type":25,"value":30657},{"type":20,"tag":157,"props":44298,"children":44299},{"class":159,"line":196},[44300,44304,44308,44312,44316,44320,44324,44328,44332,44337,44342,44346],{"type":20,"tag":157,"props":44301,"children":44302},{"style":892},[44303],{"type":25,"value":39582},{"type":20,"tag":157,"props":44305,"children":44306},{"style":5667},[44307],{"type":25,"value":42462},{"type":20,"tag":157,"props":44309,"children":44310},{"style":892},[44311],{"type":25,"value":39677},{"type":20,"tag":157,"props":44313,"children":44314},{"style":248},[44315],{"type":25,"value":39682},{"type":20,"tag":157,"props":44317,"children":44318},{"style":892},[44319],{"type":25,"value":2261},{"type":20,"tag":157,"props":44321,"children":44322},{"style":254},[44323],{"type":25,"value":39603},{"type":20,"tag":157,"props":44325,"children":44326},{"style":892},[44327],{"type":25,"value":44274},{"type":20,"tag":157,"props":44329,"children":44330},{"style":39166},[44331],{"type":25,"value":2261},{"type":20,"tag":157,"props":44333,"children":44334},{"style":254},[44335],{"type":25,"value":44336}," 'MyCom2'\"",{"type":20,"tag":157,"props":44338,"children":44339},{"style":892},[44340],{"type":25,"value":44341},">com2\u003C\u002F",{"type":20,"tag":157,"props":44343,"children":44344},{"style":5667},[44345],{"type":25,"value":42462},{"type":20,"tag":157,"props":44347,"children":44348},{"style":892},[44349],{"type":25,"value":30657},{"type":20,"tag":157,"props":44351,"children":44352},{"class":159,"line":204},[44353,44357,44361,44365,44369,44373,44377,44381,44385,44390,44395,44399],{"type":20,"tag":157,"props":44354,"children":44355},{"style":892},[44356],{"type":25,"value":39582},{"type":20,"tag":157,"props":44358,"children":44359},{"style":5667},[44360],{"type":25,"value":42462},{"type":20,"tag":157,"props":44362,"children":44363},{"style":892},[44364],{"type":25,"value":39677},{"type":20,"tag":157,"props":44366,"children":44367},{"style":248},[44368],{"type":25,"value":39682},{"type":20,"tag":157,"props":44370,"children":44371},{"style":892},[44372],{"type":25,"value":2261},{"type":20,"tag":157,"props":44374,"children":44375},{"style":254},[44376],{"type":25,"value":39603},{"type":20,"tag":157,"props":44378,"children":44379},{"style":892},[44380],{"type":25,"value":44274},{"type":20,"tag":157,"props":44382,"children":44383},{"style":39166},[44384],{"type":25,"value":2261},{"type":20,"tag":157,"props":44386,"children":44387},{"style":254},[44388],{"type":25,"value":44389}," 'MyCom3'\"",{"type":20,"tag":157,"props":44391,"children":44392},{"style":892},[44393],{"type":25,"value":44394},">com3\u003C\u002F",{"type":20,"tag":157,"props":44396,"children":44397},{"style":5667},[44398],{"type":25,"value":42462},{"type":20,"tag":157,"props":44400,"children":44401},{"style":892},[44402],{"type":25,"value":30657},{"type":20,"tag":157,"props":44404,"children":44405},{"class":159,"line":213},[44406,44410,44415],{"type":20,"tag":157,"props":44407,"children":44408},{"style":892},[44409],{"type":25,"value":39582},{"type":20,"tag":157,"props":44411,"children":44412},{"style":5667},[44413],{"type":25,"value":44414},"keep-alive",{"type":20,"tag":157,"props":44416,"children":44417},{"style":892},[44418],{"type":25,"value":30657},{"type":20,"tag":157,"props":44420,"children":44421},{"class":159,"line":222},[44422,44426,44431,44435,44440,44444,44448,44453,44457,44461,44465],{"type":20,"tag":157,"props":44423,"children":44424},{"style":892},[44425],{"type":25,"value":41808},{"type":20,"tag":157,"props":44427,"children":44428},{"style":5667},[44429],{"type":25,"value":44430},"component",{"type":20,"tag":157,"props":44432,"children":44433},{"style":892},[44434],{"type":25,"value":39442},{"type":20,"tag":157,"props":44436,"children":44437},{"style":248},[44438],{"type":25,"value":44439},"is",{"type":20,"tag":157,"props":44441,"children":44442},{"style":892},[44443],{"type":25,"value":2261},{"type":20,"tag":157,"props":44445,"children":44446},{"style":254},[44447],{"type":25,"value":39603},{"type":20,"tag":157,"props":44449,"children":44450},{"style":892},[44451],{"type":25,"value":44452},"nowCom",{"type":20,"tag":157,"props":44454,"children":44455},{"style":254},[44456],{"type":25,"value":39603},{"type":20,"tag":157,"props":44458,"children":44459},{"style":892},[44460],{"type":25,"value":36885},{"type":20,"tag":157,"props":44462,"children":44463},{"style":5667},[44464],{"type":25,"value":44430},{"type":20,"tag":157,"props":44466,"children":44467},{"style":892},[44468],{"type":25,"value":30657},{"type":20,"tag":157,"props":44470,"children":44471},{"class":159,"line":440},[44472,44477,44481],{"type":20,"tag":157,"props":44473,"children":44474},{"style":892},[44475],{"type":25,"value":44476},"    \u003C\u002F",{"type":20,"tag":157,"props":44478,"children":44479},{"style":5667},[44480],{"type":25,"value":44414},{"type":20,"tag":157,"props":44482,"children":44483},{"style":892},[44484],{"type":25,"value":30657},{"type":20,"tag":157,"props":44486,"children":44487},{"class":159,"line":448},[44488,44492,44496],{"type":20,"tag":157,"props":44489,"children":44490},{"style":892},[44491],{"type":25,"value":39720},{"type":20,"tag":157,"props":44493,"children":44494},{"style":5667},[44495],{"type":25,"value":39556},{"type":20,"tag":157,"props":44497,"children":44498},{"style":892},[44499],{"type":25,"value":30657},{"type":20,"tag":157,"props":44501,"children":44502},{"class":159,"line":456},[44503,44507,44511],{"type":20,"tag":157,"props":44504,"children":44505},{"style":892},[44506],{"type":25,"value":39512},{"type":20,"tag":157,"props":44508,"children":44509},{"style":5667},[44510],{"type":25,"value":39539},{"type":20,"tag":157,"props":44512,"children":44513},{"style":892},[44514],{"type":25,"value":30657},{"type":20,"tag":157,"props":44516,"children":44517},{"class":159,"line":465},[44518],{"type":20,"tag":157,"props":44519,"children":44520},{"emptyLinePlaceholder":173},[44521],{"type":25,"value":176},{"type":20,"tag":157,"props":44523,"children":44524},{"class":159,"line":474},[44525,44529,44533],{"type":20,"tag":157,"props":44526,"children":44527},{"style":892},[44528],{"type":25,"value":36862},{"type":20,"tag":157,"props":44530,"children":44531},{"style":5667},[44532],{"type":25,"value":39298},{"type":20,"tag":157,"props":44534,"children":44535},{"style":892},[44536],{"type":25,"value":30657},{"type":20,"tag":157,"props":44538,"children":44539},{"class":159,"line":483},[44540,44544,44549,44553],{"type":20,"tag":157,"props":44541,"children":44542},{"style":39166},[44543],{"type":25,"value":40516},{"type":20,"tag":157,"props":44545,"children":44546},{"style":892},[44547],{"type":25,"value":44548}," MyCom1 ",{"type":20,"tag":157,"props":44550,"children":44551},{"style":39166},[44552],{"type":25,"value":39806},{"type":20,"tag":157,"props":44554,"children":44555},{"style":254},[44556],{"type":25,"value":44557}," '..\u002Fcomponents\u002FMyCom1.vue'\n",{"type":20,"tag":157,"props":44559,"children":44560},{"class":159,"line":491},[44561,44565,44570,44574],{"type":20,"tag":157,"props":44562,"children":44563},{"style":39166},[44564],{"type":25,"value":40516},{"type":20,"tag":157,"props":44566,"children":44567},{"style":892},[44568],{"type":25,"value":44569}," MyCom2 ",{"type":20,"tag":157,"props":44571,"children":44572},{"style":39166},[44573],{"type":25,"value":39806},{"type":20,"tag":157,"props":44575,"children":44576},{"style":254},[44577],{"type":25,"value":44578}," '..\u002Fcomponents\u002FMyCom2.vue'\n",{"type":20,"tag":157,"props":44580,"children":44581},{"class":159,"line":499},[44582,44586,44591,44595],{"type":20,"tag":157,"props":44583,"children":44584},{"style":39166},[44585],{"type":25,"value":40516},{"type":20,"tag":157,"props":44587,"children":44588},{"style":892},[44589],{"type":25,"value":44590}," MyCom3 ",{"type":20,"tag":157,"props":44592,"children":44593},{"style":39166},[44594],{"type":25,"value":39806},{"type":20,"tag":157,"props":44596,"children":44597},{"style":254},[44598],{"type":25,"value":44599}," '..\u002Fcomponents\u002FMyCom3.vue'\n",{"type":20,"tag":157,"props":44601,"children":44602},{"class":159,"line":508},[44603],{"type":20,"tag":157,"props":44604,"children":44605},{"emptyLinePlaceholder":173},[44606],{"type":25,"value":176},{"type":20,"tag":157,"props":44608,"children":44609},{"class":159,"line":517},[44610,44614,44618],{"type":20,"tag":157,"props":44611,"children":44612},{"style":39166},[44613],{"type":25,"value":42012},{"type":20,"tag":157,"props":44615,"children":44616},{"style":39166},[44617],{"type":25,"value":42017},{"type":20,"tag":157,"props":44619,"children":44620},{"style":892},[44621],{"type":25,"value":38885},{"type":20,"tag":157,"props":44623,"children":44624},{"class":159,"line":1499},[44625,44629,44634],{"type":20,"tag":157,"props":44626,"children":44627},{"style":892},[44628],{"type":25,"value":42029},{"type":20,"tag":157,"props":44630,"children":44631},{"style":254},[44632],{"type":25,"value":44633},"\"04_动态组件\"",{"type":20,"tag":157,"props":44635,"children":44636},{"style":892},[44637],{"type":25,"value":918},{"type":20,"tag":157,"props":44639,"children":44640},{"class":159,"line":1507},[44641,44645],{"type":20,"tag":157,"props":44642,"children":44643},{"style":248},[44644],{"type":25,"value":42046},{"type":20,"tag":157,"props":44646,"children":44647},{"style":892},[44648],{"type":25,"value":39400},{"type":20,"tag":157,"props":44650,"children":44651},{"class":159,"line":1515},[44652,44656],{"type":20,"tag":157,"props":44653,"children":44654},{"style":39166},[44655],{"type":25,"value":42058},{"type":20,"tag":157,"props":44657,"children":44658},{"style":892},[44659],{"type":25,"value":38885},{"type":20,"tag":157,"props":44661,"children":44662},{"class":159,"line":1523},[44663,44668],{"type":20,"tag":157,"props":44664,"children":44665},{"style":892},[44666],{"type":25,"value":44667},"      nowCom: ",{"type":20,"tag":157,"props":44669,"children":44670},{"style":254},[44671],{"type":25,"value":44672},"'MyCom1'\n",{"type":20,"tag":157,"props":44674,"children":44675},{"class":159,"line":1532},[44676],{"type":20,"tag":157,"props":44677,"children":44678},{"style":892},[44679],{"type":25,"value":872},{"type":20,"tag":157,"props":44681,"children":44682},{"class":159,"line":1541},[44683],{"type":20,"tag":157,"props":44684,"children":44685},{"style":892},[44686],{"type":25,"value":42090},{"type":20,"tag":157,"props":44688,"children":44689},{"class":159,"line":1550},[44690],{"type":20,"tag":157,"props":44691,"children":44692},{"style":892},[44693],{"type":25,"value":44694},"  components: {\n",{"type":20,"tag":157,"props":44696,"children":44697},{"class":159,"line":1558},[44698],{"type":20,"tag":157,"props":44699,"children":44700},{"style":892},[44701],{"type":25,"value":44702},"    MyCom1,\n",{"type":20,"tag":157,"props":44704,"children":44705},{"class":159,"line":1566},[44706],{"type":20,"tag":157,"props":44707,"children":44708},{"style":892},[44709],{"type":25,"value":44710},"    MyCom2,\n",{"type":20,"tag":157,"props":44712,"children":44713},{"class":159,"line":1574},[44714],{"type":20,"tag":157,"props":44715,"children":44716},{"style":892},[44717],{"type":25,"value":44718},"    MyCom3\n",{"type":20,"tag":157,"props":44720,"children":44721},{"class":159,"line":1582},[44722],{"type":20,"tag":157,"props":44723,"children":44724},{"style":892},[44725],{"type":25,"value":39060},{"type":20,"tag":157,"props":44727,"children":44728},{"class":159,"line":1591},[44729],{"type":20,"tag":157,"props":44730,"children":44731},{"style":892},[44732],{"type":25,"value":943},{"type":20,"tag":157,"props":44734,"children":44735},{"class":159,"line":1599},[44736,44740,44744],{"type":20,"tag":157,"props":44737,"children":44738},{"style":892},[44739],{"type":25,"value":39512},{"type":20,"tag":157,"props":44741,"children":44742},{"style":5667},[44743],{"type":25,"value":39298},{"type":20,"tag":157,"props":44745,"children":44746},{"style":892},[44747],{"type":25,"value":30657},{"type":20,"tag":157,"props":44749,"children":44750},{"class":159,"line":1608},[44751],{"type":20,"tag":157,"props":44752,"children":44753},{"emptyLinePlaceholder":173},[44754],{"type":25,"value":176},{"type":20,"tag":157,"props":44756,"children":44757},{"class":159,"line":1617},[44758,44762,44766,44770],{"type":20,"tag":157,"props":44759,"children":44760},{"style":892},[44761],{"type":25,"value":36862},{"type":20,"tag":157,"props":44763,"children":44764},{"style":5667},[44765],{"type":25,"value":1785},{"type":20,"tag":157,"props":44767,"children":44768},{"style":248},[44769],{"type":25,"value":42360},{"type":20,"tag":157,"props":44771,"children":44772},{"style":892},[44773],{"type":25,"value":30657},{"type":20,"tag":157,"props":44775,"children":44776},{"class":159,"line":1626},[44777],{"type":20,"tag":157,"props":44778,"children":44779},{"emptyLinePlaceholder":173},[44780],{"type":25,"value":176},{"type":20,"tag":157,"props":44782,"children":44783},{"class":159,"line":1634},[44784,44788,44792],{"type":20,"tag":157,"props":44785,"children":44786},{"style":892},[44787],{"type":25,"value":39512},{"type":20,"tag":157,"props":44789,"children":44790},{"style":5667},[44791],{"type":25,"value":1785},{"type":20,"tag":157,"props":44793,"children":44794},{"style":892},[44795],{"type":25,"value":30657},{"type":20,"tag":28,"props":44797,"children":44799},{"id":44798},"异步组件与suspense一起使用",[44800],{"type":25,"value":44801},"异步组件与Suspense一起使用",{"type":20,"tag":6665,"props":44803,"children":44804},{},[44805,44810],{"type":20,"tag":21,"props":44806,"children":44807},{},[44808],{"type":25,"value":44809},"异步组件(defineAsyncComponent)：在大型应用中，我们可能需要将应用分割成小一些的代码块，并且只在需要的时候才从服务器加载一个模块，按需加载",{"type":20,"tag":21,"props":44811,"children":44812},{},[44813],{"type":25,"value":44814},"Suspense：Vue的内置组件，在异步组件没有加载出来的时候   用来占位的",{"type":20,"tag":126,"props":44816,"children":44818},{"className":39112,"code":44817,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch2>异步组件\u003C\u002Fh2>\n    \u003Cbutton @click=\"nowCom = 'MyCom1'\">com1\u003C\u002Fbutton>\n    \u003Cbutton @click=\"nowCom = 'MyCom2'\">com2\u003C\u002Fbutton>\n    \u003Cbutton @click=\"nowCom = 'MyCom3'\">com3\u003C\u002Fbutton>\n    \u003Ckeep-alive>\n      \u003C!-- 在异步组件没有加载出来的时候 来站位的 -->\n      \u003Csuspense>\n        \u003Ccomponent :is=\"nowCom\">\u003C\u002Fcomponent>\n        \u003Ctemplate #fallback>loading\u003C\u002Ftemplate>\n      \u003C\u002Fsuspense>\n    \u003C\u002Fkeep-alive>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\n\u002F\u002F import MyCom1 from '..\u002Fcomponents\u002FMyCom1.vue'\n\u002F\u002F import MyCom2 from '..\u002Fcomponents\u002FMyCom2.vue'\n\u002F\u002F import MyCom3 from '..\u002Fcomponents\u002FMyCom3.vue'\nimport { defineAsyncComponent } from 'vue'\n\nexport default {\n  name: \"04_动态组件\",\n  data() {\n    return {\n      nowCom: 'MyCom1'\n    }\n  },\n  components: {\n    \u002F\u002F 异步加载组件   按需加载\n    MyCom1: defineAsyncComponent(() => import(\"..\u002Fcomponents\u002FMyCom1.vue\")),\n    MyCom2: defineAsyncComponent(() => import(\"..\u002Fcomponents\u002FMyCom2.vue\")),\n    MyCom3: defineAsyncComponent(() => import(\"..\u002Fcomponents\u002FMyCom3.vue\"))\n  }\n}\n\u003C\u002Fscript>\n",[44819],{"type":20,"tag":84,"props":44820,"children":44821},{"__ignoreMap":8},[44822,44837,44852,44876,44927,44978,45029,45044,45052,45068,45116,45150,45165,45180,45195,45210,45217,45232,45240,45248,45256,45276,45283,45298,45313,45324,45335,45346,45353,45360,45367,45375,45415,45452,45490,45497,45504],{"type":20,"tag":157,"props":44823,"children":44824},{"class":159,"line":160},[44825,44829,44833],{"type":20,"tag":157,"props":44826,"children":44827},{"style":892},[44828],{"type":25,"value":36862},{"type":20,"tag":157,"props":44830,"children":44831},{"style":5667},[44832],{"type":25,"value":39539},{"type":20,"tag":157,"props":44834,"children":44835},{"style":892},[44836],{"type":25,"value":30657},{"type":20,"tag":157,"props":44838,"children":44839},{"class":159,"line":169},[44840,44844,44848],{"type":20,"tag":157,"props":44841,"children":44842},{"style":892},[44843],{"type":25,"value":39551},{"type":20,"tag":157,"props":44845,"children":44846},{"style":5667},[44847],{"type":25,"value":39556},{"type":20,"tag":157,"props":44849,"children":44850},{"style":892},[44851],{"type":25,"value":30657},{"type":20,"tag":157,"props":44853,"children":44854},{"class":159,"line":179},[44855,44859,44863,44868,44872],{"type":20,"tag":157,"props":44856,"children":44857},{"style":892},[44858],{"type":25,"value":39582},{"type":20,"tag":157,"props":44860,"children":44861},{"style":5667},[44862],{"type":25,"value":1863},{"type":20,"tag":157,"props":44864,"children":44865},{"style":892},[44866],{"type":25,"value":44867},">异步组件\u003C\u002F",{"type":20,"tag":157,"props":44869,"children":44870},{"style":5667},[44871],{"type":25,"value":1863},{"type":20,"tag":157,"props":44873,"children":44874},{"style":892},[44875],{"type":25,"value":30657},{"type":20,"tag":157,"props":44877,"children":44878},{"class":159,"line":188},[44879,44883,44887,44891,44895,44899,44903,44907,44911,44915,44919,44923],{"type":20,"tag":157,"props":44880,"children":44881},{"style":892},[44882],{"type":25,"value":39582},{"type":20,"tag":157,"props":44884,"children":44885},{"style":5667},[44886],{"type":25,"value":42462},{"type":20,"tag":157,"props":44888,"children":44889},{"style":892},[44890],{"type":25,"value":39677},{"type":20,"tag":157,"props":44892,"children":44893},{"style":248},[44894],{"type":25,"value":39682},{"type":20,"tag":157,"props":44896,"children":44897},{"style":892},[44898],{"type":25,"value":2261},{"type":20,"tag":157,"props":44900,"children":44901},{"style":254},[44902],{"type":25,"value":39603},{"type":20,"tag":157,"props":44904,"children":44905},{"style":892},[44906],{"type":25,"value":44274},{"type":20,"tag":157,"props":44908,"children":44909},{"style":39166},[44910],{"type":25,"value":2261},{"type":20,"tag":157,"props":44912,"children":44913},{"style":254},[44914],{"type":25,"value":44283},{"type":20,"tag":157,"props":44916,"children":44917},{"style":892},[44918],{"type":25,"value":44288},{"type":20,"tag":157,"props":44920,"children":44921},{"style":5667},[44922],{"type":25,"value":42462},{"type":20,"tag":157,"props":44924,"children":44925},{"style":892},[44926],{"type":25,"value":30657},{"type":20,"tag":157,"props":44928,"children":44929},{"class":159,"line":196},[44930,44934,44938,44942,44946,44950,44954,44958,44962,44966,44970,44974],{"type":20,"tag":157,"props":44931,"children":44932},{"style":892},[44933],{"type":25,"value":39582},{"type":20,"tag":157,"props":44935,"children":44936},{"style":5667},[44937],{"type":25,"value":42462},{"type":20,"tag":157,"props":44939,"children":44940},{"style":892},[44941],{"type":25,"value":39677},{"type":20,"tag":157,"props":44943,"children":44944},{"style":248},[44945],{"type":25,"value":39682},{"type":20,"tag":157,"props":44947,"children":44948},{"style":892},[44949],{"type":25,"value":2261},{"type":20,"tag":157,"props":44951,"children":44952},{"style":254},[44953],{"type":25,"value":39603},{"type":20,"tag":157,"props":44955,"children":44956},{"style":892},[44957],{"type":25,"value":44274},{"type":20,"tag":157,"props":44959,"children":44960},{"style":39166},[44961],{"type":25,"value":2261},{"type":20,"tag":157,"props":44963,"children":44964},{"style":254},[44965],{"type":25,"value":44336},{"type":20,"tag":157,"props":44967,"children":44968},{"style":892},[44969],{"type":25,"value":44341},{"type":20,"tag":157,"props":44971,"children":44972},{"style":5667},[44973],{"type":25,"value":42462},{"type":20,"tag":157,"props":44975,"children":44976},{"style":892},[44977],{"type":25,"value":30657},{"type":20,"tag":157,"props":44979,"children":44980},{"class":159,"line":204},[44981,44985,44989,44993,44997,45001,45005,45009,45013,45017,45021,45025],{"type":20,"tag":157,"props":44982,"children":44983},{"style":892},[44984],{"type":25,"value":39582},{"type":20,"tag":157,"props":44986,"children":44987},{"style":5667},[44988],{"type":25,"value":42462},{"type":20,"tag":157,"props":44990,"children":44991},{"style":892},[44992],{"type":25,"value":39677},{"type":20,"tag":157,"props":44994,"children":44995},{"style":248},[44996],{"type":25,"value":39682},{"type":20,"tag":157,"props":44998,"children":44999},{"style":892},[45000],{"type":25,"value":2261},{"type":20,"tag":157,"props":45002,"children":45003},{"style":254},[45004],{"type":25,"value":39603},{"type":20,"tag":157,"props":45006,"children":45007},{"style":892},[45008],{"type":25,"value":44274},{"type":20,"tag":157,"props":45010,"children":45011},{"style":39166},[45012],{"type":25,"value":2261},{"type":20,"tag":157,"props":45014,"children":45015},{"style":254},[45016],{"type":25,"value":44389},{"type":20,"tag":157,"props":45018,"children":45019},{"style":892},[45020],{"type":25,"value":44394},{"type":20,"tag":157,"props":45022,"children":45023},{"style":5667},[45024],{"type":25,"value":42462},{"type":20,"tag":157,"props":45026,"children":45027},{"style":892},[45028],{"type":25,"value":30657},{"type":20,"tag":157,"props":45030,"children":45031},{"class":159,"line":213},[45032,45036,45040],{"type":20,"tag":157,"props":45033,"children":45034},{"style":892},[45035],{"type":25,"value":39582},{"type":20,"tag":157,"props":45037,"children":45038},{"style":5667},[45039],{"type":25,"value":44414},{"type":20,"tag":157,"props":45041,"children":45042},{"style":892},[45043],{"type":25,"value":30657},{"type":20,"tag":157,"props":45045,"children":45046},{"class":159,"line":222},[45047],{"type":20,"tag":157,"props":45048,"children":45049},{"style":9628},[45050],{"type":25,"value":45051},"      \u003C!-- 在异步组件没有加载出来的时候 来站位的 -->\n",{"type":20,"tag":157,"props":45053,"children":45054},{"class":159,"line":440},[45055,45059,45064],{"type":20,"tag":157,"props":45056,"children":45057},{"style":892},[45058],{"type":25,"value":41808},{"type":20,"tag":157,"props":45060,"children":45061},{"style":5667},[45062],{"type":25,"value":45063},"suspense",{"type":20,"tag":157,"props":45065,"children":45066},{"style":892},[45067],{"type":25,"value":30657},{"type":20,"tag":157,"props":45069,"children":45070},{"class":159,"line":448},[45071,45076,45080,45084,45088,45092,45096,45100,45104,45108,45112],{"type":20,"tag":157,"props":45072,"children":45073},{"style":892},[45074],{"type":25,"value":45075},"        \u003C",{"type":20,"tag":157,"props":45077,"children":45078},{"style":5667},[45079],{"type":25,"value":44430},{"type":20,"tag":157,"props":45081,"children":45082},{"style":892},[45083],{"type":25,"value":39442},{"type":20,"tag":157,"props":45085,"children":45086},{"style":248},[45087],{"type":25,"value":44439},{"type":20,"tag":157,"props":45089,"children":45090},{"style":892},[45091],{"type":25,"value":2261},{"type":20,"tag":157,"props":45093,"children":45094},{"style":254},[45095],{"type":25,"value":39603},{"type":20,"tag":157,"props":45097,"children":45098},{"style":892},[45099],{"type":25,"value":44452},{"type":20,"tag":157,"props":45101,"children":45102},{"style":254},[45103],{"type":25,"value":39603},{"type":20,"tag":157,"props":45105,"children":45106},{"style":892},[45107],{"type":25,"value":36885},{"type":20,"tag":157,"props":45109,"children":45110},{"style":5667},[45111],{"type":25,"value":44430},{"type":20,"tag":157,"props":45113,"children":45114},{"style":892},[45115],{"type":25,"value":30657},{"type":20,"tag":157,"props":45117,"children":45118},{"class":159,"line":456},[45119,45123,45127,45132,45137,45142,45146],{"type":20,"tag":157,"props":45120,"children":45121},{"style":892},[45122],{"type":25,"value":45075},{"type":20,"tag":157,"props":45124,"children":45125},{"style":5667},[45126],{"type":25,"value":39539},{"type":20,"tag":157,"props":45128,"children":45129},{"style":892},[45130],{"type":25,"value":45131}," #",{"type":20,"tag":157,"props":45133,"children":45134},{"style":248},[45135],{"type":25,"value":45136},"fallback",{"type":20,"tag":157,"props":45138,"children":45139},{"style":892},[45140],{"type":25,"value":45141},">loading\u003C\u002F",{"type":20,"tag":157,"props":45143,"children":45144},{"style":5667},[45145],{"type":25,"value":39539},{"type":20,"tag":157,"props":45147,"children":45148},{"style":892},[45149],{"type":25,"value":30657},{"type":20,"tag":157,"props":45151,"children":45152},{"class":159,"line":465},[45153,45157,45161],{"type":20,"tag":157,"props":45154,"children":45155},{"style":892},[45156],{"type":25,"value":41841},{"type":20,"tag":157,"props":45158,"children":45159},{"style":5667},[45160],{"type":25,"value":45063},{"type":20,"tag":157,"props":45162,"children":45163},{"style":892},[45164],{"type":25,"value":30657},{"type":20,"tag":157,"props":45166,"children":45167},{"class":159,"line":474},[45168,45172,45176],{"type":20,"tag":157,"props":45169,"children":45170},{"style":892},[45171],{"type":25,"value":44476},{"type":20,"tag":157,"props":45173,"children":45174},{"style":5667},[45175],{"type":25,"value":44414},{"type":20,"tag":157,"props":45177,"children":45178},{"style":892},[45179],{"type":25,"value":30657},{"type":20,"tag":157,"props":45181,"children":45182},{"class":159,"line":483},[45183,45187,45191],{"type":20,"tag":157,"props":45184,"children":45185},{"style":892},[45186],{"type":25,"value":39720},{"type":20,"tag":157,"props":45188,"children":45189},{"style":5667},[45190],{"type":25,"value":39556},{"type":20,"tag":157,"props":45192,"children":45193},{"style":892},[45194],{"type":25,"value":30657},{"type":20,"tag":157,"props":45196,"children":45197},{"class":159,"line":491},[45198,45202,45206],{"type":20,"tag":157,"props":45199,"children":45200},{"style":892},[45201],{"type":25,"value":39512},{"type":20,"tag":157,"props":45203,"children":45204},{"style":5667},[45205],{"type":25,"value":39539},{"type":20,"tag":157,"props":45207,"children":45208},{"style":892},[45209],{"type":25,"value":30657},{"type":20,"tag":157,"props":45211,"children":45212},{"class":159,"line":499},[45213],{"type":20,"tag":157,"props":45214,"children":45215},{"emptyLinePlaceholder":173},[45216],{"type":25,"value":176},{"type":20,"tag":157,"props":45218,"children":45219},{"class":159,"line":508},[45220,45224,45228],{"type":20,"tag":157,"props":45221,"children":45222},{"style":892},[45223],{"type":25,"value":36862},{"type":20,"tag":157,"props":45225,"children":45226},{"style":5667},[45227],{"type":25,"value":39298},{"type":20,"tag":157,"props":45229,"children":45230},{"style":892},[45231],{"type":25,"value":30657},{"type":20,"tag":157,"props":45233,"children":45234},{"class":159,"line":517},[45235],{"type":20,"tag":157,"props":45236,"children":45237},{"style":9628},[45238],{"type":25,"value":45239},"\u002F\u002F import MyCom1 from '..\u002Fcomponents\u002FMyCom1.vue'\n",{"type":20,"tag":157,"props":45241,"children":45242},{"class":159,"line":1499},[45243],{"type":20,"tag":157,"props":45244,"children":45245},{"style":9628},[45246],{"type":25,"value":45247},"\u002F\u002F import MyCom2 from '..\u002Fcomponents\u002FMyCom2.vue'\n",{"type":20,"tag":157,"props":45249,"children":45250},{"class":159,"line":1507},[45251],{"type":20,"tag":157,"props":45252,"children":45253},{"style":9628},[45254],{"type":25,"value":45255},"\u002F\u002F import MyCom3 from '..\u002Fcomponents\u002FMyCom3.vue'\n",{"type":20,"tag":157,"props":45257,"children":45258},{"class":159,"line":1515},[45259,45263,45268,45272],{"type":20,"tag":157,"props":45260,"children":45261},{"style":39166},[45262],{"type":25,"value":40516},{"type":20,"tag":157,"props":45264,"children":45265},{"style":892},[45266],{"type":25,"value":45267}," { defineAsyncComponent } ",{"type":20,"tag":157,"props":45269,"children":45270},{"style":39166},[45271],{"type":25,"value":39806},{"type":20,"tag":157,"props":45273,"children":45274},{"style":254},[45275],{"type":25,"value":39811},{"type":20,"tag":157,"props":45277,"children":45278},{"class":159,"line":1523},[45279],{"type":20,"tag":157,"props":45280,"children":45281},{"emptyLinePlaceholder":173},[45282],{"type":25,"value":176},{"type":20,"tag":157,"props":45284,"children":45285},{"class":159,"line":1532},[45286,45290,45294],{"type":20,"tag":157,"props":45287,"children":45288},{"style":39166},[45289],{"type":25,"value":42012},{"type":20,"tag":157,"props":45291,"children":45292},{"style":39166},[45293],{"type":25,"value":42017},{"type":20,"tag":157,"props":45295,"children":45296},{"style":892},[45297],{"type":25,"value":38885},{"type":20,"tag":157,"props":45299,"children":45300},{"class":159,"line":1541},[45301,45305,45309],{"type":20,"tag":157,"props":45302,"children":45303},{"style":892},[45304],{"type":25,"value":42029},{"type":20,"tag":157,"props":45306,"children":45307},{"style":254},[45308],{"type":25,"value":44633},{"type":20,"tag":157,"props":45310,"children":45311},{"style":892},[45312],{"type":25,"value":918},{"type":20,"tag":157,"props":45314,"children":45315},{"class":159,"line":1550},[45316,45320],{"type":20,"tag":157,"props":45317,"children":45318},{"style":248},[45319],{"type":25,"value":42046},{"type":20,"tag":157,"props":45321,"children":45322},{"style":892},[45323],{"type":25,"value":39400},{"type":20,"tag":157,"props":45325,"children":45326},{"class":159,"line":1558},[45327,45331],{"type":20,"tag":157,"props":45328,"children":45329},{"style":39166},[45330],{"type":25,"value":42058},{"type":20,"tag":157,"props":45332,"children":45333},{"style":892},[45334],{"type":25,"value":38885},{"type":20,"tag":157,"props":45336,"children":45337},{"class":159,"line":1566},[45338,45342],{"type":20,"tag":157,"props":45339,"children":45340},{"style":892},[45341],{"type":25,"value":44667},{"type":20,"tag":157,"props":45343,"children":45344},{"style":254},[45345],{"type":25,"value":44672},{"type":20,"tag":157,"props":45347,"children":45348},{"class":159,"line":1574},[45349],{"type":20,"tag":157,"props":45350,"children":45351},{"style":892},[45352],{"type":25,"value":872},{"type":20,"tag":157,"props":45354,"children":45355},{"class":159,"line":1582},[45356],{"type":20,"tag":157,"props":45357,"children":45358},{"style":892},[45359],{"type":25,"value":42090},{"type":20,"tag":157,"props":45361,"children":45362},{"class":159,"line":1591},[45363],{"type":20,"tag":157,"props":45364,"children":45365},{"style":892},[45366],{"type":25,"value":44694},{"type":20,"tag":157,"props":45368,"children":45369},{"class":159,"line":1599},[45370],{"type":20,"tag":157,"props":45371,"children":45372},{"style":9628},[45373],{"type":25,"value":45374},"    \u002F\u002F 异步加载组件   按需加载\n",{"type":20,"tag":157,"props":45376,"children":45377},{"class":159,"line":1608},[45378,45383,45388,45392,45396,45401,45405,45410],{"type":20,"tag":157,"props":45379,"children":45380},{"style":892},[45381],{"type":25,"value":45382},"    MyCom1: ",{"type":20,"tag":157,"props":45384,"children":45385},{"style":248},[45386],{"type":25,"value":45387},"defineAsyncComponent",{"type":20,"tag":157,"props":45389,"children":45390},{"style":892},[45391],{"type":25,"value":39890},{"type":20,"tag":157,"props":45393,"children":45394},{"style":39166},[45395],{"type":25,"value":39895},{"type":20,"tag":157,"props":45397,"children":45398},{"style":39166},[45399],{"type":25,"value":45400}," import",{"type":20,"tag":157,"props":45402,"children":45403},{"style":892},[45404],{"type":25,"value":39189},{"type":20,"tag":157,"props":45406,"children":45407},{"style":254},[45408],{"type":25,"value":45409},"\"..\u002Fcomponents\u002FMyCom1.vue\"",{"type":20,"tag":157,"props":45411,"children":45412},{"style":892},[45413],{"type":25,"value":45414},")),\n",{"type":20,"tag":157,"props":45416,"children":45417},{"class":159,"line":1617},[45418,45423,45427,45431,45435,45439,45443,45448],{"type":20,"tag":157,"props":45419,"children":45420},{"style":892},[45421],{"type":25,"value":45422},"    MyCom2: ",{"type":20,"tag":157,"props":45424,"children":45425},{"style":248},[45426],{"type":25,"value":45387},{"type":20,"tag":157,"props":45428,"children":45429},{"style":892},[45430],{"type":25,"value":39890},{"type":20,"tag":157,"props":45432,"children":45433},{"style":39166},[45434],{"type":25,"value":39895},{"type":20,"tag":157,"props":45436,"children":45437},{"style":39166},[45438],{"type":25,"value":45400},{"type":20,"tag":157,"props":45440,"children":45441},{"style":892},[45442],{"type":25,"value":39189},{"type":20,"tag":157,"props":45444,"children":45445},{"style":254},[45446],{"type":25,"value":45447},"\"..\u002Fcomponents\u002FMyCom2.vue\"",{"type":20,"tag":157,"props":45449,"children":45450},{"style":892},[45451],{"type":25,"value":45414},{"type":20,"tag":157,"props":45453,"children":45454},{"class":159,"line":1626},[45455,45460,45464,45468,45472,45476,45480,45485],{"type":20,"tag":157,"props":45456,"children":45457},{"style":892},[45458],{"type":25,"value":45459},"    MyCom3: ",{"type":20,"tag":157,"props":45461,"children":45462},{"style":248},[45463],{"type":25,"value":45387},{"type":20,"tag":157,"props":45465,"children":45466},{"style":892},[45467],{"type":25,"value":39890},{"type":20,"tag":157,"props":45469,"children":45470},{"style":39166},[45471],{"type":25,"value":39895},{"type":20,"tag":157,"props":45473,"children":45474},{"style":39166},[45475],{"type":25,"value":45400},{"type":20,"tag":157,"props":45477,"children":45478},{"style":892},[45479],{"type":25,"value":39189},{"type":20,"tag":157,"props":45481,"children":45482},{"style":254},[45483],{"type":25,"value":45484},"\"..\u002Fcomponents\u002FMyCom3.vue\"",{"type":20,"tag":157,"props":45486,"children":45487},{"style":892},[45488],{"type":25,"value":45489},"))\n",{"type":20,"tag":157,"props":45491,"children":45492},{"class":159,"line":1634},[45493],{"type":20,"tag":157,"props":45494,"children":45495},{"style":892},[45496],{"type":25,"value":39060},{"type":20,"tag":157,"props":45498,"children":45499},{"class":159,"line":1642},[45500],{"type":20,"tag":157,"props":45501,"children":45502},{"style":892},[45503],{"type":25,"value":943},{"type":20,"tag":157,"props":45505,"children":45506},{"class":159,"line":1650},[45507,45511,45515],{"type":20,"tag":157,"props":45508,"children":45509},{"style":892},[45510],{"type":25,"value":39512},{"type":20,"tag":157,"props":45512,"children":45513},{"style":5667},[45514],{"type":25,"value":39298},{"type":20,"tag":157,"props":45516,"children":45517},{"style":892},[45518],{"type":25,"value":30657},{"type":20,"tag":28,"props":45520,"children":45522},{"id":45521},"子孙组件通信",[45523],{"type":25,"value":45521},{"type":20,"tag":6665,"props":45525,"children":45526},{},[45527],{"type":20,"tag":21,"props":45528,"children":45529},{},[45530],{"type":25,"value":45531},"Provide 与 Inject",{"type":20,"tag":126,"props":45533,"children":45535},{"className":39112,"code":45534,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Ch2>Provide\u003C\u002Fh2>\n  \u003CMiddle>\u003C\u002FMiddle>\n\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nimport Middle from \".\u002F07_Middle.vue\"\n\nexport default {\n  name: \"06_Provide\",\n  data() {\n    return {\n      count: 123\n    }\n  },\n  provide() {\n    return {\n      message: \"Message\",\n      count: this.count,\n      getInfo(data) {\n        console.log(data)\n      }\n    }\n  },\n  components: {\n    Middle\n  }\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n\n\u003C\u002Fstyle>\n",[45536],{"type":20,"tag":84,"props":45537,"children":45538},{"__ignoreMap":8},[45539,45554,45578,45602,45609,45624,45631,45646,45667,45674,45689,45705,45716,45727,45740,45747,45754,45766,45777,45793,45809,45830,45846,45853,45860,45867,45874,45882,45889,45896,45911,45918,45937,45944],{"type":20,"tag":157,"props":45540,"children":45541},{"class":159,"line":160},[45542,45546,45550],{"type":20,"tag":157,"props":45543,"children":45544},{"style":892},[45545],{"type":25,"value":36862},{"type":20,"tag":157,"props":45547,"children":45548},{"style":5667},[45549],{"type":25,"value":39539},{"type":20,"tag":157,"props":45551,"children":45552},{"style":892},[45553],{"type":25,"value":30657},{"type":20,"tag":157,"props":45555,"children":45556},{"class":159,"line":169},[45557,45561,45565,45570,45574],{"type":20,"tag":157,"props":45558,"children":45559},{"style":892},[45560],{"type":25,"value":39551},{"type":20,"tag":157,"props":45562,"children":45563},{"style":5667},[45564],{"type":25,"value":1863},{"type":20,"tag":157,"props":45566,"children":45567},{"style":892},[45568],{"type":25,"value":45569},">Provide\u003C\u002F",{"type":20,"tag":157,"props":45571,"children":45572},{"style":5667},[45573],{"type":25,"value":1863},{"type":20,"tag":157,"props":45575,"children":45576},{"style":892},[45577],{"type":25,"value":30657},{"type":20,"tag":157,"props":45579,"children":45580},{"class":159,"line":179},[45581,45585,45590,45594,45598],{"type":20,"tag":157,"props":45582,"children":45583},{"style":892},[45584],{"type":25,"value":39551},{"type":20,"tag":157,"props":45586,"children":45587},{"style":5667},[45588],{"type":25,"value":45589},"Middle",{"type":20,"tag":157,"props":45591,"children":45592},{"style":892},[45593],{"type":25,"value":36885},{"type":20,"tag":157,"props":45595,"children":45596},{"style":5667},[45597],{"type":25,"value":45589},{"type":20,"tag":157,"props":45599,"children":45600},{"style":892},[45601],{"type":25,"value":30657},{"type":20,"tag":157,"props":45603,"children":45604},{"class":159,"line":188},[45605],{"type":20,"tag":157,"props":45606,"children":45607},{"emptyLinePlaceholder":173},[45608],{"type":25,"value":176},{"type":20,"tag":157,"props":45610,"children":45611},{"class":159,"line":196},[45612,45616,45620],{"type":20,"tag":157,"props":45613,"children":45614},{"style":892},[45615],{"type":25,"value":39512},{"type":20,"tag":157,"props":45617,"children":45618},{"style":5667},[45619],{"type":25,"value":39539},{"type":20,"tag":157,"props":45621,"children":45622},{"style":892},[45623],{"type":25,"value":30657},{"type":20,"tag":157,"props":45625,"children":45626},{"class":159,"line":204},[45627],{"type":20,"tag":157,"props":45628,"children":45629},{"emptyLinePlaceholder":173},[45630],{"type":25,"value":176},{"type":20,"tag":157,"props":45632,"children":45633},{"class":159,"line":213},[45634,45638,45642],{"type":20,"tag":157,"props":45635,"children":45636},{"style":892},[45637],{"type":25,"value":36862},{"type":20,"tag":157,"props":45639,"children":45640},{"style":5667},[45641],{"type":25,"value":39298},{"type":20,"tag":157,"props":45643,"children":45644},{"style":892},[45645],{"type":25,"value":30657},{"type":20,"tag":157,"props":45647,"children":45648},{"class":159,"line":222},[45649,45653,45658,45662],{"type":20,"tag":157,"props":45650,"children":45651},{"style":39166},[45652],{"type":25,"value":40516},{"type":20,"tag":157,"props":45654,"children":45655},{"style":892},[45656],{"type":25,"value":45657}," Middle ",{"type":20,"tag":157,"props":45659,"children":45660},{"style":39166},[45661],{"type":25,"value":39806},{"type":20,"tag":157,"props":45663,"children":45664},{"style":254},[45665],{"type":25,"value":45666}," \".\u002F07_Middle.vue\"\n",{"type":20,"tag":157,"props":45668,"children":45669},{"class":159,"line":440},[45670],{"type":20,"tag":157,"props":45671,"children":45672},{"emptyLinePlaceholder":173},[45673],{"type":25,"value":176},{"type":20,"tag":157,"props":45675,"children":45676},{"class":159,"line":448},[45677,45681,45685],{"type":20,"tag":157,"props":45678,"children":45679},{"style":39166},[45680],{"type":25,"value":42012},{"type":20,"tag":157,"props":45682,"children":45683},{"style":39166},[45684],{"type":25,"value":42017},{"type":20,"tag":157,"props":45686,"children":45687},{"style":892},[45688],{"type":25,"value":38885},{"type":20,"tag":157,"props":45690,"children":45691},{"class":159,"line":456},[45692,45696,45701],{"type":20,"tag":157,"props":45693,"children":45694},{"style":892},[45695],{"type":25,"value":42029},{"type":20,"tag":157,"props":45697,"children":45698},{"style":254},[45699],{"type":25,"value":45700},"\"06_Provide\"",{"type":20,"tag":157,"props":45702,"children":45703},{"style":892},[45704],{"type":25,"value":918},{"type":20,"tag":157,"props":45706,"children":45707},{"class":159,"line":465},[45708,45712],{"type":20,"tag":157,"props":45709,"children":45710},{"style":248},[45711],{"type":25,"value":42046},{"type":20,"tag":157,"props":45713,"children":45714},{"style":892},[45715],{"type":25,"value":39400},{"type":20,"tag":157,"props":45717,"children":45718},{"class":159,"line":474},[45719,45723],{"type":20,"tag":157,"props":45720,"children":45721},{"style":39166},[45722],{"type":25,"value":42058},{"type":20,"tag":157,"props":45724,"children":45725},{"style":892},[45726],{"type":25,"value":38885},{"type":20,"tag":157,"props":45728,"children":45729},{"class":159,"line":483},[45730,45735],{"type":20,"tag":157,"props":45731,"children":45732},{"style":892},[45733],{"type":25,"value":45734},"      count: ",{"type":20,"tag":157,"props":45736,"children":45737},{"style":260},[45738],{"type":25,"value":45739},"123\n",{"type":20,"tag":157,"props":45741,"children":45742},{"class":159,"line":491},[45743],{"type":20,"tag":157,"props":45744,"children":45745},{"style":892},[45746],{"type":25,"value":872},{"type":20,"tag":157,"props":45748,"children":45749},{"class":159,"line":499},[45750],{"type":20,"tag":157,"props":45751,"children":45752},{"style":892},[45753],{"type":25,"value":42090},{"type":20,"tag":157,"props":45755,"children":45756},{"class":159,"line":508},[45757,45762],{"type":20,"tag":157,"props":45758,"children":45759},{"style":248},[45760],{"type":25,"value":45761},"  provide",{"type":20,"tag":157,"props":45763,"children":45764},{"style":892},[45765],{"type":25,"value":39400},{"type":20,"tag":157,"props":45767,"children":45768},{"class":159,"line":517},[45769,45773],{"type":20,"tag":157,"props":45770,"children":45771},{"style":39166},[45772],{"type":25,"value":42058},{"type":20,"tag":157,"props":45774,"children":45775},{"style":892},[45776],{"type":25,"value":38885},{"type":20,"tag":157,"props":45778,"children":45779},{"class":159,"line":1499},[45780,45784,45789],{"type":20,"tag":157,"props":45781,"children":45782},{"style":892},[45783],{"type":25,"value":42070},{"type":20,"tag":157,"props":45785,"children":45786},{"style":254},[45787],{"type":25,"value":45788},"\"Message\"",{"type":20,"tag":157,"props":45790,"children":45791},{"style":892},[45792],{"type":25,"value":918},{"type":20,"tag":157,"props":45794,"children":45795},{"class":159,"line":1507},[45796,45800,45804],{"type":20,"tag":157,"props":45797,"children":45798},{"style":892},[45799],{"type":25,"value":45734},{"type":20,"tag":157,"props":45801,"children":45802},{"style":260},[45803],{"type":25,"value":40479},{"type":20,"tag":157,"props":45805,"children":45806},{"style":892},[45807],{"type":25,"value":45808},".count,\n",{"type":20,"tag":157,"props":45810,"children":45811},{"class":159,"line":1515},[45812,45817,45821,45826],{"type":20,"tag":157,"props":45813,"children":45814},{"style":248},[45815],{"type":25,"value":45816},"      getInfo",{"type":20,"tag":157,"props":45818,"children":45819},{"style":892},[45820],{"type":25,"value":39189},{"type":20,"tag":157,"props":45822,"children":45823},{"style":6410},[45824],{"type":25,"value":45825},"data",{"type":20,"tag":157,"props":45827,"children":45828},{"style":892},[45829],{"type":25,"value":41031},{"type":20,"tag":157,"props":45831,"children":45832},{"class":159,"line":1523},[45833,45837,45841],{"type":20,"tag":157,"props":45834,"children":45835},{"style":892},[45836],{"type":25,"value":42211},{"type":20,"tag":157,"props":45838,"children":45839},{"style":248},[45840],{"type":25,"value":42157},{"type":20,"tag":157,"props":45842,"children":45843},{"style":892},[45844],{"type":25,"value":45845},"(data)\n",{"type":20,"tag":157,"props":45847,"children":45848},{"class":159,"line":1532},[45849],{"type":20,"tag":157,"props":45850,"children":45851},{"style":892},[45852],{"type":25,"value":42780},{"type":20,"tag":157,"props":45854,"children":45855},{"class":159,"line":1541},[45856],{"type":20,"tag":157,"props":45857,"children":45858},{"style":892},[45859],{"type":25,"value":872},{"type":20,"tag":157,"props":45861,"children":45862},{"class":159,"line":1550},[45863],{"type":20,"tag":157,"props":45864,"children":45865},{"style":892},[45866],{"type":25,"value":42090},{"type":20,"tag":157,"props":45868,"children":45869},{"class":159,"line":1558},[45870],{"type":20,"tag":157,"props":45871,"children":45872},{"style":892},[45873],{"type":25,"value":44694},{"type":20,"tag":157,"props":45875,"children":45876},{"class":159,"line":1566},[45877],{"type":20,"tag":157,"props":45878,"children":45879},{"style":892},[45880],{"type":25,"value":45881},"    Middle\n",{"type":20,"tag":157,"props":45883,"children":45884},{"class":159,"line":1574},[45885],{"type":20,"tag":157,"props":45886,"children":45887},{"style":892},[45888],{"type":25,"value":39060},{"type":20,"tag":157,"props":45890,"children":45891},{"class":159,"line":1582},[45892],{"type":20,"tag":157,"props":45893,"children":45894},{"style":892},[45895],{"type":25,"value":943},{"type":20,"tag":157,"props":45897,"children":45898},{"class":159,"line":1591},[45899,45903,45907],{"type":20,"tag":157,"props":45900,"children":45901},{"style":892},[45902],{"type":25,"value":39512},{"type":20,"tag":157,"props":45904,"children":45905},{"style":5667},[45906],{"type":25,"value":39298},{"type":20,"tag":157,"props":45908,"children":45909},{"style":892},[45910],{"type":25,"value":30657},{"type":20,"tag":157,"props":45912,"children":45913},{"class":159,"line":1599},[45914],{"type":20,"tag":157,"props":45915,"children":45916},{"emptyLinePlaceholder":173},[45917],{"type":25,"value":176},{"type":20,"tag":157,"props":45919,"children":45920},{"class":159,"line":1608},[45921,45925,45929,45933],{"type":20,"tag":157,"props":45922,"children":45923},{"style":892},[45924],{"type":25,"value":36862},{"type":20,"tag":157,"props":45926,"children":45927},{"style":5667},[45928],{"type":25,"value":1785},{"type":20,"tag":157,"props":45930,"children":45931},{"style":248},[45932],{"type":25,"value":42360},{"type":20,"tag":157,"props":45934,"children":45935},{"style":892},[45936],{"type":25,"value":30657},{"type":20,"tag":157,"props":45938,"children":45939},{"class":159,"line":1617},[45940],{"type":20,"tag":157,"props":45941,"children":45942},{"emptyLinePlaceholder":173},[45943],{"type":25,"value":176},{"type":20,"tag":157,"props":45945,"children":45946},{"class":159,"line":1626},[45947,45951,45955],{"type":20,"tag":157,"props":45948,"children":45949},{"style":892},[45950],{"type":25,"value":39512},{"type":20,"tag":157,"props":45952,"children":45953},{"style":5667},[45954],{"type":25,"value":1785},{"type":20,"tag":157,"props":45956,"children":45957},{"style":892},[45958],{"type":25,"value":30657},{"type":20,"tag":126,"props":45960,"children":45962},{"className":39112,"code":45961,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n  \u003Ch2>Inject {{ message }}{{ count }}\u003C\u002Fh2>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n  name: \"08_Inject\",\n  inject: [\"message\", \"count\", \"getInfo\"],\n  mounted() {\n    this.getInfo(\"Hello Inject\")\n  }\n}\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\n\n\u003C\u002Fstyle>\n",[45963],{"type":20,"tag":84,"props":45964,"children":45965},{"__ignoreMap":8},[45966,45981,46005,46020,46027,46042,46057,46073,46108,46119,46149,46156,46163,46178,46185,46204,46211],{"type":20,"tag":157,"props":45967,"children":45968},{"class":159,"line":160},[45969,45973,45977],{"type":20,"tag":157,"props":45970,"children":45971},{"style":892},[45972],{"type":25,"value":36862},{"type":20,"tag":157,"props":45974,"children":45975},{"style":5667},[45976],{"type":25,"value":39539},{"type":20,"tag":157,"props":45978,"children":45979},{"style":892},[45980],{"type":25,"value":30657},{"type":20,"tag":157,"props":45982,"children":45983},{"class":159,"line":169},[45984,45988,45992,45997,46001],{"type":20,"tag":157,"props":45985,"children":45986},{"style":892},[45987],{"type":25,"value":39551},{"type":20,"tag":157,"props":45989,"children":45990},{"style":5667},[45991],{"type":25,"value":1863},{"type":20,"tag":157,"props":45993,"children":45994},{"style":892},[45995],{"type":25,"value":45996},">Inject {{ message }}{{ count }}\u003C\u002F",{"type":20,"tag":157,"props":45998,"children":45999},{"style":5667},[46000],{"type":25,"value":1863},{"type":20,"tag":157,"props":46002,"children":46003},{"style":892},[46004],{"type":25,"value":30657},{"type":20,"tag":157,"props":46006,"children":46007},{"class":159,"line":179},[46008,46012,46016],{"type":20,"tag":157,"props":46009,"children":46010},{"style":892},[46011],{"type":25,"value":39512},{"type":20,"tag":157,"props":46013,"children":46014},{"style":5667},[46015],{"type":25,"value":39539},{"type":20,"tag":157,"props":46017,"children":46018},{"style":892},[46019],{"type":25,"value":30657},{"type":20,"tag":157,"props":46021,"children":46022},{"class":159,"line":188},[46023],{"type":20,"tag":157,"props":46024,"children":46025},{"emptyLinePlaceholder":173},[46026],{"type":25,"value":176},{"type":20,"tag":157,"props":46028,"children":46029},{"class":159,"line":196},[46030,46034,46038],{"type":20,"tag":157,"props":46031,"children":46032},{"style":892},[46033],{"type":25,"value":36862},{"type":20,"tag":157,"props":46035,"children":46036},{"style":5667},[46037],{"type":25,"value":39298},{"type":20,"tag":157,"props":46039,"children":46040},{"style":892},[46041],{"type":25,"value":30657},{"type":20,"tag":157,"props":46043,"children":46044},{"class":159,"line":204},[46045,46049,46053],{"type":20,"tag":157,"props":46046,"children":46047},{"style":39166},[46048],{"type":25,"value":42012},{"type":20,"tag":157,"props":46050,"children":46051},{"style":39166},[46052],{"type":25,"value":42017},{"type":20,"tag":157,"props":46054,"children":46055},{"style":892},[46056],{"type":25,"value":38885},{"type":20,"tag":157,"props":46058,"children":46059},{"class":159,"line":213},[46060,46064,46069],{"type":20,"tag":157,"props":46061,"children":46062},{"style":892},[46063],{"type":25,"value":42029},{"type":20,"tag":157,"props":46065,"children":46066},{"style":254},[46067],{"type":25,"value":46068},"\"08_Inject\"",{"type":20,"tag":157,"props":46070,"children":46071},{"style":892},[46072],{"type":25,"value":918},{"type":20,"tag":157,"props":46074,"children":46075},{"class":159,"line":222},[46076,46081,46085,46089,46094,46098,46103],{"type":20,"tag":157,"props":46077,"children":46078},{"style":892},[46079],{"type":25,"value":46080},"  inject: [",{"type":20,"tag":157,"props":46082,"children":46083},{"style":254},[46084],{"type":25,"value":41234},{"type":20,"tag":157,"props":46086,"children":46087},{"style":892},[46088],{"type":25,"value":42626},{"type":20,"tag":157,"props":46090,"children":46091},{"style":254},[46092],{"type":25,"value":46093},"\"count\"",{"type":20,"tag":157,"props":46095,"children":46096},{"style":892},[46097],{"type":25,"value":42626},{"type":20,"tag":157,"props":46099,"children":46100},{"style":254},[46101],{"type":25,"value":46102},"\"getInfo\"",{"type":20,"tag":157,"props":46104,"children":46105},{"style":892},[46106],{"type":25,"value":46107},"],\n",{"type":20,"tag":157,"props":46109,"children":46110},{"class":159,"line":440},[46111,46115],{"type":20,"tag":157,"props":46112,"children":46113},{"style":248},[46114],{"type":25,"value":42098},{"type":20,"tag":157,"props":46116,"children":46117},{"style":892},[46118],{"type":25,"value":39400},{"type":20,"tag":157,"props":46120,"children":46121},{"class":159,"line":448},[46122,46127,46131,46136,46140,46145],{"type":20,"tag":157,"props":46123,"children":46124},{"style":260},[46125],{"type":25,"value":46126},"    this",{"type":20,"tag":157,"props":46128,"children":46129},{"style":892},[46130],{"type":25,"value":40175},{"type":20,"tag":157,"props":46132,"children":46133},{"style":248},[46134],{"type":25,"value":46135},"getInfo",{"type":20,"tag":157,"props":46137,"children":46138},{"style":892},[46139],{"type":25,"value":39189},{"type":20,"tag":157,"props":46141,"children":46142},{"style":254},[46143],{"type":25,"value":46144},"\"Hello Inject\"",{"type":20,"tag":157,"props":46146,"children":46147},{"style":892},[46148],{"type":25,"value":8926},{"type":20,"tag":157,"props":46150,"children":46151},{"class":159,"line":456},[46152],{"type":20,"tag":157,"props":46153,"children":46154},{"style":892},[46155],{"type":25,"value":39060},{"type":20,"tag":157,"props":46157,"children":46158},{"class":159,"line":465},[46159],{"type":20,"tag":157,"props":46160,"children":46161},{"style":892},[46162],{"type":25,"value":943},{"type":20,"tag":157,"props":46164,"children":46165},{"class":159,"line":474},[46166,46170,46174],{"type":20,"tag":157,"props":46167,"children":46168},{"style":892},[46169],{"type":25,"value":39512},{"type":20,"tag":157,"props":46171,"children":46172},{"style":5667},[46173],{"type":25,"value":39298},{"type":20,"tag":157,"props":46175,"children":46176},{"style":892},[46177],{"type":25,"value":30657},{"type":20,"tag":157,"props":46179,"children":46180},{"class":159,"line":483},[46181],{"type":20,"tag":157,"props":46182,"children":46183},{"emptyLinePlaceholder":173},[46184],{"type":25,"value":176},{"type":20,"tag":157,"props":46186,"children":46187},{"class":159,"line":491},[46188,46192,46196,46200],{"type":20,"tag":157,"props":46189,"children":46190},{"style":892},[46191],{"type":25,"value":36862},{"type":20,"tag":157,"props":46193,"children":46194},{"style":5667},[46195],{"type":25,"value":1785},{"type":20,"tag":157,"props":46197,"children":46198},{"style":248},[46199],{"type":25,"value":42360},{"type":20,"tag":157,"props":46201,"children":46202},{"style":892},[46203],{"type":25,"value":30657},{"type":20,"tag":157,"props":46205,"children":46206},{"class":159,"line":499},[46207],{"type":20,"tag":157,"props":46208,"children":46209},{"emptyLinePlaceholder":173},[46210],{"type":25,"value":176},{"type":20,"tag":157,"props":46212,"children":46213},{"class":159,"line":508},[46214,46218,46222],{"type":20,"tag":157,"props":46215,"children":46216},{"style":892},[46217],{"type":25,"value":39512},{"type":20,"tag":157,"props":46219,"children":46220},{"style":5667},[46221],{"type":25,"value":1785},{"type":20,"tag":157,"props":46223,"children":46224},{"style":892},[46225],{"type":25,"value":30657},{"type":20,"tag":28,"props":46227,"children":46229},{"id":46228},"render函数",[46230],{"type":25,"value":46228},{"type":20,"tag":126,"props":46232,"children":46234},{"className":39112,"code":46233,"language":39114,"meta":8,"style":8},"\u003Cscript>\nimport { h } from \"vue\"\nexport default {\n    render() {\n        return h(\"h2\", \"hello render函数\")\n    }\n\n}\n\u003C\u002Fscript>\n\n\u003Cstyle lang=\"scss\" scoped>\n\n\u003C\u002Fstyle>\n",[46235],{"type":20,"tag":84,"props":46236,"children":46237},{"__ignoreMap":8},[46238,46253,46274,46289,46301,46336,46343,46350,46357,46372,46379,46411,46418],{"type":20,"tag":157,"props":46239,"children":46240},{"class":159,"line":160},[46241,46245,46249],{"type":20,"tag":157,"props":46242,"children":46243},{"style":892},[46244],{"type":25,"value":36862},{"type":20,"tag":157,"props":46246,"children":46247},{"style":5667},[46248],{"type":25,"value":39298},{"type":20,"tag":157,"props":46250,"children":46251},{"style":892},[46252],{"type":25,"value":30657},{"type":20,"tag":157,"props":46254,"children":46255},{"class":159,"line":169},[46256,46260,46265,46269],{"type":20,"tag":157,"props":46257,"children":46258},{"style":39166},[46259],{"type":25,"value":40516},{"type":20,"tag":157,"props":46261,"children":46262},{"style":892},[46263],{"type":25,"value":46264}," { h } ",{"type":20,"tag":157,"props":46266,"children":46267},{"style":39166},[46268],{"type":25,"value":39806},{"type":20,"tag":157,"props":46270,"children":46271},{"style":254},[46272],{"type":25,"value":46273}," \"vue\"\n",{"type":20,"tag":157,"props":46275,"children":46276},{"class":159,"line":179},[46277,46281,46285],{"type":20,"tag":157,"props":46278,"children":46279},{"style":39166},[46280],{"type":25,"value":42012},{"type":20,"tag":157,"props":46282,"children":46283},{"style":39166},[46284],{"type":25,"value":42017},{"type":20,"tag":157,"props":46286,"children":46287},{"style":892},[46288],{"type":25,"value":38885},{"type":20,"tag":157,"props":46290,"children":46291},{"class":159,"line":188},[46292,46297],{"type":20,"tag":157,"props":46293,"children":46294},{"style":248},[46295],{"type":25,"value":46296},"    render",{"type":20,"tag":157,"props":46298,"children":46299},{"style":892},[46300],{"type":25,"value":39400},{"type":20,"tag":157,"props":46302,"children":46303},{"class":159,"line":196},[46304,46309,46314,46318,46323,46327,46332],{"type":20,"tag":157,"props":46305,"children":46306},{"style":39166},[46307],{"type":25,"value":46308},"        return",{"type":20,"tag":157,"props":46310,"children":46311},{"style":248},[46312],{"type":25,"value":46313}," h",{"type":20,"tag":157,"props":46315,"children":46316},{"style":892},[46317],{"type":25,"value":39189},{"type":20,"tag":157,"props":46319,"children":46320},{"style":254},[46321],{"type":25,"value":46322},"\"h2\"",{"type":20,"tag":157,"props":46324,"children":46325},{"style":892},[46326],{"type":25,"value":42626},{"type":20,"tag":157,"props":46328,"children":46329},{"style":254},[46330],{"type":25,"value":46331},"\"hello render函数\"",{"type":20,"tag":157,"props":46333,"children":46334},{"style":892},[46335],{"type":25,"value":8926},{"type":20,"tag":157,"props":46337,"children":46338},{"class":159,"line":204},[46339],{"type":20,"tag":157,"props":46340,"children":46341},{"style":892},[46342],{"type":25,"value":872},{"type":20,"tag":157,"props":46344,"children":46345},{"class":159,"line":213},[46346],{"type":20,"tag":157,"props":46347,"children":46348},{"emptyLinePlaceholder":173},[46349],{"type":25,"value":176},{"type":20,"tag":157,"props":46351,"children":46352},{"class":159,"line":222},[46353],{"type":20,"tag":157,"props":46354,"children":46355},{"style":892},[46356],{"type":25,"value":943},{"type":20,"tag":157,"props":46358,"children":46359},{"class":159,"line":440},[46360,46364,46368],{"type":20,"tag":157,"props":46361,"children":46362},{"style":892},[46363],{"type":25,"value":39512},{"type":20,"tag":157,"props":46365,"children":46366},{"style":5667},[46367],{"type":25,"value":39298},{"type":20,"tag":157,"props":46369,"children":46370},{"style":892},[46371],{"type":25,"value":30657},{"type":20,"tag":157,"props":46373,"children":46374},{"class":159,"line":448},[46375],{"type":20,"tag":157,"props":46376,"children":46377},{"emptyLinePlaceholder":173},[46378],{"type":25,"value":176},{"type":20,"tag":157,"props":46380,"children":46381},{"class":159,"line":456},[46382,46386,46390,46394,46398,46403,46407],{"type":20,"tag":157,"props":46383,"children":46384},{"style":892},[46385],{"type":25,"value":36862},{"type":20,"tag":157,"props":46387,"children":46388},{"style":5667},[46389],{"type":25,"value":1785},{"type":20,"tag":157,"props":46391,"children":46392},{"style":248},[46393],{"type":25,"value":39775},{"type":20,"tag":157,"props":46395,"children":46396},{"style":892},[46397],{"type":25,"value":2261},{"type":20,"tag":157,"props":46399,"children":46400},{"style":254},[46401],{"type":25,"value":46402},"\"scss\"",{"type":20,"tag":157,"props":46404,"children":46405},{"style":248},[46406],{"type":25,"value":42360},{"type":20,"tag":157,"props":46408,"children":46409},{"style":892},[46410],{"type":25,"value":30657},{"type":20,"tag":157,"props":46412,"children":46413},{"class":159,"line":465},[46414],{"type":20,"tag":157,"props":46415,"children":46416},{"emptyLinePlaceholder":173},[46417],{"type":25,"value":176},{"type":20,"tag":157,"props":46419,"children":46420},{"class":159,"line":474},[46421,46425,46429],{"type":20,"tag":157,"props":46422,"children":46423},{"style":892},[46424],{"type":25,"value":39512},{"type":20,"tag":157,"props":46426,"children":46427},{"style":5667},[46428],{"type":25,"value":1785},{"type":20,"tag":157,"props":46430,"children":46431},{"style":892},[46432],{"type":25,"value":30657},{"type":20,"tag":1863,"props":46434,"children":46436},{"id":46435},"compositionapi",[46437],{"type":25,"value":46438},"CompositionAPI",{"type":20,"tag":28,"props":46440,"children":46442},{"id":46441},"torefs",[46443],{"type":25,"value":46444},"toRefs",{"type":20,"tag":6665,"props":46446,"children":46447},{},[46448],{"type":20,"tag":21,"props":46449,"children":46450},{},[46451],{"type":25,"value":46452},"toRefs可以通过结构的方式将reactive响应式数据转换成ref响应式数据",{"type":20,"tag":126,"props":46454,"children":46456},{"className":39112,"code":46455,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Ch2>ref and reactive\u003C\u002Fh2>\n    \u003Cbutton @click=\"count += 1\">点击+1\u003C\u002Fbutton>\n    {{ state.count }} {{ count }}\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { reactive, toRefs } from \"vue\"\n\nlet state = reactive({ count: 1 })\nlet { count } = toRefs(state)\n\u003C\u002Fscript>\n",[46457],{"type":20,"tag":84,"props":46458,"children":46459},{"__ignoreMap":8},[46460,46475,46499,46558,46566,46581,46588,46607,46627,46634,46665,46690],{"type":20,"tag":157,"props":46461,"children":46462},{"class":159,"line":160},[46463,46467,46471],{"type":20,"tag":157,"props":46464,"children":46465},{"style":892},[46466],{"type":25,"value":36862},{"type":20,"tag":157,"props":46468,"children":46469},{"style":5667},[46470],{"type":25,"value":39539},{"type":20,"tag":157,"props":46472,"children":46473},{"style":892},[46474],{"type":25,"value":30657},{"type":20,"tag":157,"props":46476,"children":46477},{"class":159,"line":169},[46478,46482,46486,46491,46495],{"type":20,"tag":157,"props":46479,"children":46480},{"style":892},[46481],{"type":25,"value":39582},{"type":20,"tag":157,"props":46483,"children":46484},{"style":5667},[46485],{"type":25,"value":1863},{"type":20,"tag":157,"props":46487,"children":46488},{"style":892},[46489],{"type":25,"value":46490},">ref and reactive\u003C\u002F",{"type":20,"tag":157,"props":46492,"children":46493},{"style":5667},[46494],{"type":25,"value":1863},{"type":20,"tag":157,"props":46496,"children":46497},{"style":892},[46498],{"type":25,"value":30657},{"type":20,"tag":157,"props":46500,"children":46501},{"class":159,"line":179},[46502,46506,46510,46514,46518,46522,46526,46531,46536,46541,46545,46550,46554],{"type":20,"tag":157,"props":46503,"children":46504},{"style":892},[46505],{"type":25,"value":39582},{"type":20,"tag":157,"props":46507,"children":46508},{"style":5667},[46509],{"type":25,"value":42462},{"type":20,"tag":157,"props":46511,"children":46512},{"style":892},[46513],{"type":25,"value":39677},{"type":20,"tag":157,"props":46515,"children":46516},{"style":248},[46517],{"type":25,"value":39682},{"type":20,"tag":157,"props":46519,"children":46520},{"style":892},[46521],{"type":25,"value":2261},{"type":20,"tag":157,"props":46523,"children":46524},{"style":254},[46525],{"type":25,"value":39603},{"type":20,"tag":157,"props":46527,"children":46528},{"style":892},[46529],{"type":25,"value":46530},"count ",{"type":20,"tag":157,"props":46532,"children":46533},{"style":39166},[46534],{"type":25,"value":46535},"+=",{"type":20,"tag":157,"props":46537,"children":46538},{"style":260},[46539],{"type":25,"value":46540}," 1",{"type":20,"tag":157,"props":46542,"children":46543},{"style":254},[46544],{"type":25,"value":39603},{"type":20,"tag":157,"props":46546,"children":46547},{"style":892},[46548],{"type":25,"value":46549},">点击+1\u003C\u002F",{"type":20,"tag":157,"props":46551,"children":46552},{"style":5667},[46553],{"type":25,"value":42462},{"type":20,"tag":157,"props":46555,"children":46556},{"style":892},[46557],{"type":25,"value":30657},{"type":20,"tag":157,"props":46559,"children":46560},{"class":159,"line":188},[46561],{"type":20,"tag":157,"props":46562,"children":46563},{"style":892},[46564],{"type":25,"value":46565},"    {{ state.count }} {{ count }}\n",{"type":20,"tag":157,"props":46567,"children":46568},{"class":159,"line":196},[46569,46573,46577],{"type":20,"tag":157,"props":46570,"children":46571},{"style":892},[46572],{"type":25,"value":39512},{"type":20,"tag":157,"props":46574,"children":46575},{"style":5667},[46576],{"type":25,"value":39539},{"type":20,"tag":157,"props":46578,"children":46579},{"style":892},[46580],{"type":25,"value":30657},{"type":20,"tag":157,"props":46582,"children":46583},{"class":159,"line":204},[46584],{"type":20,"tag":157,"props":46585,"children":46586},{"emptyLinePlaceholder":173},[46587],{"type":25,"value":176},{"type":20,"tag":157,"props":46589,"children":46590},{"class":159,"line":213},[46591,46595,46599,46603],{"type":20,"tag":157,"props":46592,"children":46593},{"style":892},[46594],{"type":25,"value":36862},{"type":20,"tag":157,"props":46596,"children":46597},{"style":5667},[46598],{"type":25,"value":39298},{"type":20,"tag":157,"props":46600,"children":46601},{"style":248},[46602],{"type":25,"value":39303},{"type":20,"tag":157,"props":46604,"children":46605},{"style":892},[46606],{"type":25,"value":30657},{"type":20,"tag":157,"props":46608,"children":46609},{"class":159,"line":222},[46610,46614,46619,46623],{"type":20,"tag":157,"props":46611,"children":46612},{"style":39166},[46613],{"type":25,"value":40516},{"type":20,"tag":157,"props":46615,"children":46616},{"style":892},[46617],{"type":25,"value":46618}," { reactive, toRefs } ",{"type":20,"tag":157,"props":46620,"children":46621},{"style":39166},[46622],{"type":25,"value":39806},{"type":20,"tag":157,"props":46624,"children":46625},{"style":254},[46626],{"type":25,"value":46273},{"type":20,"tag":157,"props":46628,"children":46629},{"class":159,"line":440},[46630],{"type":20,"tag":157,"props":46631,"children":46632},{"emptyLinePlaceholder":173},[46633],{"type":25,"value":176},{"type":20,"tag":157,"props":46635,"children":46636},{"class":159,"line":448},[46637,46641,46645,46649,46653,46657,46661],{"type":20,"tag":157,"props":46638,"children":46639},{"style":39166},[46640],{"type":25,"value":39240},{"type":20,"tag":157,"props":46642,"children":46643},{"style":892},[46644],{"type":25,"value":40780},{"type":20,"tag":157,"props":46646,"children":46647},{"style":39166},[46648],{"type":25,"value":2261},{"type":20,"tag":157,"props":46650,"children":46651},{"style":248},[46652],{"type":25,"value":40789},{"type":20,"tag":157,"props":46654,"children":46655},{"style":892},[46656],{"type":25,"value":40794},{"type":20,"tag":157,"props":46658,"children":46659},{"style":260},[46660],{"type":25,"value":10379},{"type":20,"tag":157,"props":46662,"children":46663},{"style":892},[46664],{"type":25,"value":40240},{"type":20,"tag":157,"props":46666,"children":46667},{"class":159,"line":456},[46668,46672,46676,46680,46685],{"type":20,"tag":157,"props":46669,"children":46670},{"style":39166},[46671],{"type":25,"value":39240},{"type":20,"tag":157,"props":46673,"children":46674},{"style":892},[46675],{"type":25,"value":40927},{"type":20,"tag":157,"props":46677,"children":46678},{"style":39166},[46679],{"type":25,"value":2261},{"type":20,"tag":157,"props":46681,"children":46682},{"style":248},[46683],{"type":25,"value":46684}," toRefs",{"type":20,"tag":157,"props":46686,"children":46687},{"style":892},[46688],{"type":25,"value":46689},"(state)\n",{"type":20,"tag":157,"props":46691,"children":46692},{"class":159,"line":465},[46693,46697,46701],{"type":20,"tag":157,"props":46694,"children":46695},{"style":892},[46696],{"type":25,"value":39512},{"type":20,"tag":157,"props":46698,"children":46699},{"style":5667},[46700],{"type":25,"value":39298},{"type":20,"tag":157,"props":46702,"children":46703},{"style":892},[46704],{"type":25,"value":30657},{"type":20,"tag":28,"props":46706,"children":46708},{"id":46707},"lifecycle",[46709],{"type":25,"value":46707},{"type":20,"tag":6665,"props":46711,"children":46712},{},[46713],{"type":20,"tag":21,"props":46714,"children":46715},{},[46716],{"type":25,"value":46717},"组合式API生命周期钩子可以重复调用",{"type":20,"tag":126,"props":46719,"children":46721},{"className":39112,"code":46720,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Cdiv ref=\"elem\">{{ count }}\u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { ref, onMounted } from 'vue';\n\nlet count = ref(0)\nconst elem = ref()\n\nonMounted(() => {\n    console.log(count.value)\n})\nonMounted(() => {\n    console.log(elem.value)\n})\n\u003C\u002Fscript>\n",[46722],{"type":20,"tag":84,"props":46723,"children":46724},{"__ignoreMap":8},[46725,46740,46777,46792,46799,46818,46842,46849,46881,46905,46912,46932,46948,46955,46974,46990,46997],{"type":20,"tag":157,"props":46726,"children":46727},{"class":159,"line":160},[46728,46732,46736],{"type":20,"tag":157,"props":46729,"children":46730},{"style":892},[46731],{"type":25,"value":36862},{"type":20,"tag":157,"props":46733,"children":46734},{"style":5667},[46735],{"type":25,"value":39539},{"type":20,"tag":157,"props":46737,"children":46738},{"style":892},[46739],{"type":25,"value":30657},{"type":20,"tag":157,"props":46741,"children":46742},{"class":159,"line":169},[46743,46747,46751,46755,46759,46764,46769,46773],{"type":20,"tag":157,"props":46744,"children":46745},{"style":892},[46746],{"type":25,"value":39582},{"type":20,"tag":157,"props":46748,"children":46749},{"style":5667},[46750],{"type":25,"value":39556},{"type":20,"tag":157,"props":46752,"children":46753},{"style":248},[46754],{"type":25,"value":39184},{"type":20,"tag":157,"props":46756,"children":46757},{"style":892},[46758],{"type":25,"value":2261},{"type":20,"tag":157,"props":46760,"children":46761},{"style":254},[46762],{"type":25,"value":46763},"\"elem\"",{"type":20,"tag":157,"props":46765,"children":46766},{"style":892},[46767],{"type":25,"value":46768},">{{ count }}\u003C\u002F",{"type":20,"tag":157,"props":46770,"children":46771},{"style":5667},[46772],{"type":25,"value":39556},{"type":20,"tag":157,"props":46774,"children":46775},{"style":892},[46776],{"type":25,"value":30657},{"type":20,"tag":157,"props":46778,"children":46779},{"class":159,"line":179},[46780,46784,46788],{"type":20,"tag":157,"props":46781,"children":46782},{"style":892},[46783],{"type":25,"value":39512},{"type":20,"tag":157,"props":46785,"children":46786},{"style":5667},[46787],{"type":25,"value":39539},{"type":20,"tag":157,"props":46789,"children":46790},{"style":892},[46791],{"type":25,"value":30657},{"type":20,"tag":157,"props":46793,"children":46794},{"class":159,"line":188},[46795],{"type":20,"tag":157,"props":46796,"children":46797},{"emptyLinePlaceholder":173},[46798],{"type":25,"value":176},{"type":20,"tag":157,"props":46800,"children":46801},{"class":159,"line":196},[46802,46806,46810,46814],{"type":20,"tag":157,"props":46803,"children":46804},{"style":892},[46805],{"type":25,"value":36862},{"type":20,"tag":157,"props":46807,"children":46808},{"style":5667},[46809],{"type":25,"value":39298},{"type":20,"tag":157,"props":46811,"children":46812},{"style":248},[46813],{"type":25,"value":39303},{"type":20,"tag":157,"props":46815,"children":46816},{"style":892},[46817],{"type":25,"value":30657},{"type":20,"tag":157,"props":46819,"children":46820},{"class":159,"line":204},[46821,46825,46829,46833,46838],{"type":20,"tag":157,"props":46822,"children":46823},{"style":39166},[46824],{"type":25,"value":40516},{"type":20,"tag":157,"props":46826,"children":46827},{"style":892},[46828],{"type":25,"value":39801},{"type":20,"tag":157,"props":46830,"children":46831},{"style":39166},[46832],{"type":25,"value":39806},{"type":20,"tag":157,"props":46834,"children":46835},{"style":254},[46836],{"type":25,"value":46837}," 'vue'",{"type":20,"tag":157,"props":46839,"children":46840},{"style":892},[46841],{"type":25,"value":38963},{"type":20,"tag":157,"props":46843,"children":46844},{"class":159,"line":213},[46845],{"type":20,"tag":157,"props":46846,"children":46847},{"emptyLinePlaceholder":173},[46848],{"type":25,"value":176},{"type":20,"tag":157,"props":46850,"children":46851},{"class":159,"line":222},[46852,46856,46861,46865,46869,46873,46877],{"type":20,"tag":157,"props":46853,"children":46854},{"style":39166},[46855],{"type":25,"value":39240},{"type":20,"tag":157,"props":46857,"children":46858},{"style":892},[46859],{"type":25,"value":46860}," count ",{"type":20,"tag":157,"props":46862,"children":46863},{"style":39166},[46864],{"type":25,"value":2261},{"type":20,"tag":157,"props":46866,"children":46867},{"style":248},[46868],{"type":25,"value":39184},{"type":20,"tag":157,"props":46870,"children":46871},{"style":892},[46872],{"type":25,"value":39189},{"type":20,"tag":157,"props":46874,"children":46875},{"style":260},[46876],{"type":25,"value":10387},{"type":20,"tag":157,"props":46878,"children":46879},{"style":892},[46880],{"type":25,"value":8926},{"type":20,"tag":157,"props":46882,"children":46883},{"class":159,"line":440},[46884,46888,46893,46897,46901],{"type":20,"tag":157,"props":46885,"children":46886},{"style":39166},[46887],{"type":25,"value":39169},{"type":20,"tag":157,"props":46889,"children":46890},{"style":260},[46891],{"type":25,"value":46892}," elem",{"type":20,"tag":157,"props":46894,"children":46895},{"style":39166},[46896],{"type":25,"value":39179},{"type":20,"tag":157,"props":46898,"children":46899},{"style":248},[46900],{"type":25,"value":39184},{"type":20,"tag":157,"props":46902,"children":46903},{"style":892},[46904],{"type":25,"value":39917},{"type":20,"tag":157,"props":46906,"children":46907},{"class":159,"line":448},[46908],{"type":20,"tag":157,"props":46909,"children":46910},{"emptyLinePlaceholder":173},[46911],{"type":25,"value":176},{"type":20,"tag":157,"props":46913,"children":46914},{"class":159,"line":456},[46915,46920,46924,46928],{"type":20,"tag":157,"props":46916,"children":46917},{"style":248},[46918],{"type":25,"value":46919},"onMounted",{"type":20,"tag":157,"props":46921,"children":46922},{"style":892},[46923],{"type":25,"value":39890},{"type":20,"tag":157,"props":46925,"children":46926},{"style":39166},[46927],{"type":25,"value":39895},{"type":20,"tag":157,"props":46929,"children":46930},{"style":892},[46931],{"type":25,"value":38885},{"type":20,"tag":157,"props":46933,"children":46934},{"class":159,"line":465},[46935,46939,46943],{"type":20,"tag":157,"props":46936,"children":46937},{"style":892},[46938],{"type":25,"value":42291},{"type":20,"tag":157,"props":46940,"children":46941},{"style":248},[46942],{"type":25,"value":42157},{"type":20,"tag":157,"props":46944,"children":46945},{"style":892},[46946],{"type":25,"value":46947},"(count.value)\n",{"type":20,"tag":157,"props":46949,"children":46950},{"class":159,"line":474},[46951],{"type":20,"tag":157,"props":46952,"children":46953},{"style":892},[46954],{"type":25,"value":40371},{"type":20,"tag":157,"props":46956,"children":46957},{"class":159,"line":483},[46958,46962,46966,46970],{"type":20,"tag":157,"props":46959,"children":46960},{"style":248},[46961],{"type":25,"value":46919},{"type":20,"tag":157,"props":46963,"children":46964},{"style":892},[46965],{"type":25,"value":39890},{"type":20,"tag":157,"props":46967,"children":46968},{"style":39166},[46969],{"type":25,"value":39895},{"type":20,"tag":157,"props":46971,"children":46972},{"style":892},[46973],{"type":25,"value":38885},{"type":20,"tag":157,"props":46975,"children":46976},{"class":159,"line":491},[46977,46981,46985],{"type":20,"tag":157,"props":46978,"children":46979},{"style":892},[46980],{"type":25,"value":42291},{"type":20,"tag":157,"props":46982,"children":46983},{"style":248},[46984],{"type":25,"value":42157},{"type":20,"tag":157,"props":46986,"children":46987},{"style":892},[46988],{"type":25,"value":46989},"(elem.value)\n",{"type":20,"tag":157,"props":46991,"children":46992},{"class":159,"line":499},[46993],{"type":20,"tag":157,"props":46994,"children":46995},{"style":892},[46996],{"type":25,"value":40371},{"type":20,"tag":157,"props":46998,"children":46999},{"class":159,"line":508},[47000,47004,47008],{"type":20,"tag":157,"props":47001,"children":47002},{"style":892},[47003],{"type":25,"value":39512},{"type":20,"tag":157,"props":47005,"children":47006},{"style":5667},[47007],{"type":25,"value":39298},{"type":20,"tag":157,"props":47009,"children":47010},{"style":892},[47011],{"type":25,"value":30657},{"type":20,"tag":28,"props":47013,"children":47015},{"id":47014},"生命周期watcheffect与watch",[47016],{"type":25,"value":47017},"生命周期watchEffect与watch",{"type":20,"tag":6665,"props":47019,"children":47020},{},[47021],{"type":20,"tag":21,"props":47022,"children":47023},{},[47024],{"type":25,"value":47025},"为了根据响应式状态自动应用和重新应用副作用， 我们可以使用watchEffect函数。他立即执行传入的一个函数，同时响应式追踪其依赖，并在其依赖变更是重新运行该函数",{"type":20,"tag":5719,"props":47027,"children":47028},{},[47029,47034],{"type":20,"tag":48,"props":47030,"children":47031},{},[47032],{"type":25,"value":47033},"当watchEffect回调函数中使用到的响应式是数据发生改变，这个生命周期就会重新执行一遍",{"type":20,"tag":48,"props":47035,"children":47036},{},[47037],{"type":25,"value":47038},"可以通过stop停止监听",{"type":20,"tag":126,"props":47040,"children":47042},{"className":39112,"code":47041,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Cdiv>\n        {{ count }}\n        \u003Cp ref=\"ele\">程浩\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { ref, watchEffect } from 'vue'\n\nlet count = ref(0)\nlet ele = ref()\n\nconst stop = watchEffect(() => {\n    console.log(count.value)\n})\n\nsetTimeout(() => {\n    stop()\n}, 1000)\n\nsetTimeout(() => {\n    count.value = 1\n}, 2000)\n\u003C\u002Fscript>\n",[47043],{"type":20,"tag":84,"props":47044,"children":47045},{"__ignoreMap":8},[47046,47061,47076,47084,47121,47136,47151,47158,47177,47197,47204,47235,47259,47266,47298,47313,47320,47327,47347,47359,47375,47382,47401,47418,47434],{"type":20,"tag":157,"props":47047,"children":47048},{"class":159,"line":160},[47049,47053,47057],{"type":20,"tag":157,"props":47050,"children":47051},{"style":892},[47052],{"type":25,"value":36862},{"type":20,"tag":157,"props":47054,"children":47055},{"style":5667},[47056],{"type":25,"value":39539},{"type":20,"tag":157,"props":47058,"children":47059},{"style":892},[47060],{"type":25,"value":30657},{"type":20,"tag":157,"props":47062,"children":47063},{"class":159,"line":169},[47064,47068,47072],{"type":20,"tag":157,"props":47065,"children":47066},{"style":892},[47067],{"type":25,"value":39582},{"type":20,"tag":157,"props":47069,"children":47070},{"style":5667},[47071],{"type":25,"value":39556},{"type":20,"tag":157,"props":47073,"children":47074},{"style":892},[47075],{"type":25,"value":30657},{"type":20,"tag":157,"props":47077,"children":47078},{"class":159,"line":179},[47079],{"type":20,"tag":157,"props":47080,"children":47081},{"style":892},[47082],{"type":25,"value":47083},"        {{ count }}\n",{"type":20,"tag":157,"props":47085,"children":47086},{"class":159,"line":188},[47087,47091,47095,47099,47103,47108,47113,47117],{"type":20,"tag":157,"props":47088,"children":47089},{"style":892},[47090],{"type":25,"value":45075},{"type":20,"tag":157,"props":47092,"children":47093},{"style":5667},[47094],{"type":25,"value":21},{"type":20,"tag":157,"props":47096,"children":47097},{"style":248},[47098],{"type":25,"value":39184},{"type":20,"tag":157,"props":47100,"children":47101},{"style":892},[47102],{"type":25,"value":2261},{"type":20,"tag":157,"props":47104,"children":47105},{"style":254},[47106],{"type":25,"value":47107},"\"ele\"",{"type":20,"tag":157,"props":47109,"children":47110},{"style":892},[47111],{"type":25,"value":47112},">程浩\u003C\u002F",{"type":20,"tag":157,"props":47114,"children":47115},{"style":5667},[47116],{"type":25,"value":21},{"type":20,"tag":157,"props":47118,"children":47119},{"style":892},[47120],{"type":25,"value":30657},{"type":20,"tag":157,"props":47122,"children":47123},{"class":159,"line":196},[47124,47128,47132],{"type":20,"tag":157,"props":47125,"children":47126},{"style":892},[47127],{"type":25,"value":44476},{"type":20,"tag":157,"props":47129,"children":47130},{"style":5667},[47131],{"type":25,"value":39556},{"type":20,"tag":157,"props":47133,"children":47134},{"style":892},[47135],{"type":25,"value":30657},{"type":20,"tag":157,"props":47137,"children":47138},{"class":159,"line":204},[47139,47143,47147],{"type":20,"tag":157,"props":47140,"children":47141},{"style":892},[47142],{"type":25,"value":39512},{"type":20,"tag":157,"props":47144,"children":47145},{"style":5667},[47146],{"type":25,"value":39539},{"type":20,"tag":157,"props":47148,"children":47149},{"style":892},[47150],{"type":25,"value":30657},{"type":20,"tag":157,"props":47152,"children":47153},{"class":159,"line":213},[47154],{"type":20,"tag":157,"props":47155,"children":47156},{"emptyLinePlaceholder":173},[47157],{"type":25,"value":176},{"type":20,"tag":157,"props":47159,"children":47160},{"class":159,"line":222},[47161,47165,47169,47173],{"type":20,"tag":157,"props":47162,"children":47163},{"style":892},[47164],{"type":25,"value":36862},{"type":20,"tag":157,"props":47166,"children":47167},{"style":5667},[47168],{"type":25,"value":39298},{"type":20,"tag":157,"props":47170,"children":47171},{"style":248},[47172],{"type":25,"value":39303},{"type":20,"tag":157,"props":47174,"children":47175},{"style":892},[47176],{"type":25,"value":30657},{"type":20,"tag":157,"props":47178,"children":47179},{"class":159,"line":440},[47180,47184,47189,47193],{"type":20,"tag":157,"props":47181,"children":47182},{"style":39166},[47183],{"type":25,"value":40516},{"type":20,"tag":157,"props":47185,"children":47186},{"style":892},[47187],{"type":25,"value":47188}," { ref, watchEffect } ",{"type":20,"tag":157,"props":47190,"children":47191},{"style":39166},[47192],{"type":25,"value":39806},{"type":20,"tag":157,"props":47194,"children":47195},{"style":254},[47196],{"type":25,"value":39811},{"type":20,"tag":157,"props":47198,"children":47199},{"class":159,"line":448},[47200],{"type":20,"tag":157,"props":47201,"children":47202},{"emptyLinePlaceholder":173},[47203],{"type":25,"value":176},{"type":20,"tag":157,"props":47205,"children":47206},{"class":159,"line":456},[47207,47211,47215,47219,47223,47227,47231],{"type":20,"tag":157,"props":47208,"children":47209},{"style":39166},[47210],{"type":25,"value":39240},{"type":20,"tag":157,"props":47212,"children":47213},{"style":892},[47214],{"type":25,"value":46860},{"type":20,"tag":157,"props":47216,"children":47217},{"style":39166},[47218],{"type":25,"value":2261},{"type":20,"tag":157,"props":47220,"children":47221},{"style":248},[47222],{"type":25,"value":39184},{"type":20,"tag":157,"props":47224,"children":47225},{"style":892},[47226],{"type":25,"value":39189},{"type":20,"tag":157,"props":47228,"children":47229},{"style":260},[47230],{"type":25,"value":10387},{"type":20,"tag":157,"props":47232,"children":47233},{"style":892},[47234],{"type":25,"value":8926},{"type":20,"tag":157,"props":47236,"children":47237},{"class":159,"line":465},[47238,47242,47247,47251,47255],{"type":20,"tag":157,"props":47239,"children":47240},{"style":39166},[47241],{"type":25,"value":39240},{"type":20,"tag":157,"props":47243,"children":47244},{"style":892},[47245],{"type":25,"value":47246}," ele ",{"type":20,"tag":157,"props":47248,"children":47249},{"style":39166},[47250],{"type":25,"value":2261},{"type":20,"tag":157,"props":47252,"children":47253},{"style":248},[47254],{"type":25,"value":39184},{"type":20,"tag":157,"props":47256,"children":47257},{"style":892},[47258],{"type":25,"value":39917},{"type":20,"tag":157,"props":47260,"children":47261},{"class":159,"line":474},[47262],{"type":20,"tag":157,"props":47263,"children":47264},{"emptyLinePlaceholder":173},[47265],{"type":25,"value":176},{"type":20,"tag":157,"props":47267,"children":47268},{"class":159,"line":483},[47269,47273,47277,47281,47286,47290,47294],{"type":20,"tag":157,"props":47270,"children":47271},{"style":39166},[47272],{"type":25,"value":39169},{"type":20,"tag":157,"props":47274,"children":47275},{"style":260},[47276],{"type":25,"value":8855},{"type":20,"tag":157,"props":47278,"children":47279},{"style":39166},[47280],{"type":25,"value":39179},{"type":20,"tag":157,"props":47282,"children":47283},{"style":248},[47284],{"type":25,"value":47285}," watchEffect",{"type":20,"tag":157,"props":47287,"children":47288},{"style":892},[47289],{"type":25,"value":39890},{"type":20,"tag":157,"props":47291,"children":47292},{"style":39166},[47293],{"type":25,"value":39895},{"type":20,"tag":157,"props":47295,"children":47296},{"style":892},[47297],{"type":25,"value":38885},{"type":20,"tag":157,"props":47299,"children":47300},{"class":159,"line":491},[47301,47305,47309],{"type":20,"tag":157,"props":47302,"children":47303},{"style":892},[47304],{"type":25,"value":42291},{"type":20,"tag":157,"props":47306,"children":47307},{"style":248},[47308],{"type":25,"value":42157},{"type":20,"tag":157,"props":47310,"children":47311},{"style":892},[47312],{"type":25,"value":46947},{"type":20,"tag":157,"props":47314,"children":47315},{"class":159,"line":499},[47316],{"type":20,"tag":157,"props":47317,"children":47318},{"style":892},[47319],{"type":25,"value":40371},{"type":20,"tag":157,"props":47321,"children":47322},{"class":159,"line":508},[47323],{"type":20,"tag":157,"props":47324,"children":47325},{"emptyLinePlaceholder":173},[47326],{"type":25,"value":176},{"type":20,"tag":157,"props":47328,"children":47329},{"class":159,"line":517},[47330,47335,47339,47343],{"type":20,"tag":157,"props":47331,"children":47332},{"style":248},[47333],{"type":25,"value":47334},"setTimeout",{"type":20,"tag":157,"props":47336,"children":47337},{"style":892},[47338],{"type":25,"value":39890},{"type":20,"tag":157,"props":47340,"children":47341},{"style":39166},[47342],{"type":25,"value":39895},{"type":20,"tag":157,"props":47344,"children":47345},{"style":892},[47346],{"type":25,"value":38885},{"type":20,"tag":157,"props":47348,"children":47349},{"class":159,"line":1499},[47350,47355],{"type":20,"tag":157,"props":47351,"children":47352},{"style":248},[47353],{"type":25,"value":47354},"    stop",{"type":20,"tag":157,"props":47356,"children":47357},{"style":892},[47358],{"type":25,"value":39917},{"type":20,"tag":157,"props":47360,"children":47361},{"class":159,"line":1507},[47362,47367,47371],{"type":20,"tag":157,"props":47363,"children":47364},{"style":892},[47365],{"type":25,"value":47366},"}, ",{"type":20,"tag":157,"props":47368,"children":47369},{"style":260},[47370],{"type":25,"value":42253},{"type":20,"tag":157,"props":47372,"children":47373},{"style":892},[47374],{"type":25,"value":8926},{"type":20,"tag":157,"props":47376,"children":47377},{"class":159,"line":1515},[47378],{"type":20,"tag":157,"props":47379,"children":47380},{"emptyLinePlaceholder":173},[47381],{"type":25,"value":176},{"type":20,"tag":157,"props":47383,"children":47384},{"class":159,"line":1523},[47385,47389,47393,47397],{"type":20,"tag":157,"props":47386,"children":47387},{"style":248},[47388],{"type":25,"value":47334},{"type":20,"tag":157,"props":47390,"children":47391},{"style":892},[47392],{"type":25,"value":39890},{"type":20,"tag":157,"props":47394,"children":47395},{"style":39166},[47396],{"type":25,"value":39895},{"type":20,"tag":157,"props":47398,"children":47399},{"style":892},[47400],{"type":25,"value":38885},{"type":20,"tag":157,"props":47402,"children":47403},{"class":159,"line":1532},[47404,47409,47413],{"type":20,"tag":157,"props":47405,"children":47406},{"style":892},[47407],{"type":25,"value":47408},"    count.value ",{"type":20,"tag":157,"props":47410,"children":47411},{"style":39166},[47412],{"type":25,"value":2261},{"type":20,"tag":157,"props":47414,"children":47415},{"style":260},[47416],{"type":25,"value":47417}," 1\n",{"type":20,"tag":157,"props":47419,"children":47420},{"class":159,"line":1541},[47421,47425,47430],{"type":20,"tag":157,"props":47422,"children":47423},{"style":892},[47424],{"type":25,"value":47366},{"type":20,"tag":157,"props":47426,"children":47427},{"style":260},[47428],{"type":25,"value":47429},"2000",{"type":20,"tag":157,"props":47431,"children":47432},{"style":892},[47433],{"type":25,"value":8926},{"type":20,"tag":157,"props":47435,"children":47436},{"class":159,"line":1550},[47437,47441,47445],{"type":20,"tag":157,"props":47438,"children":47439},{"style":892},[47440],{"type":25,"value":39512},{"type":20,"tag":157,"props":47442,"children":47443},{"style":5667},[47444],{"type":25,"value":39298},{"type":20,"tag":157,"props":47446,"children":47447},{"style":892},[47448],{"type":25,"value":30657},{"type":20,"tag":11085,"props":47450,"children":47451},{"id":40104},[47452],{"type":25,"value":40104},{"type":20,"tag":126,"props":47454,"children":47456},{"className":39154,"code":47455,"language":39156,"meta":8,"style":8},"import { ref, watch } from 'vue'\n\nconst selected = ref(0);\nwatch(selected, ( newValue, oldValue ) => {\n  triggerLog(newValue);\n})\n",[47457],{"type":20,"tag":84,"props":47458,"children":47459},{"__ignoreMap":8},[47460,47480,47487,47519,47558,47571],{"type":20,"tag":157,"props":47461,"children":47462},{"class":159,"line":160},[47463,47467,47472,47476],{"type":20,"tag":157,"props":47464,"children":47465},{"style":39166},[47466],{"type":25,"value":40516},{"type":20,"tag":157,"props":47468,"children":47469},{"style":892},[47470],{"type":25,"value":47471}," { ref, watch } ",{"type":20,"tag":157,"props":47473,"children":47474},{"style":39166},[47475],{"type":25,"value":39806},{"type":20,"tag":157,"props":47477,"children":47478},{"style":254},[47479],{"type":25,"value":39811},{"type":20,"tag":157,"props":47481,"children":47482},{"class":159,"line":169},[47483],{"type":20,"tag":157,"props":47484,"children":47485},{"emptyLinePlaceholder":173},[47486],{"type":25,"value":176},{"type":20,"tag":157,"props":47488,"children":47489},{"class":159,"line":179},[47490,47494,47499,47503,47507,47511,47515],{"type":20,"tag":157,"props":47491,"children":47492},{"style":39166},[47493],{"type":25,"value":39169},{"type":20,"tag":157,"props":47495,"children":47496},{"style":260},[47497],{"type":25,"value":47498}," selected",{"type":20,"tag":157,"props":47500,"children":47501},{"style":39166},[47502],{"type":25,"value":39179},{"type":20,"tag":157,"props":47504,"children":47505},{"style":248},[47506],{"type":25,"value":39184},{"type":20,"tag":157,"props":47508,"children":47509},{"style":892},[47510],{"type":25,"value":39189},{"type":20,"tag":157,"props":47512,"children":47513},{"style":260},[47514],{"type":25,"value":10387},{"type":20,"tag":157,"props":47516,"children":47517},{"style":892},[47518],{"type":25,"value":39342},{"type":20,"tag":157,"props":47520,"children":47521},{"class":159,"line":188},[47522,47526,47531,47536,47540,47545,47550,47554],{"type":20,"tag":157,"props":47523,"children":47524},{"style":248},[47525],{"type":25,"value":40104},{"type":20,"tag":157,"props":47527,"children":47528},{"style":892},[47529],{"type":25,"value":47530},"(selected, ( ",{"type":20,"tag":157,"props":47532,"children":47533},{"style":6410},[47534],{"type":25,"value":47535},"newValue",{"type":20,"tag":157,"props":47537,"children":47538},{"style":892},[47539],{"type":25,"value":42626},{"type":20,"tag":157,"props":47541,"children":47542},{"style":6410},[47543],{"type":25,"value":47544},"oldValue",{"type":20,"tag":157,"props":47546,"children":47547},{"style":892},[47548],{"type":25,"value":47549}," ) ",{"type":20,"tag":157,"props":47551,"children":47552},{"style":39166},[47553],{"type":25,"value":39895},{"type":20,"tag":157,"props":47555,"children":47556},{"style":892},[47557],{"type":25,"value":38885},{"type":20,"tag":157,"props":47559,"children":47560},{"class":159,"line":196},[47561,47566],{"type":20,"tag":157,"props":47562,"children":47563},{"style":248},[47564],{"type":25,"value":47565},"  triggerLog",{"type":20,"tag":157,"props":47567,"children":47568},{"style":892},[47569],{"type":25,"value":47570},"(newValue);\n",{"type":20,"tag":157,"props":47572,"children":47573},{"class":159,"line":204},[47574],{"type":20,"tag":157,"props":47575,"children":47576},{"style":892},[47577],{"type":25,"value":40371},{"type":20,"tag":28,"props":47579,"children":47581},{"id":47580},"跨组件通信方案provide-inject",[47582],{"type":25,"value":47583},"跨组件通信方案provide inject",{"type":20,"tag":21,"props":47585,"children":47586},{},[47587],{"type":25,"value":47588},"注意不要在inject中修改响应式数据，所有逻辑代码在父组写，子组件只负责接收和调用",{"type":20,"tag":5719,"props":47590,"children":47591},{},[47592,47597],{"type":20,"tag":48,"props":47593,"children":47594},{},[47595],{"type":25,"value":47596},"可利用回调函数修改",{"type":20,"tag":48,"props":47598,"children":47599},{},[47600],{"type":25,"value":47601},"为了防止可设置成readonly",{"type":20,"tag":21,"props":47603,"children":47604},{},[47605],{"type":20,"tag":33,"props":47606,"children":47607},{},[47608],{"type":25,"value":47609},"procide.vue",{"type":20,"tag":126,"props":47611,"children":47613},{"className":39112,"code":47612,"language":39114,"meta":8,"style":8},"\n\u003Ctemplate>\n    \u003Ch2>provide\u003C\u002Fh2>\n    \u003CInject \u002F>\n\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { provide, ref, readonly } from 'vue'\nimport Inject from \".\u002F05_inject.vue\"\n\nlet count = ref(0)\nprovide(\"count\", readonly(count))\nprovide(\"changeCount\", () => {\n    count.value = 1\n})\n\n\u003C\u002Fscript>\n",[47614],{"type":20,"tag":84,"props":47615,"children":47616},{"__ignoreMap":8},[47617,47624,47639,47663,47679,47686,47701,47708,47727,47747,47768,47775,47806,47835,47864,47879,47886,47893],{"type":20,"tag":157,"props":47618,"children":47619},{"class":159,"line":160},[47620],{"type":20,"tag":157,"props":47621,"children":47622},{"emptyLinePlaceholder":173},[47623],{"type":25,"value":176},{"type":20,"tag":157,"props":47625,"children":47626},{"class":159,"line":169},[47627,47631,47635],{"type":20,"tag":157,"props":47628,"children":47629},{"style":892},[47630],{"type":25,"value":36862},{"type":20,"tag":157,"props":47632,"children":47633},{"style":5667},[47634],{"type":25,"value":39539},{"type":20,"tag":157,"props":47636,"children":47637},{"style":892},[47638],{"type":25,"value":30657},{"type":20,"tag":157,"props":47640,"children":47641},{"class":159,"line":179},[47642,47646,47650,47655,47659],{"type":20,"tag":157,"props":47643,"children":47644},{"style":892},[47645],{"type":25,"value":39582},{"type":20,"tag":157,"props":47647,"children":47648},{"style":5667},[47649],{"type":25,"value":1863},{"type":20,"tag":157,"props":47651,"children":47652},{"style":892},[47653],{"type":25,"value":47654},">provide\u003C\u002F",{"type":20,"tag":157,"props":47656,"children":47657},{"style":5667},[47658],{"type":25,"value":1863},{"type":20,"tag":157,"props":47660,"children":47661},{"style":892},[47662],{"type":25,"value":30657},{"type":20,"tag":157,"props":47664,"children":47665},{"class":159,"line":188},[47666,47670,47675],{"type":20,"tag":157,"props":47667,"children":47668},{"style":892},[47669],{"type":25,"value":39582},{"type":20,"tag":157,"props":47671,"children":47672},{"style":5667},[47673],{"type":25,"value":47674},"Inject",{"type":20,"tag":157,"props":47676,"children":47677},{"style":892},[47678],{"type":25,"value":39992},{"type":20,"tag":157,"props":47680,"children":47681},{"class":159,"line":196},[47682],{"type":20,"tag":157,"props":47683,"children":47684},{"emptyLinePlaceholder":173},[47685],{"type":25,"value":176},{"type":20,"tag":157,"props":47687,"children":47688},{"class":159,"line":204},[47689,47693,47697],{"type":20,"tag":157,"props":47690,"children":47691},{"style":892},[47692],{"type":25,"value":39512},{"type":20,"tag":157,"props":47694,"children":47695},{"style":5667},[47696],{"type":25,"value":39539},{"type":20,"tag":157,"props":47698,"children":47699},{"style":892},[47700],{"type":25,"value":30657},{"type":20,"tag":157,"props":47702,"children":47703},{"class":159,"line":213},[47704],{"type":20,"tag":157,"props":47705,"children":47706},{"emptyLinePlaceholder":173},[47707],{"type":25,"value":176},{"type":20,"tag":157,"props":47709,"children":47710},{"class":159,"line":222},[47711,47715,47719,47723],{"type":20,"tag":157,"props":47712,"children":47713},{"style":892},[47714],{"type":25,"value":36862},{"type":20,"tag":157,"props":47716,"children":47717},{"style":5667},[47718],{"type":25,"value":39298},{"type":20,"tag":157,"props":47720,"children":47721},{"style":248},[47722],{"type":25,"value":39303},{"type":20,"tag":157,"props":47724,"children":47725},{"style":892},[47726],{"type":25,"value":30657},{"type":20,"tag":157,"props":47728,"children":47729},{"class":159,"line":440},[47730,47734,47739,47743],{"type":20,"tag":157,"props":47731,"children":47732},{"style":39166},[47733],{"type":25,"value":40516},{"type":20,"tag":157,"props":47735,"children":47736},{"style":892},[47737],{"type":25,"value":47738}," { provide, ref, readonly } ",{"type":20,"tag":157,"props":47740,"children":47741},{"style":39166},[47742],{"type":25,"value":39806},{"type":20,"tag":157,"props":47744,"children":47745},{"style":254},[47746],{"type":25,"value":39811},{"type":20,"tag":157,"props":47748,"children":47749},{"class":159,"line":448},[47750,47754,47759,47763],{"type":20,"tag":157,"props":47751,"children":47752},{"style":39166},[47753],{"type":25,"value":40516},{"type":20,"tag":157,"props":47755,"children":47756},{"style":892},[47757],{"type":25,"value":47758}," Inject ",{"type":20,"tag":157,"props":47760,"children":47761},{"style":39166},[47762],{"type":25,"value":39806},{"type":20,"tag":157,"props":47764,"children":47765},{"style":254},[47766],{"type":25,"value":47767}," \".\u002F05_inject.vue\"\n",{"type":20,"tag":157,"props":47769,"children":47770},{"class":159,"line":456},[47771],{"type":20,"tag":157,"props":47772,"children":47773},{"emptyLinePlaceholder":173},[47774],{"type":25,"value":176},{"type":20,"tag":157,"props":47776,"children":47777},{"class":159,"line":465},[47778,47782,47786,47790,47794,47798,47802],{"type":20,"tag":157,"props":47779,"children":47780},{"style":39166},[47781],{"type":25,"value":39240},{"type":20,"tag":157,"props":47783,"children":47784},{"style":892},[47785],{"type":25,"value":46860},{"type":20,"tag":157,"props":47787,"children":47788},{"style":39166},[47789],{"type":25,"value":2261},{"type":20,"tag":157,"props":47791,"children":47792},{"style":248},[47793],{"type":25,"value":39184},{"type":20,"tag":157,"props":47795,"children":47796},{"style":892},[47797],{"type":25,"value":39189},{"type":20,"tag":157,"props":47799,"children":47800},{"style":260},[47801],{"type":25,"value":10387},{"type":20,"tag":157,"props":47803,"children":47804},{"style":892},[47805],{"type":25,"value":8926},{"type":20,"tag":157,"props":47807,"children":47808},{"class":159,"line":474},[47809,47813,47817,47821,47825,47830],{"type":20,"tag":157,"props":47810,"children":47811},{"style":248},[47812],{"type":25,"value":39206},{"type":20,"tag":157,"props":47814,"children":47815},{"style":892},[47816],{"type":25,"value":39189},{"type":20,"tag":157,"props":47818,"children":47819},{"style":254},[47820],{"type":25,"value":46093},{"type":20,"tag":157,"props":47822,"children":47823},{"style":892},[47824],{"type":25,"value":42626},{"type":20,"tag":157,"props":47826,"children":47827},{"style":248},[47828],{"type":25,"value":47829},"readonly",{"type":20,"tag":157,"props":47831,"children":47832},{"style":892},[47833],{"type":25,"value":47834},"(count))\n",{"type":20,"tag":157,"props":47836,"children":47837},{"class":159,"line":483},[47838,47842,47846,47851,47856,47860],{"type":20,"tag":157,"props":47839,"children":47840},{"style":248},[47841],{"type":25,"value":39206},{"type":20,"tag":157,"props":47843,"children":47844},{"style":892},[47845],{"type":25,"value":39189},{"type":20,"tag":157,"props":47847,"children":47848},{"style":254},[47849],{"type":25,"value":47850},"\"changeCount\"",{"type":20,"tag":157,"props":47852,"children":47853},{"style":892},[47854],{"type":25,"value":47855},", () ",{"type":20,"tag":157,"props":47857,"children":47858},{"style":39166},[47859],{"type":25,"value":39895},{"type":20,"tag":157,"props":47861,"children":47862},{"style":892},[47863],{"type":25,"value":38885},{"type":20,"tag":157,"props":47865,"children":47866},{"class":159,"line":491},[47867,47871,47875],{"type":20,"tag":157,"props":47868,"children":47869},{"style":892},[47870],{"type":25,"value":47408},{"type":20,"tag":157,"props":47872,"children":47873},{"style":39166},[47874],{"type":25,"value":2261},{"type":20,"tag":157,"props":47876,"children":47877},{"style":260},[47878],{"type":25,"value":47417},{"type":20,"tag":157,"props":47880,"children":47881},{"class":159,"line":499},[47882],{"type":20,"tag":157,"props":47883,"children":47884},{"style":892},[47885],{"type":25,"value":40371},{"type":20,"tag":157,"props":47887,"children":47888},{"class":159,"line":508},[47889],{"type":20,"tag":157,"props":47890,"children":47891},{"emptyLinePlaceholder":173},[47892],{"type":25,"value":176},{"type":20,"tag":157,"props":47894,"children":47895},{"class":159,"line":517},[47896,47900,47904],{"type":20,"tag":157,"props":47897,"children":47898},{"style":892},[47899],{"type":25,"value":39512},{"type":20,"tag":157,"props":47901,"children":47902},{"style":5667},[47903],{"type":25,"value":39298},{"type":20,"tag":157,"props":47905,"children":47906},{"style":892},[47907],{"type":25,"value":30657},{"type":20,"tag":21,"props":47909,"children":47910},{},[47911],{"type":20,"tag":33,"props":47912,"children":47913},{},[47914],{"type":25,"value":47915},"inject.vue",{"type":20,"tag":126,"props":47917,"children":47919},{"className":39112,"code":47918,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Ch2>inject\u003C\u002Fh2>\n    {{ count }}\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { inject } from 'vue'\n\nlet count = inject(\"count\") \nconst changeCount = inject(\"changeCount\")\nsetTimeout(() => { changeCount() }, 2000)\n\n\u003C\u002Fscript>\n",[47920],{"type":20,"tag":84,"props":47921,"children":47922},{"__ignoreMap":8},[47923,47938,47962,47970,47985,47992,48011,48031,48038,48070,48102,48139,48146],{"type":20,"tag":157,"props":47924,"children":47925},{"class":159,"line":160},[47926,47930,47934],{"type":20,"tag":157,"props":47927,"children":47928},{"style":892},[47929],{"type":25,"value":36862},{"type":20,"tag":157,"props":47931,"children":47932},{"style":5667},[47933],{"type":25,"value":39539},{"type":20,"tag":157,"props":47935,"children":47936},{"style":892},[47937],{"type":25,"value":30657},{"type":20,"tag":157,"props":47939,"children":47940},{"class":159,"line":169},[47941,47945,47949,47954,47958],{"type":20,"tag":157,"props":47942,"children":47943},{"style":892},[47944],{"type":25,"value":39582},{"type":20,"tag":157,"props":47946,"children":47947},{"style":5667},[47948],{"type":25,"value":1863},{"type":20,"tag":157,"props":47950,"children":47951},{"style":892},[47952],{"type":25,"value":47953},">inject\u003C\u002F",{"type":20,"tag":157,"props":47955,"children":47956},{"style":5667},[47957],{"type":25,"value":1863},{"type":20,"tag":157,"props":47959,"children":47960},{"style":892},[47961],{"type":25,"value":30657},{"type":20,"tag":157,"props":47963,"children":47964},{"class":159,"line":179},[47965],{"type":20,"tag":157,"props":47966,"children":47967},{"style":892},[47968],{"type":25,"value":47969},"    {{ count }}\n",{"type":20,"tag":157,"props":47971,"children":47972},{"class":159,"line":188},[47973,47977,47981],{"type":20,"tag":157,"props":47974,"children":47975},{"style":892},[47976],{"type":25,"value":39512},{"type":20,"tag":157,"props":47978,"children":47979},{"style":5667},[47980],{"type":25,"value":39539},{"type":20,"tag":157,"props":47982,"children":47983},{"style":892},[47984],{"type":25,"value":30657},{"type":20,"tag":157,"props":47986,"children":47987},{"class":159,"line":196},[47988],{"type":20,"tag":157,"props":47989,"children":47990},{"emptyLinePlaceholder":173},[47991],{"type":25,"value":176},{"type":20,"tag":157,"props":47993,"children":47994},{"class":159,"line":204},[47995,47999,48003,48007],{"type":20,"tag":157,"props":47996,"children":47997},{"style":892},[47998],{"type":25,"value":36862},{"type":20,"tag":157,"props":48000,"children":48001},{"style":5667},[48002],{"type":25,"value":39298},{"type":20,"tag":157,"props":48004,"children":48005},{"style":248},[48006],{"type":25,"value":39303},{"type":20,"tag":157,"props":48008,"children":48009},{"style":892},[48010],{"type":25,"value":30657},{"type":20,"tag":157,"props":48012,"children":48013},{"class":159,"line":213},[48014,48018,48023,48027],{"type":20,"tag":157,"props":48015,"children":48016},{"style":39166},[48017],{"type":25,"value":40516},{"type":20,"tag":157,"props":48019,"children":48020},{"style":892},[48021],{"type":25,"value":48022}," { inject } ",{"type":20,"tag":157,"props":48024,"children":48025},{"style":39166},[48026],{"type":25,"value":39806},{"type":20,"tag":157,"props":48028,"children":48029},{"style":254},[48030],{"type":25,"value":39811},{"type":20,"tag":157,"props":48032,"children":48033},{"class":159,"line":222},[48034],{"type":20,"tag":157,"props":48035,"children":48036},{"emptyLinePlaceholder":173},[48037],{"type":25,"value":176},{"type":20,"tag":157,"props":48039,"children":48040},{"class":159,"line":440},[48041,48045,48049,48053,48057,48061,48065],{"type":20,"tag":157,"props":48042,"children":48043},{"style":39166},[48044],{"type":25,"value":39240},{"type":20,"tag":157,"props":48046,"children":48047},{"style":892},[48048],{"type":25,"value":46860},{"type":20,"tag":157,"props":48050,"children":48051},{"style":39166},[48052],{"type":25,"value":2261},{"type":20,"tag":157,"props":48054,"children":48055},{"style":248},[48056],{"type":25,"value":39254},{"type":20,"tag":157,"props":48058,"children":48059},{"style":892},[48060],{"type":25,"value":39189},{"type":20,"tag":157,"props":48062,"children":48063},{"style":254},[48064],{"type":25,"value":46093},{"type":20,"tag":157,"props":48066,"children":48067},{"style":892},[48068],{"type":25,"value":48069},") \n",{"type":20,"tag":157,"props":48071,"children":48072},{"class":159,"line":448},[48073,48077,48082,48086,48090,48094,48098],{"type":20,"tag":157,"props":48074,"children":48075},{"style":39166},[48076],{"type":25,"value":39169},{"type":20,"tag":157,"props":48078,"children":48079},{"style":260},[48080],{"type":25,"value":48081}," changeCount",{"type":20,"tag":157,"props":48083,"children":48084},{"style":39166},[48085],{"type":25,"value":39179},{"type":20,"tag":157,"props":48087,"children":48088},{"style":248},[48089],{"type":25,"value":39254},{"type":20,"tag":157,"props":48091,"children":48092},{"style":892},[48093],{"type":25,"value":39189},{"type":20,"tag":157,"props":48095,"children":48096},{"style":254},[48097],{"type":25,"value":47850},{"type":20,"tag":157,"props":48099,"children":48100},{"style":892},[48101],{"type":25,"value":8926},{"type":20,"tag":157,"props":48103,"children":48104},{"class":159,"line":456},[48105,48109,48113,48117,48121,48126,48131,48135],{"type":20,"tag":157,"props":48106,"children":48107},{"style":248},[48108],{"type":25,"value":47334},{"type":20,"tag":157,"props":48110,"children":48111},{"style":892},[48112],{"type":25,"value":39890},{"type":20,"tag":157,"props":48114,"children":48115},{"style":39166},[48116],{"type":25,"value":39895},{"type":20,"tag":157,"props":48118,"children":48119},{"style":892},[48120],{"type":25,"value":40677},{"type":20,"tag":157,"props":48122,"children":48123},{"style":248},[48124],{"type":25,"value":48125},"changeCount",{"type":20,"tag":157,"props":48127,"children":48128},{"style":892},[48129],{"type":25,"value":48130},"() }, ",{"type":20,"tag":157,"props":48132,"children":48133},{"style":260},[48134],{"type":25,"value":47429},{"type":20,"tag":157,"props":48136,"children":48137},{"style":892},[48138],{"type":25,"value":8926},{"type":20,"tag":157,"props":48140,"children":48141},{"class":159,"line":465},[48142],{"type":20,"tag":157,"props":48143,"children":48144},{"emptyLinePlaceholder":173},[48145],{"type":25,"value":176},{"type":20,"tag":157,"props":48147,"children":48148},{"class":159,"line":474},[48149,48153,48157],{"type":20,"tag":157,"props":48150,"children":48151},{"style":892},[48152],{"type":25,"value":39512},{"type":20,"tag":157,"props":48154,"children":48155},{"style":5667},[48156],{"type":25,"value":39298},{"type":20,"tag":157,"props":48158,"children":48159},{"style":892},[48160],{"type":25,"value":30657},{"type":20,"tag":28,"props":48162,"children":48164},{"id":48163},"父子通信props-emit",[48165],{"type":25,"value":48166},"父子通信props emit",{"type":20,"tag":21,"props":48168,"children":48169},{},[48170],{"type":20,"tag":33,"props":48171,"children":48172},{},[48173],{"type":25,"value":48174},"Prop.vue",{"type":20,"tag":21,"props":48176,"children":48177},{},[48178],{"type":25,"value":48179},"父传子自定义属性、子传父自定义事件",{"type":20,"tag":126,"props":48181,"children":48183},{"className":39112,"code":48182,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Ch2>props\u003C\u002Fh2>\n    \u003CEmit :count=\"1\" :message=\"'hello world'\" @sendDate=\"getEmitDate\" \u002F>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport Emit from \".\u002F07_emit.vue\"\n\nconst getEmitDate = (data) => {\n    console.log(data)\n}\n\u003C\u002Fscript>\n",[48184],{"type":20,"tag":84,"props":48185,"children":48186},{"__ignoreMap":8},[48187,48202,48226,48310,48325,48332,48351,48372,48379,48415,48430,48437],{"type":20,"tag":157,"props":48188,"children":48189},{"class":159,"line":160},[48190,48194,48198],{"type":20,"tag":157,"props":48191,"children":48192},{"style":892},[48193],{"type":25,"value":36862},{"type":20,"tag":157,"props":48195,"children":48196},{"style":5667},[48197],{"type":25,"value":39539},{"type":20,"tag":157,"props":48199,"children":48200},{"style":892},[48201],{"type":25,"value":30657},{"type":20,"tag":157,"props":48203,"children":48204},{"class":159,"line":169},[48205,48209,48213,48218,48222],{"type":20,"tag":157,"props":48206,"children":48207},{"style":892},[48208],{"type":25,"value":39582},{"type":20,"tag":157,"props":48210,"children":48211},{"style":5667},[48212],{"type":25,"value":1863},{"type":20,"tag":157,"props":48214,"children":48215},{"style":892},[48216],{"type":25,"value":48217},">props\u003C\u002F",{"type":20,"tag":157,"props":48219,"children":48220},{"style":5667},[48221],{"type":25,"value":1863},{"type":20,"tag":157,"props":48223,"children":48224},{"style":892},[48225],{"type":25,"value":30657},{"type":20,"tag":157,"props":48227,"children":48228},{"class":159,"line":179},[48229,48233,48238,48242,48246,48250,48254,48258,48262,48266,48271,48275,48280,48284,48289,48293,48297,48302,48306],{"type":20,"tag":157,"props":48230,"children":48231},{"style":892},[48232],{"type":25,"value":39582},{"type":20,"tag":157,"props":48234,"children":48235},{"style":5667},[48236],{"type":25,"value":48237},"Emit",{"type":20,"tag":157,"props":48239,"children":48240},{"style":892},[48241],{"type":25,"value":39442},{"type":20,"tag":157,"props":48243,"children":48244},{"style":248},[48245],{"type":25,"value":40952},{"type":20,"tag":157,"props":48247,"children":48248},{"style":892},[48249],{"type":25,"value":2261},{"type":20,"tag":157,"props":48251,"children":48252},{"style":254},[48253],{"type":25,"value":39603},{"type":20,"tag":157,"props":48255,"children":48256},{"style":260},[48257],{"type":25,"value":10379},{"type":20,"tag":157,"props":48259,"children":48260},{"style":254},[48261],{"type":25,"value":39603},{"type":20,"tag":157,"props":48263,"children":48264},{"style":892},[48265],{"type":25,"value":39442},{"type":20,"tag":157,"props":48267,"children":48268},{"style":248},[48269],{"type":25,"value":48270},"message",{"type":20,"tag":157,"props":48272,"children":48273},{"style":892},[48274],{"type":25,"value":2261},{"type":20,"tag":157,"props":48276,"children":48277},{"style":254},[48278],{"type":25,"value":48279},"\"'hello world'\"",{"type":20,"tag":157,"props":48281,"children":48282},{"style":892},[48283],{"type":25,"value":39677},{"type":20,"tag":157,"props":48285,"children":48286},{"style":248},[48287],{"type":25,"value":48288},"sendDate",{"type":20,"tag":157,"props":48290,"children":48291},{"style":892},[48292],{"type":25,"value":2261},{"type":20,"tag":157,"props":48294,"children":48295},{"style":254},[48296],{"type":25,"value":39603},{"type":20,"tag":157,"props":48298,"children":48299},{"style":892},[48300],{"type":25,"value":48301},"getEmitDate",{"type":20,"tag":157,"props":48303,"children":48304},{"style":254},[48305],{"type":25,"value":39603},{"type":20,"tag":157,"props":48307,"children":48308},{"style":892},[48309],{"type":25,"value":39992},{"type":20,"tag":157,"props":48311,"children":48312},{"class":159,"line":188},[48313,48317,48321],{"type":20,"tag":157,"props":48314,"children":48315},{"style":892},[48316],{"type":25,"value":39512},{"type":20,"tag":157,"props":48318,"children":48319},{"style":5667},[48320],{"type":25,"value":39539},{"type":20,"tag":157,"props":48322,"children":48323},{"style":892},[48324],{"type":25,"value":30657},{"type":20,"tag":157,"props":48326,"children":48327},{"class":159,"line":196},[48328],{"type":20,"tag":157,"props":48329,"children":48330},{"emptyLinePlaceholder":173},[48331],{"type":25,"value":176},{"type":20,"tag":157,"props":48333,"children":48334},{"class":159,"line":204},[48335,48339,48343,48347],{"type":20,"tag":157,"props":48336,"children":48337},{"style":892},[48338],{"type":25,"value":36862},{"type":20,"tag":157,"props":48340,"children":48341},{"style":5667},[48342],{"type":25,"value":39298},{"type":20,"tag":157,"props":48344,"children":48345},{"style":248},[48346],{"type":25,"value":39303},{"type":20,"tag":157,"props":48348,"children":48349},{"style":892},[48350],{"type":25,"value":30657},{"type":20,"tag":157,"props":48352,"children":48353},{"class":159,"line":213},[48354,48358,48363,48367],{"type":20,"tag":157,"props":48355,"children":48356},{"style":39166},[48357],{"type":25,"value":40516},{"type":20,"tag":157,"props":48359,"children":48360},{"style":892},[48361],{"type":25,"value":48362}," Emit ",{"type":20,"tag":157,"props":48364,"children":48365},{"style":39166},[48366],{"type":25,"value":39806},{"type":20,"tag":157,"props":48368,"children":48369},{"style":254},[48370],{"type":25,"value":48371}," \".\u002F07_emit.vue\"\n",{"type":20,"tag":157,"props":48373,"children":48374},{"class":159,"line":222},[48375],{"type":20,"tag":157,"props":48376,"children":48377},{"emptyLinePlaceholder":173},[48378],{"type":25,"value":176},{"type":20,"tag":157,"props":48380,"children":48381},{"class":159,"line":440},[48382,48386,48391,48395,48399,48403,48407,48411],{"type":20,"tag":157,"props":48383,"children":48384},{"style":39166},[48385],{"type":25,"value":39169},{"type":20,"tag":157,"props":48387,"children":48388},{"style":248},[48389],{"type":25,"value":48390}," getEmitDate",{"type":20,"tag":157,"props":48392,"children":48393},{"style":39166},[48394],{"type":25,"value":39179},{"type":20,"tag":157,"props":48396,"children":48397},{"style":892},[48398],{"type":25,"value":42746},{"type":20,"tag":157,"props":48400,"children":48401},{"style":6410},[48402],{"type":25,"value":45825},{"type":20,"tag":157,"props":48404,"children":48405},{"style":892},[48406],{"type":25,"value":42636},{"type":20,"tag":157,"props":48408,"children":48409},{"style":39166},[48410],{"type":25,"value":39895},{"type":20,"tag":157,"props":48412,"children":48413},{"style":892},[48414],{"type":25,"value":38885},{"type":20,"tag":157,"props":48416,"children":48417},{"class":159,"line":448},[48418,48422,48426],{"type":20,"tag":157,"props":48419,"children":48420},{"style":892},[48421],{"type":25,"value":42291},{"type":20,"tag":157,"props":48423,"children":48424},{"style":248},[48425],{"type":25,"value":42157},{"type":20,"tag":157,"props":48427,"children":48428},{"style":892},[48429],{"type":25,"value":45845},{"type":20,"tag":157,"props":48431,"children":48432},{"class":159,"line":456},[48433],{"type":20,"tag":157,"props":48434,"children":48435},{"style":892},[48436],{"type":25,"value":943},{"type":20,"tag":157,"props":48438,"children":48439},{"class":159,"line":465},[48440,48444,48448],{"type":20,"tag":157,"props":48441,"children":48442},{"style":892},[48443],{"type":25,"value":39512},{"type":20,"tag":157,"props":48445,"children":48446},{"style":5667},[48447],{"type":25,"value":39298},{"type":20,"tag":157,"props":48449,"children":48450},{"style":892},[48451],{"type":25,"value":30657},{"type":20,"tag":21,"props":48453,"children":48454},{},[48455],{"type":20,"tag":33,"props":48456,"children":48457},{},[48458],{"type":25,"value":48459},"Emit.vue",{"type":20,"tag":126,"props":48461,"children":48463},{"className":39112,"code":48462,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Ch2>emit {{ count }} {{ message }}\u003C\u002Fh2>\n\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { defineProps, defineEmits, onMounted } from 'vue'\n\nconst state = defineProps({\n    count: {\n        type: Number\n    },\n    message: {\n        type: String\n    }\n})\n\nconst emit = defineEmits([\"sendDate\"])\nonMounted(() => {\n    emit(\"sendDate\", \"Emit传来的数据\")\n})\n\u003C\u002Fscript>\n",[48464],{"type":20,"tag":84,"props":48465,"children":48466},{"__ignoreMap":8},[48467,48482,48506,48513,48528,48535,48554,48574,48581,48606,48614,48622,48629,48637,48645,48652,48659,48666,48702,48721,48750,48757],{"type":20,"tag":157,"props":48468,"children":48469},{"class":159,"line":160},[48470,48474,48478],{"type":20,"tag":157,"props":48471,"children":48472},{"style":892},[48473],{"type":25,"value":36862},{"type":20,"tag":157,"props":48475,"children":48476},{"style":5667},[48477],{"type":25,"value":39539},{"type":20,"tag":157,"props":48479,"children":48480},{"style":892},[48481],{"type":25,"value":30657},{"type":20,"tag":157,"props":48483,"children":48484},{"class":159,"line":169},[48485,48489,48493,48498,48502],{"type":20,"tag":157,"props":48486,"children":48487},{"style":892},[48488],{"type":25,"value":39582},{"type":20,"tag":157,"props":48490,"children":48491},{"style":5667},[48492],{"type":25,"value":1863},{"type":20,"tag":157,"props":48494,"children":48495},{"style":892},[48496],{"type":25,"value":48497},">emit {{ count }} {{ message }}\u003C\u002F",{"type":20,"tag":157,"props":48499,"children":48500},{"style":5667},[48501],{"type":25,"value":1863},{"type":20,"tag":157,"props":48503,"children":48504},{"style":892},[48505],{"type":25,"value":30657},{"type":20,"tag":157,"props":48507,"children":48508},{"class":159,"line":179},[48509],{"type":20,"tag":157,"props":48510,"children":48511},{"emptyLinePlaceholder":173},[48512],{"type":25,"value":176},{"type":20,"tag":157,"props":48514,"children":48515},{"class":159,"line":188},[48516,48520,48524],{"type":20,"tag":157,"props":48517,"children":48518},{"style":892},[48519],{"type":25,"value":39512},{"type":20,"tag":157,"props":48521,"children":48522},{"style":5667},[48523],{"type":25,"value":39539},{"type":20,"tag":157,"props":48525,"children":48526},{"style":892},[48527],{"type":25,"value":30657},{"type":20,"tag":157,"props":48529,"children":48530},{"class":159,"line":196},[48531],{"type":20,"tag":157,"props":48532,"children":48533},{"emptyLinePlaceholder":173},[48534],{"type":25,"value":176},{"type":20,"tag":157,"props":48536,"children":48537},{"class":159,"line":204},[48538,48542,48546,48550],{"type":20,"tag":157,"props":48539,"children":48540},{"style":892},[48541],{"type":25,"value":36862},{"type":20,"tag":157,"props":48543,"children":48544},{"style":5667},[48545],{"type":25,"value":39298},{"type":20,"tag":157,"props":48547,"children":48548},{"style":248},[48549],{"type":25,"value":39303},{"type":20,"tag":157,"props":48551,"children":48552},{"style":892},[48553],{"type":25,"value":30657},{"type":20,"tag":157,"props":48555,"children":48556},{"class":159,"line":213},[48557,48561,48566,48570],{"type":20,"tag":157,"props":48558,"children":48559},{"style":39166},[48560],{"type":25,"value":40516},{"type":20,"tag":157,"props":48562,"children":48563},{"style":892},[48564],{"type":25,"value":48565}," { defineProps, defineEmits, onMounted } ",{"type":20,"tag":157,"props":48567,"children":48568},{"style":39166},[48569],{"type":25,"value":39806},{"type":20,"tag":157,"props":48571,"children":48572},{"style":254},[48573],{"type":25,"value":39811},{"type":20,"tag":157,"props":48575,"children":48576},{"class":159,"line":222},[48577],{"type":20,"tag":157,"props":48578,"children":48579},{"emptyLinePlaceholder":173},[48580],{"type":25,"value":176},{"type":20,"tag":157,"props":48582,"children":48583},{"class":159,"line":440},[48584,48588,48592,48596,48601],{"type":20,"tag":157,"props":48585,"children":48586},{"style":39166},[48587],{"type":25,"value":39169},{"type":20,"tag":157,"props":48589,"children":48590},{"style":260},[48591],{"type":25,"value":40880},{"type":20,"tag":157,"props":48593,"children":48594},{"style":39166},[48595],{"type":25,"value":39179},{"type":20,"tag":157,"props":48597,"children":48598},{"style":248},[48599],{"type":25,"value":48600}," defineProps",{"type":20,"tag":157,"props":48602,"children":48603},{"style":892},[48604],{"type":25,"value":48605},"({\n",{"type":20,"tag":157,"props":48607,"children":48608},{"class":159,"line":448},[48609],{"type":20,"tag":157,"props":48610,"children":48611},{"style":892},[48612],{"type":25,"value":48613},"    count: {\n",{"type":20,"tag":157,"props":48615,"children":48616},{"class":159,"line":456},[48617],{"type":20,"tag":157,"props":48618,"children":48619},{"style":892},[48620],{"type":25,"value":48621},"        type: Number\n",{"type":20,"tag":157,"props":48623,"children":48624},{"class":159,"line":465},[48625],{"type":20,"tag":157,"props":48626,"children":48627},{"style":892},[48628],{"type":25,"value":41792},{"type":20,"tag":157,"props":48630,"children":48631},{"class":159,"line":474},[48632],{"type":20,"tag":157,"props":48633,"children":48634},{"style":892},[48635],{"type":25,"value":48636},"    message: {\n",{"type":20,"tag":157,"props":48638,"children":48639},{"class":159,"line":483},[48640],{"type":20,"tag":157,"props":48641,"children":48642},{"style":892},[48643],{"type":25,"value":48644},"        type: String\n",{"type":20,"tag":157,"props":48646,"children":48647},{"class":159,"line":491},[48648],{"type":20,"tag":157,"props":48649,"children":48650},{"style":892},[48651],{"type":25,"value":872},{"type":20,"tag":157,"props":48653,"children":48654},{"class":159,"line":499},[48655],{"type":20,"tag":157,"props":48656,"children":48657},{"style":892},[48658],{"type":25,"value":40371},{"type":20,"tag":157,"props":48660,"children":48661},{"class":159,"line":508},[48662],{"type":20,"tag":157,"props":48663,"children":48664},{"emptyLinePlaceholder":173},[48665],{"type":25,"value":176},{"type":20,"tag":157,"props":48667,"children":48668},{"class":159,"line":517},[48669,48673,48678,48682,48687,48692,48697],{"type":20,"tag":157,"props":48670,"children":48671},{"style":39166},[48672],{"type":25,"value":39169},{"type":20,"tag":157,"props":48674,"children":48675},{"style":260},[48676],{"type":25,"value":48677}," emit",{"type":20,"tag":157,"props":48679,"children":48680},{"style":39166},[48681],{"type":25,"value":39179},{"type":20,"tag":157,"props":48683,"children":48684},{"style":248},[48685],{"type":25,"value":48686}," defineEmits",{"type":20,"tag":157,"props":48688,"children":48689},{"style":892},[48690],{"type":25,"value":48691},"([",{"type":20,"tag":157,"props":48693,"children":48694},{"style":254},[48695],{"type":25,"value":48696},"\"sendDate\"",{"type":20,"tag":157,"props":48698,"children":48699},{"style":892},[48700],{"type":25,"value":48701},"])\n",{"type":20,"tag":157,"props":48703,"children":48704},{"class":159,"line":1499},[48705,48709,48713,48717],{"type":20,"tag":157,"props":48706,"children":48707},{"style":248},[48708],{"type":25,"value":46919},{"type":20,"tag":157,"props":48710,"children":48711},{"style":892},[48712],{"type":25,"value":39890},{"type":20,"tag":157,"props":48714,"children":48715},{"style":39166},[48716],{"type":25,"value":39895},{"type":20,"tag":157,"props":48718,"children":48719},{"style":892},[48720],{"type":25,"value":38885},{"type":20,"tag":157,"props":48722,"children":48723},{"class":159,"line":1507},[48724,48729,48733,48737,48741,48746],{"type":20,"tag":157,"props":48725,"children":48726},{"style":248},[48727],{"type":25,"value":48728},"    emit",{"type":20,"tag":157,"props":48730,"children":48731},{"style":892},[48732],{"type":25,"value":39189},{"type":20,"tag":157,"props":48734,"children":48735},{"style":254},[48736],{"type":25,"value":48696},{"type":20,"tag":157,"props":48738,"children":48739},{"style":892},[48740],{"type":25,"value":42626},{"type":20,"tag":157,"props":48742,"children":48743},{"style":254},[48744],{"type":25,"value":48745},"\"Emit传来的数据\"",{"type":20,"tag":157,"props":48747,"children":48748},{"style":892},[48749],{"type":25,"value":8926},{"type":20,"tag":157,"props":48751,"children":48752},{"class":159,"line":1515},[48753],{"type":20,"tag":157,"props":48754,"children":48755},{"style":892},[48756],{"type":25,"value":40371},{"type":20,"tag":157,"props":48758,"children":48759},{"class":159,"line":1523},[48760,48764,48768],{"type":20,"tag":157,"props":48761,"children":48762},{"style":892},[48763],{"type":25,"value":39512},{"type":20,"tag":157,"props":48765,"children":48766},{"style":5667},[48767],{"type":25,"value":39298},{"type":20,"tag":157,"props":48769,"children":48770},{"style":892},[48771],{"type":25,"value":30657},{"type":20,"tag":1863,"props":48773,"children":48775},{"id":48774},"vue-router",[48776],{"type":25,"value":48777},"Vue-Router",{"type":20,"tag":28,"props":48779,"children":48781},{"id":48780},"嵌套路由",[48782],{"type":25,"value":48780},{"type":20,"tag":21,"props":48784,"children":48785},{},[48786,48788,48793,48795,48801],{"type":25,"value":48787},"子路由如果前面不加",{"type":20,"tag":84,"props":48789,"children":48791},{"className":48790},[],[48792],{"type":25,"value":37775},{"type":25,"value":48794},"，路由跳转的时候就需要写全路径，如：",{"type":20,"tag":84,"props":48796,"children":48798},{"className":48797},[],[48799],{"type":25,"value":48800},"\u002Fabout\u002Ffoo",{"type":25,"value":48802},"，推荐",{"type":20,"tag":21,"props":48804,"children":48805},{},[48806,48808,48813,48815],{"type":25,"value":48807},"子路由如果前面加",{"type":20,"tag":84,"props":48809,"children":48811},{"className":48810},[],[48812],{"type":25,"value":37775},{"type":25,"value":48814},"，路由跳转的时候就只需要写，如：",{"type":20,"tag":84,"props":48816,"children":48818},{"className":48817},[],[48819],{"type":25,"value":48820},"\u002Ffoo",{"type":20,"tag":28,"props":48822,"children":48824},{"id":48823},"动态路由",[48825],{"type":25,"value":48823},{"type":20,"tag":6665,"props":48827,"children":48828},{},[48829],{"type":20,"tag":21,"props":48830,"children":48831},{},[48832],{"type":25,"value":48833},"也就是路由传参",{"type":20,"tag":126,"props":48835,"children":48837},{"className":38826,"code":48836,"language":38828,"meta":8,"style":8},"children: {\n    {\n        path: \"bar\u002F:id\"\n    }\n}\n",[48838],{"type":20,"tag":84,"props":48839,"children":48840},{"__ignoreMap":8},[48841,48849,48857,48865,48872],{"type":20,"tag":157,"props":48842,"children":48843},{"class":159,"line":160},[48844],{"type":20,"tag":157,"props":48845,"children":48846},{},[48847],{"type":25,"value":48848},"children: {\n",{"type":20,"tag":157,"props":48850,"children":48851},{"class":159,"line":169},[48852],{"type":20,"tag":157,"props":48853,"children":48854},{},[48855],{"type":25,"value":48856},"    {\n",{"type":20,"tag":157,"props":48858,"children":48859},{"class":159,"line":179},[48860],{"type":20,"tag":157,"props":48861,"children":48862},{},[48863],{"type":25,"value":48864},"        path: \"bar\u002F:id\"\n",{"type":20,"tag":157,"props":48866,"children":48867},{"class":159,"line":188},[48868],{"type":20,"tag":157,"props":48869,"children":48870},{},[48871],{"type":25,"value":872},{"type":20,"tag":157,"props":48873,"children":48874},{"class":159,"line":196},[48875],{"type":20,"tag":157,"props":48876,"children":48877},{},[48878],{"type":25,"value":943},{"type":20,"tag":21,"props":48880,"children":48881},{},[48882],{"type":25,"value":48883},"点击跳转路由时",{"type":20,"tag":126,"props":48885,"children":48887},{"className":38826,"code":48886,"language":38828,"meta":8,"style":8},"const router = router.push(\"\u002Fanout\u002Fbai\u002F123\")\n",[48888],{"type":20,"tag":84,"props":48889,"children":48890},{"__ignoreMap":8},[48891],{"type":20,"tag":157,"props":48892,"children":48893},{"class":159,"line":160},[48894],{"type":20,"tag":157,"props":48895,"children":48896},{},[48897],{"type":25,"value":48886},{"type":20,"tag":21,"props":48899,"children":48900},{},[48901],{"type":25,"value":48902},"在组件中接收",{"type":20,"tag":126,"props":48904,"children":48906},{"className":38826,"code":48905,"language":38828,"meta":8,"style":8},"const route = route()\n\nconsole.log(route.params.id)\n",[48907],{"type":20,"tag":84,"props":48908,"children":48909},{"__ignoreMap":8},[48910,48918,48925],{"type":20,"tag":157,"props":48911,"children":48912},{"class":159,"line":160},[48913],{"type":20,"tag":157,"props":48914,"children":48915},{},[48916],{"type":25,"value":48917},"const route = route()\n",{"type":20,"tag":157,"props":48919,"children":48920},{"class":159,"line":169},[48921],{"type":20,"tag":157,"props":48922,"children":48923},{"emptyLinePlaceholder":173},[48924],{"type":25,"value":176},{"type":20,"tag":157,"props":48926,"children":48927},{"class":159,"line":179},[48928],{"type":20,"tag":157,"props":48929,"children":48930},{},[48931],{"type":25,"value":48932},"console.log(route.params.id)\n",{"type":20,"tag":28,"props":48934,"children":48936},{"id":48935},"命名路由",[48937],{"type":25,"value":48935},{"type":20,"tag":21,"props":48939,"children":48940},{},[48941],{"type":25,"value":48942},"可能通过给路由命名，然后通过 name 进行路由跳转",{"type":20,"tag":126,"props":48944,"children":48946},{"className":39112,"code":48945,"language":39114,"meta":8,"style":8},"\u003Ctemplate>\n    \u003Ch2>About\u003C\u002Fh2>\n    \u003Cbutton @click=\"toSub1\">Sub1\u003C\u002Fbutton> |\n    \u003Cbutton @click=\"toSub2\">Sub2\u003C\u002Fbutton>\n    \u003Crouter-view>\u003C\u002Frouter-view>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nimport { useRouter } from 'vue-router'\nconst router = useRouter()\n\nconst toSub1 = () => {\n    router.push({\n        name: 'sub1',\n        \u002F\u002F 可以携带路由参数\n        params: {\n            id: 123\n        }\n    }\n    )\n    \u002F\u002F router.push(\"\u002Fabout\u002Fsub1\")\n} \n\nconst toSub2 = () => {\n    router.push({ name: 'sub2' })\n    \u002F\u002F router.push(\"\u002Fabout\u002Fsub2\")\n}\n\u003C\u002Fscript>\n",[48947],{"type":20,"tag":84,"props":48948,"children":48949},{"__ignoreMap":8},[48950,48965,48989,49039,49088,49112,49127,49134,49153,49174,49199,49206,49234,49251,49268,49276,49284,49296,49303,49310,49317,49325,49333,49340,49368,49393,49401,49408],{"type":20,"tag":157,"props":48951,"children":48952},{"class":159,"line":160},[48953,48957,48961],{"type":20,"tag":157,"props":48954,"children":48955},{"style":892},[48956],{"type":25,"value":36862},{"type":20,"tag":157,"props":48958,"children":48959},{"style":5667},[48960],{"type":25,"value":39539},{"type":20,"tag":157,"props":48962,"children":48963},{"style":892},[48964],{"type":25,"value":30657},{"type":20,"tag":157,"props":48966,"children":48967},{"class":159,"line":169},[48968,48972,48976,48981,48985],{"type":20,"tag":157,"props":48969,"children":48970},{"style":892},[48971],{"type":25,"value":39582},{"type":20,"tag":157,"props":48973,"children":48974},{"style":5667},[48975],{"type":25,"value":1863},{"type":20,"tag":157,"props":48977,"children":48978},{"style":892},[48979],{"type":25,"value":48980},">About\u003C\u002F",{"type":20,"tag":157,"props":48982,"children":48983},{"style":5667},[48984],{"type":25,"value":1863},{"type":20,"tag":157,"props":48986,"children":48987},{"style":892},[48988],{"type":25,"value":30657},{"type":20,"tag":157,"props":48990,"children":48991},{"class":159,"line":179},[48992,48996,49000,49004,49008,49012,49016,49021,49025,49030,49034],{"type":20,"tag":157,"props":48993,"children":48994},{"style":892},[48995],{"type":25,"value":39582},{"type":20,"tag":157,"props":48997,"children":48998},{"style":5667},[48999],{"type":25,"value":42462},{"type":20,"tag":157,"props":49001,"children":49002},{"style":892},[49003],{"type":25,"value":39677},{"type":20,"tag":157,"props":49005,"children":49006},{"style":248},[49007],{"type":25,"value":39682},{"type":20,"tag":157,"props":49009,"children":49010},{"style":892},[49011],{"type":25,"value":2261},{"type":20,"tag":157,"props":49013,"children":49014},{"style":254},[49015],{"type":25,"value":39603},{"type":20,"tag":157,"props":49017,"children":49018},{"style":892},[49019],{"type":25,"value":49020},"toSub1",{"type":20,"tag":157,"props":49022,"children":49023},{"style":254},[49024],{"type":25,"value":39603},{"type":20,"tag":157,"props":49026,"children":49027},{"style":892},[49028],{"type":25,"value":49029},">Sub1\u003C\u002F",{"type":20,"tag":157,"props":49031,"children":49032},{"style":5667},[49033],{"type":25,"value":42462},{"type":20,"tag":157,"props":49035,"children":49036},{"style":892},[49037],{"type":25,"value":49038},"> |\n",{"type":20,"tag":157,"props":49040,"children":49041},{"class":159,"line":188},[49042,49046,49050,49054,49058,49062,49066,49071,49075,49080,49084],{"type":20,"tag":157,"props":49043,"children":49044},{"style":892},[49045],{"type":25,"value":39582},{"type":20,"tag":157,"props":49047,"children":49048},{"style":5667},[49049],{"type":25,"value":42462},{"type":20,"tag":157,"props":49051,"children":49052},{"style":892},[49053],{"type":25,"value":39677},{"type":20,"tag":157,"props":49055,"children":49056},{"style":248},[49057],{"type":25,"value":39682},{"type":20,"tag":157,"props":49059,"children":49060},{"style":892},[49061],{"type":25,"value":2261},{"type":20,"tag":157,"props":49063,"children":49064},{"style":254},[49065],{"type":25,"value":39603},{"type":20,"tag":157,"props":49067,"children":49068},{"style":892},[49069],{"type":25,"value":49070},"toSub2",{"type":20,"tag":157,"props":49072,"children":49073},{"style":254},[49074],{"type":25,"value":39603},{"type":20,"tag":157,"props":49076,"children":49077},{"style":892},[49078],{"type":25,"value":49079},">Sub2\u003C\u002F",{"type":20,"tag":157,"props":49081,"children":49082},{"style":5667},[49083],{"type":25,"value":42462},{"type":20,"tag":157,"props":49085,"children":49086},{"style":892},[49087],{"type":25,"value":30657},{"type":20,"tag":157,"props":49089,"children":49090},{"class":159,"line":196},[49091,49095,49100,49104,49108],{"type":20,"tag":157,"props":49092,"children":49093},{"style":892},[49094],{"type":25,"value":39582},{"type":20,"tag":157,"props":49096,"children":49097},{"style":5667},[49098],{"type":25,"value":49099},"router-view",{"type":20,"tag":157,"props":49101,"children":49102},{"style":892},[49103],{"type":25,"value":36885},{"type":20,"tag":157,"props":49105,"children":49106},{"style":5667},[49107],{"type":25,"value":49099},{"type":20,"tag":157,"props":49109,"children":49110},{"style":892},[49111],{"type":25,"value":30657},{"type":20,"tag":157,"props":49113,"children":49114},{"class":159,"line":204},[49115,49119,49123],{"type":20,"tag":157,"props":49116,"children":49117},{"style":892},[49118],{"type":25,"value":39512},{"type":20,"tag":157,"props":49120,"children":49121},{"style":5667},[49122],{"type":25,"value":39539},{"type":20,"tag":157,"props":49124,"children":49125},{"style":892},[49126],{"type":25,"value":30657},{"type":20,"tag":157,"props":49128,"children":49129},{"class":159,"line":213},[49130],{"type":20,"tag":157,"props":49131,"children":49132},{"emptyLinePlaceholder":173},[49133],{"type":25,"value":176},{"type":20,"tag":157,"props":49135,"children":49136},{"class":159,"line":222},[49137,49141,49145,49149],{"type":20,"tag":157,"props":49138,"children":49139},{"style":892},[49140],{"type":25,"value":36862},{"type":20,"tag":157,"props":49142,"children":49143},{"style":5667},[49144],{"type":25,"value":39298},{"type":20,"tag":157,"props":49146,"children":49147},{"style":248},[49148],{"type":25,"value":39303},{"type":20,"tag":157,"props":49150,"children":49151},{"style":892},[49152],{"type":25,"value":30657},{"type":20,"tag":157,"props":49154,"children":49155},{"class":159,"line":440},[49156,49160,49165,49169],{"type":20,"tag":157,"props":49157,"children":49158},{"style":39166},[49159],{"type":25,"value":40516},{"type":20,"tag":157,"props":49161,"children":49162},{"style":892},[49163],{"type":25,"value":49164}," { useRouter } ",{"type":20,"tag":157,"props":49166,"children":49167},{"style":39166},[49168],{"type":25,"value":39806},{"type":20,"tag":157,"props":49170,"children":49171},{"style":254},[49172],{"type":25,"value":49173}," 'vue-router'\n",{"type":20,"tag":157,"props":49175,"children":49176},{"class":159,"line":448},[49177,49181,49186,49190,49195],{"type":20,"tag":157,"props":49178,"children":49179},{"style":39166},[49180],{"type":25,"value":39169},{"type":20,"tag":157,"props":49182,"children":49183},{"style":260},[49184],{"type":25,"value":49185}," router",{"type":20,"tag":157,"props":49187,"children":49188},{"style":39166},[49189],{"type":25,"value":39179},{"type":20,"tag":157,"props":49191,"children":49192},{"style":248},[49193],{"type":25,"value":49194}," useRouter",{"type":20,"tag":157,"props":49196,"children":49197},{"style":892},[49198],{"type":25,"value":39917},{"type":20,"tag":157,"props":49200,"children":49201},{"class":159,"line":456},[49202],{"type":20,"tag":157,"props":49203,"children":49204},{"emptyLinePlaceholder":173},[49205],{"type":25,"value":176},{"type":20,"tag":157,"props":49207,"children":49208},{"class":159,"line":465},[49209,49213,49218,49222,49226,49230],{"type":20,"tag":157,"props":49210,"children":49211},{"style":39166},[49212],{"type":25,"value":39169},{"type":20,"tag":157,"props":49214,"children":49215},{"style":248},[49216],{"type":25,"value":49217}," toSub1",{"type":20,"tag":157,"props":49219,"children":49220},{"style":39166},[49221],{"type":25,"value":39179},{"type":20,"tag":157,"props":49223,"children":49224},{"style":892},[49225],{"type":25,"value":40118},{"type":20,"tag":157,"props":49227,"children":49228},{"style":39166},[49229],{"type":25,"value":39895},{"type":20,"tag":157,"props":49231,"children":49232},{"style":892},[49233],{"type":25,"value":38885},{"type":20,"tag":157,"props":49235,"children":49236},{"class":159,"line":474},[49237,49242,49247],{"type":20,"tag":157,"props":49238,"children":49239},{"style":892},[49240],{"type":25,"value":49241},"    router.",{"type":20,"tag":157,"props":49243,"children":49244},{"style":248},[49245],{"type":25,"value":49246},"push",{"type":20,"tag":157,"props":49248,"children":49249},{"style":892},[49250],{"type":25,"value":48605},{"type":20,"tag":157,"props":49252,"children":49253},{"class":159,"line":483},[49254,49259,49264],{"type":20,"tag":157,"props":49255,"children":49256},{"style":892},[49257],{"type":25,"value":49258},"        name: ",{"type":20,"tag":157,"props":49260,"children":49261},{"style":254},[49262],{"type":25,"value":49263},"'sub1'",{"type":20,"tag":157,"props":49265,"children":49266},{"style":892},[49267],{"type":25,"value":918},{"type":20,"tag":157,"props":49269,"children":49270},{"class":159,"line":491},[49271],{"type":20,"tag":157,"props":49272,"children":49273},{"style":9628},[49274],{"type":25,"value":49275},"        \u002F\u002F 可以携带路由参数\n",{"type":20,"tag":157,"props":49277,"children":49278},{"class":159,"line":499},[49279],{"type":20,"tag":157,"props":49280,"children":49281},{"style":892},[49282],{"type":25,"value":49283},"        params: {\n",{"type":20,"tag":157,"props":49285,"children":49286},{"class":159,"line":508},[49287,49292],{"type":20,"tag":157,"props":49288,"children":49289},{"style":892},[49290],{"type":25,"value":49291},"            id: ",{"type":20,"tag":157,"props":49293,"children":49294},{"style":260},[49295],{"type":25,"value":45739},{"type":20,"tag":157,"props":49297,"children":49298},{"class":159,"line":517},[49299],{"type":20,"tag":157,"props":49300,"children":49301},{"style":892},[49302],{"type":25,"value":24820},{"type":20,"tag":157,"props":49304,"children":49305},{"class":159,"line":1499},[49306],{"type":20,"tag":157,"props":49307,"children":49308},{"style":892},[49309],{"type":25,"value":872},{"type":20,"tag":157,"props":49311,"children":49312},{"class":159,"line":1507},[49313],{"type":20,"tag":157,"props":49314,"children":49315},{"style":892},[49316],{"type":25,"value":3314},{"type":20,"tag":157,"props":49318,"children":49319},{"class":159,"line":1515},[49320],{"type":20,"tag":157,"props":49321,"children":49322},{"style":9628},[49323],{"type":25,"value":49324},"    \u002F\u002F router.push(\"\u002Fabout\u002Fsub1\")\n",{"type":20,"tag":157,"props":49326,"children":49327},{"class":159,"line":1523},[49328],{"type":20,"tag":157,"props":49329,"children":49330},{"style":892},[49331],{"type":25,"value":49332},"} \n",{"type":20,"tag":157,"props":49334,"children":49335},{"class":159,"line":1532},[49336],{"type":20,"tag":157,"props":49337,"children":49338},{"emptyLinePlaceholder":173},[49339],{"type":25,"value":176},{"type":20,"tag":157,"props":49341,"children":49342},{"class":159,"line":1541},[49343,49347,49352,49356,49360,49364],{"type":20,"tag":157,"props":49344,"children":49345},{"style":39166},[49346],{"type":25,"value":39169},{"type":20,"tag":157,"props":49348,"children":49349},{"style":248},[49350],{"type":25,"value":49351}," toSub2",{"type":20,"tag":157,"props":49353,"children":49354},{"style":39166},[49355],{"type":25,"value":39179},{"type":20,"tag":157,"props":49357,"children":49358},{"style":892},[49359],{"type":25,"value":40118},{"type":20,"tag":157,"props":49361,"children":49362},{"style":39166},[49363],{"type":25,"value":39895},{"type":20,"tag":157,"props":49365,"children":49366},{"style":892},[49367],{"type":25,"value":38885},{"type":20,"tag":157,"props":49369,"children":49370},{"class":159,"line":1550},[49371,49375,49379,49384,49389],{"type":20,"tag":157,"props":49372,"children":49373},{"style":892},[49374],{"type":25,"value":49241},{"type":20,"tag":157,"props":49376,"children":49377},{"style":248},[49378],{"type":25,"value":49246},{"type":20,"tag":157,"props":49380,"children":49381},{"style":892},[49382],{"type":25,"value":49383},"({ name: ",{"type":20,"tag":157,"props":49385,"children":49386},{"style":254},[49387],{"type":25,"value":49388},"'sub2'",{"type":20,"tag":157,"props":49390,"children":49391},{"style":892},[49392],{"type":25,"value":40240},{"type":20,"tag":157,"props":49394,"children":49395},{"class":159,"line":1558},[49396],{"type":20,"tag":157,"props":49397,"children":49398},{"style":9628},[49399],{"type":25,"value":49400},"    \u002F\u002F router.push(\"\u002Fabout\u002Fsub2\")\n",{"type":20,"tag":157,"props":49402,"children":49403},{"class":159,"line":1566},[49404],{"type":20,"tag":157,"props":49405,"children":49406},{"style":892},[49407],{"type":25,"value":943},{"type":20,"tag":157,"props":49409,"children":49410},{"class":159,"line":1574},[49411,49415,49419],{"type":20,"tag":157,"props":49412,"children":49413},{"style":892},[49414],{"type":25,"value":39512},{"type":20,"tag":157,"props":49416,"children":49417},{"style":5667},[49418],{"type":25,"value":39298},{"type":20,"tag":157,"props":49420,"children":49421},{"style":892},[49422],{"type":25,"value":30657},{"type":20,"tag":28,"props":49424,"children":49426},{"id":49425},"路由传参",[49427],{"type":25,"value":49425},{"type":20,"tag":5719,"props":49429,"children":49430},{},[49431,49450,49461],{"type":20,"tag":48,"props":49432,"children":49433},{},[49434,49436,49442,49444],{"type":25,"value":49435},"query方式(显示)：",{"type":20,"tag":84,"props":49437,"children":49439},{"className":49438},[],[49440],{"type":25,"value":49441},"route.query",{"type":25,"value":49443}," : ",{"type":20,"tag":84,"props":49445,"children":49447},{"className":49446},[],[49448],{"type":25,"value":49449},"const router = router.push(\"\u002Fanout\u002Fbai\u002F?123\")",{"type":20,"tag":48,"props":49451,"children":49452},{},[49453,49455],{"type":25,"value":49454},"params方式(显示)：route.params: ",{"type":20,"tag":84,"props":49456,"children":49458},{"className":49457},[],[49459],{"type":25,"value":49460},"const router = router.push(\"\u002Fanout\u002Fbai\u002F123\")",{"type":20,"tag":48,"props":49462,"children":49463},{},[49464,49466,49472,49474],{"type":25,"value":49465},"params方式(隐式)：route.params：在写路由表的时候不写动态路由，如：",{"type":20,"tag":84,"props":49467,"children":49469},{"className":49468},[],[49470],{"type":25,"value":49471},"path: \"bar\u002F:id\"",{"type":25,"value":49473},"改写成",{"type":20,"tag":84,"props":49475,"children":49477},{"className":49476},[],[49478],{"type":25,"value":49479},"path: \"bar",{"type":20,"tag":28,"props":49481,"children":49483},{"id":49482},"route与router对象",[49484],{"type":25,"value":49482},{"type":20,"tag":21,"props":49486,"children":49487},{},[49488],{"type":25,"value":49489},"route：获取路由信息",{"type":20,"tag":21,"props":49491,"children":49492},{},[49493],{"type":25,"value":49494},"router：调用路由方法",{"type":20,"tag":1863,"props":49496,"children":49498},{"id":49497},"路由守卫",[49499],{"type":25,"value":49497},{"type":20,"tag":21,"props":49501,"children":49502},{},[49503],{"type":20,"tag":33,"props":49504,"children":49505},{},[49506],{"type":25,"value":49507},"路由表中配置",{"type":20,"tag":126,"props":49509,"children":49511},{"className":39154,"code":49510,"language":39156,"meta":8,"style":8},"router.beforeEach((to, from, next) => {\n    if(to.meta.auth){\n        \u002F\u002F 如果有权限跳转到想去的页面\n            next()\n    }else {\n        \u002F\u002F  没有权限强制跳转到login页面\n        next(\"\u002Flogin\")\n    }\n})\n",[49512],{"type":20,"tag":84,"props":49513,"children":49514},{"__ignoreMap":8},[49515,49567,49579,49587,49599,49616,49624,49645,49652],{"type":20,"tag":157,"props":49516,"children":49517},{"class":159,"line":160},[49518,49523,49528,49533,49538,49542,49546,49550,49555,49559,49563],{"type":20,"tag":157,"props":49519,"children":49520},{"style":892},[49521],{"type":25,"value":49522},"router.",{"type":20,"tag":157,"props":49524,"children":49525},{"style":248},[49526],{"type":25,"value":49527},"beforeEach",{"type":20,"tag":157,"props":49529,"children":49530},{"style":892},[49531],{"type":25,"value":49532},"((",{"type":20,"tag":157,"props":49534,"children":49535},{"style":6410},[49536],{"type":25,"value":49537},"to",{"type":20,"tag":157,"props":49539,"children":49540},{"style":892},[49541],{"type":25,"value":42626},{"type":20,"tag":157,"props":49543,"children":49544},{"style":6410},[49545],{"type":25,"value":39806},{"type":20,"tag":157,"props":49547,"children":49548},{"style":892},[49549],{"type":25,"value":42626},{"type":20,"tag":157,"props":49551,"children":49552},{"style":6410},[49553],{"type":25,"value":49554},"next",{"type":20,"tag":157,"props":49556,"children":49557},{"style":892},[49558],{"type":25,"value":42636},{"type":20,"tag":157,"props":49560,"children":49561},{"style":39166},[49562],{"type":25,"value":39895},{"type":20,"tag":157,"props":49564,"children":49565},{"style":892},[49566],{"type":25,"value":38885},{"type":20,"tag":157,"props":49568,"children":49569},{"class":159,"line":169},[49570,49574],{"type":20,"tag":157,"props":49571,"children":49572},{"style":39166},[49573],{"type":25,"value":43053},{"type":20,"tag":157,"props":49575,"children":49576},{"style":892},[49577],{"type":25,"value":49578},"(to.meta.auth){\n",{"type":20,"tag":157,"props":49580,"children":49581},{"class":159,"line":179},[49582],{"type":20,"tag":157,"props":49583,"children":49584},{"style":9628},[49585],{"type":25,"value":49586},"        \u002F\u002F 如果有权限跳转到想去的页面\n",{"type":20,"tag":157,"props":49588,"children":49589},{"class":159,"line":188},[49590,49595],{"type":20,"tag":157,"props":49591,"children":49592},{"style":248},[49593],{"type":25,"value":49594},"            next",{"type":20,"tag":157,"props":49596,"children":49597},{"style":892},[49598],{"type":25,"value":39917},{"type":20,"tag":157,"props":49600,"children":49601},{"class":159,"line":196},[49602,49607,49612],{"type":20,"tag":157,"props":49603,"children":49604},{"style":892},[49605],{"type":25,"value":49606},"    }",{"type":20,"tag":157,"props":49608,"children":49609},{"style":39166},[49610],{"type":25,"value":49611},"else",{"type":20,"tag":157,"props":49613,"children":49614},{"style":892},[49615],{"type":25,"value":38885},{"type":20,"tag":157,"props":49617,"children":49618},{"class":159,"line":204},[49619],{"type":20,"tag":157,"props":49620,"children":49621},{"style":9628},[49622],{"type":25,"value":49623},"        \u002F\u002F  没有权限强制跳转到login页面\n",{"type":20,"tag":157,"props":49625,"children":49626},{"class":159,"line":213},[49627,49632,49636,49641],{"type":20,"tag":157,"props":49628,"children":49629},{"style":248},[49630],{"type":25,"value":49631},"        next",{"type":20,"tag":157,"props":49633,"children":49634},{"style":892},[49635],{"type":25,"value":39189},{"type":20,"tag":157,"props":49637,"children":49638},{"style":254},[49639],{"type":25,"value":49640},"\"\u002Flogin\"",{"type":20,"tag":157,"props":49642,"children":49643},{"style":892},[49644],{"type":25,"value":8926},{"type":20,"tag":157,"props":49646,"children":49647},{"class":159,"line":222},[49648],{"type":20,"tag":157,"props":49649,"children":49650},{"style":892},[49651],{"type":25,"value":872},{"type":20,"tag":157,"props":49653,"children":49654},{"class":159,"line":440},[49655],{"type":20,"tag":157,"props":49656,"children":49657},{"style":892},[49658],{"type":25,"value":40371},{"type":20,"tag":21,"props":49660,"children":49661},{},[49662],{"type":20,"tag":33,"props":49663,"children":49664},{},[49665],{"type":25,"value":49666},"组件内的守卫",{"type":20,"tag":126,"props":49668,"children":49670},{"className":39154,"code":49669,"language":39156,"meta":8,"style":8},"router.beforeRouteEach((to, from, next) => {\n    if(to.meta.auth){\n        \u002F\u002F 如果有权限跳转到想去的页面\n            next()\n    }else {\n        \u002F\u002F  没有权限强制跳转到login页面\n        next(\"\u002Flogin\")\n    }\n})\n",[49671],{"type":20,"tag":84,"props":49672,"children":49673},{"__ignoreMap":8},[49674,49722,49733,49740,49751,49766,49773,49792,49799],{"type":20,"tag":157,"props":49675,"children":49676},{"class":159,"line":160},[49677,49681,49686,49690,49694,49698,49702,49706,49710,49714,49718],{"type":20,"tag":157,"props":49678,"children":49679},{"style":892},[49680],{"type":25,"value":49522},{"type":20,"tag":157,"props":49682,"children":49683},{"style":248},[49684],{"type":25,"value":49685},"beforeRouteEach",{"type":20,"tag":157,"props":49687,"children":49688},{"style":892},[49689],{"type":25,"value":49532},{"type":20,"tag":157,"props":49691,"children":49692},{"style":6410},[49693],{"type":25,"value":49537},{"type":20,"tag":157,"props":49695,"children":49696},{"style":892},[49697],{"type":25,"value":42626},{"type":20,"tag":157,"props":49699,"children":49700},{"style":6410},[49701],{"type":25,"value":39806},{"type":20,"tag":157,"props":49703,"children":49704},{"style":892},[49705],{"type":25,"value":42626},{"type":20,"tag":157,"props":49707,"children":49708},{"style":6410},[49709],{"type":25,"value":49554},{"type":20,"tag":157,"props":49711,"children":49712},{"style":892},[49713],{"type":25,"value":42636},{"type":20,"tag":157,"props":49715,"children":49716},{"style":39166},[49717],{"type":25,"value":39895},{"type":20,"tag":157,"props":49719,"children":49720},{"style":892},[49721],{"type":25,"value":38885},{"type":20,"tag":157,"props":49723,"children":49724},{"class":159,"line":169},[49725,49729],{"type":20,"tag":157,"props":49726,"children":49727},{"style":39166},[49728],{"type":25,"value":43053},{"type":20,"tag":157,"props":49730,"children":49731},{"style":892},[49732],{"type":25,"value":49578},{"type":20,"tag":157,"props":49734,"children":49735},{"class":159,"line":179},[49736],{"type":20,"tag":157,"props":49737,"children":49738},{"style":9628},[49739],{"type":25,"value":49586},{"type":20,"tag":157,"props":49741,"children":49742},{"class":159,"line":188},[49743,49747],{"type":20,"tag":157,"props":49744,"children":49745},{"style":248},[49746],{"type":25,"value":49594},{"type":20,"tag":157,"props":49748,"children":49749},{"style":892},[49750],{"type":25,"value":39917},{"type":20,"tag":157,"props":49752,"children":49753},{"class":159,"line":196},[49754,49758,49762],{"type":20,"tag":157,"props":49755,"children":49756},{"style":892},[49757],{"type":25,"value":49606},{"type":20,"tag":157,"props":49759,"children":49760},{"style":39166},[49761],{"type":25,"value":49611},{"type":20,"tag":157,"props":49763,"children":49764},{"style":892},[49765],{"type":25,"value":38885},{"type":20,"tag":157,"props":49767,"children":49768},{"class":159,"line":204},[49769],{"type":20,"tag":157,"props":49770,"children":49771},{"style":9628},[49772],{"type":25,"value":49623},{"type":20,"tag":157,"props":49774,"children":49775},{"class":159,"line":213},[49776,49780,49784,49788],{"type":20,"tag":157,"props":49777,"children":49778},{"style":248},[49779],{"type":25,"value":49631},{"type":20,"tag":157,"props":49781,"children":49782},{"style":892},[49783],{"type":25,"value":39189},{"type":20,"tag":157,"props":49785,"children":49786},{"style":254},[49787],{"type":25,"value":49640},{"type":20,"tag":157,"props":49789,"children":49790},{"style":892},[49791],{"type":25,"value":8926},{"type":20,"tag":157,"props":49793,"children":49794},{"class":159,"line":222},[49795],{"type":20,"tag":157,"props":49796,"children":49797},{"style":892},[49798],{"type":25,"value":872},{"type":20,"tag":157,"props":49800,"children":49801},{"class":159,"line":440},[49802],{"type":20,"tag":157,"props":49803,"children":49804},{"style":892},[49805],{"type":25,"value":40371},{"type":20,"tag":15759,"props":49807,"children":49809},{"id":49808},"typescript",[49810],{"type":25,"value":49811},"TypeScript",{"type":20,"tag":1863,"props":49813,"children":49815},{"id":49814},"初体验",[49816],{"type":25,"value":49814},{"type":20,"tag":21,"props":49818,"children":49819},{},[49820,49826,49827,49833],{"type":20,"tag":84,"props":49821,"children":49823},{"className":49822},[],[49824],{"type":25,"value":49825},"npm i typescript -g",{"type":25,"value":38084},{"type":20,"tag":84,"props":49828,"children":49830},{"className":49829},[],[49831],{"type":25,"value":49832},"tsc xxx.ts -w",{"type":25,"value":49834},"   将ts文件转换成js文件",{"type":20,"tag":21,"props":49836,"children":49837},{},[49838,49844],{"type":20,"tag":84,"props":49839,"children":49841},{"className":49840},[],[49842],{"type":25,"value":49843},"tsc --init",{"type":25,"value":49845},"：生成tsconfig.json",{"type":20,"tag":1863,"props":49847,"children":49849},{"id":49848},"ts特有的数据类型",[49850],{"type":25,"value":49851},"TS特有的数据类型",{"type":20,"tag":5719,"props":49853,"children":49854},{},[49855,49860],{"type":20,"tag":48,"props":49856,"children":49857},{},[49858],{"type":25,"value":49859},"never：用不存在的值",{"type":20,"tag":48,"props":49861,"children":49862},{},[49863],{"type":25,"value":49864},"any：任意类型",{"type":20,"tag":126,"props":49866,"children":49869},{"className":49867,"code":49868,"language":49808,"meta":8,"style":8},"language-typescript shiki shiki-themes github-dark","let a: any = \"string\"\na = 123\na.map(() => {  \u002F\u002F 这句不会报错\n    \n})\n",[49870],{"type":20,"tag":84,"props":49871,"children":49872},{"__ignoreMap":8},[49873,49903,49920,49951,49958],{"type":20,"tag":157,"props":49874,"children":49875},{"class":159,"line":160},[49876,49880,49885,49889,49894,49898],{"type":20,"tag":157,"props":49877,"children":49878},{"style":39166},[49879],{"type":25,"value":39240},{"type":20,"tag":157,"props":49881,"children":49882},{"style":892},[49883],{"type":25,"value":49884}," a",{"type":20,"tag":157,"props":49886,"children":49887},{"style":39166},[49888],{"type":25,"value":40615},{"type":20,"tag":157,"props":49890,"children":49891},{"style":260},[49892],{"type":25,"value":49893}," any",{"type":20,"tag":157,"props":49895,"children":49896},{"style":39166},[49897],{"type":25,"value":39179},{"type":20,"tag":157,"props":49899,"children":49900},{"style":254},[49901],{"type":25,"value":49902}," \"string\"\n",{"type":20,"tag":157,"props":49904,"children":49905},{"class":159,"line":169},[49906,49911,49915],{"type":20,"tag":157,"props":49907,"children":49908},{"style":892},[49909],{"type":25,"value":49910},"a ",{"type":20,"tag":157,"props":49912,"children":49913},{"style":39166},[49914],{"type":25,"value":2261},{"type":20,"tag":157,"props":49916,"children":49917},{"style":260},[49918],{"type":25,"value":49919}," 123\n",{"type":20,"tag":157,"props":49921,"children":49922},{"class":159,"line":179},[49923,49928,49933,49937,49941,49946],{"type":20,"tag":157,"props":49924,"children":49925},{"style":892},[49926],{"type":25,"value":49927},"a.",{"type":20,"tag":157,"props":49929,"children":49930},{"style":248},[49931],{"type":25,"value":49932},"map",{"type":20,"tag":157,"props":49934,"children":49935},{"style":892},[49936],{"type":25,"value":39890},{"type":20,"tag":157,"props":49938,"children":49939},{"style":39166},[49940],{"type":25,"value":39895},{"type":20,"tag":157,"props":49942,"children":49943},{"style":892},[49944],{"type":25,"value":49945}," {  ",{"type":20,"tag":157,"props":49947,"children":49948},{"style":9628},[49949],{"type":25,"value":49950},"\u002F\u002F 这句不会报错\n",{"type":20,"tag":157,"props":49952,"children":49953},{"class":159,"line":188},[49954],{"type":20,"tag":157,"props":49955,"children":49956},{"style":892},[49957],{"type":25,"value":30680},{"type":20,"tag":157,"props":49959,"children":49960},{"class":159,"line":196},[49961],{"type":20,"tag":157,"props":49962,"children":49963},{"style":892},[49964],{"type":25,"value":40371},{"type":20,"tag":5719,"props":49966,"children":49967},{"start":179},[49968],{"type":20,"tag":48,"props":49969,"children":49970},{},[49971],{"type":25,"value":49972},"unknow：any类型对应的安全类型",{"type":20,"tag":126,"props":49974,"children":49976},{"className":49867,"code":49975,"language":49808,"meta":8,"style":8},"let a: unknown = \"string\"\na = 123\na.map(() => {  \u002F\u002F这句会报错\n    \n})\n",[49977],{"type":20,"tag":84,"props":49978,"children":49979},{"__ignoreMap":8},[49980,50008,50023,50051,50058],{"type":20,"tag":157,"props":49981,"children":49982},{"class":159,"line":160},[49983,49987,49991,49995,50000,50004],{"type":20,"tag":157,"props":49984,"children":49985},{"style":39166},[49986],{"type":25,"value":39240},{"type":20,"tag":157,"props":49988,"children":49989},{"style":892},[49990],{"type":25,"value":49884},{"type":20,"tag":157,"props":49992,"children":49993},{"style":39166},[49994],{"type":25,"value":40615},{"type":20,"tag":157,"props":49996,"children":49997},{"style":260},[49998],{"type":25,"value":49999}," unknown",{"type":20,"tag":157,"props":50001,"children":50002},{"style":39166},[50003],{"type":25,"value":39179},{"type":20,"tag":157,"props":50005,"children":50006},{"style":254},[50007],{"type":25,"value":49902},{"type":20,"tag":157,"props":50009,"children":50010},{"class":159,"line":169},[50011,50015,50019],{"type":20,"tag":157,"props":50012,"children":50013},{"style":892},[50014],{"type":25,"value":49910},{"type":20,"tag":157,"props":50016,"children":50017},{"style":39166},[50018],{"type":25,"value":2261},{"type":20,"tag":157,"props":50020,"children":50021},{"style":260},[50022],{"type":25,"value":49919},{"type":20,"tag":157,"props":50024,"children":50025},{"class":159,"line":179},[50026,50030,50034,50038,50042,50046],{"type":20,"tag":157,"props":50027,"children":50028},{"style":892},[50029],{"type":25,"value":49927},{"type":20,"tag":157,"props":50031,"children":50032},{"style":248},[50033],{"type":25,"value":49932},{"type":20,"tag":157,"props":50035,"children":50036},{"style":892},[50037],{"type":25,"value":39890},{"type":20,"tag":157,"props":50039,"children":50040},{"style":39166},[50041],{"type":25,"value":39895},{"type":20,"tag":157,"props":50043,"children":50044},{"style":892},[50045],{"type":25,"value":49945},{"type":20,"tag":157,"props":50047,"children":50048},{"style":9628},[50049],{"type":25,"value":50050},"\u002F\u002F这句会报错\n",{"type":20,"tag":157,"props":50052,"children":50053},{"class":159,"line":188},[50054],{"type":20,"tag":157,"props":50055,"children":50056},{"style":892},[50057],{"type":25,"value":30680},{"type":20,"tag":157,"props":50059,"children":50060},{"class":159,"line":196},[50061],{"type":20,"tag":157,"props":50062,"children":50063},{"style":892},[50064],{"type":25,"value":40371},{"type":20,"tag":1863,"props":50066,"children":50068},{"id":50067},"断言与非空断言",[50069],{"type":25,"value":50067},{"type":20,"tag":126,"props":50071,"children":50073},{"className":49867,"code":50072,"language":49808,"meta":8,"style":8},"\u002F\u002F 断言\nconst a = undefined\nconsole.log((a as []).length)\n\n\n\u002F\u002F 非空断言 !， 断言a肯定非空\nconst a: number | undefined = undefined\na!.length\n",[50074],{"type":20,"tag":84,"props":50075,"children":50076},{"__ignoreMap":8},[50077,50085,50105,50140,50147,50154,50162,50199],{"type":20,"tag":157,"props":50078,"children":50079},{"class":159,"line":160},[50080],{"type":20,"tag":157,"props":50081,"children":50082},{"style":9628},[50083],{"type":25,"value":50084},"\u002F\u002F 断言\n",{"type":20,"tag":157,"props":50086,"children":50087},{"class":159,"line":169},[50088,50092,50096,50100],{"type":20,"tag":157,"props":50089,"children":50090},{"style":39166},[50091],{"type":25,"value":39169},{"type":20,"tag":157,"props":50093,"children":50094},{"style":260},[50095],{"type":25,"value":49884},{"type":20,"tag":157,"props":50097,"children":50098},{"style":39166},[50099],{"type":25,"value":39179},{"type":20,"tag":157,"props":50101,"children":50102},{"style":260},[50103],{"type":25,"value":50104}," undefined\n",{"type":20,"tag":157,"props":50106,"children":50107},{"class":159,"line":179},[50108,50113,50117,50122,50126,50131,50136],{"type":20,"tag":157,"props":50109,"children":50110},{"style":892},[50111],{"type":25,"value":50112},"console.",{"type":20,"tag":157,"props":50114,"children":50115},{"style":248},[50116],{"type":25,"value":42157},{"type":20,"tag":157,"props":50118,"children":50119},{"style":892},[50120],{"type":25,"value":50121},"((a ",{"type":20,"tag":157,"props":50123,"children":50124},{"style":39166},[50125],{"type":25,"value":40705},{"type":20,"tag":157,"props":50127,"children":50128},{"style":892},[50129],{"type":25,"value":50130}," []).",{"type":20,"tag":157,"props":50132,"children":50133},{"style":260},[50134],{"type":25,"value":50135},"length",{"type":20,"tag":157,"props":50137,"children":50138},{"style":892},[50139],{"type":25,"value":8926},{"type":20,"tag":157,"props":50141,"children":50142},{"class":159,"line":188},[50143],{"type":20,"tag":157,"props":50144,"children":50145},{"emptyLinePlaceholder":173},[50146],{"type":25,"value":176},{"type":20,"tag":157,"props":50148,"children":50149},{"class":159,"line":196},[50150],{"type":20,"tag":157,"props":50151,"children":50152},{"emptyLinePlaceholder":173},[50153],{"type":25,"value":176},{"type":20,"tag":157,"props":50155,"children":50156},{"class":159,"line":204},[50157],{"type":20,"tag":157,"props":50158,"children":50159},{"style":9628},[50160],{"type":25,"value":50161},"\u002F\u002F 非空断言 !， 断言a肯定非空\n",{"type":20,"tag":157,"props":50163,"children":50164},{"class":159,"line":213},[50165,50169,50173,50177,50182,50186,50191,50195],{"type":20,"tag":157,"props":50166,"children":50167},{"style":39166},[50168],{"type":25,"value":39169},{"type":20,"tag":157,"props":50170,"children":50171},{"style":260},[50172],{"type":25,"value":49884},{"type":20,"tag":157,"props":50174,"children":50175},{"style":39166},[50176],{"type":25,"value":40615},{"type":20,"tag":157,"props":50178,"children":50179},{"style":260},[50180],{"type":25,"value":50181}," number",{"type":20,"tag":157,"props":50183,"children":50184},{"style":39166},[50185],{"type":25,"value":39852},{"type":20,"tag":157,"props":50187,"children":50188},{"style":260},[50189],{"type":25,"value":50190}," undefined",{"type":20,"tag":157,"props":50192,"children":50193},{"style":39166},[50194],{"type":25,"value":39179},{"type":20,"tag":157,"props":50196,"children":50197},{"style":260},[50198],{"type":25,"value":50104},{"type":20,"tag":157,"props":50200,"children":50201},{"class":159,"line":222},[50202,50206,50210,50214],{"type":20,"tag":157,"props":50203,"children":50204},{"style":892},[50205],{"type":25,"value":101},{"type":20,"tag":157,"props":50207,"children":50208},{"style":39166},[50209],{"type":25,"value":40723},{"type":20,"tag":157,"props":50211,"children":50212},{"style":892},[50213],{"type":25,"value":40175},{"type":20,"tag":157,"props":50215,"children":50216},{"style":260},[50217],{"type":25,"value":50218},"length\n",{"type":20,"tag":1863,"props":50220,"children":50222},{"id":50221},"nullish-coalescing",[50223],{"type":25,"value":50224},"nullish coalescing",{"type":20,"tag":21,"props":50226,"children":50227},{},[50228],{"type":25,"value":50229},"nulllish coalescing只判断 null 与 undefined，",{"type":20,"tag":21,"props":50231,"children":50232},{},[50233,50235],{"type":25,"value":50234},"|| 或，",{"type":20,"tag":39084,"props":50236,"children":50238},{"style":50237},"color:rgb(25, 27, 31);",[50239],{"type":25,"value":50240},"通过判断布尔真值。",{"type":20,"tag":126,"props":50242,"children":50244},{"className":38861,"code":50243,"language":38863,"meta":8,"style":8},"const user = {\n    name: \"John\",\n    address: {\n        city: false\n    }\n}\n\n\u002F\u002F user、address、city 每一层为undefined或null，直接返回undefined，\nconst cityName1 = user?.address?.city ?? \"unknown\";\nconst cityName2 = false || '123'\nconsole.log(cityName1);  \u002F\u002F false\nconsole.log(cityName2);  \u002F\u002F 123\n",[50245],{"type":20,"tag":84,"props":50246,"children":50247},{"__ignoreMap":8},[50248,50256,50277,50285,50293,50300,50307,50314,50322,50345,50353,50361],{"type":20,"tag":157,"props":50249,"children":50250},{"class":159,"line":160},[50251],{"type":20,"tag":157,"props":50252,"children":50253},{"style":892},[50254],{"type":25,"value":50255},"const user = {\n",{"type":20,"tag":157,"props":50257,"children":50258},{"class":159,"line":169},[50259,50264,50268,50273],{"type":20,"tag":157,"props":50260,"children":50261},{"style":260},[50262],{"type":25,"value":50263},"    name",{"type":20,"tag":157,"props":50265,"children":50266},{"style":892},[50267],{"type":25,"value":908},{"type":20,"tag":157,"props":50269,"children":50270},{"style":254},[50271],{"type":25,"value":50272},"\"John\"",{"type":20,"tag":157,"props":50274,"children":50275},{"style":892},[50276],{"type":25,"value":918},{"type":20,"tag":157,"props":50278,"children":50279},{"class":159,"line":179},[50280],{"type":20,"tag":157,"props":50281,"children":50282},{"style":892},[50283],{"type":25,"value":50284},"    address: {\n",{"type":20,"tag":157,"props":50286,"children":50287},{"class":159,"line":188},[50288],{"type":20,"tag":157,"props":50289,"children":50290},{"style":892},[50291],{"type":25,"value":50292},"        city: false\n",{"type":20,"tag":157,"props":50294,"children":50295},{"class":159,"line":196},[50296],{"type":20,"tag":157,"props":50297,"children":50298},{"style":892},[50299],{"type":25,"value":872},{"type":20,"tag":157,"props":50301,"children":50302},{"class":159,"line":204},[50303],{"type":20,"tag":157,"props":50304,"children":50305},{"style":892},[50306],{"type":25,"value":943},{"type":20,"tag":157,"props":50308,"children":50309},{"class":159,"line":213},[50310],{"type":20,"tag":157,"props":50311,"children":50312},{"emptyLinePlaceholder":173},[50313],{"type":25,"value":176},{"type":20,"tag":157,"props":50315,"children":50316},{"class":159,"line":222},[50317],{"type":20,"tag":157,"props":50318,"children":50319},{"style":892},[50320],{"type":25,"value":50321},"\u002F\u002F user、address、city 每一层为undefined或null，直接返回undefined，\n",{"type":20,"tag":157,"props":50323,"children":50324},{"class":159,"line":440},[50325,50330,50335,50340],{"type":20,"tag":157,"props":50326,"children":50327},{"style":892},[50328],{"type":25,"value":50329},"const cityName1 = user?",{"type":20,"tag":157,"props":50331,"children":50332},{"style":41203},[50333],{"type":25,"value":50334},".address?",{"type":20,"tag":157,"props":50336,"children":50337},{"style":248},[50338],{"type":25,"value":50339},".city",{"type":20,"tag":157,"props":50341,"children":50342},{"style":892},[50343],{"type":25,"value":50344}," ?? \"unknown\";\n",{"type":20,"tag":157,"props":50346,"children":50347},{"class":159,"line":448},[50348],{"type":20,"tag":157,"props":50349,"children":50350},{"style":892},[50351],{"type":25,"value":50352},"const cityName2 = false || '123'\n",{"type":20,"tag":157,"props":50354,"children":50355},{"class":159,"line":456},[50356],{"type":20,"tag":157,"props":50357,"children":50358},{"style":892},[50359],{"type":25,"value":50360},"console.log(cityName1);  \u002F\u002F false\n",{"type":20,"tag":157,"props":50362,"children":50363},{"class":159,"line":465},[50364],{"type":20,"tag":157,"props":50365,"children":50366},{"style":892},[50367],{"type":25,"value":50368},"console.log(cityName2);  \u002F\u002F 123\n",{"type":20,"tag":1863,"props":50370,"children":50372},{"id":50371},"数组与元祖",[50373],{"type":25,"value":50371},{"type":20,"tag":28,"props":50375,"children":50377},{"id":50376},"数组",[50378],{"type":25,"value":50376},{"type":20,"tag":126,"props":50380,"children":50382},{"className":38826,"code":50381,"language":38828,"meta":8,"style":8},"1.  const  arr1: (number | string)[] = {123, \"string\"}\n\n2.  const arr2: Array\u003Cnumber> = [1, 2, 3 ]\n",[50383],{"type":20,"tag":84,"props":50384,"children":50385},{"__ignoreMap":8},[50386,50394,50401],{"type":20,"tag":157,"props":50387,"children":50388},{"class":159,"line":160},[50389],{"type":20,"tag":157,"props":50390,"children":50391},{},[50392],{"type":25,"value":50393},"1.  const  arr1: (number | string)[] = {123, \"string\"}\n",{"type":20,"tag":157,"props":50395,"children":50396},{"class":159,"line":169},[50397],{"type":20,"tag":157,"props":50398,"children":50399},{"emptyLinePlaceholder":173},[50400],{"type":25,"value":176},{"type":20,"tag":157,"props":50402,"children":50403},{"class":159,"line":179},[50404],{"type":20,"tag":157,"props":50405,"children":50406},{},[50407],{"type":25,"value":50408},"2.  const arr2: Array\u003Cnumber> = [1, 2, 3 ]\n",{"type":20,"tag":28,"props":50410,"children":50412},{"id":50411},"元祖",[50413],{"type":25,"value":50411},{"type":20,"tag":21,"props":50415,"children":50416},{},[50417],{"type":25,"value":50418},"元祖类型允许表示一个已知元素数量类型和类型的数组，各元素的类型不必相同",{"type":20,"tag":126,"props":50420,"children":50422},{"className":38826,"code":50421,"language":38828,"meta":8,"style":8},"const arr3: [number, string] = [1, \"hello\"]\n\narr3[2] = 2 \u002F\u002F eror\n",[50423],{"type":20,"tag":84,"props":50424,"children":50425},{"__ignoreMap":8},[50426,50434,50441],{"type":20,"tag":157,"props":50427,"children":50428},{"class":159,"line":160},[50429],{"type":20,"tag":157,"props":50430,"children":50431},{},[50432],{"type":25,"value":50433},"const arr3: [number, string] = [1, \"hello\"]\n",{"type":20,"tag":157,"props":50435,"children":50436},{"class":159,"line":169},[50437],{"type":20,"tag":157,"props":50438,"children":50439},{"emptyLinePlaceholder":173},[50440],{"type":25,"value":176},{"type":20,"tag":157,"props":50442,"children":50443},{"class":159,"line":179},[50444],{"type":20,"tag":157,"props":50445,"children":50446},{},[50447],{"type":25,"value":50448},"arr3[2] = 2 \u002F\u002F eror\n",{"type":20,"tag":1863,"props":50450,"children":50452},{"id":50451},"索引签名",[50453],{"type":25,"value":50451},{"type":20,"tag":6665,"props":50455,"children":50456},{},[50457],{"type":20,"tag":21,"props":50458,"children":50459},{},[50460],{"type":25,"value":50461},"后端传过来的数据不确定是什么，我们定义类型的时候就可以使用索引签名",{"type":20,"tag":28,"props":50463,"children":50465},{"id":50464},"对象索引签名",[50466],{"type":25,"value":50464},{"type":20,"tag":21,"props":50468,"children":50469},{},[50470],{"type":25,"value":50471},"对象索引用string类型",{"type":20,"tag":126,"props":50473,"children":50475},{"className":49867,"code":50474,"language":49808,"meta":8,"style":8},"type A = {\n    username: string\n    age?: number\n    [index: string]: any\n}\n\nconst a: A = {\n    username: \"张三\",\n    age: 12,\n    sex: \"男\",\n    other: 1\n}\n",[50476],{"type":20,"tag":84,"props":50477,"children":50478},{"__ignoreMap":8},[50479,50500,50517,50535,50552,50559,50566,50593,50610,50627,50644,50657],{"type":20,"tag":157,"props":50480,"children":50481},{"class":159,"line":160},[50482,50487,50492,50496],{"type":20,"tag":157,"props":50483,"children":50484},{"style":39166},[50485],{"type":25,"value":50486},"type",{"type":20,"tag":157,"props":50488,"children":50489},{"style":248},[50490],{"type":25,"value":50491}," A",{"type":20,"tag":157,"props":50493,"children":50494},{"style":39166},[50495],{"type":25,"value":39179},{"type":20,"tag":157,"props":50497,"children":50498},{"style":892},[50499],{"type":25,"value":38885},{"type":20,"tag":157,"props":50501,"children":50502},{"class":159,"line":169},[50503,50508,50512],{"type":20,"tag":157,"props":50504,"children":50505},{"style":6410},[50506],{"type":25,"value":50507},"    username",{"type":20,"tag":157,"props":50509,"children":50510},{"style":39166},[50511],{"type":25,"value":40615},{"type":20,"tag":157,"props":50513,"children":50514},{"style":260},[50515],{"type":25,"value":50516}," string\n",{"type":20,"tag":157,"props":50518,"children":50519},{"class":159,"line":179},[50520,50525,50530],{"type":20,"tag":157,"props":50521,"children":50522},{"style":6410},[50523],{"type":25,"value":50524},"    age",{"type":20,"tag":157,"props":50526,"children":50527},{"style":39166},[50528],{"type":25,"value":50529},"?:",{"type":20,"tag":157,"props":50531,"children":50532},{"style":260},[50533],{"type":25,"value":50534}," number\n",{"type":20,"tag":157,"props":50536,"children":50537},{"class":159,"line":188},[50538,50543,50547],{"type":20,"tag":157,"props":50539,"children":50540},{"style":892},[50541],{"type":25,"value":50542},"    [index: string]",{"type":20,"tag":157,"props":50544,"children":50545},{"style":39166},[50546],{"type":25,"value":40615},{"type":20,"tag":157,"props":50548,"children":50549},{"style":260},[50550],{"type":25,"value":50551}," any\n",{"type":20,"tag":157,"props":50553,"children":50554},{"class":159,"line":196},[50555],{"type":20,"tag":157,"props":50556,"children":50557},{"style":892},[50558],{"type":25,"value":943},{"type":20,"tag":157,"props":50560,"children":50561},{"class":159,"line":204},[50562],{"type":20,"tag":157,"props":50563,"children":50564},{"emptyLinePlaceholder":173},[50565],{"type":25,"value":176},{"type":20,"tag":157,"props":50567,"children":50568},{"class":159,"line":213},[50569,50573,50577,50581,50585,50589],{"type":20,"tag":157,"props":50570,"children":50571},{"style":39166},[50572],{"type":25,"value":39169},{"type":20,"tag":157,"props":50574,"children":50575},{"style":260},[50576],{"type":25,"value":49884},{"type":20,"tag":157,"props":50578,"children":50579},{"style":39166},[50580],{"type":25,"value":40615},{"type":20,"tag":157,"props":50582,"children":50583},{"style":248},[50584],{"type":25,"value":50491},{"type":20,"tag":157,"props":50586,"children":50587},{"style":39166},[50588],{"type":25,"value":39179},{"type":20,"tag":157,"props":50590,"children":50591},{"style":892},[50592],{"type":25,"value":38885},{"type":20,"tag":157,"props":50594,"children":50595},{"class":159,"line":222},[50596,50601,50606],{"type":20,"tag":157,"props":50597,"children":50598},{"style":892},[50599],{"type":25,"value":50600},"    username: ",{"type":20,"tag":157,"props":50602,"children":50603},{"style":254},[50604],{"type":25,"value":50605},"\"张三\"",{"type":20,"tag":157,"props":50607,"children":50608},{"style":892},[50609],{"type":25,"value":918},{"type":20,"tag":157,"props":50611,"children":50612},{"class":159,"line":440},[50613,50618,50623],{"type":20,"tag":157,"props":50614,"children":50615},{"style":892},[50616],{"type":25,"value":50617},"    age: ",{"type":20,"tag":157,"props":50619,"children":50620},{"style":260},[50621],{"type":25,"value":50622},"12",{"type":20,"tag":157,"props":50624,"children":50625},{"style":892},[50626],{"type":25,"value":918},{"type":20,"tag":157,"props":50628,"children":50629},{"class":159,"line":448},[50630,50635,50640],{"type":20,"tag":157,"props":50631,"children":50632},{"style":892},[50633],{"type":25,"value":50634},"    sex: ",{"type":20,"tag":157,"props":50636,"children":50637},{"style":254},[50638],{"type":25,"value":50639},"\"男\"",{"type":20,"tag":157,"props":50641,"children":50642},{"style":892},[50643],{"type":25,"value":918},{"type":20,"tag":157,"props":50645,"children":50646},{"class":159,"line":456},[50647,50652],{"type":20,"tag":157,"props":50648,"children":50649},{"style":892},[50650],{"type":25,"value":50651},"    other: ",{"type":20,"tag":157,"props":50653,"children":50654},{"style":260},[50655],{"type":25,"value":50656},"1\n",{"type":20,"tag":157,"props":50658,"children":50659},{"class":159,"line":465},[50660],{"type":20,"tag":157,"props":50661,"children":50662},{"style":892},[50663],{"type":25,"value":943},{"type":20,"tag":28,"props":50665,"children":50667},{"id":50666},"数组索引签名",[50668],{"type":25,"value":50666},{"type":20,"tag":21,"props":50670,"children":50671},{},[50672],{"type":25,"value":50673},"数组索引用number类型",{"type":20,"tag":126,"props":50675,"children":50677},{"className":38826,"code":50676,"language":38828,"meta":8,"style":8},"type A = {\n    [index: number]: any\n}\n\nconst a: A = [1, 2, 3, \"zhangsan\"]\n",[50678],{"type":20,"tag":84,"props":50679,"children":50680},{"__ignoreMap":8},[50681,50689,50697,50704,50711],{"type":20,"tag":157,"props":50682,"children":50683},{"class":159,"line":160},[50684],{"type":20,"tag":157,"props":50685,"children":50686},{},[50687],{"type":25,"value":50688},"type A = {\n",{"type":20,"tag":157,"props":50690,"children":50691},{"class":159,"line":169},[50692],{"type":20,"tag":157,"props":50693,"children":50694},{},[50695],{"type":25,"value":50696},"    [index: number]: any\n",{"type":20,"tag":157,"props":50698,"children":50699},{"class":159,"line":179},[50700],{"type":20,"tag":157,"props":50701,"children":50702},{},[50703],{"type":25,"value":943},{"type":20,"tag":157,"props":50705,"children":50706},{"class":159,"line":188},[50707],{"type":20,"tag":157,"props":50708,"children":50709},{"emptyLinePlaceholder":173},[50710],{"type":25,"value":176},{"type":20,"tag":157,"props":50712,"children":50713},{"class":159,"line":196},[50714],{"type":20,"tag":157,"props":50715,"children":50716},{},[50717],{"type":25,"value":50718},"const a: A = [1, 2, 3, \"zhangsan\"]\n",{"type":20,"tag":28,"props":50720,"children":50722},{"id":50721},"小技巧-1",[50723],{"type":25,"value":39269},{"type":20,"tag":21,"props":50725,"children":50726},{},[50727],{"type":25,"value":50728},"可以使用断言让对象初始值为空，并且限制对象的类型",{"type":20,"tag":126,"props":50730,"children":50732},{"className":38826,"code":50731,"language":38828,"meta":8,"style":8},"type A = {\n    username: string\n    age?: number\n}\n\u002F\u002F const a: A = {}  error  \nconst a = {} as A\n\na.sex = \"男\"  \u002F\u002F error\n",[50733],{"type":20,"tag":84,"props":50734,"children":50735},{"__ignoreMap":8},[50736,50743,50751,50759,50766,50774,50782,50789],{"type":20,"tag":157,"props":50737,"children":50738},{"class":159,"line":160},[50739],{"type":20,"tag":157,"props":50740,"children":50741},{},[50742],{"type":25,"value":50688},{"type":20,"tag":157,"props":50744,"children":50745},{"class":159,"line":169},[50746],{"type":20,"tag":157,"props":50747,"children":50748},{},[50749],{"type":25,"value":50750},"    username: string\n",{"type":20,"tag":157,"props":50752,"children":50753},{"class":159,"line":179},[50754],{"type":20,"tag":157,"props":50755,"children":50756},{},[50757],{"type":25,"value":50758},"    age?: number\n",{"type":20,"tag":157,"props":50760,"children":50761},{"class":159,"line":188},[50762],{"type":20,"tag":157,"props":50763,"children":50764},{},[50765],{"type":25,"value":943},{"type":20,"tag":157,"props":50767,"children":50768},{"class":159,"line":196},[50769],{"type":20,"tag":157,"props":50770,"children":50771},{},[50772],{"type":25,"value":50773},"\u002F\u002F const a: A = {}  error  \n",{"type":20,"tag":157,"props":50775,"children":50776},{"class":159,"line":204},[50777],{"type":20,"tag":157,"props":50778,"children":50779},{},[50780],{"type":25,"value":50781},"const a = {} as A\n",{"type":20,"tag":157,"props":50783,"children":50784},{"class":159,"line":213},[50785],{"type":20,"tag":157,"props":50786,"children":50787},{"emptyLinePlaceholder":173},[50788],{"type":25,"value":176},{"type":20,"tag":157,"props":50790,"children":50791},{"class":159,"line":222},[50792],{"type":20,"tag":157,"props":50793,"children":50794},{},[50795],{"type":25,"value":50796},"a.sex = \"男\"  \u002F\u002F error\n",{"type":20,"tag":1863,"props":50798,"children":50800},{"id":50799},"函数重载与可调用注解",[50801],{"type":25,"value":50799},{"type":20,"tag":28,"props":50803,"children":50805},{"id":50804},"函数重载",[50806],{"type":25,"value":50804},{"type":20,"tag":6665,"props":50808,"children":50809},{},[50810],{"type":20,"tag":21,"props":50811,"children":50812},{},[50813],{"type":25,"value":50814},"函数重载是只函数约束传入不用的参数，返回不同类型的数据，而且可以清晰的知道传入不同的参数得到不同的结果",{"type":20,"tag":126,"props":50816,"children":50818},{"className":49867,"code":50817,"language":49808,"meta":8,"style":8},"function foo(n: number, m: string): any\nfunction foo(n: number, m: number): any\nfunction foo(n: string|number, number|string) {\n\n}\n\nfoo(1,2)\nfoo(\"张三\", \"李四\")\nfoo(1, \"张三\")  \u002F\u002F error\n",[50819],{"type":20,"tag":84,"props":50820,"children":50821},{"__ignoreMap":8},[50822,50882,50937,50995,51002,51009,51016,51044,51072],{"type":20,"tag":157,"props":50823,"children":50824},{"class":159,"line":160},[50825,50830,50835,50839,50844,50848,50852,50856,50861,50865,50870,50874,50878],{"type":20,"tag":157,"props":50826,"children":50827},{"style":39166},[50828],{"type":25,"value":50829},"function",{"type":20,"tag":157,"props":50831,"children":50832},{"style":248},[50833],{"type":25,"value":50834}," foo",{"type":20,"tag":157,"props":50836,"children":50837},{"style":892},[50838],{"type":25,"value":39189},{"type":20,"tag":157,"props":50840,"children":50841},{"style":6410},[50842],{"type":25,"value":50843},"n",{"type":20,"tag":157,"props":50845,"children":50846},{"style":39166},[50847],{"type":25,"value":40615},{"type":20,"tag":157,"props":50849,"children":50850},{"style":260},[50851],{"type":25,"value":50181},{"type":20,"tag":157,"props":50853,"children":50854},{"style":892},[50855],{"type":25,"value":42626},{"type":20,"tag":157,"props":50857,"children":50858},{"style":6410},[50859],{"type":25,"value":50860},"m",{"type":20,"tag":157,"props":50862,"children":50863},{"style":39166},[50864],{"type":25,"value":40615},{"type":20,"tag":157,"props":50866,"children":50867},{"style":260},[50868],{"type":25,"value":50869}," string",{"type":20,"tag":157,"props":50871,"children":50872},{"style":892},[50873],{"type":25,"value":37479},{"type":20,"tag":157,"props":50875,"children":50876},{"style":39166},[50877],{"type":25,"value":40615},{"type":20,"tag":157,"props":50879,"children":50880},{"style":260},[50881],{"type":25,"value":50551},{"type":20,"tag":157,"props":50883,"children":50884},{"class":159,"line":169},[50885,50889,50893,50897,50901,50905,50909,50913,50917,50921,50925,50929,50933],{"type":20,"tag":157,"props":50886,"children":50887},{"style":39166},[50888],{"type":25,"value":50829},{"type":20,"tag":157,"props":50890,"children":50891},{"style":248},[50892],{"type":25,"value":50834},{"type":20,"tag":157,"props":50894,"children":50895},{"style":892},[50896],{"type":25,"value":39189},{"type":20,"tag":157,"props":50898,"children":50899},{"style":6410},[50900],{"type":25,"value":50843},{"type":20,"tag":157,"props":50902,"children":50903},{"style":39166},[50904],{"type":25,"value":40615},{"type":20,"tag":157,"props":50906,"children":50907},{"style":260},[50908],{"type":25,"value":50181},{"type":20,"tag":157,"props":50910,"children":50911},{"style":892},[50912],{"type":25,"value":42626},{"type":20,"tag":157,"props":50914,"children":50915},{"style":6410},[50916],{"type":25,"value":50860},{"type":20,"tag":157,"props":50918,"children":50919},{"style":39166},[50920],{"type":25,"value":40615},{"type":20,"tag":157,"props":50922,"children":50923},{"style":260},[50924],{"type":25,"value":50181},{"type":20,"tag":157,"props":50926,"children":50927},{"style":892},[50928],{"type":25,"value":37479},{"type":20,"tag":157,"props":50930,"children":50931},{"style":39166},[50932],{"type":25,"value":40615},{"type":20,"tag":157,"props":50934,"children":50935},{"style":260},[50936],{"type":25,"value":50551},{"type":20,"tag":157,"props":50938,"children":50939},{"class":159,"line":179},[50940,50944,50948,50952,50956,50960,50964,50969,50974,50978,50982,50986,50991],{"type":20,"tag":157,"props":50941,"children":50942},{"style":39166},[50943],{"type":25,"value":50829},{"type":20,"tag":157,"props":50945,"children":50946},{"style":248},[50947],{"type":25,"value":50834},{"type":20,"tag":157,"props":50949,"children":50950},{"style":892},[50951],{"type":25,"value":39189},{"type":20,"tag":157,"props":50953,"children":50954},{"style":6410},[50955],{"type":25,"value":50843},{"type":20,"tag":157,"props":50957,"children":50958},{"style":39166},[50959],{"type":25,"value":40615},{"type":20,"tag":157,"props":50961,"children":50962},{"style":260},[50963],{"type":25,"value":50869},{"type":20,"tag":157,"props":50965,"children":50966},{"style":39166},[50967],{"type":25,"value":50968},"|",{"type":20,"tag":157,"props":50970,"children":50971},{"style":260},[50972],{"type":25,"value":50973},"number",{"type":20,"tag":157,"props":50975,"children":50976},{"style":892},[50977],{"type":25,"value":42626},{"type":20,"tag":157,"props":50979,"children":50980},{"style":6410},[50981],{"type":25,"value":50973},{"type":20,"tag":157,"props":50983,"children":50984},{"style":892},[50985],{"type":25,"value":50968},{"type":20,"tag":157,"props":50987,"children":50988},{"style":6410},[50989],{"type":25,"value":50990},"string",{"type":20,"tag":157,"props":50992,"children":50993},{"style":892},[50994],{"type":25,"value":41031},{"type":20,"tag":157,"props":50996,"children":50997},{"class":159,"line":188},[50998],{"type":20,"tag":157,"props":50999,"children":51000},{"emptyLinePlaceholder":173},[51001],{"type":25,"value":176},{"type":20,"tag":157,"props":51003,"children":51004},{"class":159,"line":196},[51005],{"type":20,"tag":157,"props":51006,"children":51007},{"style":892},[51008],{"type":25,"value":943},{"type":20,"tag":157,"props":51010,"children":51011},{"class":159,"line":204},[51012],{"type":20,"tag":157,"props":51013,"children":51014},{"emptyLinePlaceholder":173},[51015],{"type":25,"value":176},{"type":20,"tag":157,"props":51017,"children":51018},{"class":159,"line":213},[51019,51024,51028,51032,51036,51040],{"type":20,"tag":157,"props":51020,"children":51021},{"style":248},[51022],{"type":25,"value":51023},"foo",{"type":20,"tag":157,"props":51025,"children":51026},{"style":892},[51027],{"type":25,"value":39189},{"type":20,"tag":157,"props":51029,"children":51030},{"style":260},[51031],{"type":25,"value":10379},{"type":20,"tag":157,"props":51033,"children":51034},{"style":892},[51035],{"type":25,"value":42676},{"type":20,"tag":157,"props":51037,"children":51038},{"style":260},[51039],{"type":25,"value":43928},{"type":20,"tag":157,"props":51041,"children":51042},{"style":892},[51043],{"type":25,"value":8926},{"type":20,"tag":157,"props":51045,"children":51046},{"class":159,"line":222},[51047,51051,51055,51059,51063,51068],{"type":20,"tag":157,"props":51048,"children":51049},{"style":248},[51050],{"type":25,"value":51023},{"type":20,"tag":157,"props":51052,"children":51053},{"style":892},[51054],{"type":25,"value":39189},{"type":20,"tag":157,"props":51056,"children":51057},{"style":254},[51058],{"type":25,"value":50605},{"type":20,"tag":157,"props":51060,"children":51061},{"style":892},[51062],{"type":25,"value":42626},{"type":20,"tag":157,"props":51064,"children":51065},{"style":254},[51066],{"type":25,"value":51067},"\"李四\"",{"type":20,"tag":157,"props":51069,"children":51070},{"style":892},[51071],{"type":25,"value":8926},{"type":20,"tag":157,"props":51073,"children":51074},{"class":159,"line":440},[51075,51079,51083,51087,51091,51095,51100],{"type":20,"tag":157,"props":51076,"children":51077},{"style":248},[51078],{"type":25,"value":51023},{"type":20,"tag":157,"props":51080,"children":51081},{"style":892},[51082],{"type":25,"value":39189},{"type":20,"tag":157,"props":51084,"children":51085},{"style":260},[51086],{"type":25,"value":10379},{"type":20,"tag":157,"props":51088,"children":51089},{"style":892},[51090],{"type":25,"value":42626},{"type":20,"tag":157,"props":51092,"children":51093},{"style":254},[51094],{"type":25,"value":50605},{"type":20,"tag":157,"props":51096,"children":51097},{"style":892},[51098],{"type":25,"value":51099},")  ",{"type":20,"tag":157,"props":51101,"children":51102},{"style":9628},[51103],{"type":25,"value":51104},"\u002F\u002F error\n",{"type":20,"tag":28,"props":51106,"children":51108},{"id":51107},"可调用注解",[51109],{"type":25,"value":51107},{"type":20,"tag":126,"props":51111,"children":51113},{"className":49867,"code":51112,"language":49808,"meta":8,"style":8},"\u002F\u002F 定义函数类型\ntype A = () => void;\n\n\u002F\u002F 可调用注解定义函数类型，可以针对函数重载进行类型注解\n\ntype A = {\n  () => void\n}\n\nconst a: A = () => {}\n",[51114],{"type":20,"tag":84,"props":51115,"children":51116},{"__ignoreMap":8},[51117,51125,51157,51164,51172,51179,51198,51215,51222,51229],{"type":20,"tag":157,"props":51118,"children":51119},{"class":159,"line":160},[51120],{"type":20,"tag":157,"props":51121,"children":51122},{"style":9628},[51123],{"type":25,"value":51124},"\u002F\u002F 定义函数类型\n",{"type":20,"tag":157,"props":51126,"children":51127},{"class":159,"line":169},[51128,51132,51136,51140,51144,51148,51153],{"type":20,"tag":157,"props":51129,"children":51130},{"style":39166},[51131],{"type":25,"value":50486},{"type":20,"tag":157,"props":51133,"children":51134},{"style":248},[51135],{"type":25,"value":50491},{"type":20,"tag":157,"props":51137,"children":51138},{"style":39166},[51139],{"type":25,"value":39179},{"type":20,"tag":157,"props":51141,"children":51142},{"style":892},[51143],{"type":25,"value":40118},{"type":20,"tag":157,"props":51145,"children":51146},{"style":39166},[51147],{"type":25,"value":39895},{"type":20,"tag":157,"props":51149,"children":51150},{"style":260},[51151],{"type":25,"value":51152}," void",{"type":20,"tag":157,"props":51154,"children":51155},{"style":892},[51156],{"type":25,"value":38963},{"type":20,"tag":157,"props":51158,"children":51159},{"class":159,"line":179},[51160],{"type":20,"tag":157,"props":51161,"children":51162},{"emptyLinePlaceholder":173},[51163],{"type":25,"value":176},{"type":20,"tag":157,"props":51165,"children":51166},{"class":159,"line":188},[51167],{"type":20,"tag":157,"props":51168,"children":51169},{"style":9628},[51170],{"type":25,"value":51171},"\u002F\u002F 可调用注解定义函数类型，可以针对函数重载进行类型注解\n",{"type":20,"tag":157,"props":51173,"children":51174},{"class":159,"line":196},[51175],{"type":20,"tag":157,"props":51176,"children":51177},{"emptyLinePlaceholder":173},[51178],{"type":25,"value":176},{"type":20,"tag":157,"props":51180,"children":51181},{"class":159,"line":204},[51182,51186,51190,51194],{"type":20,"tag":157,"props":51183,"children":51184},{"style":39166},[51185],{"type":25,"value":50486},{"type":20,"tag":157,"props":51187,"children":51188},{"style":248},[51189],{"type":25,"value":50491},{"type":20,"tag":157,"props":51191,"children":51192},{"style":39166},[51193],{"type":25,"value":39179},{"type":20,"tag":157,"props":51195,"children":51196},{"style":892},[51197],{"type":25,"value":38885},{"type":20,"tag":157,"props":51199,"children":51200},{"class":159,"line":213},[51201,51206,51210],{"type":20,"tag":157,"props":51202,"children":51203},{"style":892},[51204],{"type":25,"value":51205},"  () ",{"type":20,"tag":157,"props":51207,"children":51208},{"style":39166},[51209],{"type":25,"value":39895},{"type":20,"tag":157,"props":51211,"children":51212},{"style":260},[51213],{"type":25,"value":51214}," void\n",{"type":20,"tag":157,"props":51216,"children":51217},{"class":159,"line":222},[51218],{"type":20,"tag":157,"props":51219,"children":51220},{"style":892},[51221],{"type":25,"value":943},{"type":20,"tag":157,"props":51223,"children":51224},{"class":159,"line":440},[51225],{"type":20,"tag":157,"props":51226,"children":51227},{"emptyLinePlaceholder":173},[51228],{"type":25,"value":176},{"type":20,"tag":157,"props":51230,"children":51231},{"class":159,"line":448},[51232,51236,51240,51244,51248,51252,51256,51260],{"type":20,"tag":157,"props":51233,"children":51234},{"style":39166},[51235],{"type":25,"value":39169},{"type":20,"tag":157,"props":51237,"children":51238},{"style":248},[51239],{"type":25,"value":49884},{"type":20,"tag":157,"props":51241,"children":51242},{"style":39166},[51243],{"type":25,"value":40615},{"type":20,"tag":157,"props":51245,"children":51246},{"style":248},[51247],{"type":25,"value":50491},{"type":20,"tag":157,"props":51249,"children":51250},{"style":39166},[51251],{"type":25,"value":39179},{"type":20,"tag":157,"props":51253,"children":51254},{"style":892},[51255],{"type":25,"value":40118},{"type":20,"tag":157,"props":51257,"children":51258},{"style":39166},[51259],{"type":25,"value":39895},{"type":20,"tag":157,"props":51261,"children":51262},{"style":892},[51263],{"type":25,"value":42580},{"type":20,"tag":21,"props":51265,"children":51266},{},[51267],{"type":25,"value":51268},"函数重载与调用注解配合使用",{"type":20,"tag":126,"props":51270,"children":51272},{"className":49867,"code":51271,"language":49808,"meta":8,"style":8},"type A = {\n    (n: number, m: number): any\n    (n: string, m: string): any\n}\n\nfunction foo(n: number, m: number): any\nfunction foo(n: string, m: string): any\nfunction foo(n: number|string, m: number|string) {\n\n}\n\nconst a: A = foo\n===================================================\nfunction foo(n: number, m: number): any  \nfunction foo(n: number|string, m: number|string) {\n\n}\n\nconst a: A = foo; \u002F\u002F error\n",[51273],{"type":20,"tag":84,"props":51274,"children":51275},{"__ignoreMap":8},[51276,51295,51343,51390,51397,51404,51459,51514,51577,51584,51591,51598,51626,51634,51693,51756,51763,51770,51777],{"type":20,"tag":157,"props":51277,"children":51278},{"class":159,"line":160},[51279,51283,51287,51291],{"type":20,"tag":157,"props":51280,"children":51281},{"style":39166},[51282],{"type":25,"value":50486},{"type":20,"tag":157,"props":51284,"children":51285},{"style":248},[51286],{"type":25,"value":50491},{"type":20,"tag":157,"props":51288,"children":51289},{"style":39166},[51290],{"type":25,"value":39179},{"type":20,"tag":157,"props":51292,"children":51293},{"style":892},[51294],{"type":25,"value":38885},{"type":20,"tag":157,"props":51296,"children":51297},{"class":159,"line":169},[51298,51303,51307,51311,51315,51319,51323,51327,51331,51335,51339],{"type":20,"tag":157,"props":51299,"children":51300},{"style":892},[51301],{"type":25,"value":51302},"    (",{"type":20,"tag":157,"props":51304,"children":51305},{"style":6410},[51306],{"type":25,"value":50843},{"type":20,"tag":157,"props":51308,"children":51309},{"style":39166},[51310],{"type":25,"value":40615},{"type":20,"tag":157,"props":51312,"children":51313},{"style":260},[51314],{"type":25,"value":50181},{"type":20,"tag":157,"props":51316,"children":51317},{"style":892},[51318],{"type":25,"value":42626},{"type":20,"tag":157,"props":51320,"children":51321},{"style":6410},[51322],{"type":25,"value":50860},{"type":20,"tag":157,"props":51324,"children":51325},{"style":39166},[51326],{"type":25,"value":40615},{"type":20,"tag":157,"props":51328,"children":51329},{"style":260},[51330],{"type":25,"value":50181},{"type":20,"tag":157,"props":51332,"children":51333},{"style":892},[51334],{"type":25,"value":37479},{"type":20,"tag":157,"props":51336,"children":51337},{"style":39166},[51338],{"type":25,"value":40615},{"type":20,"tag":157,"props":51340,"children":51341},{"style":260},[51342],{"type":25,"value":50551},{"type":20,"tag":157,"props":51344,"children":51345},{"class":159,"line":179},[51346,51350,51354,51358,51362,51366,51370,51374,51378,51382,51386],{"type":20,"tag":157,"props":51347,"children":51348},{"style":892},[51349],{"type":25,"value":51302},{"type":20,"tag":157,"props":51351,"children":51352},{"style":6410},[51353],{"type":25,"value":50843},{"type":20,"tag":157,"props":51355,"children":51356},{"style":39166},[51357],{"type":25,"value":40615},{"type":20,"tag":157,"props":51359,"children":51360},{"style":260},[51361],{"type":25,"value":50869},{"type":20,"tag":157,"props":51363,"children":51364},{"style":892},[51365],{"type":25,"value":42626},{"type":20,"tag":157,"props":51367,"children":51368},{"style":6410},[51369],{"type":25,"value":50860},{"type":20,"tag":157,"props":51371,"children":51372},{"style":39166},[51373],{"type":25,"value":40615},{"type":20,"tag":157,"props":51375,"children":51376},{"style":260},[51377],{"type":25,"value":50869},{"type":20,"tag":157,"props":51379,"children":51380},{"style":892},[51381],{"type":25,"value":37479},{"type":20,"tag":157,"props":51383,"children":51384},{"style":39166},[51385],{"type":25,"value":40615},{"type":20,"tag":157,"props":51387,"children":51388},{"style":260},[51389],{"type":25,"value":50551},{"type":20,"tag":157,"props":51391,"children":51392},{"class":159,"line":188},[51393],{"type":20,"tag":157,"props":51394,"children":51395},{"style":892},[51396],{"type":25,"value":943},{"type":20,"tag":157,"props":51398,"children":51399},{"class":159,"line":196},[51400],{"type":20,"tag":157,"props":51401,"children":51402},{"emptyLinePlaceholder":173},[51403],{"type":25,"value":176},{"type":20,"tag":157,"props":51405,"children":51406},{"class":159,"line":204},[51407,51411,51415,51419,51423,51427,51431,51435,51439,51443,51447,51451,51455],{"type":20,"tag":157,"props":51408,"children":51409},{"style":39166},[51410],{"type":25,"value":50829},{"type":20,"tag":157,"props":51412,"children":51413},{"style":248},[51414],{"type":25,"value":50834},{"type":20,"tag":157,"props":51416,"children":51417},{"style":892},[51418],{"type":25,"value":39189},{"type":20,"tag":157,"props":51420,"children":51421},{"style":6410},[51422],{"type":25,"value":50843},{"type":20,"tag":157,"props":51424,"children":51425},{"style":39166},[51426],{"type":25,"value":40615},{"type":20,"tag":157,"props":51428,"children":51429},{"style":260},[51430],{"type":25,"value":50181},{"type":20,"tag":157,"props":51432,"children":51433},{"style":892},[51434],{"type":25,"value":42626},{"type":20,"tag":157,"props":51436,"children":51437},{"style":6410},[51438],{"type":25,"value":50860},{"type":20,"tag":157,"props":51440,"children":51441},{"style":39166},[51442],{"type":25,"value":40615},{"type":20,"tag":157,"props":51444,"children":51445},{"style":260},[51446],{"type":25,"value":50181},{"type":20,"tag":157,"props":51448,"children":51449},{"style":892},[51450],{"type":25,"value":37479},{"type":20,"tag":157,"props":51452,"children":51453},{"style":39166},[51454],{"type":25,"value":40615},{"type":20,"tag":157,"props":51456,"children":51457},{"style":260},[51458],{"type":25,"value":50551},{"type":20,"tag":157,"props":51460,"children":51461},{"class":159,"line":213},[51462,51466,51470,51474,51478,51482,51486,51490,51494,51498,51502,51506,51510],{"type":20,"tag":157,"props":51463,"children":51464},{"style":39166},[51465],{"type":25,"value":50829},{"type":20,"tag":157,"props":51467,"children":51468},{"style":248},[51469],{"type":25,"value":50834},{"type":20,"tag":157,"props":51471,"children":51472},{"style":892},[51473],{"type":25,"value":39189},{"type":20,"tag":157,"props":51475,"children":51476},{"style":6410},[51477],{"type":25,"value":50843},{"type":20,"tag":157,"props":51479,"children":51480},{"style":39166},[51481],{"type":25,"value":40615},{"type":20,"tag":157,"props":51483,"children":51484},{"style":260},[51485],{"type":25,"value":50869},{"type":20,"tag":157,"props":51487,"children":51488},{"style":892},[51489],{"type":25,"value":42626},{"type":20,"tag":157,"props":51491,"children":51492},{"style":6410},[51493],{"type":25,"value":50860},{"type":20,"tag":157,"props":51495,"children":51496},{"style":39166},[51497],{"type":25,"value":40615},{"type":20,"tag":157,"props":51499,"children":51500},{"style":260},[51501],{"type":25,"value":50869},{"type":20,"tag":157,"props":51503,"children":51504},{"style":892},[51505],{"type":25,"value":37479},{"type":20,"tag":157,"props":51507,"children":51508},{"style":39166},[51509],{"type":25,"value":40615},{"type":20,"tag":157,"props":51511,"children":51512},{"style":260},[51513],{"type":25,"value":50551},{"type":20,"tag":157,"props":51515,"children":51516},{"class":159,"line":222},[51517,51521,51525,51529,51533,51537,51541,51545,51549,51553,51557,51561,51565,51569,51573],{"type":20,"tag":157,"props":51518,"children":51519},{"style":39166},[51520],{"type":25,"value":50829},{"type":20,"tag":157,"props":51522,"children":51523},{"style":248},[51524],{"type":25,"value":50834},{"type":20,"tag":157,"props":51526,"children":51527},{"style":892},[51528],{"type":25,"value":39189},{"type":20,"tag":157,"props":51530,"children":51531},{"style":6410},[51532],{"type":25,"value":50843},{"type":20,"tag":157,"props":51534,"children":51535},{"style":39166},[51536],{"type":25,"value":40615},{"type":20,"tag":157,"props":51538,"children":51539},{"style":260},[51540],{"type":25,"value":50181},{"type":20,"tag":157,"props":51542,"children":51543},{"style":39166},[51544],{"type":25,"value":50968},{"type":20,"tag":157,"props":51546,"children":51547},{"style":260},[51548],{"type":25,"value":50990},{"type":20,"tag":157,"props":51550,"children":51551},{"style":892},[51552],{"type":25,"value":42626},{"type":20,"tag":157,"props":51554,"children":51555},{"style":6410},[51556],{"type":25,"value":50860},{"type":20,"tag":157,"props":51558,"children":51559},{"style":39166},[51560],{"type":25,"value":40615},{"type":20,"tag":157,"props":51562,"children":51563},{"style":260},[51564],{"type":25,"value":50181},{"type":20,"tag":157,"props":51566,"children":51567},{"style":39166},[51568],{"type":25,"value":50968},{"type":20,"tag":157,"props":51570,"children":51571},{"style":260},[51572],{"type":25,"value":50990},{"type":20,"tag":157,"props":51574,"children":51575},{"style":892},[51576],{"type":25,"value":41031},{"type":20,"tag":157,"props":51578,"children":51579},{"class":159,"line":440},[51580],{"type":20,"tag":157,"props":51581,"children":51582},{"emptyLinePlaceholder":173},[51583],{"type":25,"value":176},{"type":20,"tag":157,"props":51585,"children":51586},{"class":159,"line":448},[51587],{"type":20,"tag":157,"props":51588,"children":51589},{"style":892},[51590],{"type":25,"value":943},{"type":20,"tag":157,"props":51592,"children":51593},{"class":159,"line":456},[51594],{"type":20,"tag":157,"props":51595,"children":51596},{"emptyLinePlaceholder":173},[51597],{"type":25,"value":176},{"type":20,"tag":157,"props":51599,"children":51600},{"class":159,"line":465},[51601,51605,51609,51613,51617,51621],{"type":20,"tag":157,"props":51602,"children":51603},{"style":39166},[51604],{"type":25,"value":39169},{"type":20,"tag":157,"props":51606,"children":51607},{"style":260},[51608],{"type":25,"value":49884},{"type":20,"tag":157,"props":51610,"children":51611},{"style":39166},[51612],{"type":25,"value":40615},{"type":20,"tag":157,"props":51614,"children":51615},{"style":248},[51616],{"type":25,"value":50491},{"type":20,"tag":157,"props":51618,"children":51619},{"style":39166},[51620],{"type":25,"value":39179},{"type":20,"tag":157,"props":51622,"children":51623},{"style":892},[51624],{"type":25,"value":51625}," foo\n",{"type":20,"tag":157,"props":51627,"children":51628},{"class":159,"line":474},[51629],{"type":20,"tag":157,"props":51630,"children":51631},{"style":39166},[51632],{"type":25,"value":51633},"===================================================\n",{"type":20,"tag":157,"props":51635,"children":51636},{"class":159,"line":483},[51637,51641,51645,51649,51653,51657,51661,51665,51669,51673,51677,51681,51685,51689],{"type":20,"tag":157,"props":51638,"children":51639},{"style":39166},[51640],{"type":25,"value":50829},{"type":20,"tag":157,"props":51642,"children":51643},{"style":248},[51644],{"type":25,"value":50834},{"type":20,"tag":157,"props":51646,"children":51647},{"style":892},[51648],{"type":25,"value":39189},{"type":20,"tag":157,"props":51650,"children":51651},{"style":6410},[51652],{"type":25,"value":50843},{"type":20,"tag":157,"props":51654,"children":51655},{"style":39166},[51656],{"type":25,"value":40615},{"type":20,"tag":157,"props":51658,"children":51659},{"style":260},[51660],{"type":25,"value":50181},{"type":20,"tag":157,"props":51662,"children":51663},{"style":892},[51664],{"type":25,"value":42626},{"type":20,"tag":157,"props":51666,"children":51667},{"style":6410},[51668],{"type":25,"value":50860},{"type":20,"tag":157,"props":51670,"children":51671},{"style":39166},[51672],{"type":25,"value":40615},{"type":20,"tag":157,"props":51674,"children":51675},{"style":260},[51676],{"type":25,"value":50181},{"type":20,"tag":157,"props":51678,"children":51679},{"style":892},[51680],{"type":25,"value":37479},{"type":20,"tag":157,"props":51682,"children":51683},{"style":39166},[51684],{"type":25,"value":40615},{"type":20,"tag":157,"props":51686,"children":51687},{"style":260},[51688],{"type":25,"value":49893},{"type":20,"tag":157,"props":51690,"children":51691},{"style":892},[51692],{"type":25,"value":17278},{"type":20,"tag":157,"props":51694,"children":51695},{"class":159,"line":491},[51696,51700,51704,51708,51712,51716,51720,51724,51728,51732,51736,51740,51744,51748,51752],{"type":20,"tag":157,"props":51697,"children":51698},{"style":39166},[51699],{"type":25,"value":50829},{"type":20,"tag":157,"props":51701,"children":51702},{"style":248},[51703],{"type":25,"value":50834},{"type":20,"tag":157,"props":51705,"children":51706},{"style":892},[51707],{"type":25,"value":39189},{"type":20,"tag":157,"props":51709,"children":51710},{"style":6410},[51711],{"type":25,"value":50843},{"type":20,"tag":157,"props":51713,"children":51714},{"style":39166},[51715],{"type":25,"value":40615},{"type":20,"tag":157,"props":51717,"children":51718},{"style":260},[51719],{"type":25,"value":50181},{"type":20,"tag":157,"props":51721,"children":51722},{"style":39166},[51723],{"type":25,"value":50968},{"type":20,"tag":157,"props":51725,"children":51726},{"style":260},[51727],{"type":25,"value":50990},{"type":20,"tag":157,"props":51729,"children":51730},{"style":892},[51731],{"type":25,"value":42626},{"type":20,"tag":157,"props":51733,"children":51734},{"style":6410},[51735],{"type":25,"value":50860},{"type":20,"tag":157,"props":51737,"children":51738},{"style":39166},[51739],{"type":25,"value":40615},{"type":20,"tag":157,"props":51741,"children":51742},{"style":260},[51743],{"type":25,"value":50181},{"type":20,"tag":157,"props":51745,"children":51746},{"style":39166},[51747],{"type":25,"value":50968},{"type":20,"tag":157,"props":51749,"children":51750},{"style":260},[51751],{"type":25,"value":50990},{"type":20,"tag":157,"props":51753,"children":51754},{"style":892},[51755],{"type":25,"value":41031},{"type":20,"tag":157,"props":51757,"children":51758},{"class":159,"line":499},[51759],{"type":20,"tag":157,"props":51760,"children":51761},{"emptyLinePlaceholder":173},[51762],{"type":25,"value":176},{"type":20,"tag":157,"props":51764,"children":51765},{"class":159,"line":508},[51766],{"type":20,"tag":157,"props":51767,"children":51768},{"style":892},[51769],{"type":25,"value":943},{"type":20,"tag":157,"props":51771,"children":51772},{"class":159,"line":517},[51773],{"type":20,"tag":157,"props":51774,"children":51775},{"emptyLinePlaceholder":173},[51776],{"type":25,"value":176},{"type":20,"tag":157,"props":51778,"children":51779},{"class":159,"line":1499},[51780,51784,51788,51792,51796,51800,51805],{"type":20,"tag":157,"props":51781,"children":51782},{"style":39166},[51783],{"type":25,"value":39169},{"type":20,"tag":157,"props":51785,"children":51786},{"style":260},[51787],{"type":25,"value":49884},{"type":20,"tag":157,"props":51789,"children":51790},{"style":39166},[51791],{"type":25,"value":40615},{"type":20,"tag":157,"props":51793,"children":51794},{"style":248},[51795],{"type":25,"value":50491},{"type":20,"tag":157,"props":51797,"children":51798},{"style":39166},[51799],{"type":25,"value":39179},{"type":20,"tag":157,"props":51801,"children":51802},{"style":892},[51803],{"type":25,"value":51804}," foo; ",{"type":20,"tag":157,"props":51806,"children":51807},{"style":9628},[51808],{"type":25,"value":51104},{"type":20,"tag":1863,"props":51810,"children":51812},{"id":51811},"枚举类型与const枚举",[51813],{"type":25,"value":51811},{"type":20,"tag":6665,"props":51815,"children":51816},{},[51817],{"type":20,"tag":21,"props":51818,"children":51819},{},[51820],{"type":25,"value":51821},"美剧是组织手机有关联集合的一种方式，是代码更加易于阅读",{"type":20,"tag":21,"props":51823,"children":51824},{},[51825],{"type":25,"value":51826},"**特点：  **",{"type":20,"tag":5719,"props":51828,"children":51829},{},[51830,51835,51840,51845],{"type":20,"tag":48,"props":51831,"children":51832},{},[51833],{"type":25,"value":51834},"自动累加",{"type":20,"tag":48,"props":51836,"children":51837},{},[51838],{"type":25,"value":51839},"反向映射",{"type":20,"tag":48,"props":51841,"children":51842},{},[51843],{"type":25,"value":51844},"类型方式",{"type":20,"tag":48,"props":51846,"children":51847},{},[51848],{"type":25,"value":51849},"const枚举",{"type":20,"tag":21,"props":51851,"children":51852},{},[51853],{"type":25,"value":51854},"const枚举性能更好",{"type":20,"tag":126,"props":51856,"children":51858},{"className":49867,"code":51857,"language":49808,"meta":8,"style":8},"const enum Roles {\n    .....\n}\n",[51859],{"type":20,"tag":84,"props":51860,"children":51861},{"__ignoreMap":8},[51862,51883,51891],{"type":20,"tag":157,"props":51863,"children":51864},{"class":159,"line":160},[51865,51869,51874,51879],{"type":20,"tag":157,"props":51866,"children":51867},{"style":39166},[51868],{"type":25,"value":39169},{"type":20,"tag":157,"props":51870,"children":51871},{"style":39166},[51872],{"type":25,"value":51873}," enum",{"type":20,"tag":157,"props":51875,"children":51876},{"style":248},[51877],{"type":25,"value":51878}," Roles",{"type":20,"tag":157,"props":51880,"children":51881},{"style":892},[51882],{"type":25,"value":38885},{"type":20,"tag":157,"props":51884,"children":51885},{"class":159,"line":169},[51886],{"type":20,"tag":157,"props":51887,"children":51888},{"style":892},[51889],{"type":25,"value":51890},"    .....\n",{"type":20,"tag":157,"props":51892,"children":51893},{"class":159,"line":179},[51894],{"type":20,"tag":157,"props":51895,"children":51896},{"style":892},[51897],{"type":25,"value":943},{"type":20,"tag":1863,"props":51899,"children":51901},{"id":51900},"接口与类型别名的区别",[51902],{"type":25,"value":51900},{"type":20,"tag":6665,"props":51904,"children":51905},{},[51906,51911],{"type":20,"tag":21,"props":51907,"children":51908},{},[51909],{"type":25,"value":51910},"接口：多个类型需要合并、类型之间需要继承用接口",{"type":20,"tag":21,"props":51912,"children":51913},{},[51914],{"type":25,"value":51915},"type：定义基本类型、映射类型、条件类型",{"type":20,"tag":5719,"props":51917,"children":51918},{},[51919,51924,51929,51934],{"type":20,"tag":48,"props":51920,"children":51921},{},[51922],{"type":25,"value":51923},"对象类型",{"type":20,"tag":48,"props":51925,"children":51926},{},[51927],{"type":25,"value":51928},"接口合并",{"type":20,"tag":48,"props":51930,"children":51931},{},[51932],{"type":25,"value":51933},"接口继承",{"type":20,"tag":48,"props":51935,"children":51936},{},[51937],{"type":25,"value":51938},"映射类型",{"type":20,"tag":21,"props":51940,"children":51941},{},[51942],{"type":25,"value":51943},"接口只能用在对象类型，接口具备合并功能，接口具备继承能力",{"type":20,"tag":21,"props":51945,"children":51946},{},[51947],{"type":25,"value":51948},"类型别名具有映射类型的能力",{"type":20,"tag":126,"props":51950,"children":51952},{"className":49867,"code":51951,"language":49808,"meta":8,"style":8},"\u002F\u002F 1. 接口只能定义对象类型\ntype A = string\n\u002F\u002F interface A string  error\n\n\n\u002F\u002F 2. 接口可以合并，类型别名不可以\ninterface B {\n    username: string\n}\n\ninterface B {\n    age: number\n}\n\n\u002F\u002F type C = {\n\u002F\u002F     username: string\n\u002F\u002F }\n\u002F\u002F type C = {  \u002F\u002F error\n\u002F\u002F     age: number\n\u002F\u002F }\n\n\n\u002F\u002F 3. 接口可以继承\ninterface D {\n    username: string\n}\ninterface E extends D {\n    age: number\n}\n\nconst obj1: E = {\n    username: \"张三\",\n    age: 12\n}\n\n\u002F\u002F 4. 类型别名的映射类型\ntype F = {\n    [P in \"username\" | \"age\"]: string\n}\n\n\u002F\u002F interface G {   error\n\u002F\u002F     [P in \"username\" | \"age\"]: string\n\u002F\u002F }\n",[51953],{"type":20,"tag":84,"props":51954,"children":51955},{"__ignoreMap":8},[51956,51964,51983,51991,51998,52005,52013,52030,52045,52052,52059,52074,52089,52096,52103,52111,52119,52127,52135,52143,52150,52157,52164,52172,52188,52203,52210,52235,52250,52257,52264,52292,52307,52319,52326,52333,52341,52361,52406,52413,52420,52428,52436],{"type":20,"tag":157,"props":51957,"children":51958},{"class":159,"line":160},[51959],{"type":20,"tag":157,"props":51960,"children":51961},{"style":9628},[51962],{"type":25,"value":51963},"\u002F\u002F 1. 接口只能定义对象类型\n",{"type":20,"tag":157,"props":51965,"children":51966},{"class":159,"line":169},[51967,51971,51975,51979],{"type":20,"tag":157,"props":51968,"children":51969},{"style":39166},[51970],{"type":25,"value":50486},{"type":20,"tag":157,"props":51972,"children":51973},{"style":248},[51974],{"type":25,"value":50491},{"type":20,"tag":157,"props":51976,"children":51977},{"style":39166},[51978],{"type":25,"value":39179},{"type":20,"tag":157,"props":51980,"children":51981},{"style":260},[51982],{"type":25,"value":50516},{"type":20,"tag":157,"props":51984,"children":51985},{"class":159,"line":179},[51986],{"type":20,"tag":157,"props":51987,"children":51988},{"style":9628},[51989],{"type":25,"value":51990},"\u002F\u002F interface A string  error\n",{"type":20,"tag":157,"props":51992,"children":51993},{"class":159,"line":188},[51994],{"type":20,"tag":157,"props":51995,"children":51996},{"emptyLinePlaceholder":173},[51997],{"type":25,"value":176},{"type":20,"tag":157,"props":51999,"children":52000},{"class":159,"line":196},[52001],{"type":20,"tag":157,"props":52002,"children":52003},{"emptyLinePlaceholder":173},[52004],{"type":25,"value":176},{"type":20,"tag":157,"props":52006,"children":52007},{"class":159,"line":204},[52008],{"type":20,"tag":157,"props":52009,"children":52010},{"style":9628},[52011],{"type":25,"value":52012},"\u002F\u002F 2. 接口可以合并，类型别名不可以\n",{"type":20,"tag":157,"props":52014,"children":52015},{"class":159,"line":213},[52016,52021,52026],{"type":20,"tag":157,"props":52017,"children":52018},{"style":39166},[52019],{"type":25,"value":52020},"interface",{"type":20,"tag":157,"props":52022,"children":52023},{"style":248},[52024],{"type":25,"value":52025}," B",{"type":20,"tag":157,"props":52027,"children":52028},{"style":892},[52029],{"type":25,"value":38885},{"type":20,"tag":157,"props":52031,"children":52032},{"class":159,"line":222},[52033,52037,52041],{"type":20,"tag":157,"props":52034,"children":52035},{"style":6410},[52036],{"type":25,"value":50507},{"type":20,"tag":157,"props":52038,"children":52039},{"style":39166},[52040],{"type":25,"value":40615},{"type":20,"tag":157,"props":52042,"children":52043},{"style":260},[52044],{"type":25,"value":50516},{"type":20,"tag":157,"props":52046,"children":52047},{"class":159,"line":440},[52048],{"type":20,"tag":157,"props":52049,"children":52050},{"style":892},[52051],{"type":25,"value":943},{"type":20,"tag":157,"props":52053,"children":52054},{"class":159,"line":448},[52055],{"type":20,"tag":157,"props":52056,"children":52057},{"emptyLinePlaceholder":173},[52058],{"type":25,"value":176},{"type":20,"tag":157,"props":52060,"children":52061},{"class":159,"line":456},[52062,52066,52070],{"type":20,"tag":157,"props":52063,"children":52064},{"style":39166},[52065],{"type":25,"value":52020},{"type":20,"tag":157,"props":52067,"children":52068},{"style":248},[52069],{"type":25,"value":52025},{"type":20,"tag":157,"props":52071,"children":52072},{"style":892},[52073],{"type":25,"value":38885},{"type":20,"tag":157,"props":52075,"children":52076},{"class":159,"line":465},[52077,52081,52085],{"type":20,"tag":157,"props":52078,"children":52079},{"style":6410},[52080],{"type":25,"value":50524},{"type":20,"tag":157,"props":52082,"children":52083},{"style":39166},[52084],{"type":25,"value":40615},{"type":20,"tag":157,"props":52086,"children":52087},{"style":260},[52088],{"type":25,"value":50534},{"type":20,"tag":157,"props":52090,"children":52091},{"class":159,"line":474},[52092],{"type":20,"tag":157,"props":52093,"children":52094},{"style":892},[52095],{"type":25,"value":943},{"type":20,"tag":157,"props":52097,"children":52098},{"class":159,"line":483},[52099],{"type":20,"tag":157,"props":52100,"children":52101},{"emptyLinePlaceholder":173},[52102],{"type":25,"value":176},{"type":20,"tag":157,"props":52104,"children":52105},{"class":159,"line":491},[52106],{"type":20,"tag":157,"props":52107,"children":52108},{"style":9628},[52109],{"type":25,"value":52110},"\u002F\u002F type C = {\n",{"type":20,"tag":157,"props":52112,"children":52113},{"class":159,"line":499},[52114],{"type":20,"tag":157,"props":52115,"children":52116},{"style":9628},[52117],{"type":25,"value":52118},"\u002F\u002F     username: string\n",{"type":20,"tag":157,"props":52120,"children":52121},{"class":159,"line":508},[52122],{"type":20,"tag":157,"props":52123,"children":52124},{"style":9628},[52125],{"type":25,"value":52126},"\u002F\u002F }\n",{"type":20,"tag":157,"props":52128,"children":52129},{"class":159,"line":517},[52130],{"type":20,"tag":157,"props":52131,"children":52132},{"style":9628},[52133],{"type":25,"value":52134},"\u002F\u002F type C = {  \u002F\u002F error\n",{"type":20,"tag":157,"props":52136,"children":52137},{"class":159,"line":1499},[52138],{"type":20,"tag":157,"props":52139,"children":52140},{"style":9628},[52141],{"type":25,"value":52142},"\u002F\u002F     age: number\n",{"type":20,"tag":157,"props":52144,"children":52145},{"class":159,"line":1507},[52146],{"type":20,"tag":157,"props":52147,"children":52148},{"style":9628},[52149],{"type":25,"value":52126},{"type":20,"tag":157,"props":52151,"children":52152},{"class":159,"line":1515},[52153],{"type":20,"tag":157,"props":52154,"children":52155},{"emptyLinePlaceholder":173},[52156],{"type":25,"value":176},{"type":20,"tag":157,"props":52158,"children":52159},{"class":159,"line":1523},[52160],{"type":20,"tag":157,"props":52161,"children":52162},{"emptyLinePlaceholder":173},[52163],{"type":25,"value":176},{"type":20,"tag":157,"props":52165,"children":52166},{"class":159,"line":1532},[52167],{"type":20,"tag":157,"props":52168,"children":52169},{"style":9628},[52170],{"type":25,"value":52171},"\u002F\u002F 3. 接口可以继承\n",{"type":20,"tag":157,"props":52173,"children":52174},{"class":159,"line":1541},[52175,52179,52184],{"type":20,"tag":157,"props":52176,"children":52177},{"style":39166},[52178],{"type":25,"value":52020},{"type":20,"tag":157,"props":52180,"children":52181},{"style":248},[52182],{"type":25,"value":52183}," D",{"type":20,"tag":157,"props":52185,"children":52186},{"style":892},[52187],{"type":25,"value":38885},{"type":20,"tag":157,"props":52189,"children":52190},{"class":159,"line":1550},[52191,52195,52199],{"type":20,"tag":157,"props":52192,"children":52193},{"style":6410},[52194],{"type":25,"value":50507},{"type":20,"tag":157,"props":52196,"children":52197},{"style":39166},[52198],{"type":25,"value":40615},{"type":20,"tag":157,"props":52200,"children":52201},{"style":260},[52202],{"type":25,"value":50516},{"type":20,"tag":157,"props":52204,"children":52205},{"class":159,"line":1558},[52206],{"type":20,"tag":157,"props":52207,"children":52208},{"style":892},[52209],{"type":25,"value":943},{"type":20,"tag":157,"props":52211,"children":52212},{"class":159,"line":1566},[52213,52217,52222,52227,52231],{"type":20,"tag":157,"props":52214,"children":52215},{"style":39166},[52216],{"type":25,"value":52020},{"type":20,"tag":157,"props":52218,"children":52219},{"style":248},[52220],{"type":25,"value":52221}," E",{"type":20,"tag":157,"props":52223,"children":52224},{"style":39166},[52225],{"type":25,"value":52226}," extends",{"type":20,"tag":157,"props":52228,"children":52229},{"style":248},[52230],{"type":25,"value":52183},{"type":20,"tag":157,"props":52232,"children":52233},{"style":892},[52234],{"type":25,"value":38885},{"type":20,"tag":157,"props":52236,"children":52237},{"class":159,"line":1574},[52238,52242,52246],{"type":20,"tag":157,"props":52239,"children":52240},{"style":6410},[52241],{"type":25,"value":50524},{"type":20,"tag":157,"props":52243,"children":52244},{"style":39166},[52245],{"type":25,"value":40615},{"type":20,"tag":157,"props":52247,"children":52248},{"style":260},[52249],{"type":25,"value":50534},{"type":20,"tag":157,"props":52251,"children":52252},{"class":159,"line":1582},[52253],{"type":20,"tag":157,"props":52254,"children":52255},{"style":892},[52256],{"type":25,"value":943},{"type":20,"tag":157,"props":52258,"children":52259},{"class":159,"line":1591},[52260],{"type":20,"tag":157,"props":52261,"children":52262},{"emptyLinePlaceholder":173},[52263],{"type":25,"value":176},{"type":20,"tag":157,"props":52265,"children":52266},{"class":159,"line":1599},[52267,52271,52276,52280,52284,52288],{"type":20,"tag":157,"props":52268,"children":52269},{"style":39166},[52270],{"type":25,"value":39169},{"type":20,"tag":157,"props":52272,"children":52273},{"style":260},[52274],{"type":25,"value":52275}," obj1",{"type":20,"tag":157,"props":52277,"children":52278},{"style":39166},[52279],{"type":25,"value":40615},{"type":20,"tag":157,"props":52281,"children":52282},{"style":248},[52283],{"type":25,"value":52221},{"type":20,"tag":157,"props":52285,"children":52286},{"style":39166},[52287],{"type":25,"value":39179},{"type":20,"tag":157,"props":52289,"children":52290},{"style":892},[52291],{"type":25,"value":38885},{"type":20,"tag":157,"props":52293,"children":52294},{"class":159,"line":1608},[52295,52299,52303],{"type":20,"tag":157,"props":52296,"children":52297},{"style":892},[52298],{"type":25,"value":50600},{"type":20,"tag":157,"props":52300,"children":52301},{"style":254},[52302],{"type":25,"value":50605},{"type":20,"tag":157,"props":52304,"children":52305},{"style":892},[52306],{"type":25,"value":918},{"type":20,"tag":157,"props":52308,"children":52309},{"class":159,"line":1617},[52310,52314],{"type":20,"tag":157,"props":52311,"children":52312},{"style":892},[52313],{"type":25,"value":50617},{"type":20,"tag":157,"props":52315,"children":52316},{"style":260},[52317],{"type":25,"value":52318},"12\n",{"type":20,"tag":157,"props":52320,"children":52321},{"class":159,"line":1626},[52322],{"type":20,"tag":157,"props":52323,"children":52324},{"style":892},[52325],{"type":25,"value":943},{"type":20,"tag":157,"props":52327,"children":52328},{"class":159,"line":1634},[52329],{"type":20,"tag":157,"props":52330,"children":52331},{"emptyLinePlaceholder":173},[52332],{"type":25,"value":176},{"type":20,"tag":157,"props":52334,"children":52335},{"class":159,"line":1642},[52336],{"type":20,"tag":157,"props":52337,"children":52338},{"style":9628},[52339],{"type":25,"value":52340},"\u002F\u002F 4. 类型别名的映射类型\n",{"type":20,"tag":157,"props":52342,"children":52343},{"class":159,"line":1650},[52344,52348,52353,52357],{"type":20,"tag":157,"props":52345,"children":52346},{"style":39166},[52347],{"type":25,"value":50486},{"type":20,"tag":157,"props":52349,"children":52350},{"style":248},[52351],{"type":25,"value":52352}," F",{"type":20,"tag":157,"props":52354,"children":52355},{"style":39166},[52356],{"type":25,"value":39179},{"type":20,"tag":157,"props":52358,"children":52359},{"style":892},[52360],{"type":25,"value":38885},{"type":20,"tag":157,"props":52362,"children":52363},{"class":159,"line":1659},[52364,52369,52374,52379,52384,52388,52393,52398,52402],{"type":20,"tag":157,"props":52365,"children":52366},{"style":892},[52367],{"type":25,"value":52368},"    [",{"type":20,"tag":157,"props":52370,"children":52371},{"style":248},[52372],{"type":25,"value":52373},"P",{"type":20,"tag":157,"props":52375,"children":52376},{"style":39166},[52377],{"type":25,"value":52378}," in",{"type":20,"tag":157,"props":52380,"children":52381},{"style":254},[52382],{"type":25,"value":52383}," \"username\"",{"type":20,"tag":157,"props":52385,"children":52386},{"style":39166},[52387],{"type":25,"value":39852},{"type":20,"tag":157,"props":52389,"children":52390},{"style":254},[52391],{"type":25,"value":52392}," \"age\"",{"type":20,"tag":157,"props":52394,"children":52395},{"style":892},[52396],{"type":25,"value":52397},"]",{"type":20,"tag":157,"props":52399,"children":52400},{"style":39166},[52401],{"type":25,"value":40615},{"type":20,"tag":157,"props":52403,"children":52404},{"style":260},[52405],{"type":25,"value":50516},{"type":20,"tag":157,"props":52407,"children":52408},{"class":159,"line":1668},[52409],{"type":20,"tag":157,"props":52410,"children":52411},{"style":892},[52412],{"type":25,"value":943},{"type":20,"tag":157,"props":52414,"children":52415},{"class":159,"line":1677},[52416],{"type":20,"tag":157,"props":52417,"children":52418},{"emptyLinePlaceholder":173},[52419],{"type":25,"value":176},{"type":20,"tag":157,"props":52421,"children":52422},{"class":159,"line":1685},[52423],{"type":20,"tag":157,"props":52424,"children":52425},{"style":9628},[52426],{"type":25,"value":52427},"\u002F\u002F interface G {   error\n",{"type":20,"tag":157,"props":52429,"children":52430},{"class":159,"line":1693},[52431],{"type":20,"tag":157,"props":52432,"children":52433},{"style":9628},[52434],{"type":25,"value":52435},"\u002F\u002F     [P in \"username\" | \"age\"]: string\n",{"type":20,"tag":157,"props":52437,"children":52438},{"class":159,"line":1701},[52439],{"type":20,"tag":157,"props":52440,"children":52441},{"style":9628},[52442],{"type":25,"value":52126},{"type":20,"tag":1863,"props":52444,"children":52446},{"id":52445},"字面量类型与keyof关键字",[52447],{"type":25,"value":52445},{"type":20,"tag":126,"props":52449,"children":52451},{"className":38826,"code":52450,"language":38828,"meta":8,"style":8},"interface A {\n    username: '张三'\n    age: 123\n}\n\n\u002F\u002F 通过keyof取到  接口A的key\nconst a: keyof A = 'username'\n",[52452],{"type":20,"tag":84,"props":52453,"children":52454},{"__ignoreMap":8},[52455,52463,52471,52479,52486,52493,52501],{"type":20,"tag":157,"props":52456,"children":52457},{"class":159,"line":160},[52458],{"type":20,"tag":157,"props":52459,"children":52460},{},[52461],{"type":25,"value":52462},"interface A {\n",{"type":20,"tag":157,"props":52464,"children":52465},{"class":159,"line":169},[52466],{"type":20,"tag":157,"props":52467,"children":52468},{},[52469],{"type":25,"value":52470},"    username: '张三'\n",{"type":20,"tag":157,"props":52472,"children":52473},{"class":159,"line":179},[52474],{"type":20,"tag":157,"props":52475,"children":52476},{},[52477],{"type":25,"value":52478},"    age: 123\n",{"type":20,"tag":157,"props":52480,"children":52481},{"class":159,"line":188},[52482],{"type":20,"tag":157,"props":52483,"children":52484},{},[52485],{"type":25,"value":943},{"type":20,"tag":157,"props":52487,"children":52488},{"class":159,"line":196},[52489],{"type":20,"tag":157,"props":52490,"children":52491},{"emptyLinePlaceholder":173},[52492],{"type":25,"value":176},{"type":20,"tag":157,"props":52494,"children":52495},{"class":159,"line":204},[52496],{"type":20,"tag":157,"props":52497,"children":52498},{},[52499],{"type":25,"value":52500},"\u002F\u002F 通过keyof取到  接口A的key\n",{"type":20,"tag":157,"props":52502,"children":52503},{"class":159,"line":213},[52504],{"type":20,"tag":157,"props":52505,"children":52506},{},[52507],{"type":25,"value":52508},"const a: keyof A = 'username'\n",{"type":20,"tag":1863,"props":52510,"children":52512},{"id":52511},"类型保护与自定义类型",[52513],{"type":25,"value":52511},{"type":20,"tag":28,"props":52515,"children":52517},{"id":52516},"类型保护",[52518],{"type":25,"value":52516},{"type":20,"tag":6665,"props":52520,"children":52521},{},[52522],{"type":20,"tag":21,"props":52523,"children":52524},{},[52525],{"type":25,"value":52526},"缩小类型范围",{"type":20,"tag":5719,"props":52528,"children":52529},{},[52530,52535,52539,52544],{"type":20,"tag":48,"props":52531,"children":52532},{},[52533],{"type":25,"value":52534},"typeof：只能检查a",{"type":20,"tag":48,"props":52536,"children":52537},{},[52538],{"type":25,"value":26604},{"type":20,"tag":48,"props":52540,"children":52541},{},[52542],{"type":25,"value":52543},"in",{"type":20,"tag":48,"props":52545,"children":52546},{},[52547],{"type":25,"value":52548},"字面量类型",{"type":20,"tag":11085,"props":52550,"children":52551},{"id":52543},[52552],{"type":25,"value":52543},{"type":20,"tag":126,"props":52554,"children":52556},{"className":49867,"code":52555,"language":49808,"meta":8,"style":8},"function foo(a: { username: string } | { age: number }) {\n    if (\"username\" in a) {\n        a.username = \"xiaoming\"\n    }\n}\n",[52557],{"type":20,"tag":84,"props":52558,"children":52559},{"__ignoreMap":8},[52560,52630,52655,52672,52679],{"type":20,"tag":157,"props":52561,"children":52562},{"class":159,"line":160},[52563,52567,52571,52575,52579,52583,52587,52592,52596,52600,52604,52608,52612,52617,52621,52625],{"type":20,"tag":157,"props":52564,"children":52565},{"style":39166},[52566],{"type":25,"value":50829},{"type":20,"tag":157,"props":52568,"children":52569},{"style":248},[52570],{"type":25,"value":50834},{"type":20,"tag":157,"props":52572,"children":52573},{"style":892},[52574],{"type":25,"value":39189},{"type":20,"tag":157,"props":52576,"children":52577},{"style":6410},[52578],{"type":25,"value":101},{"type":20,"tag":157,"props":52580,"children":52581},{"style":39166},[52582],{"type":25,"value":40615},{"type":20,"tag":157,"props":52584,"children":52585},{"style":892},[52586],{"type":25,"value":40677},{"type":20,"tag":157,"props":52588,"children":52589},{"style":6410},[52590],{"type":25,"value":52591},"username",{"type":20,"tag":157,"props":52593,"children":52594},{"style":39166},[52595],{"type":25,"value":40615},{"type":20,"tag":157,"props":52597,"children":52598},{"style":260},[52599],{"type":25,"value":50869},{"type":20,"tag":157,"props":52601,"children":52602},{"style":892},[52603],{"type":25,"value":40687},{"type":20,"tag":157,"props":52605,"children":52606},{"style":39166},[52607],{"type":25,"value":50968},{"type":20,"tag":157,"props":52609,"children":52610},{"style":892},[52611],{"type":25,"value":40677},{"type":20,"tag":157,"props":52613,"children":52614},{"style":6410},[52615],{"type":25,"value":52616},"age",{"type":20,"tag":157,"props":52618,"children":52619},{"style":39166},[52620],{"type":25,"value":40615},{"type":20,"tag":157,"props":52622,"children":52623},{"style":260},[52624],{"type":25,"value":50181},{"type":20,"tag":157,"props":52626,"children":52627},{"style":892},[52628],{"type":25,"value":52629}," }) {\n",{"type":20,"tag":157,"props":52631,"children":52632},{"class":159,"line":169},[52633,52637,52641,52646,52650],{"type":20,"tag":157,"props":52634,"children":52635},{"style":39166},[52636],{"type":25,"value":43053},{"type":20,"tag":157,"props":52638,"children":52639},{"style":892},[52640],{"type":25,"value":42746},{"type":20,"tag":157,"props":52642,"children":52643},{"style":254},[52644],{"type":25,"value":52645},"\"username\"",{"type":20,"tag":157,"props":52647,"children":52648},{"style":39166},[52649],{"type":25,"value":52378},{"type":20,"tag":157,"props":52651,"children":52652},{"style":892},[52653],{"type":25,"value":52654}," a) {\n",{"type":20,"tag":157,"props":52656,"children":52657},{"class":159,"line":179},[52658,52663,52667],{"type":20,"tag":157,"props":52659,"children":52660},{"style":892},[52661],{"type":25,"value":52662},"        a.username ",{"type":20,"tag":157,"props":52664,"children":52665},{"style":39166},[52666],{"type":25,"value":2261},{"type":20,"tag":157,"props":52668,"children":52669},{"style":254},[52670],{"type":25,"value":52671}," \"xiaoming\"\n",{"type":20,"tag":157,"props":52673,"children":52674},{"class":159,"line":188},[52675],{"type":20,"tag":157,"props":52676,"children":52677},{"style":892},[52678],{"type":25,"value":872},{"type":20,"tag":157,"props":52680,"children":52681},{"class":159,"line":196},[52682],{"type":20,"tag":157,"props":52683,"children":52684},{"style":892},[52685],{"type":25,"value":943},{"type":20,"tag":11085,"props":52687,"children":52688},{"id":26604},[52689],{"type":25,"value":26604},{"type":20,"tag":126,"props":52691,"children":52693},{"className":49867,"code":52692,"language":49808,"meta":8,"style":8},"\u002F\u002F instanceof\nclass Foo {\n    username = \"zhangsan\"\n}\n\nclass Bar {\n    age: 12\n}\n\n\u002F\u002F instanceof 左边是不是有右边的实例   或者  右边的原型是否出现在左边的原型链上\nfunction baz(a: Foo | Bar) {\n    if (a instanceof Foo) {\n        a.username\n    }\n}\n",[52694],{"type":20,"tag":84,"props":52695,"children":52696},{"__ignoreMap":8},[52697,52705,52722,52738,52745,52752,52768,52784,52791,52798,52806,52846,52870,52878,52885],{"type":20,"tag":157,"props":52698,"children":52699},{"class":159,"line":160},[52700],{"type":20,"tag":157,"props":52701,"children":52702},{"style":9628},[52703],{"type":25,"value":52704},"\u002F\u002F instanceof\n",{"type":20,"tag":157,"props":52706,"children":52707},{"class":159,"line":169},[52708,52713,52718],{"type":20,"tag":157,"props":52709,"children":52710},{"style":39166},[52711],{"type":25,"value":52712},"class",{"type":20,"tag":157,"props":52714,"children":52715},{"style":248},[52716],{"type":25,"value":52717}," Foo",{"type":20,"tag":157,"props":52719,"children":52720},{"style":892},[52721],{"type":25,"value":38885},{"type":20,"tag":157,"props":52723,"children":52724},{"class":159,"line":179},[52725,52729,52733],{"type":20,"tag":157,"props":52726,"children":52727},{"style":6410},[52728],{"type":25,"value":50507},{"type":20,"tag":157,"props":52730,"children":52731},{"style":39166},[52732],{"type":25,"value":39179},{"type":20,"tag":157,"props":52734,"children":52735},{"style":254},[52736],{"type":25,"value":52737}," \"zhangsan\"\n",{"type":20,"tag":157,"props":52739,"children":52740},{"class":159,"line":188},[52741],{"type":20,"tag":157,"props":52742,"children":52743},{"style":892},[52744],{"type":25,"value":943},{"type":20,"tag":157,"props":52746,"children":52747},{"class":159,"line":196},[52748],{"type":20,"tag":157,"props":52749,"children":52750},{"emptyLinePlaceholder":173},[52751],{"type":25,"value":176},{"type":20,"tag":157,"props":52753,"children":52754},{"class":159,"line":204},[52755,52759,52764],{"type":20,"tag":157,"props":52756,"children":52757},{"style":39166},[52758],{"type":25,"value":52712},{"type":20,"tag":157,"props":52760,"children":52761},{"style":248},[52762],{"type":25,"value":52763}," Bar",{"type":20,"tag":157,"props":52765,"children":52766},{"style":892},[52767],{"type":25,"value":38885},{"type":20,"tag":157,"props":52769,"children":52770},{"class":159,"line":213},[52771,52775,52779],{"type":20,"tag":157,"props":52772,"children":52773},{"style":6410},[52774],{"type":25,"value":50524},{"type":20,"tag":157,"props":52776,"children":52777},{"style":39166},[52778],{"type":25,"value":40615},{"type":20,"tag":157,"props":52780,"children":52781},{"style":260},[52782],{"type":25,"value":52783}," 12\n",{"type":20,"tag":157,"props":52785,"children":52786},{"class":159,"line":222},[52787],{"type":20,"tag":157,"props":52788,"children":52789},{"style":892},[52790],{"type":25,"value":943},{"type":20,"tag":157,"props":52792,"children":52793},{"class":159,"line":440},[52794],{"type":20,"tag":157,"props":52795,"children":52796},{"emptyLinePlaceholder":173},[52797],{"type":25,"value":176},{"type":20,"tag":157,"props":52799,"children":52800},{"class":159,"line":448},[52801],{"type":20,"tag":157,"props":52802,"children":52803},{"style":9628},[52804],{"type":25,"value":52805},"\u002F\u002F instanceof 左边是不是有右边的实例   或者  右边的原型是否出现在左边的原型链上\n",{"type":20,"tag":157,"props":52807,"children":52808},{"class":159,"line":456},[52809,52813,52818,52822,52826,52830,52834,52838,52842],{"type":20,"tag":157,"props":52810,"children":52811},{"style":39166},[52812],{"type":25,"value":50829},{"type":20,"tag":157,"props":52814,"children":52815},{"style":248},[52816],{"type":25,"value":52817}," baz",{"type":20,"tag":157,"props":52819,"children":52820},{"style":892},[52821],{"type":25,"value":39189},{"type":20,"tag":157,"props":52823,"children":52824},{"style":6410},[52825],{"type":25,"value":101},{"type":20,"tag":157,"props":52827,"children":52828},{"style":39166},[52829],{"type":25,"value":40615},{"type":20,"tag":157,"props":52831,"children":52832},{"style":248},[52833],{"type":25,"value":52717},{"type":20,"tag":157,"props":52835,"children":52836},{"style":39166},[52837],{"type":25,"value":39852},{"type":20,"tag":157,"props":52839,"children":52840},{"style":248},[52841],{"type":25,"value":52763},{"type":20,"tag":157,"props":52843,"children":52844},{"style":892},[52845],{"type":25,"value":41031},{"type":20,"tag":157,"props":52847,"children":52848},{"class":159,"line":465},[52849,52853,52858,52862,52866],{"type":20,"tag":157,"props":52850,"children":52851},{"style":39166},[52852],{"type":25,"value":43053},{"type":20,"tag":157,"props":52854,"children":52855},{"style":892},[52856],{"type":25,"value":52857}," (a ",{"type":20,"tag":157,"props":52859,"children":52860},{"style":39166},[52861],{"type":25,"value":26604},{"type":20,"tag":157,"props":52863,"children":52864},{"style":248},[52865],{"type":25,"value":52717},{"type":20,"tag":157,"props":52867,"children":52868},{"style":892},[52869],{"type":25,"value":41031},{"type":20,"tag":157,"props":52871,"children":52872},{"class":159,"line":474},[52873],{"type":20,"tag":157,"props":52874,"children":52875},{"style":892},[52876],{"type":25,"value":52877},"        a.username\n",{"type":20,"tag":157,"props":52879,"children":52880},{"class":159,"line":483},[52881],{"type":20,"tag":157,"props":52882,"children":52883},{"style":892},[52884],{"type":25,"value":872},{"type":20,"tag":157,"props":52886,"children":52887},{"class":159,"line":491},[52888],{"type":20,"tag":157,"props":52889,"children":52890},{"style":892},[52891],{"type":25,"value":943},{"type":20,"tag":11085,"props":52893,"children":52895},{"id":52894},"自定义类型保护",[52896],{"type":25,"value":52894},{"type":20,"tag":6665,"props":52898,"children":52899},{},[52900],{"type":20,"tag":21,"props":52901,"children":52902},{},[52903],{"type":25,"value":52904},"使用is类型为此",{"type":20,"tag":126,"props":52906,"children":52908},{"className":38826,"code":52907,"language":38828,"meta":8,"style":8},"function isString(): n is string{\n    return typeof n === 'string'\n}\n\nfunction foo(n: string|number) {\n    if( isString(n) ){\n        n.length\n    }\n}\n",[52909],{"type":20,"tag":84,"props":52910,"children":52911},{"__ignoreMap":8},[52912,52920,52928,52935,52942,52950,52958,52966,52973],{"type":20,"tag":157,"props":52913,"children":52914},{"class":159,"line":160},[52915],{"type":20,"tag":157,"props":52916,"children":52917},{},[52918],{"type":25,"value":52919},"function isString(): n is string{\n",{"type":20,"tag":157,"props":52921,"children":52922},{"class":159,"line":169},[52923],{"type":20,"tag":157,"props":52924,"children":52925},{},[52926],{"type":25,"value":52927},"    return typeof n === 'string'\n",{"type":20,"tag":157,"props":52929,"children":52930},{"class":159,"line":179},[52931],{"type":20,"tag":157,"props":52932,"children":52933},{},[52934],{"type":25,"value":943},{"type":20,"tag":157,"props":52936,"children":52937},{"class":159,"line":188},[52938],{"type":20,"tag":157,"props":52939,"children":52940},{"emptyLinePlaceholder":173},[52941],{"type":25,"value":176},{"type":20,"tag":157,"props":52943,"children":52944},{"class":159,"line":196},[52945],{"type":20,"tag":157,"props":52946,"children":52947},{},[52948],{"type":25,"value":52949},"function foo(n: string|number) {\n",{"type":20,"tag":157,"props":52951,"children":52952},{"class":159,"line":204},[52953],{"type":20,"tag":157,"props":52954,"children":52955},{},[52956],{"type":25,"value":52957},"    if( isString(n) ){\n",{"type":20,"tag":157,"props":52959,"children":52960},{"class":159,"line":213},[52961],{"type":20,"tag":157,"props":52962,"children":52963},{},[52964],{"type":25,"value":52965},"        n.length\n",{"type":20,"tag":157,"props":52967,"children":52968},{"class":159,"line":222},[52969],{"type":20,"tag":157,"props":52970,"children":52971},{},[52972],{"type":25,"value":872},{"type":20,"tag":157,"props":52974,"children":52975},{"class":159,"line":440},[52976],{"type":20,"tag":157,"props":52977,"children":52978},{},[52979],{"type":25,"value":943},{"type":20,"tag":1863,"props":52981,"children":52983},{"id":52982},"泛型与泛型常见操作",[52984],{"type":25,"value":52982},{"type":20,"tag":6665,"props":52986,"children":52987},{},[52988],{"type":20,"tag":21,"props":52989,"children":52990},{},[52991],{"type":25,"value":52992},"泛型是指在定义函数、接口或者类时，未指定其参数类型，只有在运行时传入才能确定",{"type":20,"tag":126,"props":52994,"children":52996},{"className":49867,"code":52995,"language":49808,"meta":8,"style":8},"\u002F\u002F 基础类型\ntype A\u003CT = string> = T\nconst a: A = \"zhangsan\"\nconst b: A\u003Cnumber> = 1\n\n\u002F\u002F 数组类型\ntype MyArray\u003CT> = T[]\nconst arr: MyArray\u003Cnumber> = [1, 2, 3]\nconst arr1: number[] = [1, 2, 3]\n",[52997],{"type":20,"tag":84,"props":52998,"children":52999},{"__ignoreMap":8},[53000,53008,53050,53077,53117,53124,53132,53170,53235],{"type":20,"tag":157,"props":53001,"children":53002},{"class":159,"line":160},[53003],{"type":20,"tag":157,"props":53004,"children":53005},{"style":9628},[53006],{"type":25,"value":53007},"\u002F\u002F 基础类型\n",{"type":20,"tag":157,"props":53009,"children":53010},{"class":159,"line":169},[53011,53015,53019,53023,53028,53032,53036,53041,53045],{"type":20,"tag":157,"props":53012,"children":53013},{"style":39166},[53014],{"type":25,"value":50486},{"type":20,"tag":157,"props":53016,"children":53017},{"style":248},[53018],{"type":25,"value":50491},{"type":20,"tag":157,"props":53020,"children":53021},{"style":892},[53022],{"type":25,"value":36862},{"type":20,"tag":157,"props":53024,"children":53025},{"style":248},[53026],{"type":25,"value":53027},"T",{"type":20,"tag":157,"props":53029,"children":53030},{"style":39166},[53031],{"type":25,"value":39179},{"type":20,"tag":157,"props":53033,"children":53034},{"style":260},[53035],{"type":25,"value":50869},{"type":20,"tag":157,"props":53037,"children":53038},{"style":892},[53039],{"type":25,"value":53040},"> ",{"type":20,"tag":157,"props":53042,"children":53043},{"style":39166},[53044],{"type":25,"value":2261},{"type":20,"tag":157,"props":53046,"children":53047},{"style":248},[53048],{"type":25,"value":53049}," T\n",{"type":20,"tag":157,"props":53051,"children":53052},{"class":159,"line":179},[53053,53057,53061,53065,53069,53073],{"type":20,"tag":157,"props":53054,"children":53055},{"style":39166},[53056],{"type":25,"value":39169},{"type":20,"tag":157,"props":53058,"children":53059},{"style":260},[53060],{"type":25,"value":49884},{"type":20,"tag":157,"props":53062,"children":53063},{"style":39166},[53064],{"type":25,"value":40615},{"type":20,"tag":157,"props":53066,"children":53067},{"style":248},[53068],{"type":25,"value":50491},{"type":20,"tag":157,"props":53070,"children":53071},{"style":39166},[53072],{"type":25,"value":39179},{"type":20,"tag":157,"props":53074,"children":53075},{"style":254},[53076],{"type":25,"value":52737},{"type":20,"tag":157,"props":53078,"children":53079},{"class":159,"line":188},[53080,53084,53089,53093,53097,53101,53105,53109,53113],{"type":20,"tag":157,"props":53081,"children":53082},{"style":39166},[53083],{"type":25,"value":39169},{"type":20,"tag":157,"props":53085,"children":53086},{"style":260},[53087],{"type":25,"value":53088}," b",{"type":20,"tag":157,"props":53090,"children":53091},{"style":39166},[53092],{"type":25,"value":40615},{"type":20,"tag":157,"props":53094,"children":53095},{"style":248},[53096],{"type":25,"value":50491},{"type":20,"tag":157,"props":53098,"children":53099},{"style":892},[53100],{"type":25,"value":36862},{"type":20,"tag":157,"props":53102,"children":53103},{"style":260},[53104],{"type":25,"value":50973},{"type":20,"tag":157,"props":53106,"children":53107},{"style":892},[53108],{"type":25,"value":53040},{"type":20,"tag":157,"props":53110,"children":53111},{"style":39166},[53112],{"type":25,"value":2261},{"type":20,"tag":157,"props":53114,"children":53115},{"style":260},[53116],{"type":25,"value":47417},{"type":20,"tag":157,"props":53118,"children":53119},{"class":159,"line":196},[53120],{"type":20,"tag":157,"props":53121,"children":53122},{"emptyLinePlaceholder":173},[53123],{"type":25,"value":176},{"type":20,"tag":157,"props":53125,"children":53126},{"class":159,"line":204},[53127],{"type":20,"tag":157,"props":53128,"children":53129},{"style":9628},[53130],{"type":25,"value":53131},"\u002F\u002F 数组类型\n",{"type":20,"tag":157,"props":53133,"children":53134},{"class":159,"line":213},[53135,53139,53144,53148,53152,53156,53160,53165],{"type":20,"tag":157,"props":53136,"children":53137},{"style":39166},[53138],{"type":25,"value":50486},{"type":20,"tag":157,"props":53140,"children":53141},{"style":248},[53142],{"type":25,"value":53143}," MyArray",{"type":20,"tag":157,"props":53145,"children":53146},{"style":892},[53147],{"type":25,"value":36862},{"type":20,"tag":157,"props":53149,"children":53150},{"style":248},[53151],{"type":25,"value":53027},{"type":20,"tag":157,"props":53153,"children":53154},{"style":892},[53155],{"type":25,"value":53040},{"type":20,"tag":157,"props":53157,"children":53158},{"style":39166},[53159],{"type":25,"value":2261},{"type":20,"tag":157,"props":53161,"children":53162},{"style":248},[53163],{"type":25,"value":53164}," T",{"type":20,"tag":157,"props":53166,"children":53167},{"style":892},[53168],{"type":25,"value":53169},"[]\n",{"type":20,"tag":157,"props":53171,"children":53172},{"class":159,"line":222},[53173,53177,53182,53186,53190,53194,53198,53202,53206,53210,53214,53218,53222,53226,53231],{"type":20,"tag":157,"props":53174,"children":53175},{"style":39166},[53176],{"type":25,"value":39169},{"type":20,"tag":157,"props":53178,"children":53179},{"style":260},[53180],{"type":25,"value":53181}," arr",{"type":20,"tag":157,"props":53183,"children":53184},{"style":39166},[53185],{"type":25,"value":40615},{"type":20,"tag":157,"props":53187,"children":53188},{"style":248},[53189],{"type":25,"value":53143},{"type":20,"tag":157,"props":53191,"children":53192},{"style":892},[53193],{"type":25,"value":36862},{"type":20,"tag":157,"props":53195,"children":53196},{"style":260},[53197],{"type":25,"value":50973},{"type":20,"tag":157,"props":53199,"children":53200},{"style":892},[53201],{"type":25,"value":53040},{"type":20,"tag":157,"props":53203,"children":53204},{"style":39166},[53205],{"type":25,"value":2261},{"type":20,"tag":157,"props":53207,"children":53208},{"style":892},[53209],{"type":25,"value":42666},{"type":20,"tag":157,"props":53211,"children":53212},{"style":260},[53213],{"type":25,"value":10379},{"type":20,"tag":157,"props":53215,"children":53216},{"style":892},[53217],{"type":25,"value":42626},{"type":20,"tag":157,"props":53219,"children":53220},{"style":260},[53221],{"type":25,"value":43928},{"type":20,"tag":157,"props":53223,"children":53224},{"style":892},[53225],{"type":25,"value":42626},{"type":20,"tag":157,"props":53227,"children":53228},{"style":260},[53229],{"type":25,"value":53230},"3",{"type":20,"tag":157,"props":53232,"children":53233},{"style":892},[53234],{"type":25,"value":42686},{"type":20,"tag":157,"props":53236,"children":53237},{"class":159,"line":440},[53238,53242,53247,53251,53255,53260,53264,53268,53272,53276,53280,53284,53288],{"type":20,"tag":157,"props":53239,"children":53240},{"style":39166},[53241],{"type":25,"value":39169},{"type":20,"tag":157,"props":53243,"children":53244},{"style":260},[53245],{"type":25,"value":53246}," arr1",{"type":20,"tag":157,"props":53248,"children":53249},{"style":39166},[53250],{"type":25,"value":40615},{"type":20,"tag":157,"props":53252,"children":53253},{"style":260},[53254],{"type":25,"value":50181},{"type":20,"tag":157,"props":53256,"children":53257},{"style":892},[53258],{"type":25,"value":53259},"[] ",{"type":20,"tag":157,"props":53261,"children":53262},{"style":39166},[53263],{"type":25,"value":2261},{"type":20,"tag":157,"props":53265,"children":53266},{"style":892},[53267],{"type":25,"value":42666},{"type":20,"tag":157,"props":53269,"children":53270},{"style":260},[53271],{"type":25,"value":10379},{"type":20,"tag":157,"props":53273,"children":53274},{"style":892},[53275],{"type":25,"value":42626},{"type":20,"tag":157,"props":53277,"children":53278},{"style":260},[53279],{"type":25,"value":43928},{"type":20,"tag":157,"props":53281,"children":53282},{"style":892},[53283],{"type":25,"value":42626},{"type":20,"tag":157,"props":53285,"children":53286},{"style":260},[53287],{"type":25,"value":53230},{"type":20,"tag":157,"props":53289,"children":53290},{"style":892},[53291],{"type":25,"value":42686},{"type":20,"tag":21,"props":53293,"children":53294},{},[53295],{"type":20,"tag":33,"props":53296,"children":53297},{},[53298],{"type":25,"value":53299},"函数与接口结合",{"type":20,"tag":126,"props":53301,"children":53303},{"className":49867,"code":53302,"language":49808,"meta":8,"style":8},"interface A\u003CT> {\n    (n: T): void\n    default?: T\n}\n\nconst foo: A\u003Cstring> = (n) => { }\n\n\u002F\u002F foo(123) error\n\u002F\u002F foo.default = 123 error\nfoo(\"张三\")\nfoo.default = \"李四\"\n",[53304],{"type":20,"tag":84,"props":53305,"children":53306},{"__ignoreMap":8},[53307,53331,53362,53378,53385,53392,53448,53455,53463,53471,53490],{"type":20,"tag":157,"props":53308,"children":53309},{"class":159,"line":160},[53310,53314,53318,53322,53326],{"type":20,"tag":157,"props":53311,"children":53312},{"style":39166},[53313],{"type":25,"value":52020},{"type":20,"tag":157,"props":53315,"children":53316},{"style":248},[53317],{"type":25,"value":50491},{"type":20,"tag":157,"props":53319,"children":53320},{"style":892},[53321],{"type":25,"value":36862},{"type":20,"tag":157,"props":53323,"children":53324},{"style":248},[53325],{"type":25,"value":53027},{"type":20,"tag":157,"props":53327,"children":53328},{"style":892},[53329],{"type":25,"value":53330},"> {\n",{"type":20,"tag":157,"props":53332,"children":53333},{"class":159,"line":169},[53334,53338,53342,53346,53350,53354,53358],{"type":20,"tag":157,"props":53335,"children":53336},{"style":892},[53337],{"type":25,"value":51302},{"type":20,"tag":157,"props":53339,"children":53340},{"style":6410},[53341],{"type":25,"value":50843},{"type":20,"tag":157,"props":53343,"children":53344},{"style":39166},[53345],{"type":25,"value":40615},{"type":20,"tag":157,"props":53347,"children":53348},{"style":248},[53349],{"type":25,"value":53164},{"type":20,"tag":157,"props":53351,"children":53352},{"style":892},[53353],{"type":25,"value":37479},{"type":20,"tag":157,"props":53355,"children":53356},{"style":39166},[53357],{"type":25,"value":40615},{"type":20,"tag":157,"props":53359,"children":53360},{"style":260},[53361],{"type":25,"value":51214},{"type":20,"tag":157,"props":53363,"children":53364},{"class":159,"line":179},[53365,53370,53374],{"type":20,"tag":157,"props":53366,"children":53367},{"style":6410},[53368],{"type":25,"value":53369},"    default",{"type":20,"tag":157,"props":53371,"children":53372},{"style":39166},[53373],{"type":25,"value":50529},{"type":20,"tag":157,"props":53375,"children":53376},{"style":248},[53377],{"type":25,"value":53049},{"type":20,"tag":157,"props":53379,"children":53380},{"class":159,"line":188},[53381],{"type":20,"tag":157,"props":53382,"children":53383},{"style":892},[53384],{"type":25,"value":943},{"type":20,"tag":157,"props":53386,"children":53387},{"class":159,"line":196},[53388],{"type":20,"tag":157,"props":53389,"children":53390},{"emptyLinePlaceholder":173},[53391],{"type":25,"value":176},{"type":20,"tag":157,"props":53393,"children":53394},{"class":159,"line":204},[53395,53399,53403,53407,53411,53415,53419,53423,53427,53431,53435,53439,53443],{"type":20,"tag":157,"props":53396,"children":53397},{"style":39166},[53398],{"type":25,"value":39169},{"type":20,"tag":157,"props":53400,"children":53401},{"style":248},[53402],{"type":25,"value":50834},{"type":20,"tag":157,"props":53404,"children":53405},{"style":39166},[53406],{"type":25,"value":40615},{"type":20,"tag":157,"props":53408,"children":53409},{"style":248},[53410],{"type":25,"value":50491},{"type":20,"tag":157,"props":53412,"children":53413},{"style":892},[53414],{"type":25,"value":36862},{"type":20,"tag":157,"props":53416,"children":53417},{"style":260},[53418],{"type":25,"value":50990},{"type":20,"tag":157,"props":53420,"children":53421},{"style":892},[53422],{"type":25,"value":53040},{"type":20,"tag":157,"props":53424,"children":53425},{"style":39166},[53426],{"type":25,"value":2261},{"type":20,"tag":157,"props":53428,"children":53429},{"style":892},[53430],{"type":25,"value":42746},{"type":20,"tag":157,"props":53432,"children":53433},{"style":6410},[53434],{"type":25,"value":50843},{"type":20,"tag":157,"props":53436,"children":53437},{"style":892},[53438],{"type":25,"value":42636},{"type":20,"tag":157,"props":53440,"children":53441},{"style":39166},[53442],{"type":25,"value":39895},{"type":20,"tag":157,"props":53444,"children":53445},{"style":892},[53446],{"type":25,"value":53447}," { }\n",{"type":20,"tag":157,"props":53449,"children":53450},{"class":159,"line":213},[53451],{"type":20,"tag":157,"props":53452,"children":53453},{"emptyLinePlaceholder":173},[53454],{"type":25,"value":176},{"type":20,"tag":157,"props":53456,"children":53457},{"class":159,"line":222},[53458],{"type":20,"tag":157,"props":53459,"children":53460},{"style":9628},[53461],{"type":25,"value":53462},"\u002F\u002F foo(123) error\n",{"type":20,"tag":157,"props":53464,"children":53465},{"class":159,"line":440},[53466],{"type":20,"tag":157,"props":53467,"children":53468},{"style":9628},[53469],{"type":25,"value":53470},"\u002F\u002F foo.default = 123 error\n",{"type":20,"tag":157,"props":53472,"children":53473},{"class":159,"line":448},[53474,53478,53482,53486],{"type":20,"tag":157,"props":53475,"children":53476},{"style":248},[53477],{"type":25,"value":51023},{"type":20,"tag":157,"props":53479,"children":53480},{"style":892},[53481],{"type":25,"value":39189},{"type":20,"tag":157,"props":53483,"children":53484},{"style":254},[53485],{"type":25,"value":50605},{"type":20,"tag":157,"props":53487,"children":53488},{"style":892},[53489],{"type":25,"value":8926},{"type":20,"tag":157,"props":53491,"children":53492},{"class":159,"line":456},[53493,53498,53502],{"type":20,"tag":157,"props":53494,"children":53495},{"style":892},[53496],{"type":25,"value":53497},"foo.default ",{"type":20,"tag":157,"props":53499,"children":53500},{"style":39166},[53501],{"type":25,"value":2261},{"type":20,"tag":157,"props":53503,"children":53504},{"style":254},[53505],{"type":25,"value":53506}," \"李四\"\n",{"type":20,"tag":28,"props":53508,"children":53510},{"id":53509},"泛型约束",[53511],{"type":25,"value":53509},{"type":20,"tag":21,"props":53513,"children":53514},{},[53515],{"type":20,"tag":33,"props":53516,"children":53517},{},[53518],{"type":25,"value":53519},"只能是字符串类型",{"type":20,"tag":126,"props":53521,"children":53523},{"className":49867,"code":53522,"language":49808,"meta":8,"style":8},"\u002F\u002F 泛型约束\ntype FunType = string\nfunction bar\u003CT extends FunType>(n: T) { }\n\n\u002F\u002F bar(123) error\nbar(\"张三\")\n",[53524],{"type":20,"tag":84,"props":53525,"children":53526},{"__ignoreMap":8},[53527,53535,53555,53604,53611,53619],{"type":20,"tag":157,"props":53528,"children":53529},{"class":159,"line":160},[53530],{"type":20,"tag":157,"props":53531,"children":53532},{"style":9628},[53533],{"type":25,"value":53534},"\u002F\u002F 泛型约束\n",{"type":20,"tag":157,"props":53536,"children":53537},{"class":159,"line":169},[53538,53542,53547,53551],{"type":20,"tag":157,"props":53539,"children":53540},{"style":39166},[53541],{"type":25,"value":50486},{"type":20,"tag":157,"props":53543,"children":53544},{"style":248},[53545],{"type":25,"value":53546}," FunType",{"type":20,"tag":157,"props":53548,"children":53549},{"style":39166},[53550],{"type":25,"value":39179},{"type":20,"tag":157,"props":53552,"children":53553},{"style":260},[53554],{"type":25,"value":50516},{"type":20,"tag":157,"props":53556,"children":53557},{"class":159,"line":179},[53558,53562,53567,53571,53575,53579,53583,53587,53591,53595,53599],{"type":20,"tag":157,"props":53559,"children":53560},{"style":39166},[53561],{"type":25,"value":50829},{"type":20,"tag":157,"props":53563,"children":53564},{"style":248},[53565],{"type":25,"value":53566}," bar",{"type":20,"tag":157,"props":53568,"children":53569},{"style":892},[53570],{"type":25,"value":36862},{"type":20,"tag":157,"props":53572,"children":53573},{"style":248},[53574],{"type":25,"value":53027},{"type":20,"tag":157,"props":53576,"children":53577},{"style":39166},[53578],{"type":25,"value":52226},{"type":20,"tag":157,"props":53580,"children":53581},{"style":248},[53582],{"type":25,"value":53546},{"type":20,"tag":157,"props":53584,"children":53585},{"style":892},[53586],{"type":25,"value":39862},{"type":20,"tag":157,"props":53588,"children":53589},{"style":6410},[53590],{"type":25,"value":50843},{"type":20,"tag":157,"props":53592,"children":53593},{"style":39166},[53594],{"type":25,"value":40615},{"type":20,"tag":157,"props":53596,"children":53597},{"style":248},[53598],{"type":25,"value":53164},{"type":20,"tag":157,"props":53600,"children":53601},{"style":892},[53602],{"type":25,"value":53603},") { }\n",{"type":20,"tag":157,"props":53605,"children":53606},{"class":159,"line":188},[53607],{"type":20,"tag":157,"props":53608,"children":53609},{"emptyLinePlaceholder":173},[53610],{"type":25,"value":176},{"type":20,"tag":157,"props":53612,"children":53613},{"class":159,"line":196},[53614],{"type":20,"tag":157,"props":53615,"children":53616},{"style":9628},[53617],{"type":25,"value":53618},"\u002F\u002F bar(123) error\n",{"type":20,"tag":157,"props":53620,"children":53621},{"class":159,"line":204},[53622,53627,53631,53635],{"type":20,"tag":157,"props":53623,"children":53624},{"style":248},[53625],{"type":25,"value":53626},"bar",{"type":20,"tag":157,"props":53628,"children":53629},{"style":892},[53630],{"type":25,"value":39189},{"type":20,"tag":157,"props":53632,"children":53633},{"style":254},[53634],{"type":25,"value":50605},{"type":20,"tag":157,"props":53636,"children":53637},{"style":892},[53638],{"type":25,"value":8926},{"type":20,"tag":21,"props":53640,"children":53641},{},[53642],{"type":20,"tag":33,"props":53643,"children":53644},{},[53645],{"type":25,"value":53646},"参数必须拥有length属性",{"type":20,"tag":126,"props":53648,"children":53650},{"className":49867,"code":53649,"language":49808,"meta":8,"style":8},"type FunType = {\n    length: number\n}\nfunction bar\u003CT extends FunType>(n: T) { }\n\n\u002F\u002F bar(123) error\nbar(\"张三\")\n",[53651],{"type":20,"tag":84,"props":53652,"children":53653},{"__ignoreMap":8},[53654,53673,53689,53696,53743,53750,53757],{"type":20,"tag":157,"props":53655,"children":53656},{"class":159,"line":160},[53657,53661,53665,53669],{"type":20,"tag":157,"props":53658,"children":53659},{"style":39166},[53660],{"type":25,"value":50486},{"type":20,"tag":157,"props":53662,"children":53663},{"style":248},[53664],{"type":25,"value":53546},{"type":20,"tag":157,"props":53666,"children":53667},{"style":39166},[53668],{"type":25,"value":39179},{"type":20,"tag":157,"props":53670,"children":53671},{"style":892},[53672],{"type":25,"value":38885},{"type":20,"tag":157,"props":53674,"children":53675},{"class":159,"line":169},[53676,53681,53685],{"type":20,"tag":157,"props":53677,"children":53678},{"style":6410},[53679],{"type":25,"value":53680},"    length",{"type":20,"tag":157,"props":53682,"children":53683},{"style":39166},[53684],{"type":25,"value":40615},{"type":20,"tag":157,"props":53686,"children":53687},{"style":260},[53688],{"type":25,"value":50534},{"type":20,"tag":157,"props":53690,"children":53691},{"class":159,"line":179},[53692],{"type":20,"tag":157,"props":53693,"children":53694},{"style":892},[53695],{"type":25,"value":943},{"type":20,"tag":157,"props":53697,"children":53698},{"class":159,"line":188},[53699,53703,53707,53711,53715,53719,53723,53727,53731,53735,53739],{"type":20,"tag":157,"props":53700,"children":53701},{"style":39166},[53702],{"type":25,"value":50829},{"type":20,"tag":157,"props":53704,"children":53705},{"style":248},[53706],{"type":25,"value":53566},{"type":20,"tag":157,"props":53708,"children":53709},{"style":892},[53710],{"type":25,"value":36862},{"type":20,"tag":157,"props":53712,"children":53713},{"style":248},[53714],{"type":25,"value":53027},{"type":20,"tag":157,"props":53716,"children":53717},{"style":39166},[53718],{"type":25,"value":52226},{"type":20,"tag":157,"props":53720,"children":53721},{"style":248},[53722],{"type":25,"value":53546},{"type":20,"tag":157,"props":53724,"children":53725},{"style":892},[53726],{"type":25,"value":39862},{"type":20,"tag":157,"props":53728,"children":53729},{"style":6410},[53730],{"type":25,"value":50843},{"type":20,"tag":157,"props":53732,"children":53733},{"style":39166},[53734],{"type":25,"value":40615},{"type":20,"tag":157,"props":53736,"children":53737},{"style":248},[53738],{"type":25,"value":53164},{"type":20,"tag":157,"props":53740,"children":53741},{"style":892},[53742],{"type":25,"value":53603},{"type":20,"tag":157,"props":53744,"children":53745},{"class":159,"line":196},[53746],{"type":20,"tag":157,"props":53747,"children":53748},{"emptyLinePlaceholder":173},[53749],{"type":25,"value":176},{"type":20,"tag":157,"props":53751,"children":53752},{"class":159,"line":204},[53753],{"type":20,"tag":157,"props":53754,"children":53755},{"style":9628},[53756],{"type":25,"value":53618},{"type":20,"tag":157,"props":53758,"children":53759},{"class":159,"line":213},[53760,53764,53768,53772],{"type":20,"tag":157,"props":53761,"children":53762},{"style":248},[53763],{"type":25,"value":53626},{"type":20,"tag":157,"props":53765,"children":53766},{"style":892},[53767],{"type":25,"value":39189},{"type":20,"tag":157,"props":53769,"children":53770},{"style":254},[53771],{"type":25,"value":50605},{"type":20,"tag":157,"props":53773,"children":53774},{"style":892},[53775],{"type":25,"value":8926},{"type":20,"tag":1863,"props":53777,"children":53779},{"id":53778},"类型兼容性",[53780],{"type":25,"value":53778},{"type":20,"tag":6665,"props":53782,"children":53783},{},[53784],{"type":20,"tag":21,"props":53785,"children":53786},{},[53787],{"type":25,"value":53788},"类型兼容性用于确定一个类型是否能赋值给其他类型",{"type":20,"tag":126,"props":53790,"children":53792},{"className":38826,"code":53791,"language":38828,"meta":8,"style":8},"let obj1 = { username: \"zhangsan\" }\nlet obj2 = { username: \"lisi\", age: 12 }\n\n\u002F\u002F obj1 = obj2\nobj2 = obj1 \u002F\u002F error\n\u002F\u002F 大的能赋值给小的\n\u002F\u002F 小的不能赋值给大的\n",[53793],{"type":20,"tag":84,"props":53794,"children":53795},{"__ignoreMap":8},[53796,53804,53812,53819,53827,53835,53843],{"type":20,"tag":157,"props":53797,"children":53798},{"class":159,"line":160},[53799],{"type":20,"tag":157,"props":53800,"children":53801},{},[53802],{"type":25,"value":53803},"let obj1 = { username: \"zhangsan\" }\n",{"type":20,"tag":157,"props":53805,"children":53806},{"class":159,"line":169},[53807],{"type":20,"tag":157,"props":53808,"children":53809},{},[53810],{"type":25,"value":53811},"let obj2 = { username: \"lisi\", age: 12 }\n",{"type":20,"tag":157,"props":53813,"children":53814},{"class":159,"line":179},[53815],{"type":20,"tag":157,"props":53816,"children":53817},{"emptyLinePlaceholder":173},[53818],{"type":25,"value":176},{"type":20,"tag":157,"props":53820,"children":53821},{"class":159,"line":188},[53822],{"type":20,"tag":157,"props":53823,"children":53824},{},[53825],{"type":25,"value":53826},"\u002F\u002F obj1 = obj2\n",{"type":20,"tag":157,"props":53828,"children":53829},{"class":159,"line":196},[53830],{"type":20,"tag":157,"props":53831,"children":53832},{},[53833],{"type":25,"value":53834},"obj2 = obj1 \u002F\u002F error\n",{"type":20,"tag":157,"props":53836,"children":53837},{"class":159,"line":204},[53838],{"type":20,"tag":157,"props":53839,"children":53840},{},[53841],{"type":25,"value":53842},"\u002F\u002F 大的能赋值给小的\n",{"type":20,"tag":157,"props":53844,"children":53845},{"class":159,"line":213},[53846],{"type":20,"tag":157,"props":53847,"children":53848},{},[53849],{"type":25,"value":53850},"\u002F\u002F 小的不能赋值给大的\n",{"type":20,"tag":1863,"props":53852,"children":53854},{"id":53853},"映射类型与内置工具类",[53855],{"type":25,"value":53853},{"type":20,"tag":28,"props":53857,"children":53858},{"id":51938},[53859],{"type":25,"value":51938},{"type":20,"tag":6665,"props":53861,"children":53862},{},[53863,53868],{"type":20,"tag":21,"props":53864,"children":53865},{},[53866],{"type":25,"value":53867},"将已知类型的每个属性都变为可选的或者只读的",{"type":20,"tag":21,"props":53869,"children":53870},{},[53871],{"type":25,"value":53872},"只能应用与类型别名。接口不支持",{"type":20,"tag":126,"props":53874,"children":53876},{"className":49867,"code":53875,"language":49808,"meta":8,"style":8},"type A = {\n    username: string\n    age: number\n}\n\ntype B\u003CT> = {\n    [P in keyof T]: T[P]\n}\n\ntype C = B\u003CA>  \u002F\u002F 相当于下面的代码\n\u002F\u002F type C = {\n\u002F\u002F     username: string\n\u002F\u002F     age: number\n\u002F\u002F }\n",[53877],{"type":20,"tag":84,"props":53878,"children":53879},{"__ignoreMap":8},[53880,53899,53914,53929,53936,53943,53974,54023,54030,54037,54076,54083,54090,54097],{"type":20,"tag":157,"props":53881,"children":53882},{"class":159,"line":160},[53883,53887,53891,53895],{"type":20,"tag":157,"props":53884,"children":53885},{"style":39166},[53886],{"type":25,"value":50486},{"type":20,"tag":157,"props":53888,"children":53889},{"style":248},[53890],{"type":25,"value":50491},{"type":20,"tag":157,"props":53892,"children":53893},{"style":39166},[53894],{"type":25,"value":39179},{"type":20,"tag":157,"props":53896,"children":53897},{"style":892},[53898],{"type":25,"value":38885},{"type":20,"tag":157,"props":53900,"children":53901},{"class":159,"line":169},[53902,53906,53910],{"type":20,"tag":157,"props":53903,"children":53904},{"style":6410},[53905],{"type":25,"value":50507},{"type":20,"tag":157,"props":53907,"children":53908},{"style":39166},[53909],{"type":25,"value":40615},{"type":20,"tag":157,"props":53911,"children":53912},{"style":260},[53913],{"type":25,"value":50516},{"type":20,"tag":157,"props":53915,"children":53916},{"class":159,"line":179},[53917,53921,53925],{"type":20,"tag":157,"props":53918,"children":53919},{"style":6410},[53920],{"type":25,"value":50524},{"type":20,"tag":157,"props":53922,"children":53923},{"style":39166},[53924],{"type":25,"value":40615},{"type":20,"tag":157,"props":53926,"children":53927},{"style":260},[53928],{"type":25,"value":50534},{"type":20,"tag":157,"props":53930,"children":53931},{"class":159,"line":188},[53932],{"type":20,"tag":157,"props":53933,"children":53934},{"style":892},[53935],{"type":25,"value":943},{"type":20,"tag":157,"props":53937,"children":53938},{"class":159,"line":196},[53939],{"type":20,"tag":157,"props":53940,"children":53941},{"emptyLinePlaceholder":173},[53942],{"type":25,"value":176},{"type":20,"tag":157,"props":53944,"children":53945},{"class":159,"line":204},[53946,53950,53954,53958,53962,53966,53970],{"type":20,"tag":157,"props":53947,"children":53948},{"style":39166},[53949],{"type":25,"value":50486},{"type":20,"tag":157,"props":53951,"children":53952},{"style":248},[53953],{"type":25,"value":52025},{"type":20,"tag":157,"props":53955,"children":53956},{"style":892},[53957],{"type":25,"value":36862},{"type":20,"tag":157,"props":53959,"children":53960},{"style":248},[53961],{"type":25,"value":53027},{"type":20,"tag":157,"props":53963,"children":53964},{"style":892},[53965],{"type":25,"value":53040},{"type":20,"tag":157,"props":53967,"children":53968},{"style":39166},[53969],{"type":25,"value":2261},{"type":20,"tag":157,"props":53971,"children":53972},{"style":892},[53973],{"type":25,"value":38885},{"type":20,"tag":157,"props":53975,"children":53976},{"class":159,"line":213},[53977,53981,53985,53989,53994,53998,54002,54006,54010,54015,54019],{"type":20,"tag":157,"props":53978,"children":53979},{"style":892},[53980],{"type":25,"value":52368},{"type":20,"tag":157,"props":53982,"children":53983},{"style":248},[53984],{"type":25,"value":52373},{"type":20,"tag":157,"props":53986,"children":53987},{"style":39166},[53988],{"type":25,"value":52378},{"type":20,"tag":157,"props":53990,"children":53991},{"style":39166},[53992],{"type":25,"value":53993}," keyof",{"type":20,"tag":157,"props":53995,"children":53996},{"style":248},[53997],{"type":25,"value":53164},{"type":20,"tag":157,"props":53999,"children":54000},{"style":892},[54001],{"type":25,"value":52397},{"type":20,"tag":157,"props":54003,"children":54004},{"style":39166},[54005],{"type":25,"value":40615},{"type":20,"tag":157,"props":54007,"children":54008},{"style":248},[54009],{"type":25,"value":53164},{"type":20,"tag":157,"props":54011,"children":54012},{"style":892},[54013],{"type":25,"value":54014},"[",{"type":20,"tag":157,"props":54016,"children":54017},{"style":248},[54018],{"type":25,"value":52373},{"type":20,"tag":157,"props":54020,"children":54021},{"style":892},[54022],{"type":25,"value":42686},{"type":20,"tag":157,"props":54024,"children":54025},{"class":159,"line":222},[54026],{"type":20,"tag":157,"props":54027,"children":54028},{"style":892},[54029],{"type":25,"value":943},{"type":20,"tag":157,"props":54031,"children":54032},{"class":159,"line":440},[54033],{"type":20,"tag":157,"props":54034,"children":54035},{"emptyLinePlaceholder":173},[54036],{"type":25,"value":176},{"type":20,"tag":157,"props":54038,"children":54039},{"class":159,"line":448},[54040,54044,54049,54053,54057,54061,54066,54071],{"type":20,"tag":157,"props":54041,"children":54042},{"style":39166},[54043],{"type":25,"value":50486},{"type":20,"tag":157,"props":54045,"children":54046},{"style":248},[54047],{"type":25,"value":54048}," C",{"type":20,"tag":157,"props":54050,"children":54051},{"style":39166},[54052],{"type":25,"value":39179},{"type":20,"tag":157,"props":54054,"children":54055},{"style":248},[54056],{"type":25,"value":52025},{"type":20,"tag":157,"props":54058,"children":54059},{"style":892},[54060],{"type":25,"value":36862},{"type":20,"tag":157,"props":54062,"children":54063},{"style":248},[54064],{"type":25,"value":54065},"A",{"type":20,"tag":157,"props":54067,"children":54068},{"style":892},[54069],{"type":25,"value":54070},">  ",{"type":20,"tag":157,"props":54072,"children":54073},{"style":9628},[54074],{"type":25,"value":54075},"\u002F\u002F 相当于下面的代码\n",{"type":20,"tag":157,"props":54077,"children":54078},{"class":159,"line":456},[54079],{"type":20,"tag":157,"props":54080,"children":54081},{"style":9628},[54082],{"type":25,"value":52110},{"type":20,"tag":157,"props":54084,"children":54085},{"class":159,"line":465},[54086],{"type":20,"tag":157,"props":54087,"children":54088},{"style":9628},[54089],{"type":25,"value":52118},{"type":20,"tag":157,"props":54091,"children":54092},{"class":159,"line":474},[54093],{"type":20,"tag":157,"props":54094,"children":54095},{"style":9628},[54096],{"type":25,"value":52142},{"type":20,"tag":157,"props":54098,"children":54099},{"class":159,"line":483},[54100],{"type":20,"tag":157,"props":54101,"children":54102},{"style":9628},[54103],{"type":25,"value":52126},{"type":20,"tag":28,"props":54105,"children":54107},{"id":54106},"内置工具类",[54108],{"type":25,"value":54106},{"type":20,"tag":6665,"props":54110,"children":54111},{},[54112],{"type":20,"tag":21,"props":54113,"children":54114},{},[54115],{"type":25,"value":54116},"TypeScript内置了很多映射类型的工具",{"type":20,"tag":21,"props":54118,"children":54119},{},[54120],{"type":20,"tag":33,"props":54121,"children":54122},{},[54123],{"type":25,"value":54124},"Readonly",{"type":20,"tag":126,"props":54126,"children":54128},{"className":49867,"code":54127,"language":49808,"meta":8,"style":8},"type A = {\n    username: string\n    age: number\n}\n\ntype B = Readonly\u003CA>\n",[54129],{"type":20,"tag":84,"props":54130,"children":54131},{"__ignoreMap":8},[54132,54151,54166,54181,54188,54195],{"type":20,"tag":157,"props":54133,"children":54134},{"class":159,"line":160},[54135,54139,54143,54147],{"type":20,"tag":157,"props":54136,"children":54137},{"style":39166},[54138],{"type":25,"value":50486},{"type":20,"tag":157,"props":54140,"children":54141},{"style":248},[54142],{"type":25,"value":50491},{"type":20,"tag":157,"props":54144,"children":54145},{"style":39166},[54146],{"type":25,"value":39179},{"type":20,"tag":157,"props":54148,"children":54149},{"style":892},[54150],{"type":25,"value":38885},{"type":20,"tag":157,"props":54152,"children":54153},{"class":159,"line":169},[54154,54158,54162],{"type":20,"tag":157,"props":54155,"children":54156},{"style":6410},[54157],{"type":25,"value":50507},{"type":20,"tag":157,"props":54159,"children":54160},{"style":39166},[54161],{"type":25,"value":40615},{"type":20,"tag":157,"props":54163,"children":54164},{"style":260},[54165],{"type":25,"value":50516},{"type":20,"tag":157,"props":54167,"children":54168},{"class":159,"line":179},[54169,54173,54177],{"type":20,"tag":157,"props":54170,"children":54171},{"style":6410},[54172],{"type":25,"value":50524},{"type":20,"tag":157,"props":54174,"children":54175},{"style":39166},[54176],{"type":25,"value":40615},{"type":20,"tag":157,"props":54178,"children":54179},{"style":260},[54180],{"type":25,"value":50534},{"type":20,"tag":157,"props":54182,"children":54183},{"class":159,"line":188},[54184],{"type":20,"tag":157,"props":54185,"children":54186},{"style":892},[54187],{"type":25,"value":943},{"type":20,"tag":157,"props":54189,"children":54190},{"class":159,"line":196},[54191],{"type":20,"tag":157,"props":54192,"children":54193},{"emptyLinePlaceholder":173},[54194],{"type":25,"value":176},{"type":20,"tag":157,"props":54196,"children":54197},{"class":159,"line":204},[54198,54202,54206,54210,54215,54219,54223],{"type":20,"tag":157,"props":54199,"children":54200},{"style":39166},[54201],{"type":25,"value":50486},{"type":20,"tag":157,"props":54203,"children":54204},{"style":248},[54205],{"type":25,"value":52025},{"type":20,"tag":157,"props":54207,"children":54208},{"style":39166},[54209],{"type":25,"value":39179},{"type":20,"tag":157,"props":54211,"children":54212},{"style":248},[54213],{"type":25,"value":54214}," Readonly",{"type":20,"tag":157,"props":54216,"children":54217},{"style":892},[54218],{"type":25,"value":36862},{"type":20,"tag":157,"props":54220,"children":54221},{"style":248},[54222],{"type":25,"value":54065},{"type":20,"tag":157,"props":54224,"children":54225},{"style":892},[54226],{"type":25,"value":30657},{"type":20,"tag":1863,"props":54228,"children":54230},{"id":54229},"条件类型与infer关键字",[54231],{"type":25,"value":54229},{"type":20,"tag":28,"props":54233,"children":54235},{"id":54234},"条件类型",[54236],{"type":25,"value":54234},{"type":20,"tag":6665,"props":54238,"children":54239},{},[54240],{"type":20,"tag":21,"props":54241,"children":54242},{},[54243],{"type":25,"value":54244},"在初始状态并不直接确定具体类型，而是通过一定的类型运算得到最终的变量类型",{"type":20,"tag":126,"props":54246,"children":54248},{"className":38826,"code":54247,"language":38828,"meta":8,"style":8},"type A = string\ntype B = number | string\ntype C = A extends B ? {} : []  \u002F\u002F {}\n",[54249],{"type":20,"tag":84,"props":54250,"children":54251},{"__ignoreMap":8},[54252,54260,54268],{"type":20,"tag":157,"props":54253,"children":54254},{"class":159,"line":160},[54255],{"type":20,"tag":157,"props":54256,"children":54257},{},[54258],{"type":25,"value":54259},"type A = string\n",{"type":20,"tag":157,"props":54261,"children":54262},{"class":159,"line":169},[54263],{"type":20,"tag":157,"props":54264,"children":54265},{},[54266],{"type":25,"value":54267},"type B = number | string\n",{"type":20,"tag":157,"props":54269,"children":54270},{"class":159,"line":179},[54271],{"type":20,"tag":157,"props":54272,"children":54273},{},[54274],{"type":25,"value":54275},"type C = A extends B ? {} : []  \u002F\u002F {}\n",{"type":20,"tag":21,"props":54277,"children":54278},{},[54279],{"type":20,"tag":33,"props":54280,"children":54281},{},[54282],{"type":25,"value":54106},{"type":20,"tag":126,"props":54284,"children":54286},{"className":49867,"code":54285,"language":49808,"meta":8,"style":8},"type A = Exclude\u003Cstring|number|boolean, string>\n",[54287],{"type":20,"tag":84,"props":54288,"children":54289},{"__ignoreMap":8},[54290],{"type":20,"tag":157,"props":54291,"children":54292},{"class":159,"line":160},[54293,54297,54301,54305,54310,54314,54318,54322,54326,54330,54335,54339,54343],{"type":20,"tag":157,"props":54294,"children":54295},{"style":39166},[54296],{"type":25,"value":50486},{"type":20,"tag":157,"props":54298,"children":54299},{"style":248},[54300],{"type":25,"value":50491},{"type":20,"tag":157,"props":54302,"children":54303},{"style":39166},[54304],{"type":25,"value":39179},{"type":20,"tag":157,"props":54306,"children":54307},{"style":248},[54308],{"type":25,"value":54309}," Exclude",{"type":20,"tag":157,"props":54311,"children":54312},{"style":892},[54313],{"type":25,"value":36862},{"type":20,"tag":157,"props":54315,"children":54316},{"style":260},[54317],{"type":25,"value":50990},{"type":20,"tag":157,"props":54319,"children":54320},{"style":39166},[54321],{"type":25,"value":50968},{"type":20,"tag":157,"props":54323,"children":54324},{"style":260},[54325],{"type":25,"value":50973},{"type":20,"tag":157,"props":54327,"children":54328},{"style":39166},[54329],{"type":25,"value":50968},{"type":20,"tag":157,"props":54331,"children":54332},{"style":260},[54333],{"type":25,"value":54334},"boolean",{"type":20,"tag":157,"props":54336,"children":54337},{"style":892},[54338],{"type":25,"value":42626},{"type":20,"tag":157,"props":54340,"children":54341},{"style":260},[54342],{"type":25,"value":50990},{"type":20,"tag":157,"props":54344,"children":54345},{"style":892},[54346],{"type":25,"value":30657},{"type":20,"tag":15759,"props":54348,"children":54350},{"id":54349},"vue3与typescript配合使用",[54351],{"type":25,"value":54352},"Vue3与TypeScript配合使用",{"type":20,"tag":1863,"props":54354,"children":54356},{"id":54355},"dts声明文件与declare关键字",[54357],{"type":25,"value":54358},"d.ts声明文件与declare关键字",{"type":20,"tag":6665,"props":54360,"children":54361},{},[54362,54375],{"type":20,"tag":21,"props":54363,"children":54364},{},[54365,54367,54373],{"type":25,"value":54366},"在TypeScript中以",{"type":20,"tag":84,"props":54368,"children":54370},{"className":54369},[],[54371],{"type":25,"value":54372},".d.ts",{"type":25,"value":54374},"为后缀的文件，我们称之为TypeSCript声明文件。它的主要作用是描述JavaScript模块内所有导出接口的类型信息",{"type":20,"tag":21,"props":54376,"children":54377},{},[54378],{"type":25,"value":54379},"使js文件能够在ts文件进行使用",{"type":20,"tag":126,"props":54381,"children":54383},{"className":49867,"code":54382,"language":49808,"meta":8,"style":8},"\u002F\u002F demo.d.ts\nexport declare function foo(n: number): void\n",[54384],{"type":20,"tag":84,"props":54385,"children":54386},{"__ignoreMap":8},[54387,54395],{"type":20,"tag":157,"props":54388,"children":54389},{"class":159,"line":160},[54390],{"type":20,"tag":157,"props":54391,"children":54392},{"style":9628},[54393],{"type":25,"value":54394},"\u002F\u002F demo.d.ts\n",{"type":20,"tag":157,"props":54396,"children":54397},{"class":159,"line":169},[54398,54402,54407,54412,54416,54420,54424,54428,54432,54436,54440],{"type":20,"tag":157,"props":54399,"children":54400},{"style":39166},[54401],{"type":25,"value":42012},{"type":20,"tag":157,"props":54403,"children":54404},{"style":39166},[54405],{"type":25,"value":54406}," declare",{"type":20,"tag":157,"props":54408,"children":54409},{"style":39166},[54410],{"type":25,"value":54411}," function",{"type":20,"tag":157,"props":54413,"children":54414},{"style":248},[54415],{"type":25,"value":50834},{"type":20,"tag":157,"props":54417,"children":54418},{"style":892},[54419],{"type":25,"value":39189},{"type":20,"tag":157,"props":54421,"children":54422},{"style":6410},[54423],{"type":25,"value":50843},{"type":20,"tag":157,"props":54425,"children":54426},{"style":39166},[54427],{"type":25,"value":40615},{"type":20,"tag":157,"props":54429,"children":54430},{"style":260},[54431],{"type":25,"value":50181},{"type":20,"tag":157,"props":54433,"children":54434},{"style":892},[54435],{"type":25,"value":37479},{"type":20,"tag":157,"props":54437,"children":54438},{"style":39166},[54439],{"type":25,"value":40615},{"type":20,"tag":157,"props":54441,"children":54442},{"style":260},[54443],{"type":25,"value":51214},{"type":20,"tag":1863,"props":54445,"children":54447},{"id":54446},"types和definitelytyped仓库",[54448],{"type":25,"value":54449},"@types和DefinitelyTyped仓库",{"type":20,"tag":6665,"props":54451,"children":54452},{},[54453],{"type":20,"tag":21,"props":54454,"children":54455},{},[54456],{"type":25,"value":54457},"Definitely是一个高质量的TypeScript类型定义的仓库。通过@types方式来安装常见的第三方JavaScript库的声明适配模块",{"type":20,"tag":21,"props":54459,"children":54460},{},[54461,54463,54468,54470,54476],{"type":25,"value":54462},"有一些第三方库没有",{"type":20,"tag":84,"props":54464,"children":54466},{"className":54465},[],[54467],{"type":25,"value":54372},{"type":25,"value":54469},"文件。可以通过",{"type":20,"tag":84,"props":54471,"children":54473},{"className":54472},[],[54474],{"type":25,"value":54475},"npm i --save-dev @types\u002Fjquery",{"type":25,"value":54477},"来自动生成",{"type":20,"tag":1863,"props":54479,"children":54481},{"id":54480},"libdts与globaldts",[54482],{"type":25,"value":54483},"lib.d.ts与global.d.ts",{"type":20,"tag":6665,"props":54485,"children":54486},{},[54487],{"type":20,"tag":21,"props":54488,"children":54489},{},[54490],{"type":25,"value":54491},"当你安装TypeScript时，会顺带安装一个lib.d.ts声明文件。这个文件包含JavaScript运行时以及DOM中存在各种常见的环境声明",{"type":20,"tag":28,"props":54493,"children":54495},{"id":54494},"globaldts",[54496],{"type":25,"value":54497},"global.d.ts",{"type":20,"tag":21,"props":54499,"children":54500},{},[54501],{"type":25,"value":54502},"在global.d.ts文件中定义的类型，在全局都可以使用",{"type":20,"tag":1863,"props":54504,"children":54506},{"id":54505},"详解tsconfigjson",[54507],{"type":25,"value":54508},"详解tsconfig.json",{"type":20,"tag":5719,"props":54510,"children":54511},{},[54512,54517,54527,54532,54542,54552],{"type":20,"tag":48,"props":54513,"children":54514},{},[54515],{"type":25,"value":54516},"compilerOptions:{}——编译选项",{"type":20,"tag":48,"props":54518,"children":54519},{},[54520,54522,54525],{"type":25,"value":54521},"files:",{"type":20,"tag":157,"props":54523,"children":54524},{},[],{"type":25,"value":54526},"——包含在程序中的文件的允许列表",{"type":20,"tag":48,"props":54528,"children":54529},{},[54530],{"type":25,"value":54531},"extends:\" \"——继承的另一个配置文件",{"type":20,"tag":48,"props":54533,"children":54534},{},[54535,54537,54540],{"type":25,"value":54536},"include:",{"type":20,"tag":157,"props":54538,"children":54539},{},[],{"type":25,"value":54541}," —— 指定的进行编译解析",{"type":20,"tag":48,"props":54543,"children":54544},{},[54545,54547,54550],{"type":25,"value":54546},"exclude:",{"type":20,"tag":157,"props":54548,"children":54549},{},[],{"type":25,"value":54551}," ——指定的不进行编译解析",{"type":20,"tag":48,"props":54553,"children":54554},{},[54555,54557,54560],{"type":25,"value":54556},"references:",{"type":20,"tag":157,"props":54558,"children":54559},{},[],{"type":25,"value":54561},"——项目引用，提高性能",{"type":20,"tag":1863,"props":54563,"children":54565},{"id":54564},"组合式api与ts",[54566],{"type":25,"value":54567},"组合式API与TS",{"type":20,"tag":28,"props":54569,"children":54571},{"id":54570},"与ref-配合",[54572],{"type":25,"value":54573},"与ref 配合",{"type":20,"tag":126,"props":54575,"children":54577},{"className":49867,"code":54576,"language":49808,"meta":8,"style":8},"let count = ref\u003Cnumber|string>(0)\ncount.value = \"hello\"\n\ninterface List {\n    username: string\n    age: number\n}\n\nlet list = ref\u003CList[]>([])  \n\nlist.value.push({\n    username: \"world\",\n    age: 12\n})\n",[54578],{"type":20,"tag":84,"props":54579,"children":54580},{"__ignoreMap":8},[54581,54628,54645,54652,54668,54683,54698,54705,54712,54746,54753,54769,54785,54796],{"type":20,"tag":157,"props":54582,"children":54583},{"class":159,"line":160},[54584,54588,54592,54596,54600,54604,54608,54612,54616,54620,54624],{"type":20,"tag":157,"props":54585,"children":54586},{"style":39166},[54587],{"type":25,"value":39240},{"type":20,"tag":157,"props":54589,"children":54590},{"style":892},[54591],{"type":25,"value":46860},{"type":20,"tag":157,"props":54593,"children":54594},{"style":39166},[54595],{"type":25,"value":2261},{"type":20,"tag":157,"props":54597,"children":54598},{"style":248},[54599],{"type":25,"value":39184},{"type":20,"tag":157,"props":54601,"children":54602},{"style":892},[54603],{"type":25,"value":36862},{"type":20,"tag":157,"props":54605,"children":54606},{"style":260},[54607],{"type":25,"value":50973},{"type":20,"tag":157,"props":54609,"children":54610},{"style":39166},[54611],{"type":25,"value":50968},{"type":20,"tag":157,"props":54613,"children":54614},{"style":260},[54615],{"type":25,"value":50990},{"type":20,"tag":157,"props":54617,"children":54618},{"style":892},[54619],{"type":25,"value":39862},{"type":20,"tag":157,"props":54621,"children":54622},{"style":260},[54623],{"type":25,"value":10387},{"type":20,"tag":157,"props":54625,"children":54626},{"style":892},[54627],{"type":25,"value":8926},{"type":20,"tag":157,"props":54629,"children":54630},{"class":159,"line":169},[54631,54636,54640],{"type":20,"tag":157,"props":54632,"children":54633},{"style":892},[54634],{"type":25,"value":54635},"count.value ",{"type":20,"tag":157,"props":54637,"children":54638},{"style":39166},[54639],{"type":25,"value":2261},{"type":20,"tag":157,"props":54641,"children":54642},{"style":254},[54643],{"type":25,"value":54644}," \"hello\"\n",{"type":20,"tag":157,"props":54646,"children":54647},{"class":159,"line":179},[54648],{"type":20,"tag":157,"props":54649,"children":54650},{"emptyLinePlaceholder":173},[54651],{"type":25,"value":176},{"type":20,"tag":157,"props":54653,"children":54654},{"class":159,"line":188},[54655,54659,54664],{"type":20,"tag":157,"props":54656,"children":54657},{"style":39166},[54658],{"type":25,"value":52020},{"type":20,"tag":157,"props":54660,"children":54661},{"style":248},[54662],{"type":25,"value":54663}," List",{"type":20,"tag":157,"props":54665,"children":54666},{"style":892},[54667],{"type":25,"value":38885},{"type":20,"tag":157,"props":54669,"children":54670},{"class":159,"line":196},[54671,54675,54679],{"type":20,"tag":157,"props":54672,"children":54673},{"style":6410},[54674],{"type":25,"value":50507},{"type":20,"tag":157,"props":54676,"children":54677},{"style":39166},[54678],{"type":25,"value":40615},{"type":20,"tag":157,"props":54680,"children":54681},{"style":260},[54682],{"type":25,"value":50516},{"type":20,"tag":157,"props":54684,"children":54685},{"class":159,"line":204},[54686,54690,54694],{"type":20,"tag":157,"props":54687,"children":54688},{"style":6410},[54689],{"type":25,"value":50524},{"type":20,"tag":157,"props":54691,"children":54692},{"style":39166},[54693],{"type":25,"value":40615},{"type":20,"tag":157,"props":54695,"children":54696},{"style":260},[54697],{"type":25,"value":50534},{"type":20,"tag":157,"props":54699,"children":54700},{"class":159,"line":213},[54701],{"type":20,"tag":157,"props":54702,"children":54703},{"style":892},[54704],{"type":25,"value":943},{"type":20,"tag":157,"props":54706,"children":54707},{"class":159,"line":222},[54708],{"type":20,"tag":157,"props":54709,"children":54710},{"emptyLinePlaceholder":173},[54711],{"type":25,"value":176},{"type":20,"tag":157,"props":54713,"children":54714},{"class":159,"line":440},[54715,54719,54724,54728,54732,54736,54741],{"type":20,"tag":157,"props":54716,"children":54717},{"style":39166},[54718],{"type":25,"value":39240},{"type":20,"tag":157,"props":54720,"children":54721},{"style":892},[54722],{"type":25,"value":54723}," list ",{"type":20,"tag":157,"props":54725,"children":54726},{"style":39166},[54727],{"type":25,"value":2261},{"type":20,"tag":157,"props":54729,"children":54730},{"style":248},[54731],{"type":25,"value":39184},{"type":20,"tag":157,"props":54733,"children":54734},{"style":892},[54735],{"type":25,"value":36862},{"type":20,"tag":157,"props":54737,"children":54738},{"style":248},[54739],{"type":25,"value":54740},"List",{"type":20,"tag":157,"props":54742,"children":54743},{"style":892},[54744],{"type":25,"value":54745},"[]>([])  \n",{"type":20,"tag":157,"props":54747,"children":54748},{"class":159,"line":448},[54749],{"type":20,"tag":157,"props":54750,"children":54751},{"emptyLinePlaceholder":173},[54752],{"type":25,"value":176},{"type":20,"tag":157,"props":54754,"children":54755},{"class":159,"line":456},[54756,54761,54765],{"type":20,"tag":157,"props":54757,"children":54758},{"style":892},[54759],{"type":25,"value":54760},"list.value.",{"type":20,"tag":157,"props":54762,"children":54763},{"style":248},[54764],{"type":25,"value":49246},{"type":20,"tag":157,"props":54766,"children":54767},{"style":892},[54768],{"type":25,"value":48605},{"type":20,"tag":157,"props":54770,"children":54771},{"class":159,"line":465},[54772,54776,54781],{"type":20,"tag":157,"props":54773,"children":54774},{"style":892},[54775],{"type":25,"value":50600},{"type":20,"tag":157,"props":54777,"children":54778},{"style":254},[54779],{"type":25,"value":54780},"\"world\"",{"type":20,"tag":157,"props":54782,"children":54783},{"style":892},[54784],{"type":25,"value":918},{"type":20,"tag":157,"props":54786,"children":54787},{"class":159,"line":474},[54788,54792],{"type":20,"tag":157,"props":54789,"children":54790},{"style":892},[54791],{"type":25,"value":50617},{"type":20,"tag":157,"props":54793,"children":54794},{"style":260},[54795],{"type":25,"value":52318},{"type":20,"tag":157,"props":54797,"children":54798},{"class":159,"line":483},[54799],{"type":20,"tag":157,"props":54800,"children":54801},{"style":892},[54802],{"type":25,"value":40371},{"type":20,"tag":28,"props":54804,"children":54806},{"id":54805},"与defineprops配合",[54807],{"type":25,"value":54808},"与defineProps配合",{"type":20,"tag":126,"props":54810,"children":54812},{"className":49867,"code":54811,"language":49808,"meta":8,"style":8},"\u002F\u002F 1.\ndefineProps({\n    count: [Number, String]\n})\n\n\u002F\u002F 2.\ninterface Props {\n    count: number|string\n    list: {username: string; age: number}[]\n}\ndefineProps\u003CProps>()\n",[54813],{"type":20,"tag":84,"props":54814,"children":54815},{"__ignoreMap":8},[54816,54824,54836,54844,54851,54858,54866,54882,54907,54956,54963],{"type":20,"tag":157,"props":54817,"children":54818},{"class":159,"line":160},[54819],{"type":20,"tag":157,"props":54820,"children":54821},{"style":9628},[54822],{"type":25,"value":54823},"\u002F\u002F 1.\n",{"type":20,"tag":157,"props":54825,"children":54826},{"class":159,"line":169},[54827,54832],{"type":20,"tag":157,"props":54828,"children":54829},{"style":248},[54830],{"type":25,"value":54831},"defineProps",{"type":20,"tag":157,"props":54833,"children":54834},{"style":892},[54835],{"type":25,"value":48605},{"type":20,"tag":157,"props":54837,"children":54838},{"class":159,"line":179},[54839],{"type":20,"tag":157,"props":54840,"children":54841},{"style":892},[54842],{"type":25,"value":54843},"    count: [Number, String]\n",{"type":20,"tag":157,"props":54845,"children":54846},{"class":159,"line":188},[54847],{"type":20,"tag":157,"props":54848,"children":54849},{"style":892},[54850],{"type":25,"value":40371},{"type":20,"tag":157,"props":54852,"children":54853},{"class":159,"line":196},[54854],{"type":20,"tag":157,"props":54855,"children":54856},{"emptyLinePlaceholder":173},[54857],{"type":25,"value":176},{"type":20,"tag":157,"props":54859,"children":54860},{"class":159,"line":204},[54861],{"type":20,"tag":157,"props":54862,"children":54863},{"style":9628},[54864],{"type":25,"value":54865},"\u002F\u002F 2.\n",{"type":20,"tag":157,"props":54867,"children":54868},{"class":159,"line":213},[54869,54873,54878],{"type":20,"tag":157,"props":54870,"children":54871},{"style":39166},[54872],{"type":25,"value":52020},{"type":20,"tag":157,"props":54874,"children":54875},{"style":248},[54876],{"type":25,"value":54877}," Props",{"type":20,"tag":157,"props":54879,"children":54880},{"style":892},[54881],{"type":25,"value":38885},{"type":20,"tag":157,"props":54883,"children":54884},{"class":159,"line":222},[54885,54890,54894,54898,54902],{"type":20,"tag":157,"props":54886,"children":54887},{"style":6410},[54888],{"type":25,"value":54889},"    count",{"type":20,"tag":157,"props":54891,"children":54892},{"style":39166},[54893],{"type":25,"value":40615},{"type":20,"tag":157,"props":54895,"children":54896},{"style":260},[54897],{"type":25,"value":50181},{"type":20,"tag":157,"props":54899,"children":54900},{"style":39166},[54901],{"type":25,"value":50968},{"type":20,"tag":157,"props":54903,"children":54904},{"style":260},[54905],{"type":25,"value":54906},"string\n",{"type":20,"tag":157,"props":54908,"children":54909},{"class":159,"line":440},[54910,54915,54919,54923,54927,54931,54935,54939,54943,54947,54951],{"type":20,"tag":157,"props":54911,"children":54912},{"style":6410},[54913],{"type":25,"value":54914},"    list",{"type":20,"tag":157,"props":54916,"children":54917},{"style":39166},[54918],{"type":25,"value":40615},{"type":20,"tag":157,"props":54920,"children":54921},{"style":892},[54922],{"type":25,"value":40600},{"type":20,"tag":157,"props":54924,"children":54925},{"style":6410},[54926],{"type":25,"value":52591},{"type":20,"tag":157,"props":54928,"children":54929},{"style":39166},[54930],{"type":25,"value":40615},{"type":20,"tag":157,"props":54932,"children":54933},{"style":260},[54934],{"type":25,"value":50869},{"type":20,"tag":157,"props":54936,"children":54937},{"style":892},[54938],{"type":25,"value":39649},{"type":20,"tag":157,"props":54940,"children":54941},{"style":6410},[54942],{"type":25,"value":52616},{"type":20,"tag":157,"props":54944,"children":54945},{"style":39166},[54946],{"type":25,"value":40615},{"type":20,"tag":157,"props":54948,"children":54949},{"style":260},[54950],{"type":25,"value":50181},{"type":20,"tag":157,"props":54952,"children":54953},{"style":892},[54954],{"type":25,"value":54955},"}[]\n",{"type":20,"tag":157,"props":54957,"children":54958},{"class":159,"line":448},[54959],{"type":20,"tag":157,"props":54960,"children":54961},{"style":892},[54962],{"type":25,"value":943},{"type":20,"tag":157,"props":54964,"children":54965},{"class":159,"line":456},[54966,54970,54974,54979],{"type":20,"tag":157,"props":54967,"children":54968},{"style":248},[54969],{"type":25,"value":54831},{"type":20,"tag":157,"props":54971,"children":54972},{"style":892},[54973],{"type":25,"value":36862},{"type":20,"tag":157,"props":54975,"children":54976},{"style":248},[54977],{"type":25,"value":54978},"Props",{"type":20,"tag":157,"props":54980,"children":54981},{"style":892},[54982],{"type":25,"value":54983},">()\n",{"type":20,"tag":28,"props":54985,"children":54987},{"id":54986},"与defineemits配合",[54988],{"type":25,"value":54989},"与defineEmits配合",{"type":20,"tag":126,"props":54991,"children":54993},{"className":49867,"code":54992,"language":49808,"meta":8,"style":8},"interface Emits {\n    (e: 'getData', payload: string): void\n}\n\nlet emit = defineEmits\u003CEmits>()\nemit(\"getData\", \"hello\")\n",[54994],{"type":20,"tag":84,"props":54995,"children":54996},{"__ignoreMap":8},[54997,55013,55063,55070,55077,55110],{"type":20,"tag":157,"props":54998,"children":54999},{"class":159,"line":160},[55000,55004,55009],{"type":20,"tag":157,"props":55001,"children":55002},{"style":39166},[55003],{"type":25,"value":52020},{"type":20,"tag":157,"props":55005,"children":55006},{"style":248},[55007],{"type":25,"value":55008}," Emits",{"type":20,"tag":157,"props":55010,"children":55011},{"style":892},[55012],{"type":25,"value":38885},{"type":20,"tag":157,"props":55014,"children":55015},{"class":159,"line":169},[55016,55020,55025,55029,55034,55038,55043,55047,55051,55055,55059],{"type":20,"tag":157,"props":55017,"children":55018},{"style":892},[55019],{"type":25,"value":51302},{"type":20,"tag":157,"props":55021,"children":55022},{"style":6410},[55023],{"type":25,"value":55024},"e",{"type":20,"tag":157,"props":55026,"children":55027},{"style":39166},[55028],{"type":25,"value":40615},{"type":20,"tag":157,"props":55030,"children":55031},{"style":254},[55032],{"type":25,"value":55033}," 'getData'",{"type":20,"tag":157,"props":55035,"children":55036},{"style":892},[55037],{"type":25,"value":42626},{"type":20,"tag":157,"props":55039,"children":55040},{"style":6410},[55041],{"type":25,"value":55042},"payload",{"type":20,"tag":157,"props":55044,"children":55045},{"style":39166},[55046],{"type":25,"value":40615},{"type":20,"tag":157,"props":55048,"children":55049},{"style":260},[55050],{"type":25,"value":50869},{"type":20,"tag":157,"props":55052,"children":55053},{"style":892},[55054],{"type":25,"value":37479},{"type":20,"tag":157,"props":55056,"children":55057},{"style":39166},[55058],{"type":25,"value":40615},{"type":20,"tag":157,"props":55060,"children":55061},{"style":260},[55062],{"type":25,"value":51214},{"type":20,"tag":157,"props":55064,"children":55065},{"class":159,"line":179},[55066],{"type":20,"tag":157,"props":55067,"children":55068},{"style":892},[55069],{"type":25,"value":943},{"type":20,"tag":157,"props":55071,"children":55072},{"class":159,"line":188},[55073],{"type":20,"tag":157,"props":55074,"children":55075},{"emptyLinePlaceholder":173},[55076],{"type":25,"value":176},{"type":20,"tag":157,"props":55078,"children":55079},{"class":159,"line":196},[55080,55084,55089,55093,55097,55101,55106],{"type":20,"tag":157,"props":55081,"children":55082},{"style":39166},[55083],{"type":25,"value":39240},{"type":20,"tag":157,"props":55085,"children":55086},{"style":892},[55087],{"type":25,"value":55088}," emit ",{"type":20,"tag":157,"props":55090,"children":55091},{"style":39166},[55092],{"type":25,"value":2261},{"type":20,"tag":157,"props":55094,"children":55095},{"style":248},[55096],{"type":25,"value":48686},{"type":20,"tag":157,"props":55098,"children":55099},{"style":892},[55100],{"type":25,"value":36862},{"type":20,"tag":157,"props":55102,"children":55103},{"style":248},[55104],{"type":25,"value":55105},"Emits",{"type":20,"tag":157,"props":55107,"children":55108},{"style":892},[55109],{"type":25,"value":54983},{"type":20,"tag":157,"props":55111,"children":55112},{"class":159,"line":204},[55113,55118,55122,55127,55131,55136],{"type":20,"tag":157,"props":55114,"children":55115},{"style":248},[55116],{"type":25,"value":55117},"emit",{"type":20,"tag":157,"props":55119,"children":55120},{"style":892},[55121],{"type":25,"value":39189},{"type":20,"tag":157,"props":55123,"children":55124},{"style":254},[55125],{"type":25,"value":55126},"\"getData\"",{"type":20,"tag":157,"props":55128,"children":55129},{"style":892},[55130],{"type":25,"value":42626},{"type":20,"tag":157,"props":55132,"children":55133},{"style":254},[55134],{"type":25,"value":55135},"\"hello\"",{"type":20,"tag":157,"props":55137,"children":55138},{"style":892},[55139],{"type":25,"value":8926},{"type":20,"tag":1863,"props":55141,"children":55143},{"id":55142},"vue_router与ts配合",[55144],{"type":25,"value":55145},"Vue_Router与TS配合",{"type":20,"tag":28,"props":55147,"children":55149},{"id":55148},"routes",[55150],{"type":25,"value":55148},{"type":20,"tag":126,"props":55152,"children":55154},{"className":49867,"code":55153,"language":49808,"meta":8,"style":8},"import type { RouteReCordRaw } from 'vue-router'\n\nconst routes: Array\u003CRouteReCordRaw> = []\n",[55155],{"type":20,"tag":84,"props":55156,"children":55157},{"__ignoreMap":8},[55158,55182,55189],{"type":20,"tag":157,"props":55159,"children":55160},{"class":159,"line":160},[55161,55165,55169,55174,55178],{"type":20,"tag":157,"props":55162,"children":55163},{"style":39166},[55164],{"type":25,"value":40516},{"type":20,"tag":157,"props":55166,"children":55167},{"style":39166},[55168],{"type":25,"value":41211},{"type":20,"tag":157,"props":55170,"children":55171},{"style":892},[55172],{"type":25,"value":55173}," { RouteReCordRaw } ",{"type":20,"tag":157,"props":55175,"children":55176},{"style":39166},[55177],{"type":25,"value":39806},{"type":20,"tag":157,"props":55179,"children":55180},{"style":254},[55181],{"type":25,"value":49173},{"type":20,"tag":157,"props":55183,"children":55184},{"class":159,"line":169},[55185],{"type":20,"tag":157,"props":55186,"children":55187},{"emptyLinePlaceholder":173},[55188],{"type":25,"value":176},{"type":20,"tag":157,"props":55190,"children":55191},{"class":159,"line":179},[55192,55196,55201,55205,55210,55214,55219,55223,55227],{"type":20,"tag":157,"props":55193,"children":55194},{"style":39166},[55195],{"type":25,"value":39169},{"type":20,"tag":157,"props":55197,"children":55198},{"style":260},[55199],{"type":25,"value":55200}," routes",{"type":20,"tag":157,"props":55202,"children":55203},{"style":39166},[55204],{"type":25,"value":40615},{"type":20,"tag":157,"props":55206,"children":55207},{"style":248},[55208],{"type":25,"value":55209}," Array",{"type":20,"tag":157,"props":55211,"children":55212},{"style":892},[55213],{"type":25,"value":36862},{"type":20,"tag":157,"props":55215,"children":55216},{"style":248},[55217],{"type":25,"value":55218},"RouteReCordRaw",{"type":20,"tag":157,"props":55220,"children":55221},{"style":892},[55222],{"type":25,"value":53040},{"type":20,"tag":157,"props":55224,"children":55225},{"style":39166},[55226],{"type":25,"value":2261},{"type":20,"tag":157,"props":55228,"children":55229},{"style":892},[55230],{"type":25,"value":55231}," []\n",{"type":20,"tag":28,"props":55233,"children":55235},{"id":55234},"routes中的meta",[55236],{"type":25,"value":55234},{"type":20,"tag":126,"props":55238,"children":55240},{"className":49867,"code":55239,"language":49808,"meta":8,"style":8},"declare module 'vue-router' {\n    interface RouteMeta {\n        isAdmin?: boolean\n        requiresAuth: boolean\n    }\n}\n",[55241],{"type":20,"tag":84,"props":55242,"children":55243},{"__ignoreMap":8},[55244,55266,55283,55300,55316,55323],{"type":20,"tag":157,"props":55245,"children":55246},{"class":159,"line":160},[55247,55252,55257,55262],{"type":20,"tag":157,"props":55248,"children":55249},{"style":39166},[55250],{"type":25,"value":55251},"declare",{"type":20,"tag":157,"props":55253,"children":55254},{"style":39166},[55255],{"type":25,"value":55256}," module",{"type":20,"tag":157,"props":55258,"children":55259},{"style":254},[55260],{"type":25,"value":55261}," 'vue-router'",{"type":20,"tag":157,"props":55263,"children":55264},{"style":892},[55265],{"type":25,"value":38885},{"type":20,"tag":157,"props":55267,"children":55268},{"class":159,"line":169},[55269,55274,55279],{"type":20,"tag":157,"props":55270,"children":55271},{"style":39166},[55272],{"type":25,"value":55273},"    interface",{"type":20,"tag":157,"props":55275,"children":55276},{"style":248},[55277],{"type":25,"value":55278}," RouteMeta",{"type":20,"tag":157,"props":55280,"children":55281},{"style":892},[55282],{"type":25,"value":38885},{"type":20,"tag":157,"props":55284,"children":55285},{"class":159,"line":179},[55286,55291,55295],{"type":20,"tag":157,"props":55287,"children":55288},{"style":6410},[55289],{"type":25,"value":55290},"        isAdmin",{"type":20,"tag":157,"props":55292,"children":55293},{"style":39166},[55294],{"type":25,"value":50529},{"type":20,"tag":157,"props":55296,"children":55297},{"style":260},[55298],{"type":25,"value":55299}," boolean\n",{"type":20,"tag":157,"props":55301,"children":55302},{"class":159,"line":188},[55303,55308,55312],{"type":20,"tag":157,"props":55304,"children":55305},{"style":6410},[55306],{"type":25,"value":55307},"        requiresAuth",{"type":20,"tag":157,"props":55309,"children":55310},{"style":39166},[55311],{"type":25,"value":40615},{"type":20,"tag":157,"props":55313,"children":55314},{"style":260},[55315],{"type":25,"value":55299},{"type":20,"tag":157,"props":55317,"children":55318},{"class":159,"line":196},[55319],{"type":20,"tag":157,"props":55320,"children":55321},{"style":892},[55322],{"type":25,"value":872},{"type":20,"tag":157,"props":55324,"children":55325},{"class":159,"line":204},[55326],{"type":20,"tag":157,"props":55327,"children":55328},{"style":892},[55329],{"type":25,"value":943},{"type":20,"tag":1863,"props":55331,"children":55333},{"id":55332},"element-plus与ts",[55334],{"type":25,"value":55335},"Element Plus与TS",{"type":20,"tag":1785,"props":55337,"children":55338},{},[55339],{"type":25,"value":1789},{"title":8,"searchDepth":169,"depth":169,"links":55341},[55342,55343,55357,55372,55379,55386,55387,55388,55389,55390,55391,55395,55400,55404,55405,55406,55407,55410,55413,55414,55418,55421,55422,55423,55426,55427,55432,55436],{"id":38856,"depth":169,"text":38856},{"id":39076,"depth":169,"text":39076,"children":55344},[55345,55346,55347,55348,55349,55350,55351,55352,55353,55354,55355,55356],{"id":39081,"depth":179,"text":39089},{"id":25765,"depth":179,"text":25765},{"id":39269,"depth":179,"text":39269},{"id":39746,"depth":179,"text":39746},{"id":40010,"depth":179,"text":40013},{"id":40374,"depth":179,"text":40374},{"id":40384,"depth":179,"text":40384},{"id":40441,"depth":179,"text":40441},{"id":40454,"depth":179,"text":40454},{"id":40745,"depth":179,"text":40748},{"id":41004,"depth":179,"text":38856},{"id":41062,"depth":179,"text":41065},{"id":41131,"depth":169,"text":41134,"children":55358},[55359,55360,55361,55362,55363,55364,55365,55366,55367,55368,55369,55370,55371],{"id":41137,"depth":179,"text":41137},{"id":41155,"depth":179,"text":41155},{"id":41176,"depth":179,"text":41176},{"id":41263,"depth":179,"text":41263},{"id":41321,"depth":179,"text":41321},{"id":41361,"depth":179,"text":41361},{"id":41867,"depth":179,"text":41870},{"id":42389,"depth":179,"text":42389},{"id":43122,"depth":179,"text":43122},{"id":44166,"depth":179,"text":44166},{"id":44798,"depth":179,"text":44801},{"id":45521,"depth":179,"text":45521},{"id":46228,"depth":179,"text":46228},{"id":46435,"depth":169,"text":46438,"children":55373},[55374,55375,55376,55377,55378],{"id":46441,"depth":179,"text":46444},{"id":46707,"depth":179,"text":46707},{"id":47014,"depth":179,"text":47017},{"id":47580,"depth":179,"text":47583},{"id":48163,"depth":179,"text":48166},{"id":48774,"depth":169,"text":48777,"children":55380},[55381,55382,55383,55384,55385],{"id":48780,"depth":179,"text":48780},{"id":48823,"depth":179,"text":48823},{"id":48935,"depth":179,"text":48935},{"id":49425,"depth":179,"text":49425},{"id":49482,"depth":179,"text":49482},{"id":49497,"depth":169,"text":49497},{"id":49814,"depth":169,"text":49814},{"id":49848,"depth":169,"text":49851},{"id":50067,"depth":169,"text":50067},{"id":50221,"depth":169,"text":50224},{"id":50371,"depth":169,"text":50371,"children":55392},[55393,55394],{"id":50376,"depth":179,"text":50376},{"id":50411,"depth":179,"text":50411},{"id":50451,"depth":169,"text":50451,"children":55396},[55397,55398,55399],{"id":50464,"depth":179,"text":50464},{"id":50666,"depth":179,"text":50666},{"id":50721,"depth":179,"text":39269},{"id":50799,"depth":169,"text":50799,"children":55401},[55402,55403],{"id":50804,"depth":179,"text":50804},{"id":51107,"depth":179,"text":51107},{"id":51811,"depth":169,"text":51811},{"id":51900,"depth":169,"text":51900},{"id":52445,"depth":169,"text":52445},{"id":52511,"depth":169,"text":52511,"children":55408},[55409],{"id":52516,"depth":179,"text":52516},{"id":52982,"depth":169,"text":52982,"children":55411},[55412],{"id":53509,"depth":179,"text":53509},{"id":53778,"depth":169,"text":53778},{"id":53853,"depth":169,"text":53853,"children":55415},[55416,55417],{"id":51938,"depth":179,"text":51938},{"id":54106,"depth":179,"text":54106},{"id":54229,"depth":169,"text":54229,"children":55419},[55420],{"id":54234,"depth":179,"text":54234},{"id":54355,"depth":169,"text":54358},{"id":54446,"depth":169,"text":54449},{"id":54480,"depth":169,"text":54483,"children":55424},[55425],{"id":54494,"depth":179,"text":54497},{"id":54505,"depth":169,"text":54508},{"id":54564,"depth":169,"text":54567,"children":55428},[55429,55430,55431],{"id":54570,"depth":179,"text":54573},{"id":54805,"depth":179,"text":54808},{"id":54986,"depth":179,"text":54989},{"id":55142,"depth":169,"text":55145,"children":55433},[55434,55435],{"id":55148,"depth":179,"text":55148},{"id":55234,"depth":179,"text":55234},{"id":55332,"depth":169,"text":55335},"content:articles:frontend:Vue3与TypeScript.md","articles\u002Ffrontend\u002FVue3与TypeScript.md","articles\u002Ffrontend\u002FVue3与TypeScript",{"_path":55441,"_dir":15199,"_draft":7,"_partial":7,"_locale":8,"title":55442,"description":55443,"date":15754,"tags":55444,"body":55445,"_type":1800,"_id":55902,"_source":1802,"_file":55903,"_stem":55904,"_extension":1805},"\u002Farticles\u002Ffrontend\u002Fjavascript","JavaScript 原型与原型链详解","深入理解 JavaScript 原型机制，从构造函数、prototype、__proto__ 到完整原型链的工作原理",[14],{"type":17,"children":55446,"toc":55887},[55447,55452,55456,55461,55466,55471,55477,55482,55492,55502,55510,55516,55526,55559,55565,55570,55578,55586,55594,55602,55617,55625,55630,55657,55666,55686,55707,55716,55756,55768,55776,55781,55786,55792,55802,55855,55868,55874,55879],{"type":20,"tag":15759,"props":55448,"children":55450},{"id":55449},"原型与原型链",[55451],{"type":25,"value":55449},{"type":20,"tag":1863,"props":55453,"children":55454},{"id":15208},[55455],{"type":25,"value":15208},{"type":20,"tag":21,"props":55457,"children":55458},{},[55459],{"type":25,"value":55460},"原型与原型链，作为JavaScript中很关键的知识点之一，它的重要性是可想而知的，如果原型与原型链没有搞明白，会很影响你接下来的很多学习，例如js继承机制、TypeScript、vue框架等，所以原型与原型链是很重要的基础，也是每一名前端工程师必须研究透的",{"type":20,"tag":1863,"props":55462,"children":55464},{"id":55463},"构造函数",[55465],{"type":25,"value":55463},{"type":20,"tag":21,"props":55467,"children":55468},{},[55469],{"type":25,"value":55470},"讲到原型，就一定要先对构造函数有一定的基础",{"type":20,"tag":28,"props":55472,"children":55474},{"id":55473},"构造函数中有静态成员实例成员原型属性一般是称为方法",[55475],{"type":25,"value":55476},"构造函数中有静态成员、实例成员、原型属性(一般是称为方法)",{"type":20,"tag":21,"props":55478,"children":55479},{},[55480],{"type":25,"value":55481},"静态成员：在构造函数本身创建的属性，只能通过构造函数访问。",{"type":20,"tag":21,"props":55483,"children":55484},{},[55485,55490],{"type":20,"tag":11159,"props":55486,"children":55489},{"alt":55487,"src":55488},"构造函数-静态成员.png","https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fcd1beb4fc50e4862921a10cc59f4b356~tplv-k3u1fbpfcp-watermark.image?",[],{"type":25,"value":55491},"\n实例成员：在构造函数本身，通过this添加的成员，只能通过实例化对象访问。",{"type":20,"tag":21,"props":55493,"children":55494},{},[55495,55500],{"type":20,"tag":11159,"props":55496,"children":55499},{"alt":55497,"src":55498},"构造函数-实例成员.png","https:\u002F\u002Fp3-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fbd9259cc09db4d00a5458a869828874b~tplv-k3u1fbpfcp-watermark.image?",[],{"type":25,"value":55501},"\n原型属性：在构造函数的原型对象上创建的属性(方法)。",{"type":20,"tag":21,"props":55503,"children":55504},{},[55505],{"type":20,"tag":11159,"props":55506,"children":55509},{"alt":55507,"src":55508},"构造函数-原型属性.png","https:\u002F\u002Fp3-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F383203f9b61542c7a9988abb280afbb0~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":28,"props":55511,"children":55513},{"id":55512},"可能这么看不够直观看图",[55514],{"type":25,"value":55515},"可能这么看不够直观，看图",{"type":20,"tag":21,"props":55517,"children":55518},{},[55519,55524],{"type":20,"tag":11159,"props":55520,"children":55523},{"alt":55521,"src":55522},"构造函数.png","https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F4a02290d9fe5486ca6af9b34387b9f71~tplv-k3u1fbpfcp-watermark.image?",[],{"type":25,"value":55525},"\n首先我们要知道，全局变量、局部变量、函数名都是储存在栈中的，而对象实体是储存在堆中的。",{"type":20,"tag":5719,"props":55527,"children":55528},{},[55529,55541,55546],{"type":20,"tag":48,"props":55530,"children":55531},{},[55532,55534,55539],{"type":25,"value":55533},"栈中的Person构造函数通过地址值0x123找到了堆中的Person构造函数对象，堆中的Person构造函数存放着实例成员(this.name,this.age,this.sayName)、静态成员(Person.uname)以及",{"type":20,"tag":84,"props":55535,"children":55537},{"className":55536},[],[55538],{"type":25,"value":29050},{"type":25,"value":55540},"(后面详细说)等属性",{"type":20,"tag":48,"props":55542,"children":55543},{},[55544],{"type":25,"value":55545},"prototype通过储存的地址值找到Person原型对象，这里存储着原型属性(sing函数)以及constructor等属性。",{"type":20,"tag":48,"props":55547,"children":55548},{},[55549,55551,55557],{"type":25,"value":55550},"我们通过new实例化了构造函数Person，在内存堆中创建了person1实例对象，栈中person1通过地址值0x345找到堆中的person1实例对象，在new构造函数Person的时候发生这么一件事，就是构造函数内部的this被赋值为person1这个实例对象，同时构造函数中的实例成员全被添加到实例对象中，所以现在实例化对象中存有实例成员(this.name,this.age,this.sayName)以及",{"type":20,"tag":84,"props":55552,"children":55554},{"className":55553},[],[55555],{"type":25,"value":55556},"__proto__",{"type":25,"value":55558},"(后面详细说)等属性。",{"type":20,"tag":28,"props":55560,"children":55562},{"id":55561},"new-构造函数后发生了什么",[55563],{"type":25,"value":55564},"new 构造函数后发生了什么",{"type":20,"tag":21,"props":55566,"children":55567},{},[55568],{"type":25,"value":55569},"这块可以先放一放，不影响理解原型与原型链，但是理解了会有一种通透的感觉",{"type":20,"tag":5719,"props":55571,"children":55572},{},[55573],{"type":20,"tag":48,"props":55574,"children":55575},{},[55576],{"type":25,"value":55577},"创建一个新对象(实例对象)",{"type":20,"tag":126,"props":55579,"children":55581},{"code":55580},"    const person1 = new Object()\n",[55582],{"type":20,"tag":84,"props":55583,"children":55584},{"__ignoreMap":8},[55585],{"type":25,"value":55580},{"type":20,"tag":5719,"props":55587,"children":55588},{"start":188},[55589],{"type":20,"tag":48,"props":55590,"children":55591},{},[55592],{"type":25,"value":55593},"将this指向实例对象，并将构造函数中用this定义的属性复制到实例上(用call和apply都行)",{"type":20,"tag":126,"props":55595,"children":55597},{"code":55596},"    Person.apply(person1, [....])\n",[55598],{"type":20,"tag":84,"props":55599,"children":55600},{"__ignoreMap":8},[55601],{"type":25,"value":55596},{"type":20,"tag":5719,"props":55603,"children":55604},{"start":179},[55605],{"type":20,"tag":48,"props":55606,"children":55607},{},[55608,55610,55615],{"type":25,"value":55609},"将实例对象中的",{"type":20,"tag":84,"props":55611,"children":55613},{"className":55612},[],[55614],{"type":25,"value":55556},{"type":25,"value":55616},"属性指向Person的原型(原来指向的是Object的原型对象)",{"type":20,"tag":126,"props":55618,"children":55620},{"code":55619},"    person1.__proto__ = Person.prototype\n",[55621],{"type":20,"tag":84,"props":55622,"children":55623},{"__ignoreMap":8},[55624],{"type":25,"value":55619},{"type":20,"tag":1863,"props":55626,"children":55628},{"id":55627},"原型",[55629],{"type":25,"value":55627},{"type":20,"tag":18942,"props":55631,"children":55633},{"id":55632},"个人习惯prototype称为显式原型属性__proto__prototype称为隐式原型属性",[55634,55636,55641,55643,55648,55649,55655],{"type":25,"value":55635},"个人习惯：",{"type":20,"tag":84,"props":55637,"children":55639},{"className":55638},[],[55640],{"type":25,"value":29050},{"type":25,"value":55642},"称为显式原型属性、",{"type":20,"tag":84,"props":55644,"children":55646},{"className":55645},[],[55647],{"type":25,"value":55556},{"type":25,"value":39189},{"type":20,"tag":84,"props":55650,"children":55652},{"className":55651},[],[55653],{"type":25,"value":55654},"[[prototype]]",{"type":25,"value":55656},")称为隐式原型属性。",{"type":20,"tag":18942,"props":55658,"children":55659},{"id":29050},[55660,55665],{"type":20,"tag":84,"props":55661,"children":55663},{"className":55662},[],[55664],{"type":25,"value":29050},{"type":25,"value":40615},{"type":20,"tag":21,"props":55667,"children":55668},{},[55669,55671,55676,55678,55684],{"type":25,"value":55670},"我们每创建一个函数，js引擎就会自动为了函数创建一个",{"type":20,"tag":84,"props":55672,"children":55674},{"className":55673},[],[55675],{"type":25,"value":29050},{"type":25,"value":55677},"属性，这个属性通过储存的地址值指向函数的原型对象(也是Object的实例对象)，而原型对象会自动获得一个",{"type":20,"tag":84,"props":55679,"children":55681},{"className":55680},[],[55682],{"type":25,"value":55683},"constructor",{"type":25,"value":55685},"属性，这个属性指回与之关联的构造函数。",{"type":20,"tag":21,"props":55687,"children":55688},{},[55689,55691,55697,55699,55705],{"type":25,"value":55690},"上面我们说函数的原型对象，也是Object的实例对象，在我们调用函数时(",{"type":20,"tag":84,"props":55692,"children":55694},{"className":55693},[],[55695],{"type":25,"value":55696},"Fun()",{"type":25,"value":55698},")，其实相当于执行了",{"type":20,"tag":84,"props":55700,"children":55702},{"className":55701},[],[55703],{"type":25,"value":55704},"Fun.constructor = new Object()",{"type":25,"value":55706},"这段代码",{"type":20,"tag":18942,"props":55708,"children":55709},{"id":55556},[55710,55715],{"type":20,"tag":84,"props":55711,"children":55713},{"className":55712},[],[55714],{"type":25,"value":55556},{"type":25,"value":40615},{"type":20,"tag":21,"props":55717,"children":55718},{},[55719,55721,55726,55728,55733,55735,55740,55742,55747,55749,55754],{"type":25,"value":55720},"注：现在谷歌浏览器显示这个属性为",{"type":20,"tag":84,"props":55722,"children":55724},{"className":55723},[],[55725],{"type":25,"value":55654},{"type":25,"value":55727},"，每次实例化构造函数，创建一个实例对象，其内部会有一个",{"type":20,"tag":84,"props":55729,"children":55731},{"className":55730},[],[55732],{"type":25,"value":55556},{"type":25,"value":55734},"属性，指向构造函数的原型对象，在内部的操作的是：实例化构造函数——>将构造函数中",{"type":20,"tag":84,"props":55736,"children":55738},{"className":55737},[],[55739],{"type":25,"value":29050},{"type":25,"value":55741},"储存的地址值拷贝一份赋值给实例对象",{"type":20,"tag":84,"props":55743,"children":55745},{"className":55744},[],[55746],{"type":25,"value":55556},{"type":25,"value":55748},"属性——>结果就是",{"type":20,"tag":84,"props":55750,"children":55752},{"className":55751},[],[55753],{"type":25,"value":55556},{"type":25,"value":55755},"属性指向原型对象",{"type":20,"tag":18942,"props":55757,"children":55759},{"id":55758},"我们可以通过代码验证prototype__proto__constructor",[55760,55762],{"type":25,"value":55761},"我们可以通过代码验证",{"type":20,"tag":84,"props":55763,"children":55765},{"className":55764},[],[55766],{"type":25,"value":55767},"prototype、__proto__、constructor",{"type":20,"tag":21,"props":55769,"children":55770},{},[55771],{"type":20,"tag":11159,"props":55772,"children":55775},{"alt":55773,"src":55774},"构造函数-原型.png","https:\u002F\u002Fp6-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fbd5f05dd75dd4577b02a7a7817424e5f~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":1863,"props":55777,"children":55779},{"id":55778},"原型链",[55780],{"type":25,"value":55778},{"type":20,"tag":21,"props":55782,"children":55783},{},[55784],{"type":25,"value":55785},"你有没有疑惑过我明明没有定义过toString()方法，但是我在哪都可以使用这个方法？答案很简单，这得益于原型链。",{"type":20,"tag":28,"props":55787,"children":55789},{"id":55788},"理解原型与原型链最好的方法是就是将原型可视化",[55790],{"type":25,"value":55791},"理解原型与原型链最好的方法是就是将原型可视化。",{"type":20,"tag":21,"props":55793,"children":55794},{},[55795,55797],{"type":25,"value":55796},"以上面代码为例\n",{"type":20,"tag":11159,"props":55798,"children":55801},{"alt":55799,"src":55800},"原型1.png","https:\u002F\u002Fp1-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Ffd3e760acff24da39ddd915ae9a59b43~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":5719,"props":55803,"children":55804},{},[55805,55824,55843],{"type":20,"tag":48,"props":55806,"children":55807},{},[55808,55810,55815,55817,55822],{"type":25,"value":55809},"我们可以看到Person构造函数中有显式原型",{"type":20,"tag":84,"props":55811,"children":55813},{"className":55812},[],[55814],{"type":25,"value":29050},{"type":25,"value":55816},"属性指向他的原型，原型中又有一个",{"type":20,"tag":84,"props":55818,"children":55820},{"className":55819},[],[55821],{"type":25,"value":55683},{"type":25,"value":55823},"属性指回Person构造函数，",{"type":20,"tag":48,"props":55825,"children":55826},{},[55827,55829,55834,55836,55841],{"type":25,"value":55828},"而实例对象中有隐式原型属性",{"type":20,"tag":84,"props":55830,"children":55832},{"className":55831},[],[55833],{"type":25,"value":55556},{"type":25,"value":55835},"也指向Person原型对象，此时我们注意Person原型，因为他也是Object的实例对象，所有它也有一个隐式原型",{"type":20,"tag":84,"props":55837,"children":55839},{"className":55838},[],[55840],{"type":25,"value":55556},{"type":25,"value":55842},"属性指向Object原型，",{"type":20,"tag":48,"props":55844,"children":55845},{},[55846,55848,55853],{"type":25,"value":55847},"我们再看Objet原型，他的隐式原型属性",{"type":20,"tag":84,"props":55849,"children":55851},{"className":55850},[],[55852],{"type":25,"value":55556},{"type":25,"value":55854},"指向null，意味着空。所以Object原型就是整个原型链的终点。",{"type":20,"tag":28,"props":55856,"children":55858},{"id":55857},"对于这段代码来说他的原型链就是person1实例对象person原型对象object的实例对象object原型对象可以发现原型链是沿着隐式原型属性__proto__走的所以也称为隐式原型链",[55859,55861,55866],{"type":25,"value":55860},"对于这段代码来说，他的原型链就是:person1实例对象——>Person原型对象(Object的实例对象)——>Object原型对象。可以发现原型链是沿着隐式原型属性",{"type":20,"tag":84,"props":55862,"children":55864},{"className":55863},[],[55865],{"type":25,"value":55556},{"type":25,"value":55867},"走的，所以也称为隐式原型链。",{"type":20,"tag":28,"props":55869,"children":55871},{"id":55870},"把前面都弄懂最后尝试理解以下这个图",[55872],{"type":25,"value":55873},"把前面都弄懂，最后尝试理解以下这个图",{"type":20,"tag":21,"props":55875,"children":55876},{},[55877],{"type":25,"value":55878},"如果你能理解、说出这里每一条线产生的原因，并且脱离了这张图，看到图中的一个词立马能在脑中浮现出与它相关的指向，那么恭喜你，你在后面理解继承，以及学习TS类继承的时候，几乎无压力，全程绿灯，这点我深有感触。",{"type":20,"tag":21,"props":55880,"children":55881},{},[55882],{"type":20,"tag":11159,"props":55883,"children":55886},{"alt":55884,"src":55885},"原型链.webp","https:\u002F\u002Fp1-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002Fae55273691354149bd7589bbd6f9c93c~tplv-k3u1fbpfcp-watermark.image?",[],{"title":8,"searchDepth":169,"depth":169,"links":55888},[55889,55890,55895,55896],{"id":15208,"depth":169,"text":15208},{"id":55463,"depth":169,"text":55463,"children":55891},[55892,55893,55894],{"id":55473,"depth":179,"text":55476},{"id":55512,"depth":179,"text":55515},{"id":55561,"depth":179,"text":55564},{"id":55627,"depth":169,"text":55627},{"id":55778,"depth":169,"text":55778,"children":55897},[55898,55899,55901],{"id":55788,"depth":179,"text":55791},{"id":55857,"depth":179,"text":55900},"对于这段代码来说，他的原型链就是:person1实例对象——>Person原型对象(Object的实例对象)——>Object原型对象。可以发现原型链是沿着隐式原型属性__proto__走的，所以也称为隐式原型链。",{"id":55870,"depth":179,"text":55873},"content:articles:frontend:javascript原型链.md","articles\u002Ffrontend\u002Fjavascript原型链.md","articles\u002Ffrontend\u002Fjavascript原型链",{"_path":55906,"_dir":15199,"_draft":7,"_partial":7,"_locale":8,"title":55907,"description":55908,"date":15754,"tags":55909,"body":55910,"_type":1800,"_id":56449,"_source":1802,"_file":56450,"_stem":56451,"_extension":1805},"\u002Farticles\u002Ffrontend\u002Fvue3","Vue3 框架设计与源码解析","从全局视角理解 Vue3 框架设计思想，涵盖声明式与命令式、运行时与编译时、编译器与渲染器的核心原理",[14],{"type":17,"children":55911,"toc":56438},[55912,55915,55921,55926,55930,55935,55940,55945,55950,55958,55963,55968,55996,56001,56009,56017,56022,56030,56035,56043,56048,56056,56061,56069,56077,56085,56093,56098,56103,56110,56115,56120,56128,56134,56139,56147,56155,56163,56171,56179,56189,56199,56205,56210,56215,56223,56231,56241,56246,56252,56257,56265,56270,56276,56284,56289,56294,56299,56307,56314,56322,56343,56351,56364,56369,56374,56382,56390,56395,56403,56407],{"type":20,"tag":5056,"props":55913,"children":55914},{},[],{"type":20,"tag":1863,"props":55916,"children":55918},{"id":55917},"theme-fancy",[55919],{"type":25,"value":55920},"theme: fancy",{"type":20,"tag":1863,"props":55922,"children":55924},{"id":55923},"框架设计概述",[55925],{"type":25,"value":55923},{"type":20,"tag":28,"props":55927,"children":55928},{"id":15208},[55929],{"type":25,"value":15208},{"type":20,"tag":21,"props":55931,"children":55932},{},[55933],{"type":25,"value":55934},"作为学习者，我们在学习框架的时候，很容易被细节困住，看不清全貌。所以我们要先从全局的角度对框架的设计拥有清晰的认知。",{"type":20,"tag":21,"props":55936,"children":55937},{},[55938],{"type":25,"value":55939},"这篇文章作为学习vue3源码细节的前篇，让大家对vue3有个全面大体的认识",{"type":20,"tag":28,"props":55941,"children":55943},{"id":55942},"声明式与命令式",[55944],{"type":25,"value":55942},{"type":20,"tag":21,"props":55946,"children":55947},{},[55948],{"type":25,"value":55949},"从范式的角度来看，框架应该设计成命令式还是声明式的、要设计成纯运行时还是纯编译型的、甚至是运行时+编译时的呢",{"type":20,"tag":21,"props":55951,"children":55952},{},[55953],{"type":20,"tag":33,"props":55954,"children":55955},{},[55956],{"type":25,"value":55957},"我们先举一个现实中的例子：",{"type":20,"tag":21,"props":55959,"children":55960},{},[55961],{"type":25,"value":55962},"张三的妈妈让张三去买酱油",{"type":20,"tag":21,"props":55964,"children":55965},{},[55966],{"type":25,"value":55967},"张三需要这么做：",{"type":20,"tag":5719,"props":55969,"children":55970},{},[55971,55976,55981,55986,55991],{"type":20,"tag":48,"props":55972,"children":55973},{},[55974],{"type":25,"value":55975},"拿起钱",{"type":20,"tag":48,"props":55977,"children":55978},{},[55979],{"type":25,"value":55980},"打开门",{"type":20,"tag":48,"props":55982,"children":55983},{},[55984],{"type":25,"value":55985},"到商店",{"type":20,"tag":48,"props":55987,"children":55988},{},[55989],{"type":25,"value":55990},"拿钱买酱油",{"type":20,"tag":48,"props":55992,"children":55993},{},[55994],{"type":25,"value":55995},"回到家",{"type":20,"tag":21,"props":55997,"children":55998},{},[55999],{"type":25,"value":56000},"这里张三妈妈的行为就是声明式，张三就是命令式",{"type":20,"tag":21,"props":56002,"children":56003},{},[56004],{"type":20,"tag":33,"props":56005,"children":56006},{},[56007],{"type":25,"value":56008},"我们再用一个编程的例子来理解声明式与命令式，需求：",{"type":20,"tag":126,"props":56010,"children":56012},{"code":56011},"1. 获取 id 为 app 的 div 标签\n2. 它的文本内容为 hello world\n3. 为其绑定点击事件\n4. 当点击时弹出提示：ok\n",[56013],{"type":20,"tag":84,"props":56014,"children":56015},{"__ignoreMap":8},[56016],{"type":25,"value":56011},{"type":20,"tag":21,"props":56018,"children":56019},{},[56020],{"type":25,"value":56021},"命令式：看重过程，指示编译器每一步该怎么做，最终实现结果",{"type":20,"tag":126,"props":56023,"children":56025},{"code":56024},"const div = document.querySelector('#app') \u002F\u002F 获取 div\ndiv.innerText = 'hello world' \u002F\u002F 设置文本内容\ndiv.addEventListener('click', () => { alert('ok') }) \u002F\u002F 绑定点击事件\n",[56026],{"type":20,"tag":84,"props":56027,"children":56028},{"__ignoreMap":8},[56029],{"type":25,"value":56024},{"type":20,"tag":21,"props":56031,"children":56032},{},[56033],{"type":25,"value":56034},"声明式：看重结果，将结果告诉编译器，编译器帮你完成过程",{"type":20,"tag":126,"props":56036,"children":56038},{"code":56037},"\u003Cdiv @click=\"() => alert('ok')\">hello world\u003C\u002Fdiv>\n",[56039],{"type":20,"tag":84,"props":56040,"children":56041},{"__ignoreMap":8},[56042],{"type":25,"value":56037},{"type":20,"tag":21,"props":56044,"children":56045},{},[56046],{"type":25,"value":56047},"两者差异：对于用户来说，声明式更快捷方便，可维护性更强，命令式不方便快捷，但性能更好",{"type":20,"tag":21,"props":56049,"children":56050},{},[56051],{"type":20,"tag":33,"props":56052,"children":56053},{},[56054],{"type":25,"value":56055},"举例：",{"type":20,"tag":21,"props":56057,"children":56058},{},[56059],{"type":25,"value":56060},"假设现在我们要将 div 标签的文本内容修改为 hello vue3",{"type":20,"tag":21,"props":56062,"children":56063},{},[56064],{"type":20,"tag":33,"props":56065,"children":56066},{},[56067],{"type":25,"value":56068},"命令式：",{"type":20,"tag":126,"props":56070,"children":56072},{"code":56071},"div.textContent = 'hello vue3' \u002F\u002F 直接修改需要改动的地方\n",[56073],{"type":20,"tag":84,"props":56074,"children":56075},{"__ignoreMap":8},[56076],{"type":25,"value":56071},{"type":20,"tag":21,"props":56078,"children":56079},{},[56080],{"type":20,"tag":33,"props":56081,"children":56082},{},[56083],{"type":25,"value":56084},"声明式：",{"type":20,"tag":126,"props":56086,"children":56088},{"code":56087},"01 \u003C!-- 之前： -->\n02 \u003Cdiv @click=\"() => alert('ok')\">hello world\u003C\u002Fdiv>\n03 \u003C!-- 之后： -->\n04 \u003Cdiv @click=\"() => alert('ok')\">hello vue3\u003C\u002Fdiv>  \u002F\u002F 需要全部重新渲染\n",[56089],{"type":20,"tag":84,"props":56090,"children":56091},{"__ignoreMap":8},[56092],{"type":25,"value":56087},{"type":20,"tag":21,"props":56094,"children":56095},{},[56096],{"type":25,"value":56097},"这里我们可以发现两者主要的区别是声明式无论修改了什么，整条语句都会重新执行",{"type":20,"tag":21,"props":56099,"children":56100},{},[56101],{"type":25,"value":56102},"所以为了实现最优的更新性能，声明式需要找到前后的差异并只更新变化的地方，但是最终完成这次更新的代码仍然是：",{"type":20,"tag":126,"props":56104,"children":56105},{"code":56071},[56106],{"type":20,"tag":84,"props":56107,"children":56108},{"__ignoreMap":8},[56109],{"type":25,"value":56071},{"type":20,"tag":21,"props":56111,"children":56112},{},[56113],{"type":25,"value":56114},"这也是vue3相较于vue2做出的调整「diff算法的优化」",{"type":20,"tag":28,"props":56116,"children":56118},{"id":56117},"运行时与编译时",[56119],{"type":25,"value":56117},{"type":20,"tag":21,"props":56121,"children":56122},{},[56123],{"type":20,"tag":33,"props":56124,"children":56125},{},[56126],{"type":25,"value":56127},"我们用一个例子来理解声明式与命令式",{"type":20,"tag":11085,"props":56129,"children":56131},{"id":56130},"纯运行时",[56132],{"type":25,"value":56133},"纯运行时：",{"type":20,"tag":21,"props":56135,"children":56136},{},[56137],{"type":25,"value":56138},"我们设计一个框架，它提供一个 Render 函数，用户可以为该函数提供一个树型结构的数据对象，然后 Render 函数会根据该对象递归地将数据渲染成 DOM 元素。我们规定树型结构的数据对象如下：",{"type":20,"tag":126,"props":56140,"children":56142},{"code":56141},"const obj = {\n  tag: 'div',\n  children: [\n    { tag: 'span', children: 'hello world' }\n  ]\n}\n",[56143],{"type":20,"tag":84,"props":56144,"children":56145},{"__ignoreMap":8},[56146],{"type":25,"value":56141},{"type":20,"tag":21,"props":56148,"children":56149},{},[56150],{"type":20,"tag":33,"props":56151,"children":56152},{},[56153],{"type":25,"value":56154},"Render函数：",{"type":20,"tag":126,"props":56156,"children":56158},{"code":56157},"function Render(obj, root) {\n  const el = document.createElement(obj.tag)\n  if (typeof obj.children === 'string') {\n    const text = document.createTextNode(obj.children)\n    el.appendChild(text)\n  } else if (obj.children) {\n    \u002F\u002F 数组，递归调用 Render，使用 el 作为 root 参数\n    obj.children.forEach((child) => Render(child, el))\n  }\n​\n  \u002F\u002F 将元素添加到 root\n  root.appendChild(el)\n}\n",[56159],{"type":20,"tag":84,"props":56160,"children":56161},{"__ignoreMap":8},[56162],{"type":25,"value":56157},{"type":20,"tag":21,"props":56164,"children":56165},{},[56166],{"type":20,"tag":33,"props":56167,"children":56168},{},[56169],{"type":25,"value":56170},"用户可以这样使用：",{"type":20,"tag":126,"props":56172,"children":56174},{"code":56173},"const obj = {\n  tag: 'div',\n  children: [\n    { tag: 'span', children: 'hello world' }\n  ]\n}\n\u002F\u002F 渲染到 body 下\nRender(obj, document.body)\n",[56175],{"type":20,"tag":84,"props":56176,"children":56177},{"__ignoreMap":8},[56178],{"type":25,"value":56173},{"type":20,"tag":21,"props":56180,"children":56181},{},[56182,56187],{"type":20,"tag":33,"props":56183,"children":56184},{},[56185],{"type":25,"value":56186},"这就是纯运行时框架",{"type":25,"value":56188},"：让用户生成树型结构对象，框架提供reader函数将对象渲染成页面，最重要的是等代码执行的时候，也就是render函数执行的时候才会生成html标签。",{"type":20,"tag":21,"props":56190,"children":56191},{},[56192,56197],{"type":20,"tag":33,"props":56193,"children":56194},{},[56195],{"type":25,"value":56196},"缺点",{"type":25,"value":56198},"：是html对象需要用户提供，并且不能进行差别更新",{"type":20,"tag":11085,"props":56200,"children":56202},{"id":56201},"运行时-编译时",[56203],{"type":25,"value":56204},"运行时 + 编译时：",{"type":20,"tag":21,"props":56206,"children":56207},{},[56208],{"type":25,"value":56209},"于是有一天，你的用户抱怨说：“手写树型结构的数据对象太麻烦了，而且不直观，能不能支持用类似于HTML 标签的方式描述树型结构的数据对象",{"type":20,"tag":21,"props":56211,"children":56212},{},[56213],{"type":25,"value":56214},"为此，你编写了一个叫作 Compiler 的程序，它的作用就是把 HTML 字符串编译成树型结构的数据对象",{"type":20,"tag":21,"props":56216,"children":56217},{},[56218],{"type":20,"tag":33,"props":56219,"children":56220},{},[56221],{"type":25,"value":56222},"用户可以这么用：",{"type":20,"tag":126,"props":56224,"children":56226},{"code":56225},"const html = `\n\u003Cdiv>\n  \u003Cspan>hello world\u003C\u002Fspan>\n\u003C\u002Fdiv>\n`\n\u002F\u002F 调用 Compiler 编译得到树型结构的数据对象\nconst obj = Compiler(html)\n\u002F\u002F 再调用 Render 进行渲染\nRender(obj, document.body)\n",[56227],{"type":20,"tag":84,"props":56228,"children":56229},{"__ignoreMap":8},[56230],{"type":25,"value":56225},{"type":20,"tag":21,"props":56232,"children":56233},{},[56234,56239],{"type":20,"tag":33,"props":56235,"children":56236},{},[56237],{"type":25,"value":56238},"这就是运行时+编译时：",{"type":25,"value":56240}," 框架提供Compiler函数「将html标签生成html对象」和Render对象，这样我们可以根据html标签的不同，进行差别更新html对象，不需要全部更新。用户可以直接提供数据对象从而无须编译；又支持编译时，用户可以提供 HTML 字符串，我们将其编译为数据对象后再交给运行时处理。",{"type":20,"tag":21,"props":56242,"children":56243},{},[56244],{"type":25,"value":56245},"Vue采用的就是这种方式",{"type":20,"tag":11085,"props":56247,"children":56249},{"id":56248},"纯编译时",[56250],{"type":25,"value":56251},"纯编译时：",{"type":20,"tag":21,"props":56253,"children":56254},{},[56255],{"type":25,"value":56256},"简单来说就是将HTML字符串直接编译成命令时代码",{"type":20,"tag":21,"props":56258,"children":56259},{},[56260],{"type":20,"tag":11159,"props":56261,"children":56264},{"alt":56262,"src":56263},"vue3纯编译时.png","https:\u002F\u002Fp9-juejin.byteimg.com\u002Ftos-cn-i-k3u1fbpfcp\u002F92cbf3e4888549a6a733c4729e8e910d~tplv-k3u1fbpfcp-watermark.image?",[],{"type":20,"tag":21,"props":56266,"children":56267},{},[56268],{"type":25,"value":56269},"优缺点：直接编译成可执行的 JavaScript 代码，因此性能会更好，但有损灵活性，即用户提供的内容必须编译后才能用",{"type":20,"tag":28,"props":56271,"children":56273},{"id":56272},"tree-shaking",[56274],{"type":25,"value":56275},"Tree Shaking",{"type":20,"tag":6665,"props":56277,"children":56278},{},[56279],{"type":20,"tag":21,"props":56280,"children":56281},{},[56282],{"type":25,"value":56283},"消除那些永远不会执行的代码",{"type":20,"tag":21,"props":56285,"children":56286},{},[56287],{"type":25,"value":56288},"vue.js对于那些永远不会用到的代码，在打包的时候会将它清除，减少包的体积",{"type":20,"tag":28,"props":56290,"children":56292},{"id":56291},"编译器与渲染器",[56293],{"type":25,"value":56291},{"type":20,"tag":11085,"props":56295,"children":56297},{"id":56296},"编译器",[56298],{"type":25,"value":56296},{"type":20,"tag":6665,"props":56300,"children":56301},{},[56302],{"type":20,"tag":21,"props":56303,"children":56304},{},[56305],{"type":25,"value":56306},"作用：将模版(template标签)编译成虚拟DOM，交给渲染器，在script标签中，所有在vue中使用模版或者虚拟DOM对象编写页面最后的结果是一样",{"type":20,"tag":21,"props":56308,"children":56309},{},[56310],{"type":20,"tag":33,"props":56311,"children":56312},{},[56313],{"type":25,"value":56055},{"type":20,"tag":126,"props":56315,"children":56317},{"code":56316},"\u003Ctemplate>\n  \u003Cdiv @click=\"handler\">\n    click me\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n​\n\u003Cscript>\nexport default {\n  data() {\u002F* ... *\u002F},\n  methods: {\n    handler: () => {\u002F* ... *\u002F}\n  }\n}\n\u003C\u002Fscript>\n",[56318],{"type":20,"tag":84,"props":56319,"children":56320},{"__ignoreMap":8},[56321],{"type":25,"value":56316},{"type":20,"tag":21,"props":56323,"children":56324},{},[56325,56327,56333,56335,56341],{"type":25,"value":56326},"其中",{"type":20,"tag":84,"props":56328,"children":56330},{"className":56329},[],[56331],{"type":25,"value":56332},"\u003Ctemplate>",{"type":25,"value":56334}," 标签里的内容就是模板内容，编译器会把模板内容编译成渲染函数并添加到 ",{"type":20,"tag":84,"props":56336,"children":56338},{"className":56337},[],[56339],{"type":25,"value":56340},"\u003Cscript>",{"type":25,"value":56342},"标签块的组件对象上，所以最终在浏览器里运行的代码就是：",{"type":20,"tag":126,"props":56344,"children":56346},{"code":56345},"01 export default {\n02   data() {\u002F* ... *\u002F},\n03   methods: {\n04     handler: () => {\u002F* ... *\u002F}\n05   },\n06   render() {\n07     return h('div', { onClick: handler }, 'click me')\n08   }\n09 }\n",[56347],{"type":20,"tag":84,"props":56348,"children":56349},{"__ignoreMap":8},[56350],{"type":25,"value":56345},{"type":20,"tag":21,"props":56352,"children":56353},{},[56354,56356,56362],{"type":25,"value":56355},"如果你学过",{"type":20,"tag":84,"props":56357,"children":56359},{"className":56358},[],[56360],{"type":25,"value":56361},"react",{"type":25,"value":56363},"，你会觉得编译后的代码很react很相似。",{"type":20,"tag":21,"props":56365,"children":56366},{},[56367],{"type":25,"value":56368},"所以，无论是使用模板还是直接手写渲染函数，对于一个组件来说，它要渲染的内容最终都是通过渲染函数产生的，然后渲染器再把渲染函数返回的虚拟 DOM 渲染为真实 DOM",{"type":20,"tag":11085,"props":56370,"children":56372},{"id":56371},"渲染器",[56373],{"type":25,"value":56371},{"type":20,"tag":6665,"props":56375,"children":56376},{},[56377],{"type":20,"tag":21,"props":56378,"children":56379},{},[56380],{"type":25,"value":56381},"渲染器(reader函数)将虚拟DOM渲染成真实DOM",{"type":20,"tag":126,"props":56383,"children":56385},{"code":56384},"01 function renderer(vnode, container) {\n02   \u002F\u002F 使用 vnode.tag 作为标签名称创建 DOM 元素\n03   const el = document.createElement(vnode.tag)\n04   \u002F\u002F 遍历 vnode.props，将属性、事件添加到 DOM 元素\n05   for (const key in vnode.props) {\n06     if (\u002F^on\u002F.test(key)) {\n07       \u002F\u002F 如果 key 以 on 开头，说明它是事件\n08       el.addEventListener(\n09         key.substr(2).toLowerCase(), \u002F\u002F 事件名称 onClick ---> click\n10         vnode.props[key] \u002F\u002F 事件处理函数\n11       )\n12     }\n13   }\n14\n15   \u002F\u002F 处理 children\n16   if (typeof vnode.children === 'string') {\n17     \u002F\u002F 如果 children 是字符串，说明它是元素的文本子节点\n18     el.appendChild(document.createTextNode(vnode.children))\n19   } else if (Array.isArray(vnode.children)) {\n20     \u002F\u002F 递归地调用 renderer 函数渲染子节点，使用当前元素 el 作为挂载点\n21     vnode.children.forEach(child => renderer(child, el))\n22   }\n23\n24   \u002F\u002F 将元素添加到挂载点下\n25   container.appendChild(el)\n26 }\n",[56386],{"type":20,"tag":84,"props":56387,"children":56388},{"__ignoreMap":8},[56389],{"type":25,"value":56384},{"type":20,"tag":21,"props":56391,"children":56392},{},[56393],{"type":25,"value":56394},"编译器和渲染器本质都是函数",{"type":20,"tag":21,"props":56396,"children":56397},{},[56398],{"type":20,"tag":33,"props":56399,"children":56400},{},[56401],{"type":25,"value":56402},"如前所述，组件的实现依赖于渲染器，模板的编译依赖于编译器",{"type":20,"tag":28,"props":56404,"children":56405},{"id":10044},[56406],{"type":25,"value":10044},{"type":20,"tag":5719,"props":56408,"children":56409},{},[56410,56423,56428,56433],{"type":20,"tag":48,"props":56411,"children":56412},{},[56413,56415],{"type":25,"value":56414},"声明式：Vue.js 是一个声明式的框架，好处在于，它直接描述结果，用户不需要关注过程。vue.js同样支持使用虚拟DOM来描述UI。",{"type":20,"tag":5719,"props":56416,"children":56417},{"start":10630},[56418],{"type":20,"tag":48,"props":56419,"children":56420},{},[56421],{"type":25,"value":56422},"运行时+编译时：vue.js采 用 运行时+编译时的方式 来降低用户的心智负担，并且保证框架的性能",{"type":20,"tag":48,"props":56424,"children":56425},{},[56426],{"type":25,"value":56427},"TreeShaking： vue.js对于那些永远不会用到的代码，在打包的时候会将它清除，减少包的体积",{"type":20,"tag":48,"props":56429,"children":56430},{},[56431],{"type":25,"value":56432},"编译器：vue.js的模版会被编译器编译成渲染函数",{"type":20,"tag":48,"props":56434,"children":56435},{},[56436],{"type":25,"value":56437},"渲染器：将虚拟 DOM 对象渲染为真实 DOM 元素",{"title":8,"searchDepth":169,"depth":169,"links":56439},[56440,56441],{"id":55917,"depth":169,"text":55920},{"id":55923,"depth":169,"text":55923,"children":56442},[56443,56444,56445,56446,56447,56448],{"id":15208,"depth":179,"text":15208},{"id":55942,"depth":179,"text":55942},{"id":56117,"depth":179,"text":56117},{"id":56272,"depth":179,"text":56275},{"id":56291,"depth":179,"text":56291},{"id":10044,"depth":179,"text":10044},"content:articles:frontend:vue3源码解析.md","articles\u002Ffrontend\u002Fvue3源码解析.md","articles\u002Ffrontend\u002Fvue3源码解析",{"_path":56453,"_dir":56454,"_draft":7,"_partial":7,"_locale":8,"title":56455,"description":56456,"date":15754,"tags":56457,"body":56458,"_type":1800,"_id":56796,"_source":1802,"_file":56797,"_stem":56798,"_extension":1805},"\u002Farticles\u002Ffrontend","articles","基于浏览器的网络基本原理：从 DNS 解析到服务器响应的全流程","通俗易懂地讲解浏览器访问网页的完整网络流程，涵盖 DNS 解析、TCP 连接、HTTP 请求发送、服务器响应及负载均衡、缓存与 CDN 等优化机制。",[14],{"type":17,"children":56459,"toc":56786},[56460,56465,56470,56475,56480,56485,56490,56495,56500,56505,56510,56515,56521,56526,56531,56544,56562,56567,56590,56596,56601,56607,56612,56620,56625,56644,56649,56675,56681,56686,56691,56696,56701,56709,56714,56719,56724,56729,56734,56739,56744,56749,56755,56760,56765,56770,56776,56781],{"type":20,"tag":1863,"props":56461,"children":56463},{"id":56462},"过程概括",[56464],{"type":25,"value":56462},{"type":20,"tag":28,"props":56466,"children":56468},{"id":56467},"客户端",[56469],{"type":25,"value":56467},{"type":20,"tag":11085,"props":56471,"children":56473},{"id":56472},"将请求发送给服务器",[56474],{"type":25,"value":56472},{"type":20,"tag":21,"props":56476,"children":56477},{},[56478],{"type":25,"value":56479},"浏览器委托协议栈发送请求，协议栈将请求打包，加上目的地等控制信息。就相当于邮局将邮件装进信封写上收信人及地址，协议栈充当邮局的角色。",{"type":20,"tag":21,"props":56481,"children":56482},{},[56483],{"type":25,"value":56484},"协议栈将包装好的网络包交给网卡，网卡将包转化成光信号或者电信号发送出去",{"type":20,"tag":28,"props":56486,"children":56488},{"id":56487},"服务器",[56489],{"type":25,"value":56487},{"type":20,"tag":21,"props":56491,"children":56492},{},[56493],{"type":25,"value":56494},"网络包到达服务器所在的区域网，会碰到防火墙，防火墙会对进入区域网的每个网络包进行检查，检查是否存在危险的包。可以形象的把它想成小区的保安",{"type":20,"tag":21,"props":56496,"children":56497},{},[56498],{"type":25,"value":56499},"还会遇到缓存服务器，如果网络包请求的数据缓存服务器里有的话，直接从缓存服务器读出数据",{"type":20,"tag":21,"props":56501,"children":56502},{},[56503],{"type":25,"value":56504},"网络包进入服务器，服务器将网络包解包成原始的请求信息，服务器根据请求信息将数据装入响应消息，发给客户端",{"type":20,"tag":1863,"props":56506,"children":56508},{"id":56507},"详细过程",[56509],{"type":25,"value":56507},{"type":20,"tag":28,"props":56511,"children":56513},{"id":56512},"浏览器",[56514],{"type":25,"value":56512},{"type":20,"tag":11085,"props":56516,"children":56518},{"id":56517},"dns解析生成ip地址",[56519],{"type":25,"value":56520},"DNS解析生成IP地址",{"type":20,"tag":21,"props":56522,"children":56523},{},[56524],{"type":25,"value":56525},"浏览器想要将请求发送给服务器，需要知道对应服务器的IP地址，但是我们在搜索框输入的是域名(网址)，而浏览器不具备将网址转换成IP地址的功能，他需要向DNS服务器要对应服务器的IP地址。",{"type":20,"tag":21,"props":56527,"children":56528},{},[56529],{"type":25,"value":56530},"浏览器也不具备将网址发送给DNS服务器的功能，这个发送的操作是浏览器通过调用Socket库中的程序委托操作系统的协议栈（网络控制软件）将网址发给DNS服务器(这个过程与浏览器委托协议栈将http请求发给服务器类似),DNS服务器回复对应的IP地址(查找到DNS服务器也是需要IP地址的，但是这个地址是事先在电脑上就设置好的)。",{"type":20,"tag":6665,"props":56532,"children":56533},{},[56534],{"type":20,"tag":21,"props":56535,"children":56536},{},[56537,56542],{"type":20,"tag":33,"props":56538,"children":56539},{},[56540],{"type":25,"value":56541},"Socket库：",{"type":25,"value":56543}," 一个程序库，可以理解为一个控制程序的方法库",{"type":20,"tag":21,"props":56545,"children":56546},{},[56547,56549,56554,56556,56560],{"type":25,"value":56548},"查询DNS时不是一下子就能找到存有对应ip地址的DNS服务器，需要一层一层的找，比如要查询",{"type":20,"tag":101,"props":56550,"children":56552},{"href":56551},"www.web.cn.net.com",[56553],{"type":25,"value":56551},{"type":25,"value":56555},"网址对应服务器的IP地址，本地DNS服务器会先询问离自己最近的根服务器，这时跟服务发现这个文件不是自己直接管理的，但是他知道这个文件在.com服务器的管辖范围，就把.com的服务器返回给本地服务器，然后本地DNS服务器再去找.com的服务器，.com服务器返回.net服务器......就这样一直找到.cn的服务器，.cn的服务器发现文件是自己直接管理，就将",{"type":20,"tag":101,"props":56557,"children":56558},{"href":56551},[56559],{"type":25,"value":56551},{"type":25,"value":56561},"对应的ip地址返回给本地DNS服务器,本地DNS服务器将IP地址交给浏览器，就这样浏览器就得到了目标服务器的IP地址。",{"type":20,"tag":21,"props":56563,"children":56564},{},[56565],{"type":25,"value":56566},"DNS服务器具有缓存的能力，在一定的时间内再次访问的相同域名会直接返回给浏览器，为什么说一定时间呢，因为有可能一段时间后你想要访问的网址它的ip地址改变了，如果一直存着就会有问题，所以缓存都设有一个有效期。",{"type":20,"tag":6665,"props":56568,"children":56569},{},[56570,56580],{"type":20,"tag":21,"props":56571,"children":56572},{},[56573,56578],{"type":20,"tag":33,"props":56574,"children":56575},{},[56576],{"type":25,"value":56577},"tip:",{"type":25,"value":56579}," 系统和浏览器也有自己的DNS缓存机制，并且也有一定的有效期。",{"type":20,"tag":21,"props":56581,"children":56582},{},[56583,56588],{"type":20,"tag":33,"props":56584,"children":56585},{},[56586],{"type":25,"value":56587},"ip地址：",{"type":25,"value":56589}," 它记录着每台计算机的位置，相当于一个小区里面的2单元702一样，代表着一个位置，我们能通过这个位置信息，准确的找到它，ip地址是由数字和.组成的，如：8.8.8.8。",{"type":20,"tag":11085,"props":56591,"children":56593},{"id":56592},"生成http请求",[56594],{"type":25,"value":56595},"生成HTTP请求",{"type":20,"tag":21,"props":56597,"children":56598},{},[56599],{"type":25,"value":56600},"将请求信息和IP地址交给协议栈，协议栈进行打包生成网络包（这里涉及到网络的层次结构(应用层、传输层、网络层、数据链路层与每个层次的职责），但是要往里说东西就太多了，这篇文章只介绍大体流程。",{"type":20,"tag":11085,"props":56602,"children":56604},{"id":56603},"建立tcp连接",[56605],{"type":25,"value":56606},"建立TCP连接",{"type":20,"tag":21,"props":56608,"children":56609},{},[56610],{"type":25,"value":56611},"客户端和服务器双方创建套接字，浏览器调用Socket库中的connect方法，协议栈将本地与服务器套接字连接。这时可以理解为通信双方通过一根管道相连，双方交换的信息就是通过这条管道运输，但实际上这跟管道是不存在的",{"type":20,"tag":6665,"props":56613,"children":56614},{},[56615],{"type":20,"tag":21,"props":56616,"children":56617},{},[56618],{"type":25,"value":56619},"其实服务器中的套接字是一直保持着待连接的状态，为了提高客户端与服务器的连接速度。",{"type":20,"tag":11085,"props":56621,"children":56623},{"id":56622},"发送请求",[56624],{"type":25,"value":56622},{"type":20,"tag":21,"props":56626,"children":56627},{},[56628,56630,56635,56637,56642],{"type":25,"value":56629},"浏览器确认了ip地址与生成http请求后，会通过调用",{"type":20,"tag":33,"props":56631,"children":56632},{},[56633],{"type":25,"value":56634},"Socket库中的程序",{"type":25,"value":56636},"委托",{"type":20,"tag":33,"props":56638,"children":56639},{},[56640],{"type":25,"value":56641},"协议栈",{"type":25,"value":56643},"将请求发送给服务器，协议栈将请求包装并分成一个一个的网络包。",{"type":20,"tag":21,"props":56645,"children":56646},{},[56647],{"type":25,"value":56648},"然后协议栈将网络包交给网卡，网卡将网络包以光信号与电信号通过网络发送给服务器，发送过程中会通过TCP头部中的控制信息来确实通信双方是否成功接收到包、当前通信双方连接的状态等。",{"type":20,"tag":6665,"props":56650,"children":56651},{},[56652,56657],{"type":20,"tag":21,"props":56653,"children":56654},{},[56655],{"type":25,"value":56656},"网络包分为这几个部分：",{"type":20,"tag":5719,"props":56658,"children":56659},{},[56660,56665,56670],{"type":20,"tag":48,"props":56661,"children":56662},{},[56663],{"type":25,"value":56664},"第一部分是MAC头部，保存着以太网的控制信息，网络包从客户端到服务器中间要经过很多路由的传>递，这部分就记录着要去的下一个路由的位置信息。",{"type":20,"tag":48,"props":56666,"children":56667},{},[56668],{"type":25,"value":56669},"第二部分是IP头部，记录着服务器的IP地。",{"type":20,"tag":48,"props":56671,"children":56672},{},[56673],{"type":25,"value":56674},"第三部分是TCP头部和数据块，TCP头部保存着TCP控制信息，就是通信双方的端口号和一些像ACK用来表示当前数据包对方是否成功接收、还有表示通信双方连接状态的一些标识符。",{"type":20,"tag":18942,"props":56676,"children":56678},{"id":56677},"为了避免网络拥堵网络包不是一股脑的全都发送出去",[56679],{"type":25,"value":56680},"为了避免网络拥堵，网络包不是一股脑的全都发送出去",{"type":20,"tag":21,"props":56682,"children":56683},{},[56684],{"type":25,"value":56685},"协议栈不是一收到数据就马上发出去，而是先放在套接字的缓冲区中，等达到一个网络包所能容纳的最大数据长度（MSS）或者到了一定的时间后就会将这个网络包发出去",{"type":20,"tag":28,"props":56687,"children":56689},{"id":56688},"服务器端",[56690],{"type":25,"value":56688},{"type":20,"tag":11085,"props":56692,"children":56694},{"id":56693},"防火墙",[56695],{"type":25,"value":56693},{"type":20,"tag":21,"props":56697,"children":56698},{},[56699],{"type":25,"value":56700},"网络包经过若干个路由传递，到达了服务器所在的区域网，会遇到防火墙，现在大多数防火墙是通过包过滤的方式防止危险的包进去服务器。但是这有点漏洞，因为防火墙无法检查包内部的数据，有一些特定的数据进入服务器会导致服务器宕机，但是这种危险无法提前预防，因为这大多数都是服务器的bug引起的，能做的只有尽快修复这个bug。",{"type":20,"tag":6665,"props":56702,"children":56703},{},[56704],{"type":20,"tag":21,"props":56705,"children":56706},{},[56707],{"type":25,"value":56708},"包过滤方式通过检查接收方IP地址，发送方IP地址，接收方端口号，发送方端口号，进行过滤",{"type":20,"tag":11085,"props":56710,"children":56712},{"id":56711},"服务器响应请求回复数据",[56713],{"type":25,"value":56711},{"type":20,"tag":21,"props":56715,"children":56716},{},[56717],{"type":25,"value":56718},"经过防火墙的过滤，请求到达服务器，服务器解析请求信息，将客户端想要的数据装进响应体，返回给客户端。",{"type":20,"tag":11085,"props":56720,"children":56722},{"id":56721},"服务器响应优化",[56723],{"type":25,"value":56721},{"type":20,"tag":21,"props":56725,"children":56726},{},[56727],{"type":25,"value":56728},"当一台服务器受到的访问非常多，性能就会大大下降，有的人会想增加服务器性能和增加网速，但这样会花费大量资金并且没有很好的解决问题，治标不治本。",{"type":20,"tag":18942,"props":56730,"children":56732},{"id":56731},"负载均衡器",[56733],{"type":25,"value":56731},{"type":20,"tag":21,"props":56735,"children":56736},{},[56737],{"type":25,"value":56738},"一种方法是设置多台服务器，并将他们的地址保存在负载均衡器上，让客户端去访问负载均衡器，负载均衡器平均分配每台服务器的访问压力。怎么让服务器去访问负载均衡器呢，简单来说就是通过修改DNS服务器的查询结果，将要访问的服务器的IP地址替换成负载均衡器的地址。",{"type":20,"tag":18942,"props":56740,"children":56742},{"id":56741},"服务器端的缓存服务器",[56743],{"type":25,"value":56741},{"type":20,"tag":21,"props":56745,"children":56746},{},[56747],{"type":25,"value":56748},"还有一种减少服务器访问压力的方法是通过缓存服务器，缓存服务器是通过代理机制对数据进行缓存的服务器，web服务器返回响应数据需要检查网址，和访问权限等内部操作过程，缓存服务器不需要，只是将磁盘上的数据返回给客户端，所以加快了响应速度。这种是将缓存服务器放在服务器端，还有一种是将缓存服务器放在客户端",{"type":20,"tag":18942,"props":56750,"children":56752},{"id":56751},"客户端的缓存服务器正向代理",[56753],{"type":25,"value":56754},"客户端的缓存服务器(正向代理)",{"type":20,"tag":21,"props":56756,"children":56757},{},[56758],{"type":25,"value":56759},"这时它就换了一个名字，叫做代理，代理又分为正向代理与反向代理。代理有缓存和充当防火墙的功能，他与防火墙主要差别就是防火墙不能检查内部数据，但是代理能检查内部数据是否含有危险数据，是不是听起来这种方式很好很不错，但正向代理需要设置浏览器，很麻烦，并且容易产生错误，还有一些其他的限制。",{"type":20,"tag":18942,"props":56761,"children":56763},{"id":56762},"反向代理",[56764],{"type":25,"value":56762},{"type":20,"tag":21,"props":56766,"children":56767},{},[56768],{"type":25,"value":56769},"这时就有了正向代理的改良版：反向代理。反向代理不需要我们设置浏览器，是根据请求消息中的目录名跟服务器进行关联。",{"type":20,"tag":18942,"props":56771,"children":56773},{"id":56772},"最优解内容分发服务cdn",[56774],{"type":25,"value":56775},"最优解：内容分发服务(CDN)",{"type":20,"tag":21,"props":56777,"children":56778},{},[56779],{"type":25,"value":56780},"不管是将缓存服务器放在服务器端，还是客户端都有一定的问题。放在服务器端虽然减少的服务器的压力，但是没有解决请求路径中网络拥堵的问题，而放在客户端，当缓存服务器配置不够要升配置时，服务器端无法操作。",{"type":20,"tag":21,"props":56782,"children":56783},{},[56784],{"type":25,"value":56785},"这时就出现了一些专门提供缓存服务器的公司，将缓存服务器建设在客户端与服务器中间，也就是咱们常说的内容分发服务，简称CDN。",{"title":8,"searchDepth":169,"depth":169,"links":56787},[56788,56792],{"id":56462,"depth":169,"text":56462,"children":56789},[56790,56791],{"id":56467,"depth":179,"text":56467},{"id":56487,"depth":179,"text":56487},{"id":56507,"depth":169,"text":56507,"children":56793},[56794,56795],{"id":56512,"depth":179,"text":56512},{"id":56688,"depth":179,"text":56688},"content:articles:frontend:基于浏览器的网络基本原理.md","articles\u002Ffrontend\u002F基于浏览器的网络基本原理.md","articles\u002Ffrontend\u002F基于浏览器的网络基本原理",1779811688290]