質問編集履歴

3

ハッシュコードを追記

2019/12/27 04:08

投稿

yusuke0
yusuke0

スコア4

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: $d $compare")
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
- 初期:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25
173
+ 初期:1bc4c09e-383b-4b4f-a029-ce6e42c971cb hashCode:81445899
170
-
174
+
171
- 引数6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
175
+ 初期:231966be-a4c7-4451-9550-f75ad637782e hashCode81445899
172
-
176
+
173
- 引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
177
+ 引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
174
-
178
+
175
- 引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
179
+ 引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
176
-
180
+
177
- 引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
181
+ 引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
178
-
182
+
179
- 引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
183
+ 引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
180
-
184
+
181
- 引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
185
+ 引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
182
-
186
+
183
- 引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
187
+ 引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
184
-
188
+
185
- 引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
189
+ 引数:1bc4c09e-383b-4b4f-a029-ce6e42c971cb DI: 1bc4c09e-383b-4b4f-a029-ce6e42c971cb 一致
186
-
190
+
187
- 引数:6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 DI: 6bdd5523-f9bf-4ec7-801e-4787e06f1aa7 一致
191
+ 引数:231966be-a4c7-4451-9550-f75ad637782e DI: 231966be-a4c7-4451-9550-f75ad637782e 一致
188
-
192
+
189
- 引数:bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 DI: bbbbcb60-80be-4ed3-a7f9-0fa2a388fa25 一致
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

スレッドセーフに関する実験を追記

2019/12/27 04:08

投稿

yusuke0
yusuke0

スコア4

test CHANGED
File without changes
test CHANGED
@@ -84,14 +84,116 @@
84
84
 
85
85
  後者の方法では、
86
86
 
87
- ```RequestContextHolder.currentRequestAttributes().getRequest() ```
87
+ RequestContextHolder.currentRequestAttributes().getRequest()
88
-
88
+
89
- ```RequestContextHolder.currentRequestAttributes().getResponse() ```
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方法をコンストラクタ・インジェクションに修正

2019/12/27 03:25

投稿

yusuke0
yusuke0

スコア4

test CHANGED
@@ -1 +1 @@
1
- Spring-bootにてHttpServletRequestにアクセスする2つの方法(引数 v.s. @Autowired)の相違点について
1
+ Spring-bootにてHttpServletRequestにアクセスする2つの方法(コントローラ引数 v.s. DI)の相違点について
test CHANGED
@@ -6,7 +6,15 @@
6
6
 
7
7
 
8
8
 
9
- プログラムからrequestやresponse、sessionの情報にアクセスする場合、以下の2つの方法がとれると思いますが、これらの動作上の相違点はありますでしょうか?
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
- // Controllerの引数として取得す
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
- // Autowiredアノテーションを使用する
61
+ var response: HttpServletResponse,
52
62
 
53
- @Autowired
63
+ var session : HttpSession
54
64
 
55
- private lateinit var request: HttpServletRequest
56
-
57
-
58
-
59
- @Autowired
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