|
《spring自定义作用域实现》
! R+ |: a4 Q: G! o$ S/ c7 m# r* ?8 \. N( r# T6 W, ^1 ]5 Z! R9 [( j
部分java源码:MyScope.javapackage com.javazx.po;6 @2 A7 Q8 s' O' B
5 V9 I/ |7 s Y1 G/ u) @: O
import org.springframework.beans.factory.ObjectFactory;
4 i4 ]4 g: q+ H* m$ _- o- Bimport org.springframework.beans.factory.config.Scope;
; @ l' X* _% i; x# ]
4 k$ Q2 Y' b) O, Q$ nimport java.util.Map;6 |' n$ j7 W" ]& w
import java.util.Random;! \& H! O1 @, T* X0 u
import java.util.concurrent.ConcurrentHashMap;7 A& U4 q) y# L( R& F, P
9 Z6 \1 m7 C- K& J* S* a/**
: U, Q6 O" |# ^# T * @author: itmrchen
0 M8 r6 h- a1 u% S+ k * @Description:双例模式-自定义作用域( ?+ Q. B. U' m
* @date 2019/7/30 8:59) g' P0 }5 m2 S7 _
*/
" Z* I7 i; T- q; O, K5 upublic class MyScope implements Scope {
4 N E& ^2 w' |" \/ J Map<String, Object> map1 = new ConcurrentHashMap<String, Object>(16);" X. u! K: G! Z) v8 r. R+ ]3 k
Map<String, Object> map2 = new ConcurrentHashMap<String, Object>(16);8 N3 S* ~ ?* r% ~
# [" W H6 ~9 f- t: g- [8 ~" @ public Object get(String name, ObjectFactory<?> objectFactory) {
8 i6 r% H( U) H( ?8 Q+ d if (!map1.containsKey(name)) {
) r# q$ j' N# J( I n2 N Object o = objectFactory.getObject();
% b: O) E- i0 W1 p map1.put(name, o);: }" _( Q j. e) Y% b- E, }
return o;
+ v8 r0 Y' |( z( [ }
! b. k& M) O* }( I: X if (!map2.containsKey(name)) {
( r7 y( g0 e6 u1 ?8 Y Object o = objectFactory.getObject();% i. U U5 S; t. x4 l2 Z, z
map2.put(name, o);
) G! u' x: D* V$ J% ~! d+ Y return o; \( M* P! i8 s& I- J( n
}8 a6 [1 p0 E* s
int i = new Random().nextInt(2);& o+ k8 ^8 Z5 o9 C
if (i == 0) {4 P/ o- P3 Q7 l
return map1.get(name);/ u0 j0 ^3 @$ b! K; X" g
} else {
3 O% F0 p& E# u* G _+ a return map2.get(name);" C' C! }0 J4 O3 n8 _/ A, L
}* U" n# I; u( @
$ W) M0 c7 E' `. z2 }% v5 N, H
}
, ^( |/ b. z* r6 s+ y* v' y, v
4 @: k2 O# r" T public Object remove(String name) {. h5 F' @3 _& L& @1 A6 ^' n0 X
if (map2.containsKey(name)) {
/ R$ r& k& r: F0 a) v" _ Object o = map2.get(name);% X$ k# L5 j" n* G
map2.remove(name);
1 R4 A. q9 Z4 Z' N return o;( }" g* i6 w/ m ]
}
1 w2 R6 D6 {( r0 g- I' ~ if (map1.containsKey(name)) {
7 X( S1 q. w o$ c# @' j( [, l% f Object o = map1.get(name);- q& s9 q. Q Y
map1.remove(name);' h$ }) b) u; x1 A9 Z1 a
return o; C+ ~2 F, W3 O% s' @( @
}
+ V" g, k7 F$ H6 \" b return null;0 g0 X# y9 s, Y+ B5 }
}
! y8 _0 P, z3 f# \ n& C% C; ~+ q' D+ t- Y2 T
public void registerDestructionCallback(String s, Runnable runnable) {
6 R n9 n& u& Q4 ]2 K6 u& s; i* Z2 k+ {" E& I8 ~& R. f2 R
}
2 N' m2 o1 {% [6 U* v# m8 y2 D; P* K- d# S' W% H5 K
public Object resolveContextualObject(String s) { h9 U4 r! m& r* _ c- n7 i
return null;
& z" Q' F0 y/ t; X$ |3 K% C7 X }
$ d8 c) z4 s/ @ Y+ v* [) X0 g- i/ K c4 @
public String getConversationId() {
/ p% A+ p& i1 Q' i$ e) [; b* A return null;
+ U& h% _6 S' E% ^ }1 D& l( n M1 e4 ]
}
' L& {/ ]3 ^( Y, ]$ z3 F0 X: V0 W3 \- n- L6 F# ~8 M
spring.xml关键代码:
% J, Q, Q3 n' \, E& W; @2 v3 a9 i. d' X; U; n8 @* E
<!-- 自定义作用域 -->
. p0 c Z- \3 E* W<bean id="myScope" class="com.javazx.po.MyScope"/>& f" _6 h& [! x
<bean id="simpleThreadScope" class="org.springframework.context.support.SimpleThreadScope"/>
* F! }) D: D4 o<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
# Z4 N6 F" b2 {! R b r <property name="scopes">; E$ D' h$ T. \! I( y( j, N
<map>! o% _5 [( C, r) O
<entry key="myScope" value-ref="myScope"/>
2 Q7 A# u* V3 @+ g <!-- spring自定义的作用域 不同线程创建新实例-->
/ f8 n( J, T S4 X8 k1 ~5 t <entry key="simpleThreadScope" value-ref="simpleThreadScope"/>1 U( d2 m' x! [: z& x0 h
</map># n, r9 S. E {2 J, @+ P5 H" Y
</property>
" d0 W* d! j0 ^7 ?" L% |: D</bean>; C& H( l; J. |) x! s: G
<!--<bean id="bean3" class="com.javazx.po.Bean3" scope="myScope"/>-->
1 x; y3 I) T; s/ W<bean id="bean3" class="com.javazx.po.Bean3" scope="simpleThreadScope"/>3 [5 w& @7 e+ T! f d6 Z1 X" P
* z- n8 s% w' W2 |- |3 l
% l1 e5 G4 r3 K- Tgithub地址:https://github.com/itmrchen/springPro7 @2 j) H& Z4 r9 ^
4 J3 R. f. Y* S% j8 k( W" t# I! O: X% g) {
% r2 ]9 [2 f( Q$ g2 @0 g
|
|