回答編集履歴

1

コード例を追加

2016/08/12 10:55

投稿

退会済みユーザー
test CHANGED
@@ -3,3 +3,167 @@
3
3
 
4
4
 
5
5
  その場合、DB設定が入っているマスターDBにアクセスするdataSourceとマッパーを作り、そのマッパーを使ってDBから値を取得し、取得した値をbeanとして登録するようなBeanFactoryを作ればいいと思います。dataSourceの方では、`<property name="url" ref="dbUrl"/>`のように、作成したBeanFactoryによって生成されたbeanを参照する記述にすればいいでしょう。
6
+
7
+
8
+
9
+ かなり適当ですが、bean定義のxmlの例を載せてみます。
10
+
11
+
12
+
13
+ ```xml
14
+
15
+ <context:component-scan base-package="com.teratail"/>
16
+
17
+ <!-- マスターDBのMyBatis設定 -->
18
+
19
+ <bean id="masterDataSource"
20
+
21
+ class="org.apache.commons.dbcp.BasicDataSource">
22
+
23
+ <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
24
+
25
+ <property name="url" value="jdbc:mysql://localhost:3306/teratail"/>
26
+
27
+ <property name="username" value="root"/>
28
+
29
+ <property name="password" value=""/>
30
+
31
+ <property name="initialSize" value="50"/>
32
+
33
+ <property name="maxActive" value="50"/>
34
+
35
+ </bean>
36
+
37
+ <bean id="sqlSessionFactory"
38
+
39
+ class="org.mybatis.spring.SqlSessionFactoryBean">
40
+
41
+ <property name="dataSource" ref="masterDataSource"/>
42
+
43
+ <property name="mapperLocations" value="classpath*:mappers/*.xml"/>
44
+
45
+ </bean>
46
+
47
+ <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
48
+
49
+ <property name="basePackage" value="com.teratail.mappers"/>
50
+
51
+ </bean>
52
+
53
+
54
+
55
+ <!-- マスターDBから読み込んだDB設定情報 -->
56
+
57
+ <bean id="dbConfigFactoryBean" class="com.teratail.factories.DbConfigFactoryBean"/>
58
+
59
+ <bean id="url" factory-bean="dbConfigFactoryBean" factory-method="url"/>
60
+
61
+ <bean id="port" factory-bean="dbConfigFactoryBean" factory-method="port"/>
62
+
63
+ <bean id="user" factory-bean="dbConfigFactoryBean" factory-method="user"/>
64
+
65
+ <bean id="password" factory-bean="dbConfigFactoryBean" factory-method="password"/>
66
+
67
+ <!-- 本来アクセスしたいDBのdataSource -->
68
+
69
+ <bean id="dataSource"
70
+
71
+ class="org.apache.commons.dbcp.BasicDataSource">
72
+
73
+ <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
74
+
75
+ <property name="url" ref="url"/>
76
+
77
+ <property name="username" ref="user"/>
78
+
79
+ <property name="password" ref="password"/>
80
+
81
+ <property name="initialSize" value="50"/>
82
+
83
+ <property name="maxActive" value="50"/>
84
+
85
+ </bean>
86
+
87
+ ```
88
+
89
+
90
+
91
+ 序盤はマスターDBにアクセスするためのMybatisの設定です。マスターDBの設定には定数を使えるわけですよね?肝となるのが中盤で、序盤の設定で作成したマッパーを用いてマスターDBからDB設定を取得し、`url`や`user`などを返すメソッドを定義しているBeanFactoryを定義しています。BeanFactoryの中身はこんな感じになるでしょう。
92
+
93
+
94
+
95
+ ```java
96
+
97
+ package com.teratail.factories;
98
+
99
+
100
+
101
+ import com.teratail.entities.DbConfig;
102
+
103
+ import com.teratail.mappers.DbConfigMapper;
104
+
105
+ import org.springframework.beans.factory.annotation.Autowired;
106
+
107
+
108
+
109
+ public class DbConfigFactoryBean {
110
+
111
+ private final DbConfigMapper dbConfigMapper;
112
+
113
+ private final DbConfig dbConfig;
114
+
115
+
116
+
117
+ @Autowired
118
+
119
+ public DbConfigFactoryBean(DbConfigMapper dbConfigMapper) {
120
+
121
+ this.dbConfigMapper = dbConfigMapper;
122
+
123
+ this.dbConfig = dbConfigMapper.findOne();
124
+
125
+ }
126
+
127
+
128
+
129
+ public String url() {
130
+
131
+ return dbConfig.getUrl();
132
+
133
+ }
134
+
135
+
136
+
137
+ public int port() {
138
+
139
+ return dbConfig.getPort();
140
+
141
+ }
142
+
143
+
144
+
145
+ public String user() {
146
+
147
+ return dbConfig.getUser();
148
+
149
+ }
150
+
151
+
152
+
153
+ public String password() {
154
+
155
+ return dbConfigMapper.all().getPassword();
156
+
157
+ }
158
+
159
+ }
160
+
161
+ ```
162
+
163
+
164
+
165
+ `DbConfig`というのはDB設定情報を格納するために適当に作ったクラスです。で、上記のクラスが返す値をbeanとしてDIコンテナに登録するための記述がBeanFactory定義の下に続いています。
166
+
167
+
168
+
169
+ これらのbeanが定義できたら、その値を参照するようなdataSourceを最後に定義して終わりです。こうすれば起動時にマスターDBからDB設定情報を持ってこれるようになります。