java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 20500|回复: 103

【Java源码】双例模式与自定义作用域MyScope SimpleThreadScope

  [复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2090

    主题

    3748

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66756

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2019-7-30 10:33:16 | 显示全部楼层 |阅读模式
    《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 T
    5 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 ]' P
    import 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 T
    public 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
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4618

    帖子

    9238

    积分

    普通会员

    Rank: 2

    积分
    9238
    发表于 2019-12-24 18:54:39 | 显示全部楼层
    可以看看吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4598

    帖子

    9198

    积分

    普通会员

    Rank: 2

    积分
    9198
    发表于 2020-1-12 21:11:44 | 显示全部楼层
    可以下载
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4592

    帖子

    9186

    积分

    普通会员

    Rank: 2

    积分
    9186
    发表于 2020-1-30 09:10:44 | 显示全部楼层
    好好学习 天天向上
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4741

    帖子

    9484

    积分

    普通会员

    Rank: 2

    积分
    9484
    发表于 2020-2-20 07:35:04 | 显示全部楼层
    大佬  厉害呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-6-15 21:06
  • 签到天数: 1 天

    [LV.1]初学乍练

    0

    主题

    4653

    帖子

    9325

    积分

    普通会员

    Rank: 2

    积分
    9325
    发表于 2020-3-20 11:07:06 | 显示全部楼层
    佩服佩服!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4611

    帖子

    9222

    积分

    普通会员

    Rank: 2

    积分
    9222
    发表于 2020-3-25 15:33:57 | 显示全部楼层
    感谢感谢感谢感谢感谢感谢感谢感谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2015-4-27 14:30
  • 签到天数: 1 天

    [LV.1]初学乍练

    0

    主题

    4633

    帖子

    9281

    积分

    普通会员

    Rank: 2

    积分
    9281
    发表于 2020-3-28 12:03:27 | 显示全部楼层
    真的是太棒啦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4648

    帖子

    9298

    积分

    普通会员

    Rank: 2

    积分
    9298
    发表于 2020-3-31 23:42:08 | 显示全部楼层
    非常好非常好非常好非常好非常好非常好
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4636

    帖子

    9274

    积分

    普通会员

    Rank: 2

    积分
    9274
    发表于 2020-4-2 13:21:53 | 显示全部楼层
    很完美的教程!!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2025-3-26 10:40 , Processed in 1.058540 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表