java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 19507|回复: 103

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

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

    [LV.Master]出神入化

    2061

    主题

    3719

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66587

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

    发表于 2019-7-30 10:33:16 | 显示全部楼层 |阅读模式
    《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 |; k
    import java.util.Map;
    8 `" n3 P2 m! {, s
    import java.util.Random;
    * {! H% O5 v, `6 |" G$ d5 h
    import java.util.concurrent.ConcurrentHashMap;
    0 f+ \! ]! x8 L) w% M
    5 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 x
    public 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) M
    1 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+ @, s
    github地址: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
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4488

    帖子

    8978

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4474

    帖子

    8950

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4460

    帖子

    8922

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4597

    帖子

    9196

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

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

    [LV.1]初学乍练

    0

    主题

    4514

    帖子

    9047

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4471

    帖子

    8942

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

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

    [LV.1]初学乍练

    0

    主题

    4478

    帖子

    8971

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4514

    帖子

    9030

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4510

    帖子

    9022

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-22 16:30 , Processed in 0.240079 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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