YMP运行初始化步骤

/* * Copyright 2007-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package net.ymate.platform.core;

import net.ymate.platform.core.beans.BeanMeta;import net.ymate.platform.core.beans.IBeanFactory;import net.ymate.platform.core.beans.IBeanHandler;import net.ymate.platform.core.beans.annotation.Bean;import net.ymate.platform.core.beans.annotation.Proxy;import net.ymate.platform.core.beans.impl.DefaultBeanFactory;import net.ymate.platform.core.beans.impl.DefaultBeanLoader;import net.ymate.platform.core.beans.impl.proxy.DefaultProxyFactory;import net.ymate.platform.core.beans.intercept.InterceptProxy;import net.ymate.platform.core.beans.proxy.IProxy;import net.ymate.platform.core.beans.proxy.IProxyFactory;import net.ymate.platform.core.event.Events;import net.ymate.platform.core.event.annotation.EventRegister;import net.ymate.platform.core.event.impl.DefaultEventConfig;import net.ymate.platform.core.handle.EventRegisterHandler;import net.ymate.platform.core.handle.ModuleHandler;import net.ymate.platform.core.handle.ProxyHandler;import net.ymate.platform.core.i18n.I18N;import net.ymate.platform.core.module.IModule;import net.ymate.platform.core.module.ModuleEvent;import net.ymate.platform.core.module.annotation.Module;import net.ymate.platform.core.support.ConfigBuilder;import net.ymate.platform.core.util.RuntimeUtils;import org.apache.commons.lang.time.StopWatch;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;

import java.lang.annotation.Annotation;import java.util.Collection;import java.util.HashMap;import java.util.Map;

/** * YMP框架核心管理器 * * @author 刘镇 ([email protected]) on 2012-12-23 下午5:52:44 * @version 1.0 */public class YMP {

    public static final Version VERSION = new Version(2, 0, 1, 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; }    }}
时间: 2024-08-09 11:26:51

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

[Java] 类的初始化步骤

前言 类的初始化过程,可在多线程环境下进行的,为了简化,本文介绍的单线程情况下的类初始化步骤. 此外,继承情况下的顺序不是本文焦点,本文重点在于一个类的内部字段的初始化顺序. "初始化" 一词,专门针对一个类而言.一个实例被创建过程中,实例字段被初始赋值,不称为初始化,而是直接称作实例的创建,以示区分. 正文 类的初始化,包括静态代码块的初始化.静态字段(类的字段)的初始化. 类的初始化触发条件: 1) T 是一个类,且 T 的一个实例被创建. 2) T 的一个静态方法被调用 3) T

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

类和接口在初始化化时,处理继承层级的方法不一样. 类继承的初始化:通过引用 static 字段,触发某个类的初始化,则声明该字段的类,以及该类的父类被初始化. 接口继承的初始化:通过引用 static 字段,触发某个接口的初始化,则声明该字段的接口会被初始化,但该接口的父接口不会被初始化. 想了解其他触发类初始化的方法,可参看另一篇博文 类的初始化步骤 . 注意一点,接口字段全部隐式地被修饰为 public, static, final .因此,所有的接口字段实际上都是 static 的,无论有

Eclipse运行wordcount步骤

Eclipse运行wordcount步骤 第一步:建立工程,导入代码. 第二步:建立文件写入数据(以空格分开),并上传到hdfs上. 1.创建文件并写入数据: 2.上传hdfs 在hadoop权限下就行: 命令: hadoop  fs  -put  新建的文件路径          input目录 如:  hadoop  fs -put /home/hadoop/input/text03  input 查看hdfs 所有文件 命令:hadoop fs  -ls  input 上传成功后,在ecl

2015.12.01 vim编写程序运行的步骤 Xcode基本介绍(快捷键) C语言中的变量

文本编辑器 Windows:TurboC.Dev-C++ Linux:Vim.Emacs (Vim是Mac系统自带,也是今天用到的文本编辑器) Vim · 创建文件(Terminal中完成) vim printName.c(.c为结尾是C语言的标志) vim有两种模式:命令模式 & 编辑模式 在命令模式下输入i(a)就可以进入编辑模式(编辑模式的标志是在编辑器下方显示"INSERT") (操作方式在上一篇) (P.S."#include"导入自己定义或者系统

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

利用应用程序设置来实现此功能. 1.首先,获取APP设置的容器: ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 由于获取容器的时候并没有给key为FirestStart的赋值,所以下面就直接判断是不是为null,为null就是第一次运行APP, 然后在else里给key为FirestStart的赋值,那么else的代码就只能执行一次了.当然以后在UI上可以添加一个switchButt

Windows下用cmd命令实例讲解yii2.0在php命令行中运行的步骤

Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等,资源放在Web可访问的目录下,直接被Web服务器调用. 有时候有些功能需要做到计划任务中去,因此就需要yii能用php命令去执行.yii2.0是支持php命令行运行的,操作方法如下: 在yii根目录下面有个"yii"文件(不是"yii.bat"),这个文件就是入口.然后"commands"目录下会默认有个"HelloController.ph

hibernate_基本配置和初始化步骤

1.hibernate使用步骤: 1)创建hibernate配置文件 2)创建持久化类 3)创建对象-关系映射 4)通过hibernate api编写访问数据库的代码 2.eclipse导入jar包: 偏好设置->java ->build path ->user libraries ->new 新建library并导入jar包 ->config build path ->add library ->user library选择刚才新建的libriry 3.hibe

IDEA导入eclipse项目并部署运行完整步骤(转发)

首先说明一下:idea里的project相当于eclipse里的workspace,而idea里的modules相当于eclipse里的project 1.File-->Import Project  在弹出的对话框里选择要导入的项目 2.选择ok,在弹出的对话框选择Import Project from External Model,并选择下面的eclipse 3.点击next,一直点击到finish就行. 4.加载成功后会出现一些错误 点击fix it 上面2个取消选择就可以了 5.点击项目

第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 事件源代表要注入系统的命令事件数据是从哪里过来的.这一小节我们不会对事件源的实现进行深入的分析,因为下一章会做这个事情.这里大家对事件源有个基本概念就足够了. 对Monkey来说,事件的来源可以有多个地方,比如我们用它