|
《spring自定义作用域实现》
9 `8 ~$ x! X1 I, j* x' j2 n% E) E, {
部分java源码:MyScope.javapackage com.javazx.po;
- F8 d/ d( K* q/ z v# l# d% d* a! b$ k% R. I V* Q
import org.springframework.beans.factory.ObjectFactory;6 [! g; U* A, A' I
import org.springframework.beans.factory.config.Scope;
+ ]( k% c; e/ l! x; o0 }8 T5 T9 z$ N9 e4 w6 p# A/ G4 {
import java.util.Map; z+ o F- |2 T) |$ b, y5 j8 J! w
import java.util.Random;
$ t5 H" o. M3 W r5 ]' Pimport java.util.concurrent.ConcurrentHashMap;" t0 p, j4 q: H+ L
5 q6 Q* Y! ^. S% g( t) \/**
9 v) _$ s% D; S# B * @author: itmrchen
! Q2 M. C* A6 p* z) N: m1 H * @Description:双例模式-自定义作用域; `. z3 B G a2 @
* @date 2019/7/30 8:59
/ N) A- N( |- V# J7 \' b; _3 A */
1 x7 n& D- a' S) b) r) B9 Tpublic class MyScope implements Scope {
7 f6 b) K/ H! ~* [2 ^1 f8 P4 U! O Map<String, Object> map1 = new ConcurrentHashMap<String, Object>(16);
) ]) L6 R% _8 v+ F( @ Map<String, Object> map2 = new ConcurrentHashMap<String, Object>(16);
! r# Y {: a( L8 L9 w: f: U4 a! [6 o; Q$ ~, B# ~: y$ a; v
public Object get(String name, ObjectFactory<?> objectFactory) {2 @3 G7 q% [* [
if (!map1.containsKey(name)) {! j7 Y. h# N8 G) N0 f
Object o = objectFactory.getObject();9 h3 D- K/ }4 R
map1.put(name, o);
# J! n# i* L4 f$ ^% n return o;
9 k' f% S% l f2 w+ X v; L }
2 B% p3 j! Y8 w' P$ z if (!map2.containsKey(name)) {
* q, f* k5 x) {+ f. c Object o = objectFactory.getObject();
* V! d4 h7 j& j% d8 E4 Q) t map2.put(name, o);
! R# F0 s& L& j+ U$ w/ f: z return o;
/ j( j; S6 P# g; r7 d" M }
0 ]( B& e% S0 l' A4 D! V( W3 v4 H int i = new Random().nextInt(2);
* c$ X% Q3 p0 R& ~6 T5 }( p if (i == 0) {
+ i0 R4 f2 C, h6 N% R- S) K) ~ return map1.get(name);
6 H4 x) G w% l( l } else {
2 j$ a$ ]8 _' W+ Z4 w return map2.get(name);
. M; O; b6 i5 o* e3 f; W& D }
/ h0 k# D4 s& V' `. O; ^; @" `; ?3 I5 G- a1 p
}
( f# s! ^; f9 O# H& h' Q7 Z9 T6 ? h9 v% U s( x @
public Object remove(String name) {
1 y9 i- c. [1 Q# p: Y0 K6 T$ A( ^$ b if (map2.containsKey(name)) {
; K* A' W [, t2 D; ^ D" I6 H, n Object o = map2.get(name);
3 N. @' w9 @$ V' {5 v+ J7 Z map2.remove(name);1 k9 B9 e% q G P
return o;, y, m: T: B+ m9 P1 Z3 [
}% {( L, I7 S9 x
if (map1.containsKey(name)) {& h) `8 d" S# w; V) w: l4 z: v
Object o = map1.get(name);9 {& V/ }, S Q* z. ^/ S6 B
map1.remove(name);
. S7 o! }0 e" T* _( _ return o;
; c3 M: e0 [& \/ a( @( Q) D }
2 N7 ]" Q: Y$ y1 |* G* q: \$ |! f, @ return null;3 ^! q# @" ?% Y5 \) Z. l: _
}
. P+ u8 k1 F5 @0 ]* ?+ r' v$ D" z5 S5 y: t: k( o1 M, }3 Q. R
public void registerDestructionCallback(String s, Runnable runnable) {$ x% v# U2 z0 u1 g& i, W
! l- }( H: l$ P& c: }8 q) h+ v
}) i: A( U- p6 M' d$ \( j) e( C
- S9 @. U3 X! c/ O$ ~. U, [% I/ H+ l
public Object resolveContextualObject(String s) {4 C( H; J3 Y. I+ v! j, l0 U$ f2 c" v
return null;& h+ v- _2 P6 B# r4 S' ^2 N0 ^: ]
}/ u1 q- C' ~' ~' Y" Q& [
( o2 M* ~* X7 K& g6 F$ r) I
public String getConversationId() {- V) q6 i) U2 ]4 V
return null;
2 p2 P8 ~4 a6 ^/ q) V; X }
T( K3 |* r3 k/ W! ^}. @) O0 V) V6 S3 P8 h! x; {
0 M0 T7 U& X: v: H% D+ cspring.xml关键代码:; }- a1 @: e0 ^ m. d
' n4 z9 a% O: i4 X<!-- 自定义作用域 -->
& A& M6 J. J! O# F, R& [<bean id="myScope" class="com.javazx.po.MyScope"/>
, k6 w- t- ?8 u$ k/ C4 x: E<bean id="simpleThreadScope" class="org.springframework.context.support.SimpleThreadScope"/>
1 j$ m9 u% b J0 G1 s<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
4 _* L1 s* W# m5 X: Y <property name="scopes">9 Z4 }1 D9 `. g( K. S
<map>
/ T+ Y/ ~1 E3 J: e$ C: e <entry key="myScope" value-ref="myScope"/>
! z2 k) r2 @0 M4 t( X <!-- spring自定义的作用域 不同线程创建新实例-->
3 X, T( l- X" D4 `: t* o/ R* W <entry key="simpleThreadScope" value-ref="simpleThreadScope"/>
/ N! t! {2 w% H# E. l9 Z+ ` </map>, E1 f* Q# m; B+ ~
</property>* O# ]: W2 t& F z& w# m$ o
</bean>
5 [) G5 o$ z# N1 t<!--<bean id="bean3" class="com.javazx.po.Bean3" scope="myScope"/>-->2 F- v3 V( h1 W/ Y- |' |
<bean id="bean3" class="com.javazx.po.Bean3" scope="simpleThreadScope"/>4 Q! h5 q: J& _/ k% a0 T: N
: Z* v: J8 v' c, t3 E7 E! O ]! N6 H) r3 d3 B* c3 j& H' f; S; J' k
github地址:https://github.com/itmrchen/springPro5 `/ Q! `& u# @; w0 ~1 ?4 Z( H h
/ n$ W* f# v7 H' K4 c6 j% }
% w5 ^6 E5 F$ P7 y) w9 g! l2 R! h/ r/ g' g
|
|