質問編集履歴
3
ハッシュコードを追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -126,12 +126,18 @@
|
|
126
126
|
|
127
127
|
|
128
128
|
|
129
|
+
// ランダム値とハッシュコード
|
130
|
+
|
131
|
+
val hashCode = this.hashCode()
|
132
|
+
|
133
|
+
val uuid = UUID.randomUUID().toString()
|
134
|
+
|
135
|
+
println("初期:$uuid hashCode:$hashCode")
|
136
|
+
|
137
|
+
|
138
|
+
|
129
139
|
// ランダム値をsessionに格納
|
130
140
|
|
131
|
-
val uuid = UUID.randomUUID().toString()
|
132
|
-
|
133
|
-
println("初期:$uuid")
|
134
|
-
|
135
141
|
requestA.session.setAttribute("test", uuid)
|
136
142
|
|
137
143
|
|
@@ -148,7 +154,7 @@
|
|
148
154
|
|
149
155
|
val compare = if (a == d) "一致" else "不一致"
|
150
156
|
|
151
|
-
println("引数:$a DI:
|
157
|
+
println("引数:$a DI: $d $compare")
|
152
158
|
|
153
159
|
}
|
154
160
|
|
@@ -164,29 +170,29 @@
|
|
164
170
|
|
165
171
|
```
|
166
172
|
|
167
|
-
初期:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7
|
168
|
-
|
169
|
-
初期:b
|
173
|
+
初期:1bc4c09e-383b-4b4f-a029-ce6e42c971cb hashCode:81445899
|
170
|
-
|
174
|
+
|
171
|
-
|
175
|
+
初期:231966be-a4c7-4451-9550-f75ad637782e hashCode:81445899
|
172
|
-
|
176
|
+
|
173
|
-
引数:b
|
177
|
+
引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
|
174
|
-
|
178
|
+
|
175
|
-
引数:
|
179
|
+
引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
|
176
|
-
|
180
|
+
|
177
|
-
引数:b
|
181
|
+
引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
|
178
|
-
|
182
|
+
|
179
|
-
引数:
|
183
|
+
引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
|
180
|
-
|
184
|
+
|
181
|
-
引数:b
|
185
|
+
引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
|
182
|
-
|
186
|
+
|
183
|
-
引数:
|
187
|
+
引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
|
184
|
-
|
188
|
+
|
185
|
-
引数:b
|
189
|
+
引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
|
186
|
-
|
190
|
+
|
187
|
-
引数:
|
191
|
+
引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
|
188
|
-
|
192
|
+
|
189
|
-
引数:b
|
193
|
+
引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
|
194
|
+
|
195
|
+
引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
|
190
196
|
|
191
197
|
```
|
192
198
|
|
2
スレッドセーフに関する実験を追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -84,14 +84,116 @@
|
|
84
84
|
|
85
85
|
後者の方法では、
|
86
86
|
|
87
|
-
|
87
|
+
・RequestContextHolder.currentRequestAttributes().getRequest()
|
88
|
-
|
88
|
+
|
89
|
-
|
89
|
+
・RequestContextHolder.currentRequestAttributes().getResponse()
|
90
90
|
|
91
91
|
で取得したrequest/responseを使っていて、それが前者の方法で引数から受け取ったオブジェクトと同じものであることはわかりましたが、どこの設定でそのような動作になるのかまでは突き止めていません。
|
92
92
|
|
93
93
|
|
94
94
|
|
95
|
+
### 試したこと(追記)
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
「同時アクセスしたらわかるのではないか」と指摘をいただきましたので、実験してみました。
|
100
|
+
|
101
|
+
```kotlin
|
102
|
+
|
103
|
+
package test
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
import org.springframework.stereotype.Controller
|
108
|
+
|
109
|
+
import org.springframework.web.bind.annotation.RequestMapping
|
110
|
+
|
111
|
+
import java.util.*
|
112
|
+
|
113
|
+
import javax.servlet.http.HttpServletRequest
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
@Controller
|
118
|
+
|
119
|
+
class PageController(val requestD: HttpServletRequest) {
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
@RequestMapping("/page")
|
124
|
+
|
125
|
+
fun getPage(requestA: HttpServletRequest): String? {
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
// ランダム値をsessionに格納
|
130
|
+
|
131
|
+
val uuid = UUID.randomUUID().toString()
|
132
|
+
|
133
|
+
println("初期:$uuid")
|
134
|
+
|
135
|
+
requestA.session.setAttribute("test", uuid)
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
// 1000ミリ秒間隔で一致確認
|
140
|
+
|
141
|
+
for (i in 1..5) {
|
142
|
+
|
143
|
+
Thread.sleep(1000)
|
144
|
+
|
145
|
+
val a = requestA.session.getAttribute("test") as String
|
146
|
+
|
147
|
+
val d = requestD.session.getAttribute("test") as String
|
148
|
+
|
149
|
+
val compare = if (a == d) "一致" else "不一致"
|
150
|
+
|
151
|
+
println("引数:$a DI: $d $compare")
|
152
|
+
|
153
|
+
}
|
154
|
+
|
155
|
+
return null
|
156
|
+
|
157
|
+
}
|
158
|
+
|
159
|
+
}
|
160
|
+
|
161
|
+
```
|
162
|
+
|
163
|
+
以下、二つのブラウザからなるべく同時にアクセスした際のコンソールです。
|
164
|
+
|
165
|
+
```
|
166
|
+
|
167
|
+
初期:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7
|
168
|
+
|
169
|
+
初期:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25
|
170
|
+
|
171
|
+
引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
|
172
|
+
|
173
|
+
引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
|
174
|
+
|
175
|
+
引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
|
176
|
+
|
177
|
+
引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
|
178
|
+
|
179
|
+
引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
|
180
|
+
|
181
|
+
引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
|
182
|
+
|
183
|
+
引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
|
184
|
+
|
185
|
+
引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
|
186
|
+
|
187
|
+
引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
|
188
|
+
|
189
|
+
引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
|
190
|
+
|
191
|
+
```
|
192
|
+
|
193
|
+
引数のリクエスト(requestA)から取得したセッションの値と、DI(コンストラクタインジェクション)したリクエスト(requestD)から取得したセッションの値が常に一致していますので、DIされたHttpServletRequestはスレッドセーフであることがわかりました。
|
194
|
+
|
195
|
+
|
196
|
+
|
95
197
|
### 補足情報(FW/ツールのバージョンなど)
|
96
198
|
|
97
199
|
|
1
「3種類のDIの方法の違い」に関する回答がついてしまったため、誤解を招く表記を修正。また、サンプルコードのDI方法をコンストラクタ・インジェクションに修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Spring-bootにてHttpServletRequestにアクセスする2つの方法(引数 v.s.
|
1
|
+
Spring-bootにてHttpServletRequestにアクセスする2つの方法(コントローラ引数 v.s. DI)の相違点について
|
test
CHANGED
@@ -6,7 +6,15 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
プログラムからrequestやresponse、sessionの情報にアクセスする場合、
|
9
|
+
プログラムからrequestやresponse、sessionの情報にアクセスする場合、
|
10
|
+
|
11
|
+
0. RequestMappingされた関数(メソッド)の引数として受け取る
|
12
|
+
|
13
|
+
0. 使用するBeanにDIする
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
の2つの方法がとれると思いますが、これらの動作上の相違点はありますでしょうか?
|
10
18
|
|
11
19
|
開発中のシステムの特性上、できれば後者の方法を取りたいのですが、社内に後者の方法をとった事例がなく、注意点などあればご教示いただきたいです。
|
12
20
|
|
@@ -20,7 +28,7 @@
|
|
20
28
|
|
21
29
|
|
22
30
|
|
23
|
-
//
|
31
|
+
// RequestMappingされた関数(メソッド)の引数として受け取る
|
24
32
|
|
25
33
|
@RequestMapping("/page")
|
26
34
|
|
@@ -44,27 +52,17 @@
|
|
44
52
|
|
45
53
|
@Controller
|
46
54
|
|
47
|
-
class PageController
|
55
|
+
class PageController(
|
48
56
|
|
57
|
+
// 使用するBeanにDIする
|
49
58
|
|
59
|
+
var request: HttpServletRequest,
|
50
60
|
|
51
|
-
|
61
|
+
var response: HttpServletResponse,
|
52
62
|
|
53
|
-
|
63
|
+
var session : HttpSession
|
54
64
|
|
55
|
-
private lateinit var request: HttpServletRequest
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
65
|
+
) {
|
60
|
-
|
61
|
-
private lateinit var response: HttpServletResponse
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
@Autowired
|
66
|
-
|
67
|
-
private lateinit var session : HttpSession
|
68
66
|
|
69
67
|
|
70
68
|
|