shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package com.iplatform.base.callback;
 
import com.iplatform.base.PlatformLoginCallback;
import com.iplatform.base.PlatformUserCallback;
import com.iplatform.base.SystemController;
import com.walker.infrastructure.ApplicationCallback;
import com.walker.infrastructure.ApplicationRuntimeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * 应用程序后处理器 - 回调接口的处理,启动扫描所有配置的实现类。</p>
 * 同时可以使用该对象的静态方法获取某个bean。
 * @author shikeying
 * @date 2014-11-25
 *
 */
public class PlatformCallbackPostProcessor implements BeanPostProcessor {
 
    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
 
    /** 只有单个实现的才放这里面 */
    private static final Map<Class<?>, Object> callbackReference = new java.util.HashMap<Class<?>, Object>(4);
 
    // 2023-01-26 所有回调bean对象缓存,无论单个或多个实现类型。
    private static final Map<String, Object> multipleCallbackBeans = new HashMap<>(8);
 
    // 这里是系统支持的回调接口定义,后续开发会在这里添加新的。
    private List<Class<?>> callbackList = Arrays.asList(PlatformUserCallback.class
            , PlatformLoginCallback.class, UserProfileCallback.class, AfterLoginCallback.class
            , SecurityCallback.class);
 
    // 2023-03-10 集中初始化 <code>SystemController</code> 中的一些通用bean
    private List<SystemController> systemControllerList = new ArrayList<>(64);
 
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(ApplicationCallback.class.isAssignableFrom(bean.getClass())){
            String beanClazzName = bean.getClass().getName();
            Object existBean = null;
            for(Class<?> callbackClazz : callbackList){
                if(callbackClazz.isAssignableFrom(bean.getClass())){
                    if(((ApplicationCallback) bean).supportMultiple()){
                        multipleCallbackBeans.put(beanClazzName, bean);
                    } else {
                        existBean = callbackReference.get(callbackClazz);
                        if(existBean != null){
                            throw new ApplicationRuntimeException("...... 回调实现类已经加载,不能重复配置: " + existBean.getClass().getName());
                        }
                        callbackReference.put(callbackClazz, bean);
                    }
                    logger.info("加载了'CallbackBean'=" + beanClazzName);
                }
            }
        }
        else if(SystemController.class.isAssignableFrom(bean.getClass())){
            // 2023
//            logger.debug("+++++++++++++ 找到一个 SystemController = {}", bean.getClass().getName());
            this.systemControllerList.add((SystemController)bean);
        }
        return bean;
    }
 
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
 
    /**
     * 返回给定的回调实现bean,如果不存在返回<code>null</code>
     * @param callbackClass 如: PlatformUserCallback.class
     * @return
     */
    public static final <T> T getCallbackObject(Class<T> callbackClass){
        if(callbackClass == null){
            return null;
        }
        Object bean = callbackReference.get(callbackClass);
        if(bean != null){
            return (T)bean;
        }
        return null;
    }
 
    /**
     * 根据给定bean实现类型,返回具体的回调对象。<p></p>
     * 例如: PlatformLoginCallback会存在多个实现。
     * @param callbackBean 给定的类型,如: WebLoginCallback.class
     * @return
     * @param <T>
     * @date 2023-01-26
     */
    public static final <T> T getCallbackMultipleBean(Class<T> callbackBean){
        if(callbackBean == null){
            return null;
        }
        Object bean = multipleCallbackBeans.get(callbackBean.getName());
        if(bean != null){
            return (T)bean;
        }
        return null;
    }
 
    /**
     * 返回系统收集到的 <code>SystemController</code> 对象集合。
     * @return
     * @date 2023-03-10
     */
    public List<SystemController> getSystemControllerList(){
        return this.systemControllerList;
    }
}