{"id":719,"date":"2022-02-09T10:32:37","date_gmt":"2022-02-09T02:32:37","guid":{"rendered":"https:\/\/bigwer.cn\/?p=719"},"modified":"2022-03-29T00:47:34","modified_gmt":"2022-03-28T16:47:34","slug":"bean_life_cycle","status":"publish","type":"post","link":"https:\/\/bigwer.cn\/index.php\/2022\/02\/09\/bean_life_cycle\/","title":{"rendered":"Bean\u7684\u751f\u547d\u5468\u671f"},"content":{"rendered":"<p><div class=\"has-toc have-toc\"><\/div><\/p>\n<h1>\u4e00.\u751f\u547d\u5468\u671f\u56fe<\/h1>\n<p><img decoding=\"async\" src=\"https:\/\/bigwer.cn\/wp-content\/uploads\/2022\/03\/bean\u751f\u547d\u5468\u671f.png\" alt=\"\" \/><\/p>\n<h1>\u4e8c.\u53c2\u8003\u56de\u7b54<\/h1>\n<h2>(\u4e00).\u56db\u4e2a\u9636\u6bb5<\/h2>\n<p>Spring\u4e2dBean\u7684\u751f\u547d\u5468\u671f\u4e3b\u8981\u5305\u542b\u56db\u4e2a\u9636\u6bb5<\/p>\n<ol>\n<li>\u5b9e\u4f8b\u5316Bean<\/li>\n<li>Bean\u5c5e\u6027\u586b\u5145<\/li>\n<li>\u521d\u59cb\u5316Bean<\/li>\n<li>\u9500\u6bc1Bean<\/li>\n<\/ol>\n<h2>(\u4e8c).\u5b9e\u4f8b\u5316Bean<\/h2>\n<p>\u9996\u5148\u662f\u5b9e\u4f8b\u5316Bean\uff0c\u5f53\u5ba2\u6237\u7aef\u5411\u5bb9\u5668<strong>\u8bf7\u6c42\u4e00\u4e2a\u5c1a\u672a\u521d\u59cb\u5316<\/strong>\u7684Bean\u65f6\uff0c\u6216\u521d\u59cb\u5316Bean\u7684\u65f6\u5019<strong>\u9700\u8981\u6ce8\u5165\u53e6\u4e00\u4e2a\u5c1a\u672a\u521d\u59cb\u5316<\/strong>\u7684\u4f9d\u8d56\u65f6\uff0c\u5bb9\u5668\u4f1a\u8c03\u7528<code>doCreateBean()<\/code>\u65b9\u6cd5\u8fdb\u884c\u5b9e\u4f8b\u5316\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u901a\u8fc7<strong>\u53cd\u5c04\u6765\u521b\u5efa<\/strong>\u4e00\u4e2aBean\u5bf9\u8c61\u3002<\/p>\n<h2>(\u4e09).Bean\u5c5e\u6027\u586b\u5145<\/h2>\n<p>Bean\u5b9e\u4f8b\u521b\u5efa\u51fa\u6765\u4ee5\u540e\uff0c\u63a5\u7740\u5c31\u662f\u7ed9\u8fd9\u4e2aBean\u5bf9\u8c61<strong>\u8fdb\u884c\u5c5e\u6027\u586b\u5145<\/strong>\uff0c\u4e5f\u5c31\u662f\u6ce8\u5165\u8fd9\u4e2aBean\u4f9d\u8d56\u7684\u5176\u4ed6Bean\u5bf9\u8c61\u3002<\/p>\n<h2>(\u56db).\u521d\u59cb\u5316Bean<\/h2>\n<p>\u5c5e\u6027\u586b\u5145\u5b8c\u6210\u540e\uff0c\u8fdb\u884c\u521d\u59cb\u5316Bean\u64cd\u4f5c\u3002<\/p>\n<h3>1.Aware\u63a5\u53e3<\/h3>\n<p>\u9996\u5148\u6267\u884c<strong>Aware\u63a5\u53e3<\/strong>\u7684\u65b9\u6cd5\uff0cSpring\u4f1a\u68c0\u6d4b\u8be5\u5bf9\u8c61\u662f\u5426\u5b9e\u73b0\u4e86<strong>xxxAware<\/strong>\u63a5\u53e3\u3002\u901a\u8fc7Aware\u7c7b\u578b\u7684\u63a5\u53e3\uff0c\u53ef\u4ee5\u8ba9\u6211\u4eec\u62ff\u5230Spring\u5bb9\u5668\u7684\u4e00\u4e9b\u8d44\u6e90\u3002\u4f8b\u5982\u5b9e\u73b0<strong>BeanNameAware<\/strong>\u63a5\u53e3\u53ef\u4ee5\u83b7\u53d6\u5230<strong>BeanName<\/strong>,\u5b9e\u73b0<strong>BeanFactoryAware<\/strong>\u63a5\u53e3\u53ef\u4ee5\u83b7\u53d6\u5230\u5de5\u5382\u5bf9\u8c61<strong>BeanFactory<\/strong>\u7b49\u3002<\/p>\n<h3>2.BeanPostProcessor\u524d\u7f6e\u5904\u7406<\/h3>\n<p>\u6267\u884c<strong>BeanPostProcessor<\/strong>\u7684\u524d\u7f6e\u5904\u7406\u65b9\u6cd5<code>postProcessBeforeInitialization()<\/code>\u5bf9Bean\u8fdb\u884c\u4e00\u4e9b\u81ea\u5b9a\u4e49\u7684\u524d\u7f6e\u5904\u7406\u3002<\/p>\n<h3>3.InitializingBean\u63a5\u53e3<\/h3>\n<p>\u5224\u65adBean\u662f\u5426\u5b9e\u73b0\u4e86<strong>InitializingBean<\/strong>\u63a5\u53e3\uff0c\u5982\u679c\u5b9e\u73b0\u4e86\uff0c\u5c06\u4f1a\u6267\u884c<strong>InitializingBean<\/strong>\u7684<code>afterPropertiesSet()<\/code>\u521d\u59cb\u5316\u65b9\u6cd5\u3002<\/p>\n<h3>4.\u81ea\u5b9a\u4e49\u7684\u521d\u59cb\u5316\u65b9\u6cd5<\/h3>\n<p>\u6267\u884c\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u521d\u59cb\u5316\u65b9\u6cd5\uff0c\u5982init-method\u7b49\u3002<\/p>\n<h3>5.BeanPostProcessor\u540e\u7f6e\u5904\u7406<\/h3>\n<p>\u6267\u884c<strong>BeanPostProcessor<\/strong>\u7684\u540e\u7f6e\u5904\u7406\u65b9\u6cd5<code>postProcessAfterInitialization()<\/code>\u65b9\u6cd5<\/p>\n<h2>(\u4e94).\u9500\u6bc1Bean<\/h2>\n<p>\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0cBean\u5c31\u6210\u529f\u521b\u5efa\u4e86\uff0c\u4e4b\u540e\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e2aBean\uff0c\u5f53Bean\u4e0d\u518d\u4f7f\u7528\u65f6\uff0c\u4f1a\u8fdb\u884c\u9500\u6bc1\u64cd\u4f5c\u3002<\/p>\n<h3>1.DestructionAwareBeanPostProcessor\u63a5\u53e3<\/h3>\n<p>\u9996\u5148\u5224\u65adBean\u662f\u5426\u5b9e\u73b0\u4e86<strong>DestructionAwareBeanPostProcessor\u63a5\u53e3<\/strong>\uff0c\u5982\u679c\u5b9e\u73b0\u4e86\uff0c\u5219\u4f1a\u6267\u884c<strong>DestructionAwareBeanPostProcessor\u540e\u7f6e\u5904\u7406\u5668<\/strong>\u7684\u9500\u6bc1\u56de\u8c03\u65b9\u6cd5\u3002<\/p>\n<h3>2.DisposableBean\u63a5\u53e3<\/h3>\n<p>\u5176\u6b21\u4f1a\u5224\u65adBean\u662f\u5426\u5b9e\u73b0\u4e86<strong>DisposableBean\u63a5\u53e3<\/strong>\uff0c\u5982\u679c\u5b9e\u73b0\u4e86\u5c06\u4f1a\u8c03\u7528\u5176\u5b9e\u73b0\u7684<code>destory()<\/code>\u65b9\u6cd5\u3002<\/p>\n<h3>3.destory-method<\/h3>\n<p>\u6700\u540e\u5224\u65ad\u8fd9\u4e2aBean\u662f\u5426\u914d\u7f6e\u4e86<strong>destory-method<\/strong>\u7b49\u81ea\u5b9a\u4e49\u7684\u9500\u6bc1\u65b9\u6cd5\uff0c\u5982\u679c\u6709\u7684\u8bdd\uff0c\u5219\u4f1a\u81ea\u52a8\u8c03\u7528\u5176\u914d\u7f6e\u7684\u9500\u6bc1\u65b9\u6cd5\u3002<\/p>\n<h1>\u4e09.Spring\u6e90\u7801\u5206\u6790<\/h1>\n<h2>(\u4e00).doCreateBean<\/h2>\n<p>Bean\u751f\u547d\u5468\u671f\u4e3b\u8981\u662f\u5728<code>doCreateBean<\/code>\u8fd9\u4e2a\u65b9\u6cd5\u5f00\u542f\u7684<\/p>\n<pre><code class=\"language-java\">protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {\n\n        \/\/\u5b9e\u4f8b\u5316Bean\n        BeanWrapper instanceWrapper = null;\n        if (mbd.isSingleton()) {\n            \/*\n            \u5982\u679c\u662f\u5355\u4f8bbean,\u5c1d\u8bd5\u4ece\u672a\u5b8c\u6210\u521b\u5efa\u7684\u5305\u88c5bean\u7f13\u5b58(factoryBeanInstanceCache)\u4e2d\u83b7\u53d6BeanWrapper(bean\u7684\u5305\u88c5\u7c7b)\n            *\/\n            instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);\n        }\n        \/\/\u5982\u679c\u7f13\u5b58\u4e2d\u4e0d\u5b58\u5728\u7684\u8bdd\uff0c\u8c03\u7528createBeanInstance\u521b\u5efa\u4e00\u4e2aBeanWrapper\n        if (instanceWrapper == null) {\n            \/\/\u5b8c\u6210Bean\u7684\u5b9e\u4f8b\u5316\u7684\u65b9\u6cd5\uff0c\u6839\u636e\u6307\u5b9abean\u4f7f\u7528\u7684\u7b56\u7565\u521b\u5efaBean\u7684\u5b9e\u4f8b\uff0c\u5982\u5de5\u5382\u65b9\u6cd5\uff0c\u6784\u9020\u65b9\u6cd5\u81ea\u52a8\u6ce8\u5165\u3001\u7b80\u5355\u521d\u59cb\u5316\u3002\n            instanceWrapper = this.createBeanInstance(beanName, mbd, args);\n        }\n\n        \/\/\u83b7\u53d6\u5305\u88c5\u5668\u91cc\u9762\u521a\u521b\u5efa\u597d\u7684Bean\u5b9e\u4f8b\n        Object bean = instanceWrapper.getWrappedInstance();\n        \/\/\u83b7\u53d6\u5b9e\u4f8b\u5316\u5bf9\u8c61\u7684\u7c7b\u578b\n        Class&lt;?&gt; beanType = instanceWrapper.getWrappedClass();\n        \/\/\u5982\u679c\u4e0d\u662fNullBean\uff0c\u5219\u5c06\u89e3\u6790\u7c7b\u578b\u5c5e\u6027\u8bbe\u7f6ebeanType\n        if (beanType != NullBean.class) {\n            mbd.resolvedTargetType = beanType;\n        }\n        \/\/\u5141\u8bb8\u540e\u7f6e\u5904\u7406\u5668\u5bf9\u5176\u8fdb\u884c\u5904\u7406\n        synchronized(mbd.postProcessingLock) {\n            if (!mbd.postProcessed) {\n                try {\n                    \/\/\u5e94\u7528\u5408\u5e76\u540e\u7684BeanDefinition\u540e\u7f6e\u5904\u7406\u5668\uff0c\u6267\u884cMergedBeanDefinitionPostProcessor\u540e\u7f6e\u5904\u7406\u5668\u589e\u5f3a\u65b9\u6cd5\u3002\n                    this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);\n                } catch (Throwable var17) {\n                    throw new BeanCreationException(mbd.getResourceDescription(), beanName, &quot;Post-processing of merged bean definition failed&quot;, var17);\n                }\n\n                mbd.postProcessed = true;\n            }\n        }\n\n        \/*\n        \u662f\u5426\u63d0\u524d\u66dd\u5149\uff0c\u4e3b\u8981\u662f\u5904\u7406\u5faa\u73af\u4f9d\u8d56\n        \u5982\u679c\u5f53\u524dbean\u7684\u5355\u4f8b\uff0c\u4e14\u652f\u6301\u5faa\u73af\u4f9d\u8d56\uff0c\u4e14\u5f53\u524dbean\u6b63\u5728\u521b\u5efa\u7684\u65f6\u5019\n        \u4e3b\u8981\u662f\u8c03\u7528\u65b9\u6cd5addSingletonFactory \uff0c\u5f80\u7f13\u5b58singletonFactories\u91cc\u9762\u653e\u5165\u4e00\u4e2aObjectFactory\n        \u5f53\u5176\u4ed6\u7684bean \u5bf9\u8be5bean \u6709\u4f9d\u8d56\u65f6\uff0c\u53ef\u4ee5\u63d0\u524d\u83b7\u53d6\u5230\n        \u5982\u679c\u6709\u5176\u4ed6bean\u4f9d\u8d56\u8be5bean\uff0c\u53ef\u4ee5\u4ecesingletonFactories\u83b7\u53d6\u5230bean\n        *\/\n        boolean earlySingletonExposure = mbd.isSingleton() &amp;&amp; this.allowCircularReferences &amp;&amp; this.isSingletonCurrentlyInCreation(beanName);\n        if (earlySingletonExposure) {\n            if (this.logger.isTraceEnabled()) {\n                this.logger.trace(&quot;Eagerly caching bean &#039;&quot; + beanName + &quot;&#039; to allow for resolving potential circular references&quot;);\n            }\n            \/*\n            \u4e3a\u907f\u514d\u540e\u671f\u5faa\u73af\u4f9d\u8d56\uff0c\u53ef\u4ee5\u5728bean\u521d\u59cb\u5316\u5b8c\u6210\u524d\u521b\u5efa\u5b9e\u4f8b\u7684 objectFactory \u52a0\u5165\u7f13\u5b58\n            \u5bf9bean \u518d\u4e00\u6b21\u4f9d\u8d56\u5f15\u7528\uff0c\u4e3b\u8981\u5e94\u7528 SmartInstantiationAwareBeanPostProcessor\n            \u5176\u4e2d\u6211\u4eec\u719f\u6089\u7684AOP\u5c31\u662f\u5728\u8fd9\u91cc\u5c06  advice \u52a8\u6001\u7ec7\u5165\uff0c\u82e5\u6ca1\u6709\u76f4\u63a5\u8fd4\u56debean\n            *\/\n            this.addSingletonFactory(beanName, () -&gt; {\n                \/*\n                getEarlyBeanReference\u53ef\u4ee5\u5bf9\u8fd4\u56de\u7684bean\u8fdb\u884c\u4fee\u6539\n                \u8fd9\u8fb9\u76ee\u524d\u9664\u4e86\u53ef\u80fd\u4f1a\u8fd4\u56de\u52a8\u6001\u4ee3\u7406\u5bf9\u8c61 \u5176\u4ed6\u7684\u90fd\u662f\u76f4\u63a5\u8fd4\u56debean\n                *\/\n                return this.getEarlyBeanReference(beanName, mbd, bean);\n            });\n        }\n\n        Object exposedObject = bean;\n        \/\/\u521d\u59cb\u5316\u5b9e\u4f8b\n        try {\n            \/\/\u5bf9bean\u8fdb\u884c\u586b\u5145\uff0c\u5c06\u5404\u4e2a\u5c5e\u6027\u503c\u6ce8\u5165\uff0c\u5176\u4e2d\u53ef\u80fd\u5b58\u5728\u4f9d\u8d56\u4e8e\u5176\u4ed6bean\u7684\u5c5e\u6027,\u4f1a\u9012\u5f52\u521d\u59cb\u5316\n            this.populateBean(beanName, mbd, instanceWrapper);\n            \/*\n            \u8fdb\u4e00\u6b65\u521d\u59cb\u5316bean\n            \u6ce8\u5165 Aware \u76f8\u5173\u7684\u5bf9\u8c61\n            \u8c03\u7528\u540e\u7f6e\u5904\u7406\u5668 BeanPostProcessor \u91cc\u9762\u7684postProcessBeforeInitialization\u65b9\u6cd5\n            \u8c03\u7528 initialzingBean\uff0c\u8c03\u7528\u5b9e\u73b0\u7684 afterPropertiesSet()\n            \u8c03\u7528 init-mothod\uff0c\u8c03\u7528\u76f8\u5e94\u7684init\u65b9\u6cd5\n            \u8c03\u7528 \u540e\u7f6e\u5904\u7406\u5668 BeanPostProcessor \u91cc\u9762\u7684\u8c03\u7528\u5b9e\u73b0\u7684postProcessAfterInitialization\u65b9\u6cd5\n            *\/\n            exposedObject = this.initializeBean(beanName, exposedObject, mbd);\n        } catch (Throwable var18) {\n            if (var18 instanceof BeanCreationException &amp;&amp; beanName.equals(((BeanCreationException)var18).getBeanName())) {\n                throw (BeanCreationException)var18;\n            }\n\n            throw new BeanCreationException(mbd.getResourceDescription(), beanName, &quot;Initialization of bean failed&quot;, var18);\n        }\n        \/*\n        \u5982\u679c\u63d0\u524d\u66dd\u5149\uff0c\u5c1d\u8bd5\u4ece\u7f13\u5b58\u83b7\u53d6\u8be5bean\n        (\u4e00\u822c\u5b58\u653e\u5728singletonFactories\u5bf9\u8c61\u901a\u8fc7\u8c03\u7528getObject \u628a\u5bf9\u8c61\u5b58\u5165earlySingletonObjects)\uff0c\n        \u5206\u522b\u4ecesingletonObjects\u548cearlySingletonObjects\u83b7\u53d6\u5bf9\u8c61\n        *\/\n        if (earlySingletonExposure) {\n            Object earlySingletonReference = this.getSingleton(beanName, false);\n            \/\/arlySingletonReference\u53ea\u6709\u5728\u68c0\u6d4b\u5230\u6709\u5faa\u73af\u4f9d\u8d56\u7684\u60c5\u51b5\u4e0b\u624d\u4f1a\u4e0d\u4e3a\u7a7a\n            if (earlySingletonReference != null) {\n                \/*\n                \u5f53exposedObject\u7b49\u4e8ebean\u65f6\n                (\u521d\u59cb\u5316\u4e4b\u540e\u7684bean\u7b49\u4e8e\u539f\u59cb\u7684bean\uff0c\u8bf4\u660e\u4e0d\u662fproxy)\n                (\u53ea\u6709 exposedObject \u6ca1\u6709\u5728\u521d\u59cb\u5316\u65b9\u6cd5\u4e2d\u88ab\u6539\u53d8\uff0c\u4e5f\u5c31\u662f\u6ca1\u6709\u88ab\u589e\u5f3a\u624d\u4f1a\u7b49\u4e8ebean\uff09\n                \u628a\u7f13\u5b58\u4e2d\u7684bean\u8d4b\u503c\u7ed9exposedObject\n                *\/\n                if (exposedObject == bean) {\n                    exposedObject = earlySingletonReference;\n                }\n                \/\/\u68c0\u6d4b\u8be5bean\u7684dependon\u7684bean\u662f\u5426\u90fd\u5df2\u7ecf\u521d\u59cb\u5316\u597d\u4e86\n                else if (!this.allowRawInjectionDespiteWrapping &amp;&amp; this.hasDependentBean(beanName)) {\n                    String[] dependentBeans = this.getDependentBeans(beanName);\n                    Set&lt;String&gt; actualDependentBeans = new LinkedHashSet(dependentBeans.length);\n                    String[] var12 = dependentBeans;\n                    int var13 = dependentBeans.length;\n                    \/\/\u68c0\u67e5\u4f9d\u8d56\n                    for (String dependentBean : dependentBeans) {\n                    if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){\n                            actualDependentBeans.add(dependentBean);\n                        }\n                    }\n                    \/*\n                    \u56e0\u4e3abean\u521b\u5efa\u540e\u5176\u6240\u4f9d\u8d56\u7684bean\u4e00\u5b9a\u662f\u5df2\u7ecf\u521b\u5efa\uff0c\n                    actualDependentBeans\u4e0d\u4e3a\u7a7a\u5219\u8868\u793a\n                    \u5f53\u524dbean\u521b\u5efa\u540e\u5176\u4f9d\u8d56\u7684bean\u5374\u6ca1\u6709\u5168\u90e8\u521b\u5efa\n                    \u4e5f\u5c31\u662f\u8bf4\u5b58\u5728\u4f9d\u8d56\u3002\n                    *\/\n                    if (!actualDependentBeans.isEmpty()) {\n                        throw new BeanCurrentlyInCreationException(beanName, &quot;Bean with name &#039;&quot; + beanName + &quot;&#039; has been injected into other beans [&quot; + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + &quot;] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using &#039;getBeanNamesForType&#039; with the &#039;allowEagerInit&#039; flag turned off, for example.&quot;);\n                    }\n                }\n            }\n        }\n\n        try {\n            \/\/\u6ce8\u518cDisposableBean\uff0c\u4ee5\u4fbf\u5728\u9500\u6bc1bean\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u8fd0\u884c\u6307\u5b9a\u7684\u76f8\u5173\u4e1a\u52a1\n            this.registerDisposableBeanIfNecessary(beanName, bean, mbd);\n            return exposedObject;\n        } catch (BeanDefinitionValidationException var16) {\n            throw new BeanCreationException(mbd.getResourceDescription(), beanName, &quot;Invalid destruction signature&quot;, var16);\n        }\n    }<\/code><\/pre>\n<h2>(\u4e8c).initializeBean<\/h2>\n<p>initializeBean\u662f\u8fdb\u884cbean\u521d\u59cb\u5316\u7684\uff0c\u4e3b\u8981\u505a\u4e86\u4e09\u4ef6\u4e8b<\/p>\n<ol>\n<li>\u6fc0\u6d3bAware\u65b9\u6cd5<\/li>\n<li>\u540e\u7f6e\u5904\u7406\u5668\u7684\u5e94\u7528<\/li>\n<li>\u6fc0\u6d3b\u81ea\u5b9a\u4e49\u7684init\u65b9\u6cd5<\/li>\n<\/ol>\n<pre><code class=\"language-java\">protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {\n        if (System.getSecurityManager() != null) {\n            AccessController.doPrivileged((PrivilegedAction&lt;Object&gt;) () -&gt; {\n                \/\/\u6fc0\u6d3b Aware \u65b9\u6cd5\uff0c\u5bf9\u7279\u6b8a\u7684 bean \u5904\u7406\uff1aAware\u3001BeanClassLoaderAware\u3001BeanFactoryAware\n                invokeAwareMethods(beanName, bean);\n                return null;\n            }, getAccessControlContext());\n        }\n        else {\n            invokeAwareMethods(beanName, bean);\n        }\n        \/\/\u540e\u7f6e\u5904\u7406\u5668 before\n        Object wrappedBean = bean;\n        if (mbd == null || !mbd.isSynthetic()) {\n            \/\/\u6267\u884cBeanPostProcessor\u540e\u7f6e\u5904\u7406\u5668\u65b9\u6cd5\n            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);\n        }\n        \/\/\u6fc0\u6d3b\u7528\u6237\u81ea\u5b9a\u4e49\u7684init\u65b9\u6cd5\n        try {\n            \/\/\u5148\u8c03\u7528InitializingBean\u7684afterPropertiesSet\uff0c\u5728\u8c03\u7528\u6211\u4eec\u5b9a\u4e49\u7684init\u65b9\u6cd5\n            invokeInitMethods(beanName, wrappedBean, mbd);\n        }\n        catch (Throwable ex) {\n            throw new BeanCreationException(\n                    (mbd != null ? mbd.getResourceDescription() : null),\n                    beanName, &quot;Invocation of init method failed&quot;, ex);\n        }\n        \/\/\u540e\u7f6e\u5904\u7406\u5668 after\uff0c\u6ce8\u610f\u8fd9\u8fb9\u5c31\u662f\u751f\u6210\u6211\u4eec\u914d\u7f6e\u7684\u52a8\u6001\u4ee3\u7406\u5bf9\u8c61\u7684\u5173\u952e\u4ee3\u7801\n        if (mbd == null || !mbd.isSynthetic()) {\n            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);\n        }\n\n        return wrappedBean;\n    }<\/code><\/pre>\n<h2>(\u4e09).invokeAwareMethods<\/h2>\n<pre><code class=\"language-java\">private void invokeAwareMethods(String beanName, Object bean) {\n        \/\/\u5982\u679cbean\u5b9e\u73b0\u4e86 Aware\u63a5\u53e3\n        if (bean instanceof Aware) {\n            \/\/\u5982\u679cbean\u5b9e\u73b0\u4e86 BeanNameAware \u63a5\u53e3\uff0c\u5219\u5c06 beanName \u8bbe\u503c\u8fdb\u53bb\n            if (bean instanceof BeanNameAware) {\n                ((BeanNameAware) bean).setBeanName(beanName);\n            }\n            \/\/\u5982\u679cbean\u5b9e\u73b0\u4e86 BeanClassLoaderAware \u63a5\u53e3\uff0c\u5219\u5c06 ClassLoader \u8bbe\u503c\u8fdb\u53bb\n            if (bean instanceof BeanClassLoaderAware) {\n                ClassLoader bcl = getBeanClassLoader();\n                if (bcl != null) {\n                    ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);\n                }\n            }\n            \/\/\u5982\u679cbean\u5b9e\u73b0\u4e86 BeanFactoryAware \u63a5\u53e3\uff0c\u5219\u5c06 beanFactory \u8bbe\u503c\u8fdb\u53bb\n            if (bean instanceof BeanFactoryAware) {\n                ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);\n            }\n        }\n    }<\/code><\/pre>\n<h2>(\u56db).invokeInitMethods<\/h2>\n<pre><code class=\"language-java\">protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)\n            throws Throwable {\n        \/\/\u68c0\u67e5bean\u662f\u5426\u5b9e\u73b0\u4e86InitializingBean\u63a5\u53e3\n        \/\/\u5982\u679c\u5b9e\u73b0\u4e86\u5219\u9700\u8981\u6267\u884cInitializingBean\u63a5\u53e3\u7684afterPropertiesSet\u65b9\u6cd5\n        boolean isInitializingBean = (bean instanceof InitializingBean);\n        if (isInitializingBean &amp;&amp; (mbd == null || !mbd.isExternallyManagedInitMethod(&quot;afterPropertiesSet&quot;))) {\n            if (logger.isTraceEnabled()) {\n                logger.trace(&quot;Invoking afterPropertiesSet() on bean with name &#039;&quot; + beanName + &quot;&#039;&quot;);\n            }\n            if (System.getSecurityManager() != null) {\n                try {\n                    AccessController.doPrivileged((PrivilegedExceptionAction&lt;Object&gt;) () -&gt; {\n                        ((InitializingBean) bean).afterPropertiesSet();\n                        return null;\n                    }, getAccessControlContext());\n                }\n                catch (PrivilegedActionException pae) {\n                    throw pae.getException();\n                }\n            }\n            else {\n                ((InitializingBean) bean).afterPropertiesSet();\n            }\n        }\n        \/\/\u8c03\u7528\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u521d\u59cb\u5316\u65b9\u6cd5\uff0c\u6bd4\u5982init-method\n        if (mbd != null &amp;&amp; bean.getClass() != NullBean.class) {\n            String initMethodName = mbd.getInitMethodName();\n            if (StringUtils.hasLength(initMethodName) &amp;&amp;\n                    !(isInitializingBean &amp;&amp; &quot;afterPropertiesSet&quot;.equals(initMethodName)) &amp;&amp;\n                    !mbd.isExternallyManagedInitMethod(initMethodName)) {\n                \/\/\u8c03\u7528\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u521d\u59cb\u5316\u65b9\u6cd5\n                invokeCustomInitMethod(beanName, bean, mbd);\n            }\n        }\n    }<\/code><\/pre>\n<h2>(\u4e94).destroy<\/h2>\n<pre><code class=\"language-java\">public void destroy() {\n        if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {\n            for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {\n                processor.postProcessBeforeDestruction(this.bean, this.beanName);\n            }\n        }\n\n        if (this.invokeDisposableBean) {\n            if (logger.isTraceEnabled()) {\n                logger.trace(&quot;Invoking destroy() on bean with name &#039;&quot; + this.beanName + &quot;&#039;&quot;);\n            }\n            try {\n                if (System.getSecurityManager() != null) {\n                    AccessController.doPrivileged((PrivilegedExceptionAction&lt;Object&gt;) () -&gt; {\n                        ((DisposableBean) this.bean).destroy();\n                        return null;\n                    }, this.acc);\n                }\n                else {\n                    ((DisposableBean) this.bean).destroy();\n                }\n            }\n            catch (Throwable ex) {\n                String msg = &quot;Invocation of destroy method failed on bean with name &#039;&quot; + this.beanName + &quot;&#039;&quot;;\n                if (logger.isDebugEnabled()) {\n                    logger.warn(msg, ex);\n                }\n                else {\n                    logger.warn(msg + &quot;: &quot; + ex);\n                }\n            }\n        }\n\n        if (this.invokeAutoCloseable) {\n            if (logger.isTraceEnabled()) {\n                logger.trace(&quot;Invoking close() on bean with name &#039;&quot; + this.beanName + &quot;&#039;&quot;);\n            }\n            try {\n                if (System.getSecurityManager() != null) {\n                    AccessController.doPrivileged((PrivilegedExceptionAction&lt;Object&gt;) () -&gt; {\n                        ((AutoCloseable) this.bean).close();\n                        return null;\n                    }, this.acc);\n                }\n                else {\n                    ((AutoCloseable) this.bean).close();\n                }\n            }\n            catch (Throwable ex) {\n                String msg = &quot;Invocation of close method failed on bean with name &#039;&quot; + this.beanName + &quot;&#039;&quot;;\n                if (logger.isDebugEnabled()) {\n                    logger.warn(msg, ex);\n                }\n                else {\n                    logger.warn(msg + &quot;: &quot; + ex);\n                }\n            }\n        }\n        else if (this.destroyMethod != null) {\n            invokeCustomDestroyMethod(this.destroyMethod);\n        }\n        else if (this.destroyMethodName != null) {\n            Method methodToInvoke = determineDestroyMethod(this.destroyMethodName);\n            if (methodToInvoke != null) {\n                invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(methodToInvoke));\n            }\n        }\n    }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00.\u751f\u547d\u5468\u671f\u56fe \u4e8c.\u53c2\u8003\u56de\u7b54 (\u4e00).\u56db\u4e2a\u9636\u6bb5 Spring\u4e2dBean\u7684\u751f\u547d\u5468\u671f\u4e3b\u8981\u5305\u542b\u56db\u4e2a\u9636\u6bb5 \u5b9e\u4f8b\u5316Bean Bean\u5c5e\u6027\u586b\u5145 &#8230;<\/p>","protected":false},"author":1,"featured_media":727,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[65,4],"_links":{"self":[{"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/posts\/719"}],"collection":[{"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/comments?post=719"}],"version-history":[{"count":6,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/posts\/719\/revisions"}],"predecessor-version":[{"id":726,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/posts\/719\/revisions\/726"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/media\/727"}],"wp:attachment":[{"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/media?parent=719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/categories?post=719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bigwer.cn\/index.php\/wp-json\/wp\/v2\/tags?post=719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}