{"id":576,"date":"2021-11-01T14:52:54","date_gmt":"2021-11-01T06:52:54","guid":{"rendered":"https:\/\/explause.com\/?p=576"},"modified":"2021-11-01T14:52:54","modified_gmt":"2021-11-01T06:52:54","slug":"%e5%9f%ba%e4%ba%8ejava%e7%9a%84%e5%ae%b9%e5%99%a8%e9%85%8d%e7%bd%ae","status":"publish","type":"post","link":"https:\/\/devdoge.org\/?p=576","title":{"rendered":"\u57fa\u4e8eJava\u7684\u5bb9\u5668\u914d\u7f6e"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u56f4\u7ed5\u7740<code><strong>@Bean<\/strong><\/code>\u548c<code><strong>@Configuration<\/strong><\/code>\u4e3a\u4e2d\u5fc3\uff1a<br><code><strong>@Configuration<\/strong><\/code>\u7684\u7c7b\u91cc\u9762\u6709<code><strong>@Bean<\/strong><\/code>\u7684\u65b9\u6cd5\u751f\u6210bean\u3002<br>\u4f7f\u7528<code><strong>@Configuration<\/strong><\/code>\u53ef\u4ee5\u83b7\u5f97\u589e\u5f3a\u7684CGLIB\u652f\u6301\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>full\u8fd8\u662flite\u7684@Bean\u6a21\u5f0f\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9a\u4e49\u5728\u975e<code><strong>@Configuration<\/strong><\/code>\u7c7b\u91cc\u7684@Bean\u65b9\u6cd5\u88ab\u8ba4\u4e3a\u662flite\u6a21\u5f0f\u3002<br>Lite\u6a21\u5f0f\u7684@Bean\u65b9\u6cd5\u4e0d\u80fd\u58f0\u660ebean\u5185\u4f9d\u8d56\uff0c\u53ea\u80fd\u64cd\u4f5c\u5176\u5bb9\u5668\u7c7b\u7684\u5185\u90e8\u6709\u7684\uff0c\u6216\u8005\u5b83\u7684\u65b9\u6cd5\u53c2\u6570\u3002<br>\u8fd9\u79cd@Bean\u65b9\u6cd5\u4e0d\u80fd\u8c03\u7528\u522b\u7684@Bean\u65b9\u6cd5\uff0c\u4ec5\u4ec5\u4f5c\u4e3abean\u7684\u5de5\u5382\u65b9\u6cd5\u53c2\u8003\uff0c\u6ca1\u6709\u8fd0\u884c\u65f6\u610f\u4e49\u3002<br>\u6b63\u5411\u7684\u526f\u4f5c\u7528\u662f\u5728\u7c7b\u8bbe\u8ba1\u65b9\u9762\u6ca1\u6709\u9650\u5236\uff0c\u6bd4\u5982final\u3002<br>Full\u6a21\u5f0f@Bean\u65b9\u6cd5\u7684\u8de8\u65b9\u6cd5\u5f15\u7528\u90fd\u4f1a\u88ab\u91cd\u5b9a\u5411\u5230\u5bb9\u5668\u7684\u751f\u547d\u5468\u671f\u7ba1\u7406\uff0c<br>\u53ef\u4ee5\u9632\u6b62\u540c\u6837\u7684@Bean\u65b9\u6cd5\u88ab\u666e\u901a\u7684Java\u4ee3\u7801\u8c03\u7528\uff0c\u4ee5\u51cf\u5c11\u4e0d\u6613\u5bdf\u89c9\u7684bug\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u901a\u8fc7AnnotationConfigApplicationContext\u7c7b\u5b9e\u4f8b\u5316Spring\u5bb9\u5668\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u6b62\u53ef\u4ee5\u63a5\u53d7<code><strong>@Configuration<\/strong><\/code>\u7c7b\uff0c\u8fd8\u80fd\u63a5\u53d7<strong>@Component<\/strong>\u548c<strong>JSR-330<\/strong>\u6ce8\u89e3\u7c7b\u3002<br>\u5f53<meta charset=\"utf-8\"><code><strong>@Configuration<\/strong><\/code>\u7c7b\u4f5c\u4e3a\u53c2\u6570\u65f6\uff0c<strong>\u8fd9\u4e2a<em>\u7c7b\u548c\u7c7b\u5185\u7684@Bean\u65b9\u6cd5\u90fd\u4f1a\u88ab\u6ce8\u518c\u6210bean\u5b9a\u4e49\u3002<\/em><\/strong><br><meta charset=\"utf-8\">\u5f53<code><strong>@Component<\/strong><\/code>\u548c<strong>JSR-330<\/strong><meta charset=\"utf-8\">\u7c7b\u4f5c\u4e3a\u53c2\u6570\u65f6\uff0c\u4f1a\u88ab\u6ce8\u518c\u4e3abean\u5b9a\u4e49\uff0c\u5e76\u5047\u5b9a\u7528\u4e86<strong>@Autowired<\/strong>\u548c<strong>@Inject<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u4f55\u4f7f\u7528\uff1anew\u4e00\u4e2a<code><strong>AnnotationConfigApplicationContext<\/strong><\/code>\u7c7b\uff0c\u5c06<strong>\u914d\u7f6e\u7c7b\u4f5c\u4e3a\u53c2\u6570<\/strong>\u4f20\u9012\u8fdb\u53bb\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public static void main(String&#91;] args) {\n    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);\n    MyService myService = ctx.getBean(MyService.class);\n    myService.doStuff();\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u7684\u6784\u9020\u51fd\u6570\u63a5\u53d7\u53ef\u53d8\u53c2\u6570\uff0c\u60f3\u4f20\u9012\u51e0\u4e2a\u7c7b\u5c31\u4f20\u9012\u51e0\u4e2a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f16\u7a0b\u5f0f\u6784\u5efa\u5bb9\u5668\uff1a<strong>\u8c03\u7528\u5b83\u7684register\u65b9\u6cd5<\/strong>\u6ce8\u518cbean\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public static void main(String&#91;] args) {\n    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();\n    ctx.register(AppConfig.class, OtherConfig.class);\n    ctx.register(AdditionalConfig.class);\n    ctx.refresh();\n    MyService myService = ctx.getBean(MyService.class);\n    myService.doStuff();\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u5f00\u542f\u7ec4\u4ef6\u626b\u63cf\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">@Configuration\u7c7b\u6dfb\u52a0@ComponentScan\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\n@ComponentScan(basePackages = \"com.acme\") \npublic class AppConfig  {\n    ...\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6216\u8005\u624b\u52a8\u542f\u52a8\u626b\u63cf\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public static void main(String&#91;] args) {\n    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();\n    ctx.scan(\"com.acme\");\n    ctx.refresh();\n    MyService myService = ctx.getBean(MyService.class);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e24\u8005\u90fd\u80fd\u5b9e\u73b0\u540c\u6837\u7684\u529f\u80fd\uff0c\u800c\u4e14scan\u65b9\u6cd5\u652f\u6301\u53ef\u53d8\u53c2\u6570\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b49\u4ef7\u7684xml\u914d\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;beans>\n    &lt;context:component-scan base-package=\"com.acme\"\/>\n&lt;\/beans><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6ce8\u610f\uff1a@Configuration\u6ce8\u89e3\u542b\u6709@Component\u5143\u6ce8\u89e3\uff0c\u6240\u4ee5\u4e5f\u53ef\u4ee5\u662f\u5019\u9009\u3002<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u4f7f\u7528@Bean\u6ce8\u89e3\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u65b9\u6cd5\uff0c\u7528\u8fd9\u4e2a\u65b9\u6cd5\u5728\u5bb9\u5668\u5185\u6ce8\u518cbean definition\uff0c\u7c7b\u578b\u662f\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u3002<br>\u9ed8\u8ba4\uff0cbean\u7684\u540d\u79f0\u5c31\u662f\u65b9\u6cd5\u540d\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    public TransferServiceImpl transferService() {\n        return new TransferServiceImpl();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b49\u4ef7\u4e8exml\u4e2d\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;beans&gt;\n    &lt;bean id=\"transferService\" class=\"com.acme.TransferServiceImpl\"\/&gt;\n&lt;\/beans&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">@Bean\u65b9\u6cd5\u7684\u8fd4\u56de\u7c7b\u578b\u4e5f\u53ef\u4ee5\u662f\u63a5\u53e3\u7c7b\u578b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    public TransferService transferService() {\n        return new TransferServiceImpl();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\u8fd9\u6837\u4f1a\u9650\u5236\u66f4\u8fdb\u4e00\u6b65\u7684\u7c7b\u578b\u5339\u914d\uff0c\u5bb9\u5668\u4ec5\u5728\u5b9e\u4f8b\u5316\u8fd9\u4e2abean\u7684\u65f6\u5019\u77e5\u9053\u5b83\u7684\u5b8c\u5168\u7c7b\u578b\u3002<br>\u975elazy\u521d\u59cb\u5316\u7684bean\u6309\u7167\u5b9a\u4e49\u987a\u5e8f\u8fdb\u884c\u5b9e\u4f8b\u5316\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u4e0d\u540c\u7684\u5339\u914d\u7ed3\u679c\u3002<br>\u5bf9\u4e8e\u5b9e\u73b0\u4e86\u591a\u4e2a\u63a5\u53e3\u7684bean\u6700\u597d\u5b9a\u4e49\u6210\u8fd4\u56de\u6700\u786e\u5207\u7684\u7c7b\u578b\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>bean\u4f9d\u8d56\uff1a<\/strong>2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u5c06\u4efb\u610f\u6570\u91cf\u7684\u4f9d\u8d56\u4f5c\u4e3a@Bean\u65b9\u6cd5\u7684\u53c2\u6570\uff0c\u548c\u57fa\u4e8e\u6784\u9020\u5668\u7684DI\u4e00\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    public TransferService transferService(AccountRepository accountRepository) {\n        return new TransferServiceImpl(accountRepository);\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u751f\u547d\u5468\u671f\u8c03\u7528\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u4f7f\u7528\u6765\u81eaJSR-250\u7684<code>@PostConstruc<\/code>\u548c<code>@PreDestroy<\/code>\u6ce8\u89e3\uff1b<br>bean\u5b9e\u73b0<code>InitializingBean<\/code>,\u00a0<code>DisposableBean<\/code>, \u6216<code>Lifecycle<\/code>\u63a5\u53e3\uff1b<br>\u5b9e\u73b0\u6807\u51c6\u7684*Aware\u4e4b\u7c7b\u7684\u63a5\u53e3\uff1b<br>@Bean\u6ce8\u89e3\u63d0\u4f9b\u7684\u4e24\u4e2a\u5c5e\u6027\uff1ainitMethod\u548cdestroyMethod\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class BeanOne {\n\n    public void init() {\n        \/\/ initialization logic\n    }\n}\n\npublic class BeanTwo {\n\n    public void cleanup() {\n        \/\/ destruction logic\n    }\n}\n\n@Configuration\npublic class AppConfig {\n\n    @Bean(initMethod = \"init\")\n    public BeanOne beanOne() {\n        return new BeanOne();\n    }\n\n    @Bean(destroyMethod = \"cleanup\")\n    public BeanTwo beanTwo() {\n        return new BeanTwo();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728Java\u914d\u7f6e\u6a21\u5f0f\u4e0b\u5982\u679cbean\u6709\u4e00\u4e2apublic\u7684\u540d\u4e3a<code><strong>close<\/strong><\/code>\u6216<code><strong>shutdown<\/strong><\/code>\u65b9\u6cd5\u4f1a\u81ea\u52a8\u5f53\u4f5c\u9500\u6bc1\u8c03\u7528\u3002<br>\u53ef\u4ee5\u7528@Bean(destroyMethod=&#8221;&#8221;)\u5c06\u5176\u7981\u7528\uff08inferred\u6a21\u5f0f\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u901a\u8fc7\u76f4\u63a5\u8c03\u7528\u521d\u59cb\u5316\u65b9\u6cd5\u8fbe\u6210\u76f8\u540c\u7684\u76ee\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    public BeanOne beanOne() {\n        BeanOne beanOne = new BeanOne();\n        beanOne.init();\n        return beanOne;\n    }\n\n    \/\/ ...\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u4f7f\u7528@Scope\u58f0\u660ebean\u4f5c\u7528\u57df\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9ed8\u8ba4bean\u662fsingleton\u4f5c\u7528\u57df\uff0c\u53ef\u58f0\u660e\u4e3a\u522b\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class MyConfiguration {\n\n    @Bean\n    @Scope(\"prototype\")\n    public Encryptor encryptor() {\n        \/\/ ...\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>@Scope\u548cscoped-proxy\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u4e0d\u540c\u4f5c\u7528\u57df\u7684\u4f9d\u8d56\u6ce8\u5165\u3002<br>\u521b\u5efa\u4e00\u4e2a\u4ee3\u7406\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u5c31\u662f\u5728xml\u914d\u7f6e\u6587\u4ef6\u91cc\u6dfb\u52a0\uff1a<strong>&lt;aop:scoped-proxy\/><\/strong>\u5143\u7d20\u3002<br><code>@Scope<\/code>\u6ce8\u89e3\u63d0\u4f9b\u7b49\u4ef7\u7684<strong>proxyMode<\/strong>\u5c5e\u6027\uff0c\u9ed8\u8ba4\u503c\u662fScopedProxyMode.DEFAULT\uff0c\u4e0d\u521b\u5efa<code>scoped-proxy<\/code>\uff0c\u9664\u975e\u5728\u626b\u63cf\u9636\u6bb5\u63d0\u4f9b\u4e0d\u540c\u7684\u9ed8\u8ba4\u503c\u3002<br>\u53ef\u9009\u7684\u503c\u4e3a\uff1a<br><code><strong>ScopedProxyMode.TARGET_CLASS<\/strong><\/code>\uff0c<code><strong>ScopedProxyMode.INTERFACES<\/strong><\/code>\u6216<code><strong>ScopedProxyMode.NO<\/strong><\/code>\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u5b9a\u5236bean\u540d\u79f0\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9ed8\u8ba4\u7684bean\u540d\u79f0\u5c31\u662f\u5de5\u5382\u65b9\u6cd5\u540d\uff0c\u901a\u8fc7@Bean\u6ce8\u89e3\u7684name\u5c5e\u6027\u91cd\u65b0\u8bbe\u5b9a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean(name = \"myThing\")\n    public Thing thing() {\n        return new Thing();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>bean\u522b\u540d\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">name\u5c5e\u6027\u63a5\u53d7\u4e00\u4e2a\u5b57\u7b26\u4e32\u6570\u7ec4\u53c2\u6570\uff0c\u53ef\u4ee5\u7ed9bean\u58f0\u660e\u591a\u4e2a\u522b\u540d\/\u540d\u79f0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean({\"dataSource\", \"subsystemA-dataSource\", \"subsystemB-dataSource\"})\n    public DataSource dataSource() {\n        \/\/ instantiate, configure and return DataSource bean...\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>bean\u63cf\u8ff0\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u63d0\u4f9b\u66f4\u591a\u7684bean\u7684\u7ec6\u8282\u63cf\u8ff0\uff0c\u901a\u8fc7@Description\u6ce8\u89e3\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    @Description(\"Provides a basic example of a bean\")\n    public Thing thing() {\n        return new Thing();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u4f7f\u7528@Configuration\u6ce8\u89e3\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7c7b\u7ea7\u522b\u6ce8\u89e3\uff0c\u8868\u793a\u4e00\u4e2a\u5bf9\u8c61\u5c31\u662f\u4e00\u4e2abean\u7684\u5b9a\u4e49\u6e90\u3002<br>\u901a\u8fc7@Bean\u65b9\u6cd5\u58f0\u660ebean\u3002\u4e5f\u53ef\u4ee5\u7528\u4e8e\u76f4\u63a5\u8c03\u7528bean\u65b9\u6cd5\u8fbe\u6210bean\u5185\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    public BeanOne beanOne() {\n        return new BeanOne(beanTwo());\n    }\n\n    @Bean\n    public BeanTwo beanTwo() {\n        return new BeanTwo();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6ce8\u610f\uff1a\u4ec5\u53ef\u7528\u4e8e<\/strong><code><strong>@Configuration<\/strong><\/code><strong>\u7c7b\u5185\uff01<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u65b9\u6cd5\u6ce8\u5165\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">singletin\u4f5c\u7528\u57df\u7684bean\u4f9d\u8d56\u4e8eprototype\u4f5c\u7528\u57df\u7684bean\u3002\u53cd\u6b63\u5c11\u7528\u5c31\u5bf9\u4e86\uff0c\u521b\u5efasingleton bean\u7684\u65f6\u5019\u521b\u5efa\u4e00\u4e2aprototype\u7684bean\u5c31\u884c\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u66f4\u591a\u7684@Configuration\u7684\u5185\u90e8\u4fe1\u606f\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u770b\u770b\u4e0b\u9762\u7684\u4ee3\u7801\u7247\u6bb5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Bean\n    public ClientService clientService1() {\n        ClientServiceImpl clientService = new ClientServiceImpl();\n        clientService.setClientDao(clientDao());\n        return clientService;\n    }\n\n    @Bean\n    public ClientService clientService2() {\n        ClientServiceImpl clientService = new ClientServiceImpl();\n        clientService.setClientDao(clientDao());\n        return clientService;\n    }\n\n    @Bean\n    public ClientDao clientDao() {\n        return new ClientDaoImpl();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">clientDao()\u521b\u5efa\u4e86\u51e0\u4e2a\u5b9e\u4f8b\uff1f\u5b9e\u9645\u4e0a\u5c31\u521b\u5efa\u4e86\u4e00\u4e2a\u5b9e\u4f8b\u3002<br>@Configuration\u7c7b\u5728\u542f\u52a8\u65f6\u5c31\u6210\u4e3a<strong>CGLIB<\/strong>\u7684\u5b50\u7c7b\uff0c\u6240\u4ee5@Configuration\u7c7b\u4e0d\u80fd\u662ffinal\u7684\u3002<br>\u5176\u5185\u90e8\u7684\u65b9\u6cd5\u88ab\u8c03\u7528\u65f6\u4f1a\u5148\u68c0\u67e5\u5bb9\u5668\uff0c\u5982\u679c\u5bb9\u5185\u6ca1\u6709\u8fd9\u4e2abean\uff0c\u5c31\u4f1a\u8c03\u7528bean\u7684\u5de5\u5382\u65b9\u6cd5\u751f\u6210\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u751f\u6210\u540ebean\u5b9e\u4f8b\u540e\u5c31\u76f8\u5f53\u4e8e\u88ab\u7f13\u5b58\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u4e9b\u8bb8\u9650\u5236\uff0c\u7531\u4e8e\u5728\u5f00\u59cb\u65f6\u5019<meta charset=\"utf-8\"><strong>CGLIB<\/strong>\u52a8\u6001\u65b0\u589e\u7684\u529f\u80fd\uff0c<meta charset=\"utf-8\">@Configuration\u7c7b\u4e0d\u53ef\u4ee5\u662ffinal\u7684\uff0c\u4f46\u662f\u5141\u8bb8\u6709\u6784\u9020\u5668\u3002\u5982\u679c\u60f3\u8981\u907f\u5f00\u8fd9\u4e2a\u9650\u5236\u5c31\u4e0d\u8981\u4f7f\u7528<meta charset=\"utf-8\">@Configuration\uff0c\u4f46\u662f\u4e0d\u80fd\u8fdb\u884cbean\u5185\u4f9d\u8d56\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u7ec4\u5408\u57fa\u4e8eJava\u7684\u914d\u7f6e<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528<code>@Import<\/code>\u6ce8\u89e3\uff1a\u4ece\u522b\u7684\u7c7b\u5bfc\u5165bean\u5b9a\u4e49\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class ConfigA {\n\n    @Bean\n    public A a() {\n        return new A();\n    }\n}\n\n@Configuration\n@Import(ConfigA.class)\npublic class ConfigB {\n\n    @Bean\n    public B b() {\n        return new B();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\u65f6\u53ea\u8981\u6ce8\u518cB\u7c7b\u5c31\u80fd\u83b7\u53d6\u5230\u7c7bA\u7684bean\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public static void main(String&#91;] args) {\n    ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);\n\n    \/\/ now both beans A and B will be available...\n    A a = ctx.getBean(A.class);\n    B b = ctx.getBean(B.class);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u5bfc\u5165\u6ca1\u6709\u6ce8\u89e3\u7684\u7c7b\uff0c\u7c7b\u4f3c\u4e8e\u901a\u8fc7AnnotationConfigApplicationContext.register\u65b9\u6cd5\u5b9e\u73b0\u7684\u3002<br>\u5728\u4e0d\u60f3\u88ab\u81ea\u52a8\u626b\u63cf\u7684\u65f6\u5019\u5f88\u6709\u7528\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u5728bean\u5b9a\u4e49\u4e4b\u95f4\u6ce8\u5165\u4f9d\u8d56\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u6b63\u90fd\u662f\u56f4\u7ed5\u5bb9\u5668\u8f6c\u7684\uff0c\u53ea\u8981\u5c06\u4f9d\u8d56\u4f5c\u4e3a\u5de5\u5382\u65b9\u6cd5\u53c2\u6570\u5373\u53ef\u5b8c\u6210\u81ea\u52a8\u6ce8\u5165\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class ServiceConfig {\n\n    @Bean\n    public TransferService transferService(AccountRepository accountRepository) {\n        return new TransferServiceImpl(accountRepository);\n    }\n}\n\n@Configuration\npublic class RepositoryConfig {\n\n    @Bean\n    public AccountRepository accountRepository(DataSource dataSource) {\n        return new JdbcAccountRepository(dataSource);\n    }\n}\n\n@Configuration\n@Import({ServiceConfig.class, RepositoryConfig.class})\npublic class SystemTestConfig {\n\n    @Bean\n    public DataSource dataSource() {\n        \/\/ return new DataSource\n    }\n}\n\npublic static void main(String&#91;] args) {\n    ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemTestConfig.class);\n    \/\/ everything wires up across configuration classes...\n    TransferService transferService = ctx.getBean(TransferService.class);\n    transferService.transfer(100.00, \"A123\", \"C456\");\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a\u6700\u597d\u522b\u5c06\u4f9d\u8d56\u641e\u7684\u5f88\u590d\u6742\u3002@Configuration\u7c7b\u5f88\u65e9\u5c31\u88ab\u521d\u59cb\u5316\uff0c\u8fd9\u65f6\u5019\u7684\u4f9d\u8d56\u6ce8\u5165\u53ef\u80fd\u4f1a\u5bfc\u81f4\u65e0\u6cd5\u9884\u6599\u7684\u8fc7\u65e9\u521d\u59cb\u5316\u3002<br>\u540c\u6837\u9700\u8981\u6ce8\u610f\u901a\u8fc7<code>@Bean<\/code>\u5b9a\u4e49<code><strong>BeanPostProcessor<\/strong><\/code>\u548c<code><strong>BeanFactoryPostProcessor<\/strong><\/code>\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u5e94\u8be5\u88ab\u58f0\u660e\u79f0static\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u89e6\u53d1\u521d\u59cb\u5316\u5b83\u4eec\u7684\u5bb9\u5668\u7c7b\u3002\u5426\u5219<meta charset=\"utf-8\">@Configuration\u7c7b\u7684<code>@Autowired<\/code>\u548c<code>@Value<\/code>\u53ef\u80fd\u4f1a\u4e0d\u5de5\u4f5c\uff0c\u56e0\u4e3a\u53ef\u4ee5\u5728<code>AutowiredAnnotationBeanPostProcessor<\/code>\u4e4b\u524d\u5b9e\u4f8b\u5316bean\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u4f7f\u7528\u5168\u9650\u5b9a\u8def\u5f84\u5bfc\u5165bean\u8ba9\u4ee3\u7801\u66f4\u597d\u7406\u89e3\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u8981\u5728\u4ee3\u7801\u91cc\u5bfb\u627e\u7c7b\u4f3c@Autowired AccountRepository\u7684\u5185\u5bb9\u4f1a\u5f88\u9ebb\u70e6\u3002<br>\u5982\u679c\u4e0d\u60f3\u627e\u6765\u627e\u53bb\uff0c\u53ef\u4ee5\u8003\u8651\u5728\u4ee3\u7801\u91cc\u88c5\u914d\u914d\u7f6e\u7c7b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class ServiceConfig {\n\n    @Autowired\n    private RepositoryConfig repositoryConfig;\n\n    @Bean\n    public TransferService transferService() {\n        \/\/ \u901a\u8fc7bean\u65b9\u6cd5\u76f4\u63a5\u83b7\u5f97bean\n        return new TransferServiceImpl(repositoryConfig.accountRepository());\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\u8fd9\u6837ServiceConfig\u5c31\u548cRepositoryConfig\u7d27\u8026\u5408\u4e86\u3002\u53ef\u4ee5\u901a\u8fc7\u88c5\u914d<strong>\u63a5\u53e3\u7c7b\u578b<\/strong>\u7f13\u89e3\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u6761\u4ef6\u5316\u5305\u542b@Configuration\u7c7b\u6216@Bean\u65b9\u6cd5\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u6761\u4ef6\u5730\u5f00\u542f\u6216\u7981\u7528@Configuration\u7c7b\u6216@Bean\u65b9\u6cd5\uff0c\u53ef\u4ee5\u8ba9\u4ee3\u7801\u6709\u591a\u79cd\u72b6\u6001\uff0c\u5982\u5f00\u53d1\u7248\uff0c\u6d4b\u8bd5\u7248\u7b49\u3002<br>\u5e38\u7528@Profile\u6ce8\u89e3\u3002\u53ef\u4ee5\u901a\u8fc7Spring\u00a0<code>Environment<\/code>\u4fee\u6539\u542f\u7528\u7684profile\u3002<br>@Profile\u88ab\u66f4\u7075\u6d3b\u7684<code>@Conditional<\/code>\u6ce8\u89e3\u5b9e\u73b0\uff0c\u6307\u793a\u7279\u5b9a\u7684org.springframework.context.annotation.Condition\u5b9e\u73b0\u7c7b\u5e94\u8be5\u5728bean\u88ab\u6ce8\u518c\u4e4b\u524d\u8bbf\u95ee\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><meta charset=\"utf-8\">Condition\u63a5\u53e3\u6709\u4e00\u4e2a\u8fd4\u56deboolean\u540d\u4e3amatches\u7684\u65b9\u6cd5\uff0c\u6bd4\u5982<meta charset=\"utf-8\">@Profile\u7684\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\npublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {\n    \/\/ Read the @Profile annotation attributes\n    MultiValueMap&lt;String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());\n    if (attrs != null) {\n        for (Object value : attrs.get(\"value\")) {\n            if (context.getEnvironment().acceptsProfiles(((String&#91;]) value))) {\n                return true;\n            }\n        }\n        return false;\n    }\n    return true;\n}<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>\u7ec4\u5408Java\u914d\u7f6e\u548cxml\u914d\u7f6e<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">@Configuration\u7c7b\u5e76\u4e0d\u662f\u4e3a\u4e86100%\u66ff\u4ee3xml\u800c\u751f\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Java\u914d\u7f6e\u4e3a\u4e2d\u5fc3\u6dfb\u52a0xml\uff1a\u4f7f\u7528<strong>@ImportResource<\/strong>\u6ce8\u89e3\u6765\u5bfc\u5165xml\u914d\u7f6e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">xml\u914d\u7f6e\u4e3a\u4e2d\u5fc3\u6dfb\u52a0Java\u914d\u7f6e\uff1a\u5c06<code>@Configuration<\/code>\u7c7b\u58f0\u660e\u6210<strong>&lt;bean\/&gt;<\/strong>\u5143\u7d20\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class AppConfig {\n\n    @Autowired\n    private DataSource dataSource;\n\n    @Bean\n    public AccountRepository accountRepository() {\n        return new JdbcAccountRepository(dataSource);\n    }\n\n    @Bean\n    public TransferService transferService() {\n        return new TransferService(accountRepository());\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;beans&gt;\n    &lt;!-- enable processing of annotations such as @Autowired and @Configuration --&gt;\n    &lt;context:annotation-config\/&gt;\n    &lt;context:property-placeholder location=\"classpath:\/com\/acme\/jdbc.properties\"\/&gt;\n\n    &lt;bean class=\"com.acme.AppConfig\"\/&gt;\n\n    &lt;bean class=\"org.springframework.jdbc.datasource.DriverManagerDataSource\"&gt;\n        &lt;property name=\"url\" value=\"${jdbc.url}\"\/&gt;\n        &lt;property name=\"username\" value=\"${jdbc.username}\"\/&gt;\n        &lt;property name=\"password\" value=\"${jdbc.password}\"\/&gt;\n    &lt;\/bean&gt;\n&lt;\/beans&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public static void main(String&#91;] args) {\n    ApplicationContext ctx = new ClassPathXmlApplicationContext(\"xxx.xml\");\n    TransferService transferService = ctx.getBean(TransferService.class);\n    \/\/ ...\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7531\u4e8e\u5f00\u542f\u4e86&lt;context:annotation-config\/&gt;\uff0c\u6240\u4ee5AppConfig\u5185\u7684bean\u90fd\u4f1a\u88ab\u5904\u7406\u3002<br>${jdbc.url}\u7b49\u6837\u5b50\u7684\u4ee3\u7801\u662f\u5360\u4f4d\u7b26\uff0cSpring\u4f1a\u8bfb\u53d6\u914d\u7f6e\u6587\u4ef6\uff0c\u5c31\u662f &lt;context:property-placeholder location=&#8221;classpath:\/com\/acme\/jdbc.properties&#8221;\/&gt;\uff0c\u4e4b\u540e\u4f1a\u81ea\u52a8\u66ff\u6362\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">jdbc.properties\u6587\u4ef6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jdbc.url=jdbc:mysql:\/\/localhost\/xdb\njdbc.username=sa\njdbc.password=pw<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6216\u8005\u901a\u8fc7<strong>&lt;context:component-scan\/&gt;<\/strong>\u5f00\u542f\u81ea\u52a8\u626b\u63cf\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Java\u914d\u7f6e\u5305\u542bxml\uff1a<br>\u4f7f\u7528<strong>@ImportResource<\/strong>\u6ce8\u89e3\u4f5c\u7528\u5728\u7c7b\u4e0a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\n@ImportResource(\"classpath:\/com\/acme\/properties-config.xml\")\npublic class AppConfig {\n\n    @Value(\"${jdbc.url}\")\n    private String url;\n\n    @Value(\"${jdbc.username}\")\n    private String username;\n\n    @Value(\"${jdbc.password}\")\n    private String password;\n\n    @Bean\n    public DataSource dataSource() {\n        return new DriverManagerDataSource(url, username, password);\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">properties-config.xml\u6587\u4ef6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;beans&gt;\n    &lt;context:property-placeholder location=\"classpath:\/com\/acme\/jdbc.properties\"\/&gt;\n&lt;\/beans&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528Java\u4ee3\u7801\u914d\u7f6eSpring\u5bb9\u5668<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[28],"class_list":["post-576","post","type-post","status-publish","format-standard","hentry","category-ioc","tag-ioc"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/devdoge.org\/index.php?rest_route=\/wp\/v2\/posts\/576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devdoge.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devdoge.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devdoge.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devdoge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=576"}],"version-history":[{"count":23,"href":"https:\/\/devdoge.org\/index.php?rest_route=\/wp\/v2\/posts\/576\/revisions"}],"predecessor-version":[{"id":600,"href":"https:\/\/devdoge.org\/index.php?rest_route=\/wp\/v2\/posts\/576\/revisions\/600"}],"wp:attachment":[{"href":"https:\/\/devdoge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devdoge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devdoge.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}