|
《spring自定义作用域实现》
4 o/ d% P- u0 b: D3 t% s& Z2 f; H7 o
6 ^) \: x* o5 E' E: t4 p) g部分java源码:MyScope.javapackage com.javazx.po;
; A8 j! K- m; h: `3 q! c9 ^% P, c) N9 c
import org.springframework.beans.factory.ObjectFactory;) J: R# |- \% V% q) a2 W F
import org.springframework.beans.factory.config.Scope;
, s" D9 I! B/ y4 | m; H
0 D& M. d* C0 |; kimport java.util.Map;
8 `" n3 P2 m! {, simport java.util.Random;
* {! H% O5 v, `6 |" G$ d5 himport java.util.concurrent.ConcurrentHashMap;
0 f+ \! ]! x8 L) w% M5 C4 p4 R& R/ q4 K+ K
/**& X$ u& i( j4 l8 [2 y1 {+ O* P
* @author: itmrchen i3 Y3 N1 V1 L0 P k2 a
* @Description:双例模式-自定义作用域
1 h- T2 U( o) u r* @date 2019/7/30 8:59
2 P% `' i; Z; j% q' y# \ */
+ ]3 Z5 O7 o' H/ N7 xpublic class MyScope implements Scope {6 n# m5 r" T+ Z8 w5 [6 ?+ T
Map<String, Object> map1 = new ConcurrentHashMap<String, Object>(16);
6 R4 M* _$ f: z Map<String, Object> map2 = new ConcurrentHashMap<String, Object>(16);
7 S& P8 ], ^. o& Q1 i( v) M1 y: O$ Q' o. k6 Y8 z: d/ a7 R( h M
public Object get(String name, ObjectFactory<?> objectFactory) {& I% m3 r* r& F/ _$ m J8 Y+ g) E
if (!map1.containsKey(name)) {4 l4 k3 [0 y* S4 o* ], t7 @8 U
Object o = objectFactory.getObject();$ X$ H! y9 @: q7 t, ~, e: S& z
map1.put(name, o);
8 V, P! L n \& v& ?, L return o;
6 R7 P$ G( F4 p- B5 h3 x& e2 I }
$ c4 Q3 U1 |, F' Z1 o7 ~ if (!map2.containsKey(name)) {
, \/ x' k6 U" p1 F% v Object o = objectFactory.getObject();# n: `9 T* D8 B
map2.put(name, o);
5 ]7 _0 m/ d5 T8 X6 j3 ?1 g# W return o;
9 P' K0 t+ W+ D- ^ }
8 z" {( _! C( P6 p5 e; A int i = new Random().nextInt(2);) u) l$ r, J) k3 Q9 p Z
if (i == 0) {
3 H: R' @" a( C3 ], T/ p return map1.get(name);
- j5 F) O8 s# N" N4 w, t# ] } else {. [# T# e0 n1 r0 y G* {
return map2.get(name);
7 p, Q' B2 j9 V }: t- \2 k. Z9 k7 I7 u% D; n& D3 ?3 G
% K# O2 s( k/ W: @2 I }: d8 e* v5 J: ?2 A y% Q, x% R9 q
- I/ |: G9 u% d9 W! t& e public Object remove(String name) {! g+ e$ u' `; E7 L* V- n* H0 B" @
if (map2.containsKey(name)) {& x P! |! x. c- R7 M
Object o = map2.get(name);
9 h) ?/ c2 F5 f# x3 Z! a map2.remove(name);! d" S+ ?; O1 Z6 U9 r8 w
return o;
) V" C% y% `# T9 V7 Y }% d) A" v, P( {% Q8 t
if (map1.containsKey(name)) {
9 Q/ ~: c2 h0 r" ~& `+ u Object o = map1.get(name);
: g: H* u4 G5 \+ s map1.remove(name);6 r, Z& e& h+ u9 t# k
return o;8 \2 p" L$ {, |$ u' b! `
}
: w( }9 v. [" ~0 A- l5 s' g return null;
2 m- Y) d, w1 {8 u$ R P }: X# ]$ _; k$ i7 K0 p
" Q' [$ o$ J2 I" y9 t# _+ T
public void registerDestructionCallback(String s, Runnable runnable) {7 H; d( r, o2 p# o' C
9 S* r/ f) a& a6 _% }1 k2 d) B }+ h% v J! n4 C% P1 T3 x1 K& p, w5 Z
0 K, S& S$ I, @+ {" b& h
public Object resolveContextualObject(String s) {
2 F0 j- R1 ~) O3 _7 D: R return null;
# x& y( |. j, W }' ^/ }9 P( [6 M3 ]
& T4 m9 M1 F% d$ n3 \- p; E
public String getConversationId() {- y7 ^$ P3 @, A' I% a
return null;
5 Q4 o( p. G% |) X \ }
. X( P. F. }; p2 w6 W}
; G4 \) D0 n5 k/ U9 _
r. j: i# w% A* g/ z; j1 Nspring.xml关键代码:
+ U" R* ~6 j- \0 [+ y: n% z
) ^; O \" c) i3 m; y/ B<!-- 自定义作用域 -->
) X3 D3 ^: n/ Z. K H* P<bean id="myScope" class="com.javazx.po.MyScope"/>' I1 Z/ w* Y }% \4 V
<bean id="simpleThreadScope" class="org.springframework.context.support.SimpleThreadScope"/>8 l' ]5 w1 \* Y& X. d, _
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> a7 j# L3 ?; g2 N# a1 ^ u
<property name="scopes">
* K: l% W- L+ [8 h- i <map>
J0 M; L' D0 Q <entry key="myScope" value-ref="myScope"/>8 F3 y5 m( M Y) E9 N: C- R, e
<!-- spring自定义的作用域 不同线程创建新实例-->
' M, \; ^1 d7 a* p, j <entry key="simpleThreadScope" value-ref="simpleThreadScope"/>$ n4 A8 I( i: u. `9 r! m2 T% [
</map>
# C7 q8 Z$ {4 N0 r- e( v </property>4 P$ I f, C1 ?0 @( J* j
</bean>
* N _% u& W, L& J6 W- j<!--<bean id="bean3" class="com.javazx.po.Bean3" scope="myScope"/>-->/ i) L+ E: S/ y) _
<bean id="bean3" class="com.javazx.po.Bean3" scope="simpleThreadScope"/> V* D3 [! D5 J" u& z! l- v/ _' Z
) _4 v, H" {, M/ G
/ L2 k! ^1 y+ \. ]4 Q- i+ @, sgithub地址:https://github.com/itmrchen/springPro
) E$ _! i: s2 |% Q4 o" v; N' K( T- i/ \' Y' I, T4 A0 q
" b$ O) Y- m& V! X& S
! B M. a; s2 x
|
|