|
《spring自定义作用域实现》% b) d) Y+ M7 H, U4 H% e
7 Y3 R' z1 l# n
部分java源码:MyScope.javapackage com.javazx.po;8 z( n8 K1 D, m6 _: Y
* n( z$ ~7 v- C9 [) Mimport org.springframework.beans.factory.ObjectFactory;
6 \ F& Q/ o) C7 [1 yimport org.springframework.beans.factory.config.Scope;
9 z' l0 [$ a! P* k' R
5 F/ B2 h; u5 Q' q& H: {( }import java.util.Map;& y1 @* N) j% C5 V' a' j9 ^2 b0 w& r
import java.util.Random;
' g5 }5 e x- oimport java.util.concurrent.ConcurrentHashMap;
+ ~, u' l0 U) }% U% M( b- _! O5 l' s; R, J/ s
/**# c J9 G4 L4 O- @0 t3 \/ x( B
* @author: itmrchen) U& Y# ~( F: S. R# J; T1 j2 }& B! S
* @Description:双例模式-自定义作用域
6 C V4 W6 H5 i! F* @date 2019/7/30 8:59
& d8 X" @: J5 D: i, A4 [7 U; t */* E9 x( ^5 b' [+ m3 T0 _
public class MyScope implements Scope {
3 d2 |+ m& @' H/ `& P: g Map<String, Object> map1 = new ConcurrentHashMap<String, Object>(16);
4 \8 D9 l0 _- g, l Map<String, Object> map2 = new ConcurrentHashMap<String, Object>(16);! w4 [, r/ Z# i; J5 o
9 C, z1 w; Z- E# d* c6 s2 P' q public Object get(String name, ObjectFactory<?> objectFactory) {
. u& h7 r+ A) S# ]% X if (!map1.containsKey(name)) {; B7 L9 B" \1 z d) m/ w' y
Object o = objectFactory.getObject();- i3 m" @* a% E: a) x
map1.put(name, o);
# `: R2 |# x5 d+ j return o;
' O0 q( I6 ^, O- u! T }2 N6 m0 I5 B* D: ~" @" l4 W& ?
if (!map2.containsKey(name)) {* \7 `$ s3 B$ b# s+ Z: T
Object o = objectFactory.getObject();+ B# ^/ ~& ?3 J1 \& O
map2.put(name, o);, I3 l, }. R- g; P' m8 ^. B' E
return o;
) I8 F3 T8 E( E+ d* n$ k9 H }
: ?: q! i; C2 [9 D int i = new Random().nextInt(2);& v2 q6 A, F3 r4 O% v2 ]( e3 L
if (i == 0) {+ m% R7 D3 Q' ^* H w; K' E
return map1.get(name);
, d7 I8 W$ M! R: _; \ } else {
' n! l3 q u6 w' b6 X& t return map2.get(name);
?0 x4 q) d1 E }7 u& H8 ?" E. w
6 {9 h# l+ e* j J, D/ s- w }" X+ f: D6 d7 g) n! Y4 ]" Y& H2 R" n4 ]
( |1 |, q+ y* i; `; f
public Object remove(String name) {8 I4 E! I* k9 ~5 ^# O
if (map2.containsKey(name)) {, t, T+ J6 P7 w) m# ]* B
Object o = map2.get(name);* b) e' j0 \% G: {( y
map2.remove(name);
+ @( x2 v: N3 T" f return o; M* j) M7 {" o# F
}' d( d) W, x# R8 i9 z
if (map1.containsKey(name)) {
! v8 F5 [" w% C; h" h Object o = map1.get(name);
, `$ o; a" Y- n" L& n3 U map1.remove(name);) \* d, m* p% J: z2 O: ]3 S
return o;
$ }6 v1 P2 L" X: q }6 P; M$ f6 ?1 x" o
return null;
: X4 W- l8 y/ O/ }' g( H }
3 J' w9 _3 O; h; Z' o7 w
! j) c- }; j1 S. T0 A public void registerDestructionCallback(String s, Runnable runnable) {
) m5 b J/ Q9 ?9 c3 ~( p
& s3 A& _. N7 I0 x0 [ }9 H5 a' {+ D8 Y2 S$ D o. D
$ V C! i9 m$ a6 w5 Z s public Object resolveContextualObject(String s) {5 h: j, I( W7 z0 z3 A( F2 e
return null;; z' U; F7 y; e0 n
}& q: s3 {$ L1 i; j: M2 s& r5 g" X
7 J+ h) q$ [) Z6 Y public String getConversationId() {
. m/ o7 h/ A( W6 l: Z' ?6 J return null;
& [3 W: M# [, m/ d2 M4 s }
* x* G* u$ j+ u- D}
* C' I* ]5 R3 Y9 h, w
' V6 ?3 C8 c7 K g/ dspring.xml关键代码:! X$ o$ v, y2 U7 h) C2 s) \$ Y
) k2 h G( a' A. Q& t( a2 }7 y
<!-- 自定义作用域 -->
( T: G! }6 X# H' L. }$ `<bean id="myScope" class="com.javazx.po.MyScope"/># a n5 q. t7 [! }( _. g
<bean id="simpleThreadScope" class="org.springframework.context.support.SimpleThreadScope"/>
/ v B( c U1 k7 y3 }& k<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">8 m" |0 q1 o- @+ U' `# o2 O! N! y
<property name="scopes">
2 W1 A( b' R, R4 @" z <map>- q# Y! w, `+ r# j& J& }' Z2 D
<entry key="myScope" value-ref="myScope"/>
" ]+ n ?# H% M# _0 H, i: n1 R <!-- spring自定义的作用域 不同线程创建新实例-->
8 k3 m1 Q6 I) x2 U' W3 |$ d <entry key="simpleThreadScope" value-ref="simpleThreadScope"/>
: [2 |$ e: y- @% @' B8 B1 N </map>
& w0 b1 d+ ?, d1 O- V$ }: l6 P0 s8 U </property>: g+ N; p3 d$ w/ U" f" O
</bean>
0 ]' r! k/ V, d8 w<!--<bean id="bean3" class="com.javazx.po.Bean3" scope="myScope"/>-->% f& p$ j+ _+ y Y6 K
<bean id="bean3" class="com.javazx.po.Bean3" scope="simpleThreadScope"/>* O2 k* q7 _8 S% Y& v/ m$ R
8 F, }/ w5 F/ C, o' W, K( y* o) o
- E. h6 J$ E1 |, m. }$ I4 d- Ygithub地址:https://github.com/itmrchen/springPro
% u* H3 v( a8 U! F6 }
1 h" D' {3 G4 A4 u' x* K# f' B. D4 j- T- F& S8 G& N' j
( ]' E+ t( e2 C8 o |
|