, Version.VersionType.Release);

    private static final Log _LOG = LogFactory.getLog(YMP.class);

    private static final String __YMP_BASE_PACKAGE = "net.ymate.platform";

    private static final YMP __instance = new YMP(ConfigBuilder.system().build());

    private IConfig __config;

    private boolean __inited;

    private IBeanFactory __moduleFactory;

    private IBeanFactory __beanFactory;

    private IProxyFactory __proxyFactory;

    private Map<Class<? extends IModule>, IModule> __modules;

    private Events __events;

 /**     * @return 返回默认YMP框架核心管理器对象实例,若未实例化或已销毁则重新创建对象实例     */ public static YMP get() {        return __instance; }

    /**     * 构造方法     *     * @param config YMP框架初始化配置     */ public YMP(IConfig config) {        __config = config; }

    private void __registerScanPackages(IBeanFactory factory) {        factory.registerPackage(__YMP_BASE_PACKAGE);        for (String _packageName : __config.getAutoscanPackages()) {            factory.registerPackage(_packageName); }    }

    /**     * 初始化YMP框架     *     * @return 返回当前YMP核心框架管理器对象     * @throws Exception 框架初始化失败时将抛出异常     */ public YMP init() throws Exception {        if (!__inited) {            // _LOG.info(" http://www.ymate.net/"); // StopWatch _watch = new StopWatch(); _watch.start(); // _LOG.info("Initializing ymate-platform-core-" + VERSION + " - debug:" + __config.isDevelopMode());

 // 初始化I18N I18N.initialize(__config.getDefaultLocale(), __config.getI18NEventHandlerClass()); // 初始化事件管理器,并注册框架、模块事件 __events = Events.create(new DefaultEventConfig(__config.getEventConfigs())); __events.registerEvent(ApplicationEvent.class); __events.registerEvent(ModuleEvent.class); // 创建根对象工厂 __beanFactory = new DefaultBeanFactory(); __beanFactory.setLoader(new DefaultBeanLoader(__config.getExcudedFiles())); __beanFactory.registerHandler(Bean.class); // 创建模块对象引用集合 __modules = new HashMap<Class<? extends IModule>, IModule>(); // 创建模块对象工厂 __moduleFactory = new BeanFactory(this); __moduleFactory.setLoader(new DefaultBeanLoader(__config.getExcudedFiles())); __moduleFactory.registerHandler(Module.class, new ModuleHandler(this)); __moduleFactory.registerHandler(Proxy.class, new ProxyHandler(this)); __moduleFactory.registerHandler(EventRegister.class, new EventRegisterHandler(this)); // 设置自动扫描应用包路径 __registerScanPackages(__moduleFactory); __registerScanPackages(__beanFactory); // 创建代理工厂并初始化 __proxyFactory = new DefaultProxyFactory(this).registerProxy(new InterceptProxy()); // 初始化根对象工厂 __moduleFactory.init();            for (IModule _module : __modules.values()) {                if (!_module.isInited()) {                    _module.init(this); // 触发模块初始化完成事件 __events.fireEvent(new ModuleEvent(_module, ModuleEvent.EVENT.MODULE_INITED)); }            }            // 初始化对象工厂 __beanFactory.init(); // 初始化对象代理 __beanFactory.initProxy(__proxyFactory); // IoC依赖注入 __beanFactory.initIoC(); // __inited = true; // _watch.stop(); _LOG.info("Initialization completed, Total time: " + _watch.getTime() + "ms"); // 触发框架初始化完成事件 __events.fireEvent(new ApplicationEvent(this, ApplicationEvent.EVENT.APPLICATION_INITED)); }        return this; }

    /**     * 销毁YMP框架     *     * @throws Exception 框架销毁失败时将抛出异常     */ public void destroy() throws Exception {        if (__inited) {            // 触发框架销毁事件 __events.fireEvent(new ApplicationEvent(this, ApplicationEvent.EVENT.APPLICATION_DESTROYED)); // __inited = false; // 销毁所有已加载模块 for (IModule _module : __modules.values()) {                // 触发模块销毁事件 __events.fireEvent(new ModuleEvent(_module, ModuleEvent.EVENT.MODULE_DESTROYED)); // _module.destroy(); }            __modules = null; // 销毁代理工厂 __proxyFactory = null; // 销毁根对象工厂 __moduleFactory.destroy(); __moduleFactory = null; // __beanFactory.destroy(); __beanFactory = null; // 销毁事件管理器 __events.destroy(); }    }

    /**     * @return 返回当前配置对象     */ public IConfig getConfig() {        return __config; }

    /**     * @return 返回YMP框架是否已初始化     */ public boolean isInited() {        return __inited; }

    /**     * 注册自定义注解类处理器,重复注册将覆盖前者     *     * @param annoClass 自定义注解类型     * @param handler   注解对象处理器     */ public void registerHandler(Class<? extends Annotation> annoClass, IBeanHandler handler) {        if (annoClass.equals(Module.class) || annoClass.equals(Proxy.class) || annoClass.equals(EventRegister.class)) {            _LOG.warn("Handler [" + annoClass.getSimpleName() + "] duplicate registration is not allowed");            return; }        __beanFactory.registerHandler(annoClass, handler); }

    public void registerHandler(Class<? extends Annotation> annoClass) {        registerHandler(annoClass, IBeanHandler.DEFAULT_HANDLER); }

    /**     * 注册排除的接口类     *     * @param excludedClass 预排除的接口类型     */ public void registerExcludedClass(Class<?> excludedClass) {        __beanFactory.registerExcludedClass(excludedClass); }

    /**     * 注册类     *     * @param clazz 目标类     */ public void registerBean(Class<?> clazz) {        __beanFactory.registerBean(clazz); }

    public void registerBean(Class<?> clazz, Object object) {        __beanFactory.registerBean(clazz, object); }

    public void registerBean(BeanMeta beanMeta) {        __beanFactory.registerBean(beanMeta); }

    /**     * @param <T>   返回类型     * @param clazz 接口类型     * @return 提取类型为clazz的对象实例     */ public <T> T getBean(Class<T> clazz) {        return __beanFactory.getBean(clazz); }

    /**     * 向工厂注册代理类对象     *     * @param proxy 目标代理类     */ public void registerProxy(IProxy proxy) {        __proxyFactory.registerProxy(proxy); }

    public void registerProxy(Collection<? extends IProxy> proxies) {        __proxyFactory.registerProxy(proxies); }

    /**     * 注册模块实例(此方法仅在YMP框架核心管理器未初始化前有效)     *     * @param module 目标模块     */ public void registerModule(IModule module) {        if (!__inited) {            if (module != null) {                __moduleFactory.registerBean(module.getClass(), module); __modules.put(module.getClass(), module); }        }    }

    /**     * @param moduleClass 模块类型     * @param <T>         模块类型     * @return 获取模块类实例对象     */ public <T extends IModule> T getModule(Class<T> moduleClass) {        return __moduleFactory.getBean(moduleClass); }

    /**     * @return 获取事件管理器     */ public Events getEvents() {        return __events; }

    /**     * @param targetFactory 目标对象工厂     * @param <T>           对象工厂类型     * @return 将目标对象工厂的Parent设置为当前YMP容器的对象工厂     */ public <T extends IBeanFactory> T bindBeanFactory(T targetFactory) {        targetFactory.setParent(__beanFactory);        return targetFactory; }

    /**     * YMP框架根对象工厂类     */ private static class BeanFactory extends DefaultBeanFactory {        private final YMP __owner;

        public BeanFactory(YMP owner) {            this.__owner = owner; }

        @Override public <T> T getBean(Class<T> clazz) {            T _bean = super.getBean(clazz); // 重写此方法是为了在获取模块对象时始终保证其已被初始化 if (_bean instanceof IModule) {                IModule _module = (IModule) _bean;                if (!_module.isInited()) {                    if (__owner.getConfig().getExcludedModules().contains(_module.getName())) {                        return null; }                    try {                        _module.init(__owner); // 触发模块初始化完成事件 __owner.getEvents().fireEvent(new ModuleEvent(_module, ModuleEvent.EVENT.MODULE_INITED)); } catch (Exception e) {                        throw new RuntimeException(RuntimeUtils.unwrapThrow(e)); }                }            }            return _bean; }    }}

YMP运行初始化步骤的更多相关文章

  1. [Java] 类的初始化步骤

    前言 类的初始化过程,可在多线程环境下进行的,为了简化,本文介绍的单线程情况下的类初始化步骤. 此外,继承情况下的顺序不是本文焦点,本文重点在于一个类的内部字段的初始化顺序.想了解继承情况下的初始化情 ...

  2. linux系统初始化——文件系统初始化步骤

    linux文件系统初始化步骤 System V init启动过程 概括地讲,Linux/Unix系统一般有两种不同的初始化启动方式. 1) BSD system init 2) System V in ...

  3. Stm32外围模块编程初始化步骤

    Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...

  4. [Java] 类和接口的初始化步骤 - 继承方面

    类和接口在初始化化时,处理继承层级的方法不一样. 类继承的初始化:通过引用 static 字段,触发某个类的初始化,则声明该字段的类,以及该类的父类被初始化. 接口继承的初始化:通过引用 static ...

  5. 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源

    老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...

  6. Oracle 11g ogg单表初始化步骤

    ogg单表初始化步骤 2018-06-08 14:55 296 0 原创 GoldenGate 本文链接:https://www.cndba.cn/leo1990/article/2842 1.ogg ...

  7. idea14导入eclipse项目并部署运行完整步骤

    idea14导入eclipse项目并部署运行完整步骤 2015年05月12日 14:08:04 阅读数:40456 首先说明一下:idea里的project相当于eclipse里的workspace, ...

  8. Eclipse运行wordcount步骤

    Eclipse运行wordcount步骤 第一步:建立工程,导入代码. 第二步:建立文件写入数据(以空格分开),并上传到hdfs上. 1.创建文件并写入数据: 2.上传hdfs 在hadoop权限下就 ...

  9. [UWP小白日记-1]判断APP是否是第一次运行初始化SQLITE数据库

    利用应用程序设置来实现此功能. 1.首先,获取APP设置的容器: ApplicationDataContainer localSettings = ApplicationData.Current.Lo ...

随机推荐

  1. 微软BI 之SSRS 系列 - 报表中分组聚合中处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号)

    分组聚合的展开和收起效果在SSRS Report中非常常用,并且有时还要处理一些比较特别的情况.比如分组合并时有的层次结构是不规则的,有的组有两层,遇到这种情况应该如何处理?   注意到下面的这个需求 ...

  2. PASCAL知识

    API Index http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delph ...

  3. Codeforces Round #310 (Div. 1) B. Case of Fugitive(set二分)

    B. Case of Fugitive time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  4. NameNode重新格式化以后DataNode不能启动

    最近重新格式化NameNode以后,发现几个DataNode都不能启动了. 这是因为dfs.name.dir路径下面有一个current/VERSION文件,里面有一个clusterID,重新格式化以 ...

  5. hdu4403A very hard Aoshu problem 线段树

    //给一个长度为大于2小于15的字符串 //在当中间加'+'或'='使得其成为一个等式的方法的个数 //枚举等号位置.暴力搜索加号加的位置 #include<cstdio> #includ ...

  6. 算法笔记_220:猜算式(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个 三位数. 如果没有限定条件,这样的例子很多. 但 ...

  7. C# delegate (1)

    delegate是委托,本身不能解决跨线程访问控件的问题,直接调用委托还是会报错 Invoke指定用主线程中的控件去调用这个委托,相当于主线程来执行这个函数 在codeProject网站中找到的. C ...

  8. Keepalived系列一:Keepalived.conf 详解

    接上一篇博客: http://www.cnblogs.com/xiaoit/p/4499703.html 1:按照上篇博客安装后的配置文件在 /usr/local/etc/keepalived/kee ...

  9. MongoDB numa系列问题一:[initandlisten] connection refused because too many open connections:

    1:Mongod日志有很多这样的报错: [initandlisten] connection refused because too many open connections: 2:查看系统的限制 ...

  10. Linux文件与目录操作

    1:目录操作指令 cd :切换目录 pwd:显示当前目录 mkdir:创建一个新目录 rmdir:删除一个空的目录rmdir -r:删除一个非空目录 . :此层目录 .. :上层目录 -:前一个工作目 ...