学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,

IoC是什么

  Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。

  在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

  ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  ●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

  用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:

                          

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:

                           aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVQAAAGiCAIAAAA3O6nmAAAgAElEQVR4nO29b3Bkx3UfOt+oT9qk6oX8Io4AW7OKZXKJmAAZk0PWg2XDUCoiMVUmhIq565hjCLI35lrEGKCfaS3EqVmWmAAEkxEtgAVS8SCQkZJAjVhr1lJIBiqUBNk10EYGQzzEvt4Qr4IthX7cUlB5SJQP8z78hJOz3X379r0zmDuDe079amv24v7p27d/fU6fPn061RAREUmkpOIugIiISDwi5BcRSagI+UVEEipCfhGRhIqQv9Pl4OCgVqvRf2u12sHBQeBVhUKhXq/zI7VarVQqtbx4It0rQv5Ol1KplM1m+ZFsNru3t2e/KpvNVqtVfiSfz+fz+daXT6RrRcjf6aLTuFAoFAoF+q9Rn2ezWWh+MgEymUypVCqVSoVCQelNRJIpQv6OloODg2w2e3h4WGCSzWZzuRx+5/N56h329vaq1ere3t7e3l42m61UKnt7e/V6fW9vr1KpUB9RKBTE/hdpCPk7XAqFQi6X40cODg4ymYwynteFND+E30SYLwIR8ne0ZLNZxUTH0N3P51ev1/P5fLVazWaz5XK5XC7ncrlyuZzNZkulUrVapX+VPkUkgSLk71ypVCqVSoWztFar5XK5er1OWr1SqRweHtIJ9XodnQU0f71eLxQKYDtX+PV6XfS/iJC/cwVePU7+XC4HnQ/qQsNzd6BOfpxJ5M9kMtVqVcgv0hDyd6yUy2WodCJ/Pp/PZDIgfz6fh4WvXFWv1+HVz2Qy8Ajq5G+I5hdpNBo6+W/cuFETCSl//ud/Dh+753mt+jBkzIP8GMCDuo1GI5/Pl8tl/SqwulKppFIp+PlrtVojVvLfunXrzJkzKZH2ytNP/27gp1HJf/bjZ++/v++hhx8UuOMzY0986UsvfOlLL1y69HQL+Q/J5XIY/DeOqdsICtfLZrPQ/LXj0EAiPwYF7ST/jRs37k5/xNvfFrQNK6uLjz76SOCnUcmf/mj6O997M/bSdxf2D955/4P33v/gvS996YXA2LuwQuP8BiN/o9HA/L9+frVaRSwAxgVge6lUKpfL9XoddkS9XjcaDichQv72Q8jfPpw0+ek3kR+q2xiui/Npnh99B7oJv8HCiYqQv/0Q8rcP7ST/4eFhqVQCsbPZrMJ//iclEIgmAhAX6LI6qCUi5G8/hPztw8mRH+G99N9MJsNZvbe3x4/UajX6k0J+GPxUtkqlkslkWt5PGUXI334I+duHkyM/qWuIUZ8XCgVdjfMzy+Wy7t5rW4S/kL/9EPK3DydH/r29vWgUReTP4eGhsiKw/SLkbz+E/O3DiY75u12E/O2HkL99EPJbRMjffgj52wchv0WE/O2HkL99EPJbRMjffgj52wchv0WE/O2HkL99EPJbRMjffgj52wchv0WE/O2HkL99SDj5d3Z29vf3/f4q5G8/hPztQ8LJ/9prrz3//Bf9/hoX+Xd2N2fni2GvUi5ZWV1cWV2M8PSZ4nQzhZ+cuhjtuVTsmMm/s7u5s7vpcub6xprL3cYnzm/Vr0Uuz9Dw4OTUxVAPDYuHHn6wxnbXSYhcuHDhjjvueOONN4x/dSd/9ery0PBg9ery+sYaQfnv+sba+MT5/oE+lxtOTl10PJPQ05vmjQTNJmwnsr6x1j/Q597AturXlLY9OjbCSz46NjI6NuJegPjJX7263NObXlia45icuqgcGRoe7OlNu7B6YWmupzftXqejYyP8s41PnOc1ODQ8GLZlBCKx5P/N/D85d+5e419Dkb+nN60c7B/oq15d5kdCUVonswWz80W9ACuri6lUirc6P5U2PnGeSqi00oWlOXuZ8e78DlTsldXFnt50KFOiU8jf2m/ZP9Dn/i13djd7etN0c16hs/PFUH2zIxJL/hdnZ4Y/9Umj8m8n+Xd2NxVrGcqGH1H+69K6+gf6iPA7u5v9A31GW6CnNz07X/SzVgL11uTURXp93lZhDYVqh6eB/Osba8rHWFia45dXry5TZ2kE78upQnd2N4eGB3mLacn7ehr5b926FVdawXbKr/7q0IuzM2++tWJU/u7k36pfa7LBoMnNzhcV65Ibnn5mJj19YWluZXXRMvSoXl02srGnN+3HUhcNh4Gt0lYnpy7SPdFuXTqC+MmP6mj+W+r9KAHcVtiLb0NA9aGbGJ84jx8rq4s4iKFEBM+QESD///if//3gv/6ngx/t/acbfzH9f12KPcXgSeMXH3rg7do3vP1to/IP5fBrSYOx3L96ddnv2tGxEXej0q/ws/NFpflR2zM+Fw/lgI3Q05uGi0qHi/1/esgf9lvOFKeVqp8pTqNCR8dGjN8mrFnlB5D///sf/61VFdhdMCr/sORX+nrY2I4Ov2bID77hN6l3vSFZFHgE8usYGh6ENwr9wux8MYKTu1PIr9hd/QN9M8VpfkRxbLbqW3L0D/Sh9scnzk9OXVQcgS1EwsnvmZR/V2h+DAdI869vrJFtqMNvnNik2e8xJz95H+CcAmvce4FOIX8s31J5IoZSVKFb9WujYyPo6S3unwgQ8uvKv9PIr5+wVb9GNnYz704OPx0ump/P5ymuRzJdHZtrUshvOQFdAyl5pUJhUqZSqSY/OYeQ39OUvzv51zfWWtJg/Lx9C0tzYJFy1ejYyM7upgv5ldliBZE1Pya8ObF1tYRX445qC+Inf/PefkeHn+U7cUtpfOK8PtfSP9DnWKEuEPJ7+9uv/8m/Ghr6lQjkb1WDsTxCnz/CKN27fXZNd/jb/fxABPKvrC6OT5xXBqELS3PGOayt+jXHsL9TQn67saTP63r72zPF6cmpi8oAaaY4PTQ8aJxobflUX8LJ/9T4k3Nzc5HJrzi3EfrCj1iis+wOOSPo67ff7N/Z3TQ2SLy18U+OvqpOIT8m2AhwufMj8GcY7xAhPNMPPIJCQajASTuE/N/ffjudvvvo6Cga+fXPratTS6tAi4pWcoX8Q8ODus/PHmbLi7qyusiVirHM0FI6EPOqH4ejyuUF4yf/yupik99ydGwk7AIJpa9Rupih4UHlOE2rtOSVhfyK2g9FfsxyKwdDNRiL4e3ydE5+eIv0GTsL9+BIRovdql/jRi7WuSh62zJrMDtfpPFIBMRPfqMdFfZbtioCt6c3jRVaJzTJBySc/LraD0V+4xSse4OBBzdy4XXy69zzGxrAtvfY1JK3v62b+hh72ouBqDP8jhDYC8RPfhhOkb/lyupiq1xxfCio+1daCJ38f7LyytOf/+ypx/V3NjyT2g9FfmMzcG8wTYZvNEN+4xQdJi/geyLXfaCDGVP6+I11BBHW9sZP/ia/pbHviAC4HvitQq0OCgUltv+Hf/mD55//4uXTLvfdd9+LszNGte9O/pXVReNHcWwwxjFmKDia/XohuWNbaVrkdabeAfNTfuE6+ggUN1fmrVwqM07yY9AS+VvOzhdbMg6vHq/0UI5jqN9yEyDJq/qMar/hTH6/z00NBh4BP2//0PBgM7kevKjkh3onZW5ZF0jK36j50XkZr8V6HqxPnXRL8hEz+QO/JcY//QN9euiCsuqumc9psZrg/6c6bcmEX2LJ//vP/q5R7TfcyG9xbiECB7/hRUulUoobmC99a6a1RDD7EbFOnikEEcG7zGFZPAY9F5ioBnG+ftPVCuIkv8VFr1QBZi+UYKbIszX05vDKBvaRcM+2PMKvJYzqIrlw4cLfu/P/MKr9hhv53ZW2HujiN1seodHyYvgp4cD7GJcDGF9wfWNtYWnuJDJKxT/mjwU7u5tNmn/NILHkv+uuO41qvyEJPONAQskfL5JJ/rm52ZWVFb+/CvnbDyF/DEgm+e0i5G8/hPwxQMivi5C//RDyxwAhvy5C/vZDyB8DhPy6CPnbDyF/DBDy6yLkbz+E/DFAyK+LkL/9EPLHACG/LkL+9kPIHwOE/LoI+dsPIX8MEPLrIuRvP4T8MUDIr4uQv/0Q8scAIb8uQv72Q8gfA4T8ugj52w8hfwwQ8usi5G8/hPwxQMivi5C//RDyxwAhvy5C/vYjOvlfLl9BlmtBWPz8PT8n5Ffk5s2bd3zojoceflDQNvz8PT/32GOfDvw0KvknJj776KOPCCLjxo0bJ8Khbpbr16/XRNort27dCvwuKvlFREQSIkJ+EZGEipBfpIPk6OioVqtdvnz5scc+vbW1FXdxTrkI+UVillqt9sILL4yOPnH2bAauwac//9mvvDr70MMPrq2txV260yxCfpF2y61bt1566aULFy6cO3dvKpV66OEHP3fxN18uX3m79g0+X/XuX20Nf+qXX3nly3GX99TKqSL/rVu3+B5y3Al/x4fuSB3L66+/HndJEy21Wu3sx8+mUqlP/Pzff7l85fvbb1umrJ+88Jmpqd+Pu8inU04V+R999JHP/c4/pa1j+Qz8d7735pMXRs+du7cm8/CdITdv3nz99ddHR5+46647f/uf5S38n/6DS+cvPOm3KYhIZDk95H/llVeevDBqbD1/NPP7mbMfe+WVV+Iuo4hBLl/+wqXPT9hD1v753POf/vQ/dpm7FnGXU0L+mzdvptMfefevtoxN5557PiEKv2Pl0UcfCdxV0dvffr3y5UceefjmzZtxl/f0yCkh/9DQr7z+J//Kr918/ZtffeCBgbjLKGKQo6OjM2c+7NdrAx/L/Mydd/69Jz7z+Od+55+m03fv7u7GXepTIqeB/K+99toTnzHvCE4Y/tQn33jjjbhLKqLKG2+8MfypT1o+3He+92b6o2nuIDhz5ozwvyXS9eS/efNm5uzHrr+zYSf/97ff9ttAXiRGuXTp0nOXJy0f7sXZmQsXLvBLrl+/Lt+xJdL15Lcb/By/98xvf+ELfxR3eUVuk3Pn7n3zrRXLV3viM4/L1OwJSXeTHwb/d7735vCnPjn9B5fs5H/3r7bS6Y+Ix6hzxGWp/5kzHxYn/wlJF5P/5s2b6fTdvzb6+Nmzma997WsDD/TbdYi3v/1y+cro6BNxF1zkp/L6668/8ZnHLd/rzbdWzp27N+5inlrpYvKPjj5x5syHr1wpYQQY6DoC7r+/T1aMdIhcuHDhxdkZy8d67vLkpUuX4i7mqZVuJf/R0dGzz04rNvxjj336K6/O2skvyqRzJDBn3OAvPfrWW2/FXcxTK91KfqPs7u7ec+8n7JPG8CG99tprcRc26XL9+vV77vmE3Udz5syHxbF/cnKqyN9oNC5devq5ywU7+WXarxPkpZdeeuq3ft3ymRyzUIpEltNG/lu3bmXOfsy+UMzb337ucuHSpafjLmyiJXCMdunzE5cvfyHuYp5mOW3kb1hX+HCTMpP5WUm2GZe4RPXec88nrl+/HndJT7OcQvI3HEJHvP3tr7w665LeWOQkpFarPfTwg5avc/2djTNnzsRdzFMup5P8gW3r2Jn8yPb2dtyFTaIELuOVrrkNcjrJ33Ce9vvd3/1ncZc0ifLAAwNf/+ZXLZ/myQujf/zHfxx3MU+5nFry21f4E14uz37729+Ou7DJklu3bp0582H7d7k7/RHxyJy0nFryNxqNL3zhjy498zl7I9v76+tf/OLMj3/847gLmyBxXMYbdzFPv5xm8h8dHaXTd9un/W6+/9ff/NbXV1f/NO7CJkgmJiaKV/7A8lFenJ35jd+4EHwjkebkNJO/0WisrKw8PvKP7OQ/+JFXKhX39/fjLmxSJDCq9/GRf/S1r30t7mKefjnl5G80Gg880G/xLd18/6/f/+C97279+/n5l+IuaSJElvF2jpx+8ttjyEH+9z947+V/ORcYUnJwcFCpVJopzOHh4cHBgf2carXazCMgpVKp+ZuchMgy3s6R00/+RqNx4cL5F+e+aCf/u3s/+OLzMz/5yU/styqVStlsNnJJ9vb27JcfHBxkMhlLF5PJZFwyEWcymb29vQglPGkZHX3i5fIVC/mnnn362Wen4y5mIiQR5LdM+xH53//gvX9dWXKZ9stms7lczv3p+Xyek9l+balUyufz5XI5n88bbYRMJqMfPDw8LBQKjUajXq/v7e3V6/VMJoPflUqlo6yAM2fO2BMuPvTwg5JnvT2SCPI3Go25udmnxp+0k//gR96zz04HTvtVKhU7gWu1GogHqdfr9Xqd/mq/NpPJgPPVapVMgMPDQ+Pl9KB8Po/jpO3ptHq9ns/n7W/UNpFlvB0lSSH/0dHR2bMZ3cnMyf/+B+9d/bNvKib34eHh3u1Sr9drtRr/by6Xc7cF6Ezdg6Bo6UqlAj1fq9XoKuODstks7yAat5O/UCh0CP+vXLny2xefspBflvG2U5JC/oZPbIlC/vc/eG9m5rJ92q9UKkUwpPf29qrVar1ez2az6DUqlYoy/teJDSugXq/TE/VzSqVSuVxuNBq8S8pms2T2FwqFer2u9A6xSODmPL998akXXngh7mImRRJE/kaj8StDv6zk+dbJv/0fvnflio3bdvIfHh5WKpVqtVqtVsvlMn5gGN9oNEB+nMkp3Wg0CoVCLpej8QKG/fqZCvkPDg6MtgDX/B0y5pdlvJ0mySK/PubUyY9pvx/84Ad+N3HU/PDb89F+43by12o1uk+tVoMhQOfD80dXGcl/eHiYzWbz+XypVELHUTqWTCaDH4VCAf1O7CLLeDtNkkX+hpbny0j+v3nv3Wefnfab9nMkv3GkzUf1/D6Y21fIT3+1aH7yGmQyGaNfMDCsoG1y6dIle4a1r7w6+/jjj0W+v9LPdqx0zlxG4sh/8+bNe+/9eQr4N5L//Q/eW/23y9/61k+DbchjDykUChhFQ/L5vNGdBg2vuPpLpRLRVe9EIpAfhKfwARpxZLNZ/Mjlch3S2k56c55yuRxqClYXmmrxk0KhYAnTcNQK2Wy2QwZiiSN/o9GYm5ujaT8/8vNpv4ODAwv5FXpDSqUSUQ4GOX5ns1lqXnby86ss5MfxWq2GeX6SJmnQcmnPMt5cLhcqBKter7uHYDQajUwmg0GWsY/AIEs/roRs0leGe8i9tC2XJJL/6OiItvfxI//7H7z372p/tri4oF8e2MHv7e3xE2icf3BwwJumH/kRooNJPij2arXqR/5arQbmK8EF5O3f29tDbxW2llorr7/+un0n5ZYs463VanbtDbZXjwWfgIZLdvJTfAc+qN4GuBOHHlQulxGUWa1WMR1TKBQqlQrFYsU4Lksi+RuNxltvvTX4S4/Yyf/+B++VSkXP85RrA739uVwO7rpcLlcoFBARDJ8/VwJ8CAAhnVCr1dAidc2gN9B8Pk+dCx00BgLGKIGb8xSv/MHExETzD1LGOPp8qkWUACr9rxRDxaOw8/k8jhsnVmiih6RUKnH7riVLOaJJQsnfOM7zZSf/D9/5i+ef/6JyYaDmz2az5XKZU7FarVYqFcU1wA17ulA5oj9IJz9igZRp/E4jf+Ay3uFPffKNN94Ie9tqtcrjr0B1JSIrMMbh8PCwVCpxRwnCK5UvqFhPuH+j0cjlcri/Tn6y9apM0B2QawaPDvviLZHkkv/GjRuZzM/uH/zfFvK//8F7C4tf/u53v8svNJLfHkKHKED8Ros5PDzUTT40PuMRar46q3O5XLlcRjMi1aTH/MUobVvGy2dS/U6gToH6C2I1r1ulk1X6Zd4ALCEV3Fjg13LN7/hqJyHJJX+j0bh06enlldcszH/lK/Pjn/3NBx984JlnnikcC4J5C0zgZ/LjvxJdj7AcuI6UM6EKckygx+gmmUxGadxwPeI3pvdxji4xmpeBm/O8+dbKufvONf+gQPJTb5vNZnXD3o/8GKCRTYGxOtWnH/kx+1Cv18vlMv6E1oKmQi0n+ts2LYkm/9HR0VNP/ebfvPeuXfk3k+cLUb3KQdiZEe5WqVS4sWD0Fe/t7cHzxCVG5jfauDlPIPkhe3t7evxV43h2tqHFYmHswO9s7Cb0kE0K6ObDfq7545VEk7/RaHz7299eWPyynfwHP/Kee+4P//Zv/zbuwnartG0Zr0JRzMvqp8HziiVb/GROY6UTiUB+ElxIbgjy9sMZHOE1WyVJJ3+j0Xj++S/+8J2/sPP/O5vf/vKXOyJItuskMKq3mWW8mFUlKRQKFNdMooy6Dw4OaMDFB03lcpn0s538ypStH/nJLsPJ5IIRzd9B4nleqVS0k//9D977F3P//J133om7sN0ngZvztHAZr4vZr/hfyDPK46/8yH94eAjPC78J3UEhP5Zs17V8Cpz8+l/bKUL+RqPRWFxc+He1P7OT/4fv/MXzz8/EXdLuk8BlvE/91q+/9FJrsqcGkh/qnXwicL8hRIr73vgQQLkzJU1qaLEAutkPx16lUuEhWNlsFma/nuilzSLkbzQajR//+MfPPjt98CPPzn/HPF8iJLdu3brzrjvbtow3kPyYQCmXyzQWQEeQy+UUT6pCY+Od9XP0eX7jhK6Y/Z0l3/pWdfXf/hs7+f/mvXdle59QErg5T2uX8Ropymc6jLEPSpLFhiksT78zsqfxI3qXgaQMUPV0MN5pVy5C/p/KT37yk2efnXaZ9vvTP5X9JFzl0qVLz12etJD/xdmZCxeibM6juPq4Ga+7AC3T6TDL8Rsj8Gw2awy5x314CAYfCOAq3mXUajX0DnAxIv4CC72VYse1vEfI/7/lBz/4wcv/ci5w2k+293GXsx/PvF37hoX8TS7jbVIw9lYO6mHXLoK4Xf5fXb3DNFCCr2KM8xHy3yZXrlzZ/g/fs/P/u1v//iXZ3sdBXKJ607Ibb3wi5L9N3nnnnV/6pf/zP/+Xv7Tj158cfeutt+IubKdL4OY83/nemx+V3XjjEyG/Kp/97Hjxyh/a9dXbtW/ce+4eSS9vl8BlvM9dnrx06VLcxUyuCPlVsWzvc9vs9PiTc3OzcRe2o+Wuu+60748+/KlfjrCMV6RVIuQ3CM/zZQlKTac/cvPmzbgL26ESuDmPJ7vxxi1CfoMcHR3de+4eu5va298uXvnD8c/+VtyF7VAJXMb79W9+9YEHBuIuZqJFyG+WwOgUr9XRaadMhoZ+RdkfRUGrlvGKRBYhv698OmgV+rH66o+7pB0nLpvzyG68sYuQ31euX79+f/8/CPT8/erwJ9fW1uIubGeJ2zLeMzJdEq8I+W2ibO9jxPe3306n75Z2zCVwGe9XXp197LFPx13MpIuQ3ya3bt3KnP2Yfb7K29++9MznvvCFP4q7sB0kgZvzPDX+ZKuW8YpEFiF/gDhO+90t037H4rI5zz33iqM0fhHyB0ugHvP2t18uXxkdfSLuknaEBE6UfH/77bvuujPuYooI+R2kVqv94kMP2Mnv7W//wv33bW1txV3Y+OU3fiMgqjfyMl6R1oqQ30kCk097SD5/7t64Sxq/BG7OM/qZXIzLeEVIhPxOgu19Aqf9fm308ddeey3uwsYpsoy3i0TI7yrT01NTzz5tb9Yy7Re4jPft2jfOfryz9hFMrAj5XeXo6Cidvjtw2u+5y4VLl56Ou7CxSeD46LnLhd/7PVnG2xEi5A8hr732ml2tefvb7/7VVibzs4k1awM355FlvJ0jt5H/xo0bNRGr/MzP/MyVLz23srpowTOF33nooYfiLmkM8uqrr/b2ftRSM19d/vLf+bt/580334y7pImW3d1dA/nPfvzs/ff3PfTwgwI/PPgP+++59+ce/MX77bi//74H/2F/7KVtM37h/vv+wS/ca6mW/oG+c/d9IvZyJhwf+tAdBvIHTtIIBIJuRyqVEvILBEmEkF8gSCiE/AJBQiHkFwgSCiG/wIyh4cHxifOBp61vrNHvrfo1b397Z3dzZ3cz9vILAiHkF/wUCmO36td6etPgMz+oXNU/0LewNLewNDdTnO7pTSsHR8dGRsdGYn81gRFC/u7Dyuri5NRFwsrqouOFs/PF0bERqHRctbA0R38lxhJmitPKkZ7e9Ox8kd9zaHgQP6pXl/sH+pSDKGHsNSYwQsjfldjZ3ezpTff0ph0NbDCT83B2vtg/0Ed0xX/xe2V1sXp1mR5El6ysLo6OjSjKX8jfvRDydys4de1Y31jr6U3rJFxZXeR0JZXeP9DHR/vjE+fBeaOJwc1+uhs3+4X8HQshf7fCnfz9A300Glegu/T6B/rQC2AMD3/e7HzR2H14TMmvb6xNTl0cnzhfvbo8O1/EyEI8f50MIX+3Qif/+sYatPTQ8CBp6fWNtVQq5ed1U8g5OjYCgx/DitGxEXLmz84XU6kU9+3r4O493MHb34b+j726BDqE/N0KhfwLS3P9A30gM4gKBT45dTGVSgXa3ju7m9z5NzQ8iEtmitNEeOUmC0tz3O84NDwItwJ+8z9NTl209xqCWCDk71Yo5CdzHRgaHoTidSQ/hzI/NzQ8yPsFI6pXl8n+9477hdirSGCHkL9bwclfvbqcSqXIRe/tb88Up3EkLPmNM/MYSiiTfITZ+SJnPgBLxO8SQSdAyN+t4OQnqtNfqTvAEMAlVm+rfg0hAOMT5xWjfWh4cHRsBI7DoeFBsuFXVhdxyfrGWvXqMp6CmcL1jTXwH1OS0gt0IIT83Qpd888Up+mvOAKWgn7Gm3B/Hi6HsaCcNjQ8iOn9ldVFiuGdKU5jspA6HZSHz+1PTl0cHRsJHDUIYoGQv1uhjPmhk+m/fNYddoHR8gfhuc/fj/yWYhD5cZpCfhn8dyyE/F0JPcJvYWmOPPw7u5uck97+9vjEeWXqbmFpzjgWEPInB0L+7sP6xtpMcRq84lNxCL/F+FxfgbNVvzY+cb5/oA8n+K0IwNC9enWZwxJN1D/QR0sAaH4Bpr5E+HU4hPyC2zBTnDaS32+innc04Dm6JBxZWJqTGf6OhZBfIEgohPwCQUIh5BcIEgohv0CQUAj5BYKEQsgvECQUQn6BIKHoCPKPT5zXg1IIPFLNAr7gREfgbPP6xlrgOZT3MvBWSsFo3nt9Y02S2wg6BPGTH6lm+KIUBT29aSPlFBbZs1liaRpPRKv/1xLECiCbdSD/ERVDq1mUANjApwgE7UEU8juqYkcgAhTrw4zLv/iKNOjn9QwmIogAACAASURBVI01LCb19rd5bCl+gOfKTfQgc+Ucvyh0PdEVL6SfwbKyukiL6oj8M8VpSWgl6ByEIz8o57c+NBroblv1a5Q3llvOnKVEttGxEWVdCs8hrS9ZiUz+yamLKBWA5xJSqZQf/6kMID9C6y0lFAjajNCaH+vDWvX4yamLPM0DrSHhaaF0NY5uAqeRLQCOrW+sYWsKJRwdK2H4TdzJb1maolSFssUFkuEj7+3sfJGO454y+BfEi9Dkn5y62Cryb9Wv+ZnBfGGpTn5alMb5wzW/Ttfq1WVaagYoG9T4rT8LRX4FyHKDtJajYyMzxWmLX1MgaDPiJD/0M6lE8AR/spAfC1e9Y+bzlWf4MTtfNJK/DZpfeTtcSGN+2iRHMtsIOgGxkX92vkiMpTvzUbGR/PC3Y+ANx7tO/oWlOd0h34zZryeiJhirYn1jjWe8VfJqjI6NBCbAFwjagNjIr3jCvdvpZ9H8ZDkrGSboNKNebcbhZ9H8gdMKK6uLek8keewFnYA4zX5PIz/N9lvID9qQa5BGDTSGN1JLV+Dww/EEtUaSj0+ct8QgcOzsbhp5Tntp6G8hEMSIjiD/Vv2aMgSwkB/H9YG9MjpQXGvKtILxtkbyW5LYKFBc/RQ7hO5DcS4ODQ+Kt18QL1pGfiR7D/t4EB4JJ8FGMG1ldZGsd13zYzKvenWZk4qCfMAuZR5B57A7+Zup3/6Bvq36NcljJ+hAtFLzj46N9PSmQ8X/kbYnNajb2MapPr0MgbNu9iNG8hsnDtwxU5zGU3Z2NyWqV9BpaLHZ775vNJ2vdBZ66JtOG+wYrQywLaVaWV3UOaycbyR/M2q/enW5pzdNow+Ma1zWBQkE7UE48mNXNoS7GkfCmMp2fzxWvPFEsT29ado6ho7wSzCRhhBAutzb3x4dG/EbRRtDiXBbDCIQb6uQHysOolUrHJBKv4YwROS6bu36CIEgAmJe1be+saZPntNfZ4rTykY0OJ/+i4AfbF+hAwQzTrZ5zKBAsHAqleKnIVgowhvNzhftEwQwncYnzovDTxAv4l/Sa4diX1hUsZJqnuxtF45t1a8pd46g87E1pQTwCroFnU5+gUBwQhDyCwQJhZBfIEgohPwCQUIh5BcIEgohv0CQUHQo+bfq1xAbawyGCYyQCZyi19f5WErCn8sX5FimA3d2N41TjM2k8bBPIiJVkWPsgFIMl6pQIiwArLCI8C47u5v210G4ROS64ogcoO0y3RstGKRDED/5saQPEbhY7oYgQmTCMUbL9PSmeUo8ZdmcMfhXB7JrBRYPSTvxm9YRe/vbK6uLWEpkvIqyd3MgvEfnp7Lmj07WFwhaYodmitPG2Epjd4AKpP9ioZS9Hvi704cLu5SD382Sah1/RRQpMDo2YqEZlmDw1dnK8m3+mXZ2N9GujFVNvxGryivcGCROyzcCgWg0x+Xh7UE48kMht6q326pfW99YU2J7XS7Uw/KVJuhyH0W3WBQRJdvnBNCjdzl0qvgdNGLSlH3cDiRE099R5yeypOtVSlREvLNf4Sn1MLobsEt5uhJwpbcZS1XoiyBAML/eXGlCKN74xHnloKV341Vtr3Y9Z7TnrEXoy3bOEs8Q5EdL6ulNp1IpRXW0BHpaez+9Go38pE+MsLwRrS+mJsufaNxuCGeS4gIcFz7AprAbL7PzRX5n8JDnMgbQ7pUoSWhR9H2Uj5zXDN9ZBB0BFZ7u6e1vU5ISrFnkpV1YmuPEgx2n14/fN+Jfk6c539nd1L8Rhh528uvdBx93GMlvpCjWlegH+fKtQF50zvpOV/Jv1a8NDQ/iJal1Nv945O2jVDyKreuX7ioy+S3cUzQ52pmegQPGvG40ujzLRfNTUpOe3jSG2S45f0OtF9S7FT39gaX2QPjZ+SJZsIEl1C183G1nd5M/F+M+sibQNnjCJZ7iFUAeB++4g15YmoNVj0VZ/Iix0vScTvTbMqbDahHjqAEtxD4U6hzj35X8s/NF/v1m54upVKqFS9MoFb8Onf961m1l2Nw8+fXvjdaAFhO4aV808qP1gEh8LxNQwq/FgDPKQb/RGWwEZdMhu+E6NDwIquNC/AvrgLd+5bZ0Q2z0gjMVIwh2BNoVLYvgilFxRlTdNjtxNK2NG0P47RYxyfZZUCo2kO0ctC7W8fwTRUSHX/XqcpMpaGeK05yxQ8ODSl595U/Gz0YfpuWanwPNFy0VdwAhkUfYr350h5/dOaRwWHkF9D5608dx3eDnfkql6pTqgj1sMa0pLTLeHUze2d1ECYkSyqvB2PaORxnu34JnZFKMQUsF0jlGzW+8JBT5Uc/onhSLIBT5UdvUxceLiOQPu27fDovaN6KZMb++gpjMPOMn5Jyssn2EvOMGYWyO2E1QOUjzf0rrQVcSmJtEN19RHmPV+SUmwlCC3pS8nnSyPj7Xyc9LCG+fZxrKYsxCL8KzGFjIT92Q7gMypkjVsbK6qFDLOBQnsx8+AqU96GlXMdtivI8j+amdN5khqlWISH6el755YMyp60mLcuD/bYnmHx0bUVoMkgXw1qaMfbz9behY+q/RclEcGeg3qVnDBqbGwWuYl0QvMPEW0RC65jfOS/HqIg8oHgGjWv+stFUhuk6qQyI/HmTsBBWrjZRn4AgISn5y6iLVCVKhKIlPFb8MaltvS5Pa/mg7u5tkt2JuRfmyur2AI7o9xclv9/ZxI6gTLP8o5Mcwu1UlwCSC3lLtlqEyr6v03Eby08a+LtC1h+fjqjEyk2cQcdcM3OJVXBhKq5opTtP9jS9lGfcS+TFxhdOglIy2KLrFnt40zXRQaT0H8vOPSM4Fy8eFHYR6psRHeIqLqax34p41UTrGL/oJ6GuUdo6JFe+456WxCQ1g/VzUntb8JtkWNXEhNPnh9m/V4+HRQUW4T4wpxx01v1/IkLFB6IE36KSU43ooCMD90gr5LQ3RbwIlbG5SL4j8NMjnp1k+K+04yh37KBX5Po2pFuF6oEfQzIiR/EhzTL0DLBoMHFZWFy1KleYp+ZwlGSw4yDU5N5SgOei/6Gr5NCF/kLFncezc9fzRsed0DE1+P50fIXU3TRcZW6plKjiaw89Ps7mXFt/eJcCBKxOuGaAc/O4Qjfy6Z3HBf99RjzFQqXnLQBSjPJqDxOUoFbVpfXyOzwfPiMvH5XY4+iYaImH87+e6o/vz2/KDfu8F9c6PkNGhANaHsUG6kN94Wz2ooc0IR37lA+vTxe4vMztfpMtDkR8BKvyIC/mbN1ion7awl6qFz3uFMvtDHQcim/3KaX5tEfMy9Dloo1TveLBgtGV42L9+W5ePS65WsA7PMtZ8ZPKTs4kCmSyNxBje5/J9LdHTjqHoJ4QQ5IcdxUfaRudHBE/GpGkzTD2iA/DzKhtbA/9yzVSx8uH92gGVEAYkzmkJ+S2DhebJT1HrZPTSyVv1a3gLI13hwcJoVlksoMwmOpIfoNAA3jy8Y0VNYf96vYUlv1Ie+DX8gjj8qtT+fQPXTWDj1tGxkfbv4OZKflBRgV5H0aYA3TW/cW0ZXU5ZwPVJ8sgzK4hC06kOtyL6FD6a4LNB1KQQbUqnYS2TbsQaZ+wDjUMj+S2jMK6T4cPnrRPmG13Ld0/ULWT+CHKPYeJAqUP6ga7HbyoH5j3vRzB8UHoWpeqaJD8NLhDziy+rWzR+uzn2a7sw8zu7uJlggHQu+U8UxukZY/sw1j5G1PQ7lUoZt/cLC3Q0fjsUeMcKineC+pDEO54ORC9AMBbJT/PbVYfe0/Vrmcg5eGPV59K9/W3jhB/nFSYFlftjRiCwVtGZplIphRV6ZAR5GQPVCT2X6wb88FtLB789QraNQwldIRH5Facvn8qF3wS1p6eE7jR0BPlXVhd1gjlGdOhQGm60mxhXttnBp47taG0frxPV3uyibRlAn8M4CUrnRC6zEY7uVfs5yl/xIjG62ToHHUF+gUDQfgj5BYKEQsgvECQUQn6BIKEQ8gsECYWQXyBIKDqL/K1a5BwYwz87X3SP8+ezxFv1a6HWMvMo5lDgqQGjbeYdeZLZcV/jlnypVsE4MRzqS7lXV0sWs9ubenu2b+8g8iNKxHHZDF/Ira+0s4S4UOVakrRxrG+sKdG19theBUpkq+WjKjF5tPTd888PO1Oc5jlIkVqL/qsvN6we5/Ok2EH9N9bh8K/Alyf7ldZeA+4bCjQD1IbSTtyz5fktHFAQ2EodY/XtIdt62JuSFYInWY2M0OTnuUpb/vH81oTb1+04rurT69el+vR8WOgO6L9YFqJcRSvtaNU3rf22dBzI1ae8wqQpRZ9n6keMUdJKRm3e4NxTVhuJ4U4txOq1wVhA34ffPDeZ52Oq8PI7LsHA50B0oPGexra3s7tJSyR4yDZWE1ki1v0+kGXthjtCkJ8i1f1yV4WCnoMFQa/6KvrAdTuO5MdaYGX5EEHJP6m0CSXPN1ew6IP9os31u1nMDb70EHfgmYKgmZXPz6FvVoHQfb8nGsnvl5tEj7FVRjT2sEWk6GiyzRi/KQdeuXqcqL/Kkvbr6yOgw/nKa36CZdk1ZfIjE4B/fSUFExiOOGJeS3Ra1bSnQMeRn7o6xM+3anxOL+PeOE4ijZex4+fLV0PBQn79KUo/iP4OpOWGA19GSdYHNj5Bk5o8TnfDj+gGAk/LxbctsO9fQDus6CMF9Kp2OxYFbrny13fsgJWhHKTxDr+W8hEbE/IYc7QoWhoLcr3bs/QY9aIxIyA1S9267Czy65qthfl80AcrLcO4QwNVBG+F4xPn+SYW+qo+quWw5Od8M7YnfUhC9aOvz8OK1EDbEuSEUe3nmDSuI9AbhPHaUFlrudXQTMpqmEhtyFfPV3kF1jNv1S6vo7d5SklINW9Zco41LLwlwOyHtaLkGuL5haraHjARcufoiOjwa20Gon5tu44F/53t9Po9Ic0PW5eqeOH2XWj89ImlAC4tjLyJXKUYtRCVauEkU1ZzR0wz5MfJJ5e1ksY7ysCnf6DPqKVgbYV6HfRf1KfzBZEW8vtlkeGa37ievYM0P4fiSmkS8HLp9W5pK9Fy+FWPN8MxQi8D1upHm5LxS8VpaWFoJUQwxafosrLVOK2o9016ljvuxdCrDl2PvpjPnfxkFZ9cvnq/wviRRO9M9TvwBdpIIsjPmbw9p7uR/EhGgMQH6DioV6IktOMT5wPHF14nkB/qxZjqIBqIYKHI38yY30J+/kYzxWmYWzythe6M9GtzYTU/GgFPU23f2VLvVmgluZLJT3FGYqtVamG6q9Lo+DC66/i72Ck9dLxPXmBam8gIRX7lUyJr0ORxAn9ue5LTBGaCQn66s0Xz897c6Bc0Vl1njfkJGG+kUqkmTThwHtUxOXVR2XnSnr1Xya+KMT8/EsHs1xPyew5JYPzgTv7q1eWF452q+GlhSRK4g5ixMMZL9D12KJkXj6ogD5mlE/S0RO+tUhv6uxh3OrckMtU/ViCjIpAf7YoyhZJzl3yNQ6YNiPm0BbdMeZuPbcw/OXWxyb36eHOPoPkjkD9CZ8k/qjLT5pm20FFKCNtBd/MojzD6BWF6cJcPn8SmdsYHt8rMn5IEUdl6FEYBNxzw39njve55bzhpSkfvaPYrM/zGWcPmEdbsNzazUOTnvl4L+XFcHynb/eUdTX745+nlQYPILsBQml9Pt+xo9iOvZqiC8Y+qOGDX2dZ9xkJSqXguSj062JjCCHMfgQFngbnr/FwzGIsq/a/xZGp5+p9cyG/cqM+yKTACSSKYBpHJD1Pf8WRiYM/xLtU0KPAjP+IjYZfxjp68/TCl9a5BeZ2OMPsJRs9QtPm/UJp/ZXVRcZA4kj+CwlHIr1e38X1BKorn4YnrsV2fnTbkSfLbaVd/TT/y+7UPzCnwXeX9KgeK2sjVQPIbEwTStcY/9fSm9fR+LkAMom5DBWpI3gnqjFIGg/TKK6uLtFV5YJOgwE3e24ZNxx5/hB9/tv6FoLIi8D8U+fWwykktkb5es/o5LohAftqOUjERqRieNccxtAq1OfuQtZmstRiPwAtNaYj9vo7xPnby2317tP+XngU0WiBwNM2v2DvKybrxpT/FpUkgFsgxBtTziYbUrd32kR+7JmGWyBKtMemzT54d7uRH7le/D0w3UcoQObaUz7hUry7rKYaVEnJ3g7E5UjGMxi3UrHIVLdEx7h2o15V7ympUCywUjPl7TJuO+3VAlnhYl11oUVeKuytykvUIml83TBRG6eMmPTqbjhC39fYPvsApw6OJ/eaJuVGmfGskF9eLGg0hND+yzQeOxyIM2Hgmee/YP2xsiMYXJjMEQdT6lHjkqAQ/jy7/rsoXojJjFp07aRAWjY+n1JJx4McrpP84/z9vMZzn9FzM3oHVxupCgAqCFxXFiwl55Sq6jz5DZoyHRZSRS/XqMZ2RQwBDaX5MXuiWIO0ZO3kcL6RobHwIrKEAaPKieryCQG97fIIAGrRf2wKDOhE+F6s0LV5Ix/WvdnTEkl690aP56v2fi0GoZNp3bIhG8LAZtHKlkBbvHXx+Coxrzh19pRY7wgh98zzsIVFl24cYoWikrfq19iwvbwaWflPvYixNgn81o7VlhxKObeTn+sYaDBwOKpKL7mxmExqOjiC/QCBoP4T8AkFCIeQXCBIKIb9AkFAI+QWChELILxAkFE2RP9SUvnJyqEVBFNsQFie6R3KME2CONd9pCbbjRWe2ohjRrObvd0t47GnJXv1WkhihZ2W2nMnLwwNdWhIUpby7ckM9QsYRCLzxy9iDJX30X4R5uPSeShppJXaYw0gMYxC3ES4hfRZUry7b8xd4x2uElIVVyiKrwKbomHZdWR/Nq5Ev0+p2NEt+ymFox/rt6a6pTpWoGP1TYT3s6NgI/+qWFSPe7QmwKfALweSt/Wx63kFaquVXPApDrh6nmkWgGEJo0bj1q5Q4U6X9WbSZUufK8lXlZJ5HiL+RC1tQQpe1+pQkQ1+GrCSx0wMNeX9nPCHw+yoZey3gS4+oGhHhdxL5CGJBFPLzpMj4BjyC1dj7IsR6pjjNPzb/9giNVKrVErNpD24jWtId+BrJlhjDPLEvsgnwx036bArAMxG4P4s3dCyY4WG2CPulk5F8iv7Ez+T5anlUGVWL3kErqTjsI52d3U33ZV1Y7KhY1Hg1Lyr5jbVKy2lpJTz9Xlia8+vaeN4BiqtvYdLaTkAU8iu5NJQcA8bajJa/IVTANjcNFpbmuCmILolWerQkmQTUL63NxltzQ8PYCYZa9USJaKmh68uBwWe/7kxprJaluwDK7DfEdRlu6Hy2VCBupQzTWk5+tAFjc9WXV/KhBLUivDU6EUqsckL5yNqJiOT3+5ORllgxZikEaU79s7nnZlKUElgB4yKUmnUBVp5SGdDiqa8hI0hnWiD59bXJyBqMZ2FhD62EpXbpdzdH8vO+g7d7Wm5E42r7yi4M7lxYwZe7cOOCCKxzm19iPMFCfr8q0itEaUXId4SvcPq8p+0gP0jIT9BhdCw1mZuJ/kUHb1myHhYY+FDuOrARPxQjU1/Fbczqy5NGcnZRumiejwAWe9WUcVivQF7JflYPp59SsaG8pBjcBRpW2O6KL26hNDAW8k/enu4J6e6V3GfNk58D3xdZKpCrCt830WP+UOSHyR1tsBQtPQtPSss/PFISNG/zY/CMpGDwHvMMrbrj2rHqjKB9cvRaxe6Xk1MXLRrJ3eyn1FpK4UORH66WwFSimBOhTtNj7obYNT9/nO7ww/FUKnUKbH4vMvn9FLgy10VZX6kV6kzGCMpImLCaH9kp+J+UBfCBdnIgKAkfHEIwwvEnyk5v6V8iZDrxbm/ocDSSr05PhsPhTn7oYX26wZ38lLpnfWPNsa/n31fxmLZ2zA9tocNoCuE7cm+oQnXHGa7OR4s1v9J0qAbtWcr9EIr8cOwpp51oDz15vI8yvSN4aHkuqq6q5QLFGm+/aST0aPAjKFRHFS2Ydgr2tH3NLOnD6EHe/vbO7mb19tyS9j6aSkIf15iO2uX7nhD5/bp7JboBVaS8ozF243SM/6Pk7Y9gOXNVoFecX0MJ5fDTYSRhC/eN4LdSntXjs301kd9Yh8YIHNrXRN/XmJLn+zlNQnn7yUzzWPylo+ZXTrM0Er3w+KCoPTv5uQKHN4SrcT+brkktbYwdMmYl7jqEJj8cLWEfw1thP9salaajjfyH5xydBXfX6YmiFpbmeHp88gAh8kwZZShNJNq0DWe+HnS0sDSXSqWU/XCIEhby8//CflbG/EquGLvPz0J+fTJCSaYGuJDf+Dr6zrM6wmp+5aEumh/zMu7ftHr7NgoYJ8LLY29F3YjQ5I+Q/d7z2RPScsQ7HkGQRtV38rWXhHxIyE7pd1r16nIqlUqlUqFeiu+vNumThEs/SDGwLuSHkxlP4Q1dCcVRWvz68X4B1EZ5n0hzdfSb0s73D/RF2+lE3wKAl83OfyP5KSVeS8g/U5xuZmtg8lWfxIRx7AhHfr8tRwMRlvy0GQ5vfDTmhOnB8+Ebn0hfHXNLfmdiFsD9XVAGSrdIbYJvyGHsEWibSnfNjx9KQ+dxrHbNT4qLSoVAaeOZxiIFkl/fXoJ/ROTn9Rshcz2PWiVDSXllfbOGqim1rl6SZiZ3UH6qLkdHRhchHPmjqX1PM/t1+1w5n8ZUxsbH52CMrNb3hEG0ht/gIoJy4Hta0235UFAZKyojauOMiV8fpDCTv4WF/HDvKVYPekz9O/rtoqXUv0Jj40hBKTlSzSo3gfMSJTFODSrk1y0IvbfSq2Iy0mYNACwaPW+/X+/ZjQhBfrv9bIHynQI1PzaKpvzkSgeP/hjaTI+7wjyNsZyU85g3fdjJYd+ILw7jtOHrl5QJIf4Wjprfcj6tktAXF3nHuY/93gvNWrkhBefoIRU0MYGOg17E0fWzfvsehxhf4BsZS47pN95fYHtsvzpBfH6/ts8X723DAta+UVWgcSKQsfOTGtvhSn6EfEZ7RpVllfdM5Fc+Erx39Nz+2zOlG/1zSPnuslNthHzMCuChpJts1a9xmvFmSm+qTMXt7G6G0h66ieuxvd/14gUaMuvausP1jTVcddKTWNWgxOHecX9Kp/k1PH4ffa1uBGsO5sakaVdS5bkRFEYHQjL5CAQJhZBfIEgohPwCQUIh5BcIEgohv0CQUAj5BYKEouvJf9JBV8b7tyHMw30OWd9U9+RKFTbEtfnCRKjq9gThdPskv9dp5Ef8aahqRQxZYPQRDweieWM+FWy8AwLp9U3s/RJg6zCeptyQFvAopzlmiUYaBXpQv0/+b8fKDIzG59PpgT1vv5b8F9FE7p/YPSkgFSmVSrlcoiwK1KGvWcC6ZhSeL/Xlp3VRYu/OIj8C1+zn6O3GeJXy+fkSegrbpPQV6EGMiesRwUp5o7zjJQZ8Eb6xnMg8g8W2WLwIMlNSXX6yMT+EffECL6QS+R95CYp9zS9iinjGMb/wan6J8r36tc0OFCBKkj5f2AW57vnalIpaWV1UrtKj0XjQMV/qw9OlKbHMnYyI5I+8O4Ud+lItHVhRZ8+EhxhMvzzw9NX599MbGfICebenA8Kiek/LEUR/rR6nMEaXwR/BlwPo72VkHVebSKpJ/0V/5LG+T89chhUN+I2YX5QNoMx5vJb8yK8EuiOPtd2qpxJyBJJZWWscivyTxxnTXRbhKeTXsz/olcMTB6IdwhBQlq50y/q/KOSfKU6nUqmWkF/hj05+xRhGYL9OJ+92u310bEQ32MKSny/XpyWGVB5K2qWDq2J38tP7GrN6wnDgrZOIClsUOodyinoOHbRuUdM9lfw2yGCrmMSUWsO4DQ7P2kB9EBIf8GQexguV3XL4X/VMOwTckP4buAhPJ//kcYpkqkDl0/hp/qSQH2HhrbJtlFw9SuPA5/Rb2omlezu7m/jG6IAtS1bpzvR5uBGhNLKt+jXqmCgUX8kCRMn8lGcp5KdHEB+M2tVvGOynjTn5FbMfvZWulvkCZFjXWKzF6x8anqoIt1KUm7I7w6S2/4d3Ox+IJwqd+rU9dpB7Q0n0ovSDk7fv7UPfQrk5dZd+/j96R5hUpNWrx+nJ3c3+pJAfdk4LyR8tMRtpG/jkqC2iY9LbIreZaeUfEl2Qs01pUmjTCvQRh7JhjhdS86NnwfAeOk0hLU8cwmEhP9eNekJO3N+4/aFfR6Pkw9F1pl5Cnfx+CQiVz6qc4+j1gBnC+wjcHAYRVIhSFZa2hyoykp+b/X5j/tNJfspRES/5xyfOE72h/3k75gNdui0HVpJTdn0aovNZg3XT5oIcqIeV1UVlrS4tgwXczX4+hOa5QPzy5FjIr/ixdIJ5LGeOspOnxcpAo8e4mi/71VntaeSHyWbc2tDvKiDwKwQu5YTvRh8JYnxBvTl6Q5hCKJhofrWi6ZPERX7+X+4c4ga50sdz5kPHYo0tcjwpXQO97MLxvlHKSATtAw5FxVig1GO8idCEAvHHSDClqWGIAZeSseoU8sNZoKed1g0HFIDKwDcdtHv7veOJVT2lR6DmpyES/0y6BaF3cxby8+EYFY/yLFH+Mr+UHoEsNZKfGgNPZHL6yc/fMHaz3zvOVMOvDfTxYOzKb+hnVFuKpNeGgkCz3ziXbmxqxnpGjjPMaCATDs+3D58CJUEw3kGxlcjksZMfKS4wBEClYdCkbKdBH447/LiFzJMd0XGX3Q39Mi/D0obNhRP0/le/ivt9uf6nGhDN/1OghZF6xEC3+Zd0cfgZn2LcCc873hoM+lz5E7Si7v7BrYyXeMyXrkeA+L0Ub3ncNLCnP9T/CooaXeJQttHi58DefrZHAKX98SM/NDYohJOHhgeNqUSMr8N5MslSMxk/7gLbw5umzTn0L0gdBNW8X/+rNBX9BF4DgeTH1ANGiKd5zI/URYRUKoUfeM+d3c1oGb4iaH4M4WAP89E1en3QGEmdqEhou+Q3Jmc1dTTwAhg3mfTT/BZ7gVqeQk5qTMa6Upoat6XtNPOD3yVwqvEBBZlLbVPrgQAAFCNJREFUOvmRIgknQM/DiYDq0vNqGl+HswsbkPl9XB0uDr82kB/DB/IscigTDadQ8+vVrVACtRZ2LBCW/BRj4wV1zEQ82laZf2zchDcsY4SfsUh03K+/g2KEZQTloEz1GdUXFY84Rn+CbtEfZ9zGg7wSxhm4heMd6TFLojtH/Lz95NKvsk1QYYfrT/H8yW/5uH4tLbAVRSA/9z5wSvMNvIyWGllAZL8ow4okkt87HqOGyprYzJjfTn79T3pPr5Df70J9ay0+vOSgsDljP+Jn9qNfwDyz3wDVOJ0WFkpOS6MzVSc/z8A5yRZfUF+PV7bExvqRPxSx7efQmF8nv3F8yucUFc1Pn1X/XrRBo8dS+is1llDye8fT7O6P7wryG+/JmxcvkuO2mdQ7YOKgepy+vt+0ORS/KuxiMt4N6XsZ6nGQfr4MuGOU2DvOH8U24VPfxtz+yu4jftDPUdIBe/6aH/zUDRzv9jGRZVsB/YiybQxtxMLPOeXkr2o7z1M9hlJQGM3yQbsykre4T/pv33weNpvfQJfPtJF+II0Bm8XvQqPDLzB4VnFcwUdI5eRUURofziT3Cv9Nelu3RIzAg9D07QtdKfu1vu8YJkRRSMzqQ//bJwUVzc/ril5Q6b4pH7nd4YeqUNKB4we1SXoicoErZZs0xQgSUG/9WnZzGIBK26Cbo+WjeN2S2D/mVX3G5TGO30lvfFVTimtgZ3eThqb0bZT4HOOFFoefcazbQqwfb6qlxCB4J7No37JNsAL00fYzeeXoX1CZ8G85LKMkx7zp2JyP/muclTBu4Bl5s4D2o7OW9AoEgrZByC8QJBRCfoEgoRDyCwQJhZBfIEgohPwCQUIh5BcIEgoz+T/60fT99/c99PCDAoHgtMJM/t3d3ZqIiMipluvXrxvILyIikhwR8ouIJFSE/CIiCRUhv4hIQkXILyKSUBHyi4gkVIT83S1HR0e7u7txl0KkK0XI361ydHQ0NzeXTt+dyfzsY499miZvRUQcRcjffUK0f2r8ye9vv+3tb3/l1dl77vmEdAEioUTI302i056DuoBarRZ3SUW6QIT83SF22itdwEMPP/joo49IFyBiFyF/p4s77TlWVhelCxCxi5C/06Wvry/F5I477vj6N79qof3wpz6Zul3eeOONuF9CpBNFyN9lcuHChRdnZyzkvzv9kRs3bsRdTJEuECF/l4mQX6RVIuTvMhHyi7RKhPxdJkJ+kVaJkL/LRMgv0ioR8neZCPlFWiVC/i4TIb9Iq0TI32Ui5BdplQj5u0yE/CKtEiF/l4mQX6RVIuTvMhHyi7RKhPxdJkJ+kVaJkL/LRMgv0ioR8neZCPlFWiVC/i6TkyN/Pp8/ODjA72q16p4IYG9vz+W0wBtWq1X7CQcHB4VCgQrpXqRsNktPlwQHJEL+LpOTI38mkyHOlEqlQqGgn3N4eFitVkulUvVYSqVSLpfL5/OB989ms/zCcrlcKBSqTDKZTKlUst+kUqlkMpnAZ1UqlVwuR69DlxweHmYyGeOrJVCE/F0mLST/HpN6vZ7JZOr1Ov5bKBQKhQJ+g0j8wmw2W6/X9d/KzZUjypn1el2hut+tFFWfzWb5ET9DoFQqEefpRz6fr1QqxvMTKEL+LpMWkl+hDWd4qVSyKGGd/JVKpVwukw4vFArZbNZyVSMM+bPZbD6fLxyL8ttiCND9cU61WiXmVyqVwFHGqRchf5fJyZn9nIqVSsUyks9mszhhb2+PGFsul/mt9L4jl8tFJr/xOG6i9DJgtTIqyWQyGGjw47zAyRQhf5dJa8lfq9XgAKvX67rm93P7Gc1+rki5g43fk9OvXC7n83lO1JaQnwtG+HATwMUgNj8XIX+XScs1f6VSKZVKCsFIdWezWd08NpJ/b2+PCG80xUulUhs0P8nBwUEul0PhqTxwBHBfYJJFyN9l0nLygw8Kw4n85XK5UqnoLjejww9e9L29PcVBCGnG7C8UCiWTGJ0LjUajWq0avf2NRuPg4CCbzbpMGZx6EfJ3mbSQ/KDfwcEBlOTe3h6Z5fl8nmzySqWi0DKbzdKZ/E+Y8POzrptx+Fk0vzJvd3BwoLj0q9Wqrudd5iZPvQj5u0xOwuGHeT6u3qFp/Sjnp/nL5XKtVvOzwxUFXigUcrkcV+OYazRe6GilwwepX65TXcz+hpC/66Tl5MewOZ/Pc+83KO0326eQv1KpwPkPi9pPqSrz8+6a391E5w5FHjukH3cMTDrdIuTvMmm5tx8cUCbnwDcLjcvlcqlUwjQ77zWU/3JROOxIfiphNEF/1Lh9IlMEIuTvMmkh+SuVCvnn4fPH71qtBo8dVDq/pFarZTIZkB+WM2cseeB0DmMozo84kj+fzzcTjZ/P5/GUJjuRUylC/i6TEwry4Zo/l8sR33RC6mtmcEK9Xge7YGkrV5VKJYXDSmSB37OMEweOAlcl/28ul3NZF5QQEfJ3mbSW/HD1Nxjh4ZOjE8BkS2wMMZbrVXjv+FW61qUpeoQS4b8K+XO53OHhoeO7KILYPuUgXieXy9lDGBMiQv4ukxOa56dZOj2kBxFyfvxHMJ++Tg6ThSBYuVzWOYzlQ/iN0YTiFKhUKn7TDRY5ODig2EG/E+CqkGg/IX+XyUmY/eCJhQwW9Vur1VqiQmu1GjfIDw8PI9yWopVFXETI32UimXxEWiVC/i4TIb9Iq0TI32Ui5BdplQj5u0yE/CKtEiF/l4mQX6RVIuTvMhHyi7RKhPxdJkJ+kVaJkL/LRMgv0ioR8neZPPPMpT/fftv7f7b98PnC7wj5RVxEyN9l8h/f/aFF7Xv723/5H78bdxlFukOE/F0m/+t//U87+f/r//uf4y6jSHeIkL/LRMgv0ioR8ouIJFSE/CIiCRUhv4hIQkXILyKSUGkl+a9fv14TEUmqdF14RcvIf/PmzTs+dMdDDz8oECQQ99/fd/bjZ1vFpvZIy8h/48aNu9Mfsc9CCQSnFd/53pvpj6Zbxab2iJBfIGgBhPxCfkFCIeQX8gsSCiG/kF+QUAj5hfyChELIL+SPjp3dzfGJ8yuri81cvlW/5nJy9eqy5a9Dw4OO9yFMTl0cHRvZ2d2kI+sba7FXaTsh5BfyN4WFpblUKrWwNBf58p7etAvrVlYXR8dG+JGh4UHqEfhNJqcuGu8wPnGe/2lldbGnN03/nZy66FiSUwMhv5A/BGbni/rBoeFB/fj6xpojkfoH+vzoqp85U5zm/+Xkp+MWDg8ND/b0pmEjVK8u9w/04fhW/VpPbzpyF9alEPIL+UOgf6BvYWlOwex8UT/YP9BnJOH6xppC9YWlOW7SV68uj0+cNz59fOI85+fQ8CD9VsjvV36QHKXi5OdGRHIg5BfyuwImOv13dr44NDzIx8yErfq1/oE+o/qtXl3u6U1Xry7DNNAxO1/s6U0bbwuMjo3A0HAkf/XqMsf4xHn8mJ0vwnaYKU7PFKfphP6BPmV8cVoh5Bfyu6KnN835ppMEjPL8R93eMfktT+EKGYCxQP0FKIoR++TURR3K/ReW5lZWFzn/cW1PbxrkNyL22m4DhPxC/igYnzjf05uGC42zDlrdcmEE8nv729wQIBe9n3UQSN3RsRE4GuBEGB0bmSlOh50sOAUQ8gv5Q2NldbF/oG9nd5Nr/pnidCDzvajkJz8fLt+qX/PT2NWry/A4+JVkdGwE9gvIj4PouRSH4qmHkF/IHw7Vq8tk/G/Vr+E3Buou1rIL+fUTMDL39rdXVhfxRLgJ+Shd6QJ0j8PO7ubQ8CB5Ezn58dfRsZFUKsWHNqcbQn4hfwhw5tMROPYdx8mODj/9QhB1cuqiPq3o53fkmClODw0P8nikmeK0Prc3OjZi75tOE4T8Qv4Q0IkHK3poeHB0bMRl2Gy06jl2djeNIYPgJEXyVa8uT05dhP9vdGyEHIHrG2sYxvMyT05dVO65vrGGaUv9QckZ/Av5hfwRgZE/DZIx5kfAjyW8RzG23UHkx3+pE6EfcDp6x3G79ruRAaL/CXOBsVdvGyDkF/KHBgbeSmA8gFmAVCoF/5k+5wfXerSH4v70Xwv56bkzxenxifM6EOo3OjYyOjbCj2MiwGUccQog5Bfyu2J9Yw30wMDYSCowZ2FpbnzivDEWuJn4ebj9xifOzxSnHcnvh6HhQZzjF02YBAj5hfxOwOwafls89nbika8+FBDk0z/Q1z/QRx2K3ey3k399Y40i/BeW5hISz6dDyC/kD43I5Ff87Y6YKU73D/QpFzZDfmU8AnMmCXa+AiG/kD80opF/dr7YQh0bjfw7u5vG0H24KianLibH1e8J+YX8EWCZq1fWzBMQYNPaMhD5Qeb1jTXE8PuVASt5/NyNWLYEPyXmDmOv55OGkF/IHxp2zW9kV8v9anq4EYAoPT5GQHdAawHtcJkmPDUQ8gv5W4lOGDkrs/RJ0OHRIOQX8gsSCiG/kF+QUAj5hfyChELIL+QXJBRCfiG/IKEQ8gv5BQmFkF/IL0gohPwhyO++t5TnE+6CFBSOd1hZXdQf5xKpwoHsVJF31IoM5Myl/yJFT9ibhAq2dZzPd6yKZrYh87pkLzAhfwjyYwV4qM9vbFWO2SyQVVIhgJI/2wXYUctxFT2WzVImPHqFmeL07HyRMmQG1oOy+xWCAv0IwPPwEGaK06lUyr3L6OlNIzMXAQn5+ZHJqYuOm4thew/3p3fjXmBC/nDk17UBlpoaW79RyaNV8dP8HmdMeoMmbimk345aeos37qiFmHkiPzXZyamLfLuLwER3SrouPXsXf/Gt+jWlWngx3L+OcrL+CQLTh3IgsYfjyV4X7gUm5DeQf31jbWFpTlmy4reaxa+BKvlkeMYY/EZWDMv+MH7kt/PBuKOWEcYdtRSWElX46+hMxn672E6LtC4vifJf5NVTHq2Tf2d3U7cI/KL0mye/koZwq36NP0hJVa6j6/YCE/K7an5kgHA5rXq8LRRUJX378YnzvLn7JZDkbVdfD4OVp36XKNbm7HyRt2b+9PWNNeO21tHIryNQ8+vQye+xRXu83owk1HP1hyU/7Hy/tMK4Vk8rwNFde4EJ+W3kJ+rCX4X957gK0j+kTn7KIY/uA60HWajsLiVKNaU0UAv5kUWLN3TuIMBDoc38xg5ooKSiOflHx0a4Grc3LCVzPtbb2i/h229xz4jyvn6D55aQ366i9Wu7ei8wIX8A+S1thTNNh3HMPzQ8CNbxFJF+rDAuPreTn7Czu0n+KnQ6sDKQzcJidChLZdEB7exuwnOG8uzsbhovR9dAhedmC267Vb9myfBt1Pze7eS3fBFUFx/XoHdWXICtJb+OLtoLTMjfFPnt7jr8FU5mUmj4d3RsBEeQDNM4iNVVGcoTaDcicwb1KXBE8Vv1D/SlUimj/lTW5K6sLqZSKXpNuPoo+51+OQbzMG75rYjMUIzGR/uRH+oUv7H3ht/naL/mV9Bde4EJ+YPJb0xZg10fHMlPNMDe1Y4TyH7eOHtiDIw46InQdcixQ+fALlAaOrxryiiX0trQn7AxFnoBnYewMvTuiZPZjwZ+5PdYLhDsC2B88faQ3++EbtwLTMh/gpofROUmH0bLLkYgWKRsIAFLYaY4bZkx5udXb9+agpvcxjsoB/nA2yU8CcVDB6eXik990UweP4f3s/Cw0J+IM6GoexIOPyP5u3QvMCF/gLc/Avln54uwtHUVzZNPE4yGANm3fHwOvQfdHvhp0ViVx1k0p/4WCoeRgdMvVw+/LVwbGGNzMsOI4CE9flWtaH5ciIq1fCmlV41A/sA60Y90715gQv5g8ocy+0F7tAlMZZMXCmM/Hm2GsDmjGUws5cNs+uHibDeGJOHOeKKlIRonMrzj+QJlztL4aKWEMHnstoOF/CurizBDLCMmfR8RuDaVDXn8GB4q/sel8o02QkftBSbkb7Hm39ndhG7U1Y4SZudHTv25iOrjO17Yw/VhNYAqSodF7MV0lG6eoDMiFUfZrOkIBre0IZeiDMmeV+oN3LNv46eTf6Y4jbkG/NXe5elfSv9AFobbzQq/eu7qvcCE/K03+71j2vC/LizN8balG9VKQ+SKF/NVvO/w2/pmZXWRAuD0QTW1fjAQbVd5KByEMHZwMqwSZUCOxq10QOAPcVWpK0QcWQYssJhAHihtbpvYJ1aNQUShyE+zsM2jW/YCE/K3ifzQA8RGe3ifHnun9B3GO8zOFzkbLeR3f2UyXy02Ob2vYtfQ03ncvlHvQVXCDMErKI9At2KpcKUj8/tAltdvlc3fRXuBCflbPOYnGIN8oJmNQfUEuAP0dqx0B9wXYESbya/fhF6QL3A07tujdByeNjuAOH/wym/lkl4V7uQP3OHLHf3dsxeYkL9Nmh/AgBkRPpgn14fuOjdg9uuPgDL0438z5K+yVX1EfjoYuKqPr4PATXjrd4lvr/osjJmdL+rLkxE46PKBjK9vnJuMgK7bC0zI3wLyK75x+Nt6tLW3mPknGpPnjKsyvb/AUjljAWBOW2Ld9Vlrl9W4kckPK5ci/Dzm/9OLbZz1JBD5dfc41vnzfpMHNRk/EAoGP4Je8qHhweZX2nfjXmBCfpX8WJ06O1+kCTm/JbGYq6PoXf5FsWDWO14WCieWsa0ri8b1MBu7ujBm+6GmH0HzK1qUOiPucdjZ3fTjLYgNQ9e4KpFOs+/YW726DFe534QZXbuwNOc3ecZjK73jgZJSJCy5i8yfajfvBSbkP9kcftWry4HGnt8JTQ4U4zIyUez1jbVOs3KNddJkITtEh0eDkF8SeAoSCiG/kF+QUAj5hfyChELIL+QXJBRCfiG/IKEQ8gv5BQmFkF/IL0gohPxCfkFCkWjy37x580MfuiMlIpJUue++c61iU3ukZeQXERHpLhHyi4gkVIT8IiIJFSG/iEhC5f8HDkNkLrqkgUQAAAAASUVORK5CYII=" alt="" />

以上就是简单的IOC的理解

那么接下来我们就来实现下我们自己的第一个Spring示例

1.1我们准备一个HelloWord类

package cn.ljy.clazz;

public class HelloWord {
//名称
private String name;
//性别
private String sex;
//年龄
private int age;
//体重
private double weight; //准备构造函数 //无参构造 初始化IOC容器时需要
public HelloWord() { } //姓名 性别 年龄的构造
public HelloWord(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
} //姓名 性别 体重的构造
public HelloWord(String name, String sex, double weight) {
this.name = name;
this.sex = sex;
this.weight = weight;
} public String sayHello(){
return "HelloWord"+name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "HelloWord [name=" + name + ", sex=" + sex + ", age=" + age
+ ", weight=" + weight + "]";
} }

1.2我们必须得准备一个applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
">
<!-- 将 HelloWord 类交给Spring容器进行管理-->
<!-- 通过属性的方式传入参数 -->
<bean id="HelloWord" class="cn.ljy.clazz.HelloWord">
<!-- 为参数赋值 -->
<property name="name" value="巴黎的雨季"></property>
</bean>
</beans>

这样就整理好了第一个配置文件了,然后我们进行一道测试

package cn.ljy.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.ljy.clazz.HelloWord;
import cn.ljy.clazz.NewPeople;
import cn.ljy.clazz.People;
import cn.ljy.clazz.Person; public class MyTest {
public static void main(String[] args) {
//实例化Spring容器的上下文 (创建IOC容器)
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过ApplicationContext的getBean()方法,根据id来获取Bean的实例
HelloWord hello = (HelloWord)context.getBean("HelloWord");
//调用HelloWord类中的方法
System.out.println("通过属性的方式给name赋值:");
String result = hello.sayHello();
System.out.println(result); }

实现结果为:

1.3以上在配置文件中使用的是setter方法依赖注入,接下来我们使用构造器的方式来实现依赖注入

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
">
<!-- 将 HelloWord 类交给Spring容器进行管理-->
<!-- 通过构造器的方式传入参数 -->
<bean id="AttributeByConstructor1" class="cn.ljy.clazz.HelloWord">
<!-- 通过构造器方式传参 -->
<constructor-arg value="巴黎的雨季" index=""/>
<constructor-arg value="男" index=""/>
<constructor-arg value="" type="int"/>
</bean>
</beans>

执行结果如图

1.4使用引用类型,引用自定义的Bean(外部Bean)

准备一个person对象

package cn.ljy.clazz;

public class Person {
private String name;
private int age;
private Car car; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
} }

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
"> <!-- 监管Car 准备三car-->
<bean id="car" class="cn.ljy.clazz.Car">
<property name="brand" value="奔驰"></property>
<property name="business" value="上海"></property>
<property name="price" value=""></property>
</bean>     <!-- 配置person 引用Car -->
<bean id="person" class="cn.ljy.clazz.Person">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="car" ref="car"></property>
</bean>
</bean>
</beans>

执行结果

1.5使用内部Bean

<!-- 内部bean   -->
<bean id="person2" class="cn.ljy.clazz.Person">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<!-- 注意:内部bean只能在内部使用,不能被外部所引用 -->
<property name="car" >
<bean class="cn.ljy.clazz.Car">
<property name="brand" value="福特"></property>
<property name="business" value="北京"></property>
<property name="price" value=""></property>
</bean>
</property>
</bean>

执行结果与上一步基本一致

1.6配置list集合属性

People

package cn.ljy.clazz;

import java.util.List;

public class People {

    private String name;
private int age;
private List<Car> cars; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "People [name=" + name + ", age=" + age + ", cars=" + cars + "]";
} }
<!-- list集合属性的配置 -->
<bean id="people" class="cn.ljy.clazz.People">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="cars">
<!-- 使用list节点为集合属性赋值 -->
<list>
<ref bean="car"/>
<ref bean="car2"/>
<ref bean="car3"/>
</list>
</property>
</bean>

执行结果

1.7使用Map集合配置属性

NewPeople

package cn.ljy.clazz;

import java.util.Map;
import java.util.Properties; public class NewPeople {
private String name;
private int age;
private Map<String,Car> cars; //配置properties属性
private Properties properties; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Map<String, Car> getCars() {
return cars;
}
public void setCars(Map<String, Car> cars) {
this.cars = cars;
} public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "NewPeople [name=" + name + ", age=" + age + ", cars=" + cars
+ "]";
} }
 <!--Map集合属性值的配置  -->
<bean id="people2" class="cn.ljy.clazz.NewPeople">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="cars">
<map>
<entry key="OneCar" value-ref="car"></entry>
<entry key="TwoCar" value-ref="car2"></entry>
<entry key="Three">
<bean class="cn.ljy.clazz.Car">
<property name="brand" value="法拉利"></property>
<property name="business" value="上海"></property>
<property name="price" value=""></property>
</bean>
</entry>
</map>
</property>
</bean>

以上就是一些基本的常用的依赖注入了,还有几个例子我会在下面的代码中贴出来,因为用的不多,所以就不做详细的讲解了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
"> <!-- 将 HelloWord 类交给Spring容器进行管理--> <!-- 通过属性的方式传入参数 -->
<bean id="HelloWord" class="cn.ljy.clazz.HelloWord">
<!-- 为参数赋值 -->
<property name="name" value="巴黎的雨季"></property>
</bean> <!-- 通过构造器的方式传入参数 -->
<bean id="AttributeByConstructor1" class="cn.ljy.clazz.HelloWord">
<!-- 通过构造器方式传参 -->
<constructor-arg value="巴黎的雨季" index=""/>
<constructor-arg value="男" index=""/>
<constructor-arg value="" type="int"/>
</bean> <!--给第二个构造器赋值 -->
<bean id="AttributeByConstructor2" class="cn.ljy.clazz.HelloWord">
<!-- 通过构造器方式传参 -->
<constructor-arg value="巴黎的雨季" index=""/>
<constructor-arg name="sex" value="男" />
<constructor-arg value="" type="double"/>
</bean> <!-- 监管Car 准备三car-->
<bean id="car" class="cn.ljy.clazz.Car">
<property name="brand" value="奔驰"></property>
<property name="business" value="上海"></property>
<property name="price" value=""></property>
</bean>
<bean id="car2" class="cn.ljy.clazz.Car">
<property name="brand" value="大众"></property>
<property name="business" value="广州"></property>
<property name="price" value=""></property>
</bean>
<bean id="car3" class="cn.ljy.clazz.Car">
<property name="brand" value="雪佛兰"></property>
<property name="business" value="深圳"></property>
<property name="price" value=""></property>
</bean> <!-- 配置person 引用Car -->
<bean id="person" class="cn.ljy.clazz.Person">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="car" ref="car"></property>
</bean> <!-- 内部bean -->
<bean id="person2" class="cn.ljy.clazz.Person">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<!-- 注意:内部bean只能在内部使用,不能被外部所引用 -->
<property name="car" >
<bean class="cn.ljy.clazz.Car">
<property name="brand" value="福特"></property>
<property name="business" value="北京"></property>
<property name="price" value=""></property>
</bean>
</property>
</bean> <!-- 级联属性的使用 -->
<bean id="person3" class="cn.ljy.clazz.Person">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="car" ref="car"></property>
<!-- 级联,改变原来的值 注意:必须是存在car对象才可以,Spring不会自动的创建car -->
<property name="car.brand" value="劳斯莱斯"></property>
</bean> <!-- list集合属性的配置 -->
<bean id="people" class="cn.ljy.clazz.People">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="cars">
<!-- 使用list节点为集合属性赋值 -->
<list>
<ref bean="car"/>
<ref bean="car2"/>
<ref bean="car3"/>
</list>
</property>
</bean> <!--Map集合属性值的配置 -->
<bean id="people2" class="cn.ljy.clazz.NewPeople">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="cars">
<map>
<entry key="OneCar" value-ref="car"></entry>
<entry key="TwoCar" value-ref="car2"></entry>
<entry key="Three">
<bean class="cn.ljy.clazz.Car">
<property name="brand" value="法拉利"></property>
<property name="business" value="上海"></property>
<property name="price" value=""></property>
</bean>
</entry>
</map>
</property>
</bean> <!-- 配置properties属性-->
<bean id="people3" class="cn.ljy.clazz.NewPeople">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password"></prop>
<prop key="jdbcurl">jdbc:mysql:/test</prop>
<prop key="drivarClass">com.mysql.jdbc.java</prop>
</props>
</property>
</bean> <!-- 独立出一个bean 比如说list 需要引入新的命名空间 util-->
<!-- <util:list id="cars">
<ref bean="car"/>
<ref bean="car2"/>
<ref bean="car3"/>
</util> <bean id="people4" class="cn.ljy.clazz.People">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
<property name="cars" ref="cars"></property>
</bean> --> <!-- 自动装配
可以使用autowire属性指定自动装配的方式
byName 根据Bean的名字和当前Bean的setter风格的属性名进行自动装配,若有匹配的,则进行自动装配 ,若没有匹配的则不进行装配
byType 根据Bean的类型和当前Bean的属性的类型进行自动装配,若IOC容器中定义了多个类型匹配的Bean 则会抛出异常
-->
<bean id="person4" class="cn.ljy.clazz.Person" autowire="byName">
<property name="name" value="巴黎的雨季"></property>
<property name="age" value=""></property>
</bean> </beans>

初识Spring框架实现IOC和DI(依赖注入)的更多相关文章

  1. Spring框架之控制反转和依赖注入

    学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明控制反转和依赖注入. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权 ...

  2. Spring:(二)DI依赖注入方式

    DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...

  3. Spring:Spring-IOC容器、DI依赖注入简介

    Spring容器到底是什么? 从概念上讲:Spring 容器是 Spring 框架的核心,是用来管理对象的.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁. 从具象化 ...

  4. spring框架学习(二)依赖注入

    spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普 ...

  5. 十七、Spring框架(IOC/DI)

    一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...

  6. 三大框架 之 Spring(IOC控制反转、DI依赖注入)

    目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...

  7. Spring-初识Spring框架-IOC控制反转(DI依赖注入)

    ---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...

  8. spring框架--IOC容器,依赖注入

    思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action  多个   [维护成员变量] service 一个   [不需要维护公共变量] dao     一个   [不需要维护 ...

  9. 学习Spring IOC控制反转和DI依赖注入总结

    30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...

随机推荐

  1. .NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1

    今天微软发布了 .NET Core 1.1 Preview 1(详见 Announcing .NET Core 1.1 Preview 1 ),紧跟 .NET Core 前进的步伐,我们将示例站点 h ...

  2. .NET - 基于事件的异步模型

    注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...

  3. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  4. 像黑客一样使用 Linux 命令行

    前言 之前在博客园看到一篇介绍 IntelliJ IDEA 配置的文章,它里面用的是 gif 动态图片进行展示,我觉得很不错.所以在我今天以及以后的博文中,我也会尽量使用 gif 动图进行展示.制作 ...

  5. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘

    本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...

  7. java运行时获得泛型类型

    引言 众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型. 但是其实以上的规则是针对方法的内部变量的,如果是其他形式的泛型其实是 ...

  8. 设置Fn键 笔记本直接按F1-F12 无须按Fn键 Fn+F12改F12(联想小新300为例)

    最近公司给配的笔记本联想小新300 80RT  i7-6500U 4G内存 500G机械,后加装120G固态+4G内存 这样就感觉还不错了. 在使用这本子的时候,去了Win10,强行装了Win7.无线 ...

  9. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  10. 【Win10 应用开发】自定义应用标题栏

    Win 10 app对窗口标题栏的自定义包括两个层面:一是只定义标题中各部分的颜色,如标题栏上文本的颜色.三个系统按钮(最大化,最小化,关闭)的背景颜色等:另一层是把窗口的可视区域直接扩展到标题栏上, ...