{"id":7969,"date":"2023-11-28T20:08:40","date_gmt":"2023-11-28T12:08:40","guid":{"rendered":"https:\/\/wx.kaifamiao.info\/?p=7969"},"modified":"2023-12-05T16:02:46","modified_gmt":"2023-12-05T08:02:46","slug":"springboot-duo-shu-ju-yuan-chai-fen-ru-he-zuo","status":"publish","type":"post","link":"http:\/\/wx.kaifamiao.info\/index.php\/2023\/11\/28\/springboot-duo-shu-ju-yuan-chai-fen-ru-he-zuo\/","title":{"rendered":"SpringBoot\u591a\u6570\u636e\u6e90\u62c6\u5206\u5982\u4f55\u505a?"},"content":{"rendered":"<p>\u5728 Spring Boot \u4e2d\u5b9e\u73b0\u591a\u6570\u636e\u6e90\u7684\u914d\u7f6e\u548c\u7ba1\u7406\u6d89\u53ca\u5230\u4e00\u4e9b\u6838\u5fc3\u6982\u5ff5\u548c\u6b65\u9aa4\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u57fa\u672c\u7684\u591a\u6570\u636e\u6e90\u914d\u7f6e\u793a\u4f8b\uff0c\u6d89\u53ca\u5230\u4e86\u4e3b\u6570\u636e\u6e90\u548c\u8f85\u52a9\u6570\u636e\u6e90\u7684\u914d\u7f6e\u3002<\/p>\n<h3><a id=\"1%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96%EF%BC%9A\" class=\"anchor\" aria-hidden=\"true\"><span class=\"octicon octicon-link\"><\/span><\/a>1. \u6dfb\u52a0\u4f9d\u8d56\uff1a<\/h3>\n<p>\u9996\u5148\uff0c\u786e\u4fdd\u4f60\u7684\u9879\u76ee\u4e2d\u6dfb\u52a0\u4e86\u8fde\u63a5\u6570\u636e\u5e93\u7684\u76f8\u5173\u4f9d\u8d56\uff0c\u4f8b\u5982 MySQL \u6216\u5176\u4ed6\u6570\u636e\u5e93\u7684 JDBC \u9a71\u52a8\u3002<\/p>\n<h3><a id=\"2%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90%EF%BC%9A\" class=\"anchor\" aria-hidden=\"true\"><span class=\"octicon octicon-link\"><\/span><\/a>2. \u914d\u7f6e\u6570\u636e\u6e90\uff1a<\/h3>\n<p>\u5728 <code>application.properties<\/code> \u6216 <code>application.yml<\/code> \u6587\u4ef6\u4e2d\u914d\u7f6e\u4e3b\u6570\u636e\u6e90\u548c\u8f85\u52a9\u6570\u636e\u6e90\u7684\u8fde\u63a5\u4fe1\u606f\uff1a<\/p>\n<pre><code class=\"language-properties\"># \u4e3b\u6570\u636e\u6e90\u914d\u7f6e\nspring.datasource.primary.url=jdbc:mysql:\/\/localhost:3306\/primarydb\nspring.datasource.primary.username=root\nspring.datasource.primary.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\n# \u8f85\u52a9\u6570\u636e\u6e90\u914d\u7f6e\nspring.datasource.secondary.url=jdbc:mysql:\/\/localhost:3306\/secondarydb\nspring.datasource.secondary.username=root\nspring.datasource.secondary.password=root\nspring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver\n<\/code><\/pre>\n<h3><a id=\"3%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90-bean%EF%BC%9A\" class=\"anchor\" aria-hidden=\"true\"><span class=\"octicon octicon-link\"><\/span><\/a>3. \u914d\u7f6e\u6570\u636e\u6e90 Bean\uff1a<\/h3>\n<p>\u521b\u5efa\u4e24\u4e2a\u4e0d\u540c\u7684\u6570\u636e\u6e90 Bean\uff0c\u4e00\u4e2a\u7528\u4e8e\u4e3b\u6570\u636e\u6e90\uff0c\u53e6\u4e00\u4e2a\u7528\u4e8e\u8f85\u52a9\u6570\u636e\u6e90\u3002\u540c\u65f6\uff0c\u914d\u7f6e JPA \u7684 EntityManagerFactory \u548c\u4e8b\u52a1\u7ba1\u7406\u5668\u3002<\/p>\n<pre><code class=\"language-java\">@Configuration\n@EnableTransactionManagement\npublic class DataSourceConfig {\n\n    @Primary\n    @Bean(name = &quot;primaryDataSource&quot;)\n    @ConfigurationProperties(prefix = &quot;spring.datasource.primary&quot;)\n    public DataSource dataSource() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Bean(name = &quot;secondaryDataSource&quot;)\n    @ConfigurationProperties(prefix = &quot;spring.datasource.secondary&quot;)\n    public DataSource dataSourceSecondary() {\n        return DataSourceBuilder.create().build();\n    }\n\n    @Primary\n    @Bean(name = &quot;entityManagerFactory&quot;)\n    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier(&quot;primaryDataSource&quot;) DataSource dataSource) {\n        return builder\n                .dataSource(dataSource)\n                .packages(&quot;com.example.domain.primary&quot;) \/\/ \u8bbe\u7f6e\u4e3b\u6570\u636e\u6e90\u5b9e\u4f53\u7c7b\u6240\u5728\u7684\u5305\n                .persistenceUnit(&quot;primary&quot;)\n                .build();\n    }\n\n    @Bean(name = &quot;entityManagerFactorySecondary&quot;)\n    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder, @Qualifier(&quot;secondaryDataSource&quot;) DataSource dataSource) {\n        return builder\n                .dataSource(dataSource)\n                .packages(&quot;com.example.domain.secondary&quot;) \/\/ \u8bbe\u7f6e\u8f85\u52a9\u6570\u636e\u6e90\u5b9e\u4f53\u7c7b\u6240\u5728\u7684\u5305\n                .persistenceUnit(&quot;secondary&quot;)\n                .build();\n    }\n\n    @Primary\n    @Bean(name = &quot;transactionManager&quot;)\n    public PlatformTransactionManager transactionManager(@Qualifier(&quot;entityManagerFactory&quot;) EntityManagerFactory entityManagerFactory) {\n        return new JpaTransactionManager(entityManagerFactory);\n    }\n\n    @Bean(name = &quot;transactionManagerSecondary&quot;)\n    public PlatformTransactionManager transactionManagerSecondary(@Qualifier(&quot;entityManagerFactorySecondary&quot;) EntityManagerFactory entityManagerFactory) {\n        return new JpaTransactionManager(entityManagerFactory);\n    }\n}\n<\/code><\/pre>\n<h3><a id=\"4%E9%85%8D%E7%BD%AE-repository%EF%BC%9A\" class=\"anchor\" aria-hidden=\"true\"><span class=\"octicon octicon-link\"><\/span><\/a>4. \u914d\u7f6e Repository\uff1a<\/h3>\n<p>\u5728\u5b9e\u4f53\u7c7b\u5bf9\u5e94\u7684\u5305\u4e2d\u521b\u5efa\u4e24\u4e2a\u4e0d\u540c\u7684 Repository \u63a5\u53e3\uff0c\u5206\u522b\u7528\u4e8e\u4e3b\u6570\u636e\u6e90\u548c\u8f85\u52a9\u6570\u636e\u6e90\u3002<\/p>\n<pre><code class=\"language-java\">\/\/ \u4e3b\u6570\u636e\u6e90 Repository\npublic interface UserRepository extends JpaRepository&lt;User, Long&gt; {\n    \/\/ Custom queries for primary data source\n}\n\n\/\/ \u8f85\u52a9\u6570\u636e\u6e90 Repository\npublic interface ProductRepository extends JpaRepository&lt;Product, Long&gt; {\n    \/\/ Custom queries for secondary data source\n}\n<\/code><\/pre>\n<h3><a id=\"5%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E6%95%B0%E6%8D%AE%E6%BA%90%EF%BC%9A\" class=\"anchor\" aria-hidden=\"true\"><span class=\"octicon octicon-link\"><\/span><\/a>5. \u4f7f\u7528\u4e0d\u540c\u7684\u6570\u636e\u6e90\uff1a<\/h3>\n<p>\u5728\u670d\u52a1\u7c7b\u6216\u63a7\u5236\u5668\u4e2d\u4f7f\u7528 <code>@Qualifier<\/code> \u6ce8\u89e3\u6307\u5b9a\u8981\u4f7f\u7528\u7684\u6570\u636e\u6e90\uff1a<\/p>\n<pre><code class=\"language-java\">@Service\npublic class MyService {\n\n    @Autowired\n    @Qualifier(&quot;userRepository&quot;)\n    private UserRepository userRepository;\n\n    @Autowired\n    @Qualifier(&quot;productRepository&quot;)\n    private ProductRepository productRepository;\n\n    \/\/ Service methods\n}\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u662f\u4e00\u4e2a\u57fa\u672c\u7684\u591a\u6570\u636e\u6e90\u914d\u7f6e\u793a\u4f8b\uff0c\u5b9e\u9645\u5e94\u7528\u4e2d\u53ef\u80fd\u4f1a\u6709\u66f4\u590d\u6742\u7684\u9700\u6c42\uff0c\u4f8b\u5982\u4e8b\u52a1\u7ba1\u7406\u3001\u591a\u6570\u636e\u6e90\u5207\u6362\u7b56\u7565\u7b49\uff0c\u8fd9\u65f6\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u66f4\u8be6\u7ec6\u7684\u914d\u7f6e\u548c\u5904\u7406\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728 Spring Boot \u4e2d\u5b9e\u73b0\u591a\u6570\u636e\u6e90\u7684\u914d\u7f6e\u548c\u7ba1\u7406\u6d89\u53ca\u5230\u4e00\u4e9b\u6838\u5fc3\u6982\u5ff5\u548c\u6b65\u9aa4\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u57fa\u672c\u7684\u591a\u6570\u636e\u6e90\u914d\u7f6e\u793a [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[100],"tags":[],"class_list":["post-7969","post","type-post","status-publish","format-standard","hentry","category-springboot"],"_links":{"self":[{"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/posts\/7969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/comments?post=7969"}],"version-history":[{"count":2,"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/posts\/7969\/revisions"}],"predecessor-version":[{"id":16559,"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/posts\/7969\/revisions\/16559"}],"wp:attachment":[{"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/media?parent=7969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/categories?post=7969"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wx.kaifamiao.info\/index.php\/wp-json\/wp\/v2\/tags?post=7969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}