|
《spring自定义作用域实现》
5 m5 I4 [8 T+ h9 e! g
2 W2 m" [ ^- K+ U# x8 z% \; U0 [部分java源码:MyScope.javapackage com.javazx.po; R, S1 T8 |& G3 g/ H
/ L; P$ w& B5 ]4 gimport org.springframework.beans.factory.ObjectFactory;5 u' r' k, j. w6 c7 R7 y5 N
import org.springframework.beans.factory.config.Scope;
! m# }+ S- z. V+ B& p/ d# c8 A" `% L. `3 y7 }7 v9 R
import java.util.Map;4 d. Z# H- \ O& r1 o6 [4 r
import java.util.Random;
, @: S" K2 |! }# c- m Rimport java.util.concurrent.ConcurrentHashMap;
" P: F4 A( O+ h2 E
: f5 ~1 B( I( r: Q$ q7 X. Z3 s/**
+ v, Y6 o' }% ^ * @author: itmrchen: i7 B& l* U7 n$ k. S4 h. i3 s
* @Description:双例模式-自定义作用域
* X b. o* d$ r) t) ~" k% X* @date 2019/7/30 8:59
7 r4 h" \* M5 F5 L" T; f */# t0 @# G8 e& A* q0 I
public class MyScope implements Scope {' N6 e5 }, w3 e3 u
Map<String, Object> map1 = new ConcurrentHashMap<String, Object>(16);% _( h3 H" @' |
Map<String, Object> map2 = new ConcurrentHashMap<String, Object>(16);5 [. v" D3 J, ^7 D. W3 P
" p4 ]6 q7 i4 e/ M
public Object get(String name, ObjectFactory<?> objectFactory) {
) B$ _; j# H7 p5 n4 k0 {" }8 e) I if (!map1.containsKey(name)) {
$ q+ s! S5 z4 w( k( x Object o = objectFactory.getObject();
+ H. `5 J& t8 P: R1 B( r- L map1.put(name, o);- Y. U9 B+ @6 E4 K
return o;
2 [; V1 m3 y' f$ a, \+ X' B/ | }
5 ~' [ }: D6 _/ D9 y' k5 L2 d% h if (!map2.containsKey(name)) {- S# B/ B- |5 a' O, P
Object o = objectFactory.getObject();0 V2 H0 a9 F- J/ e2 e S9 z
map2.put(name, o);3 b9 H" {; n K( t3 ]
return o;+ y0 U! h+ ]* X' R! z# D
}
2 d, N7 Q5 N* u/ L& W/ Y) { int i = new Random().nextInt(2);
! q) Q3 A L( c, [ if (i == 0) {
; }8 O' ]! h9 ` return map1.get(name);
# y/ K" |& ^' {- y/ b4 J- d } else {
: E; `" _8 ]+ X& S$ P/ _ return map2.get(name);
8 P' [+ v' m% r }$ N" R* R M; H r- w$ ?$ U8 G
2 [: x K4 a' z3 Q$ H& E" W' S8 x }
3 t6 [( e" {) h& J- |) k" h# d7 e! x
/ j8 q( d" f2 i5 ~ public Object remove(String name) {% N: X# v) @. k+ m) n7 c1 D
if (map2.containsKey(name)) {
: H& w" I# r" N; W Object o = map2.get(name);' Z, d" I2 ?/ t' r: V6 n
map2.remove(name);3 q# n& Y% Z" J; v' E& d* R
return o;
% T: L" ^1 }; i }
% i T2 R3 o+ c) q1 x if (map1.containsKey(name)) {! S" }8 l7 ~, t" ~2 Z, g9 {
Object o = map1.get(name);
6 B8 e$ u% s- _ ^" ^, d: ~: O map1.remove(name);8 W1 c0 V8 C4 y& X9 f/ m5 Y) b, V" Y
return o;
" Y% k0 [5 V' O }
1 _( e8 e& x- T1 c/ t, N; I return null;
9 O. C4 k5 F0 c }% Z2 L, \' m- u9 m. G* P4 l" u
% z) D2 n) b. j8 T public void registerDestructionCallback(String s, Runnable runnable) {, X1 [6 o3 g4 o' D9 N7 q
) u& j* n+ I* g# l( M" o }( e2 E# ]" M, h. i. ]3 A
6 T- K& m! w+ a* M# b public Object resolveContextualObject(String s) {
( }7 B Z4 a: d% N8 S return null;
# o/ m- s! y% P0 M4 m: X }
1 g# R: u8 E P* ~' \
m- o8 t0 q5 r2 }0 x& m/ c public String getConversationId() {' p! @# r ]) [* B* K5 q
return null;
! x- b6 A5 C' q4 ~$ C! y }# S4 y8 i9 c+ L8 u) R; z
}, i! w a ?9 e: t3 \$ c
+ ?4 P2 o }2 X0 P' _spring.xml关键代码:% m( v, z9 {2 Z- }' u
# Y5 \5 f6 i+ ^<!-- 自定义作用域 -->
7 a- e& ~/ ]& o) x<bean id="myScope" class="com.javazx.po.MyScope"/>1 ], P% t$ I- {" f( s
<bean id="simpleThreadScope" class="org.springframework.context.support.SimpleThreadScope"/>
; h1 d4 m& m( Z( J; W ~3 j3 \<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
6 ~" w$ A |4 s5 T <property name="scopes">
: D% A0 x8 L) O9 v' S <map>* @5 w4 S) v: Z8 q% m6 D
<entry key="myScope" value-ref="myScope"/>
& F( [3 E9 f' Q2 C <!-- spring自定义的作用域 不同线程创建新实例-->6 `2 S4 h- m- r( G- f$ t
<entry key="simpleThreadScope" value-ref="simpleThreadScope"/>4 F }+ A3 [ Q6 [0 H5 P% Z& ?& k
</map>" Z6 `2 i4 _2 s5 t
</property>6 ]+ x. ]5 N9 W) T9 L2 E! B
</bean>
d |. e4 h$ u4 r<!--<bean id="bean3" class="com.javazx.po.Bean3" scope="myScope"/>-->
6 V" ^* H8 N- [1 V, n, P) c<bean id="bean3" class="com.javazx.po.Bean3" scope="simpleThreadScope"/>) _- N! d6 |8 M% v3 x1 g
% M0 p8 Z$ A: ~# ^/ I
S( V& ~: p4 {. L' D! b( ?! O, Dgithub地址:https://github.com/itmrchen/springPro- s" F% M9 v; @
. l: E. Y; R( F6 I
) M, z3 u( ?! o$ u1 j" i, q% q/ F/ s" ?( A/ d6 W
|
|