YMP运行初始化步骤
, 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运行初始化步骤的更多相关文章
- [Java] 类的初始化步骤
前言 类的初始化过程,可在多线程环境下进行的,为了简化,本文介绍的单线程情况下的类初始化步骤. 此外,继承情况下的顺序不是本文焦点,本文重点在于一个类的内部字段的初始化顺序.想了解继承情况下的初始化情 ...
- linux系统初始化——文件系统初始化步骤
linux文件系统初始化步骤 System V init启动过程 概括地讲,Linux/Unix系统一般有两种不同的初始化启动方式. 1) BSD system init 2) System V in ...
- Stm32外围模块编程初始化步骤
Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...
- [Java] 类和接口的初始化步骤 - 继承方面
类和接口在初始化化时,处理继承层级的方法不一样. 类继承的初始化:通过引用 static 字段,触发某个类的初始化,则声明该字段的类,以及该类的父类被初始化. 接口继承的初始化:通过引用 static ...
- 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源
老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...
- Oracle 11g ogg单表初始化步骤
ogg单表初始化步骤 2018-06-08 14:55 296 0 原创 GoldenGate 本文链接:https://www.cndba.cn/leo1990/article/2842 1.ogg ...
- idea14导入eclipse项目并部署运行完整步骤
idea14导入eclipse项目并部署运行完整步骤 2015年05月12日 14:08:04 阅读数:40456 首先说明一下:idea里的project相当于eclipse里的workspace, ...
- Eclipse运行wordcount步骤
Eclipse运行wordcount步骤 第一步:建立工程,导入代码. 第二步:建立文件写入数据(以空格分开),并上传到hdfs上. 1.创建文件并写入数据: 2.上传hdfs 在hadoop权限下就 ...
- [UWP小白日记-1]判断APP是否是第一次运行初始化SQLITE数据库
利用应用程序设置来实现此功能. 1.首先,获取APP设置的容器: ApplicationDataContainer localSettings = ApplicationData.Current.Lo ...
随机推荐
- Linux内核配置.config文件
在命令行中,进入顶层内核目录,并输入命令make menuconfig,就可以启动一个基于菜单的内核配置编辑器.从这里开始,你可以访问每个可用的配置参数,并生成一个定制的内核配置. 当你退出配置编辑器 ...
- 安装和测试Kafka(转)
http://blog.javachen.com/2015/03/17/install-and-test-kafka/# 本文主要介绍如何在单节点上安装 Kafka 并测试 broker.produc ...
- J2EE框架知识清单
1:Struts MVC.JVC 2:struts action 3:struts 1.0和2.0区别 4:Spring 核心机制:依赖注入 5:使用Spring容器 6:AOP的概念与应用 7:IO ...
- Xamarin.Android其他类型的服务
一.前言 前面我们已经学了关于服务的很多知识,但是对于真实的开发那些远远不够,通过这节我们将学习其他类型的服务,比如前台服务.IntentService和消息服务.下面我们开始进入正题. 二.前台服务 ...
- MoveIt运动规划-1
按照帮助文档Setup Assistant Tutorial中的描述,用moveit_setup_assistant图形界面一步步配置机器人,最后生成机器人的配置文件保存到指定的文件夹中. 以UR5机 ...
- django之异常错误3(Student matching query does not exist.)
错误提示: DoesNotExist at /blog/test2/ Student matching query does not exist. 说明:错误提示说明错误在test2中,查找数据库的表 ...
- DPDK无法分出连续大页面(contiguous hugepages)的几个解决方法
在使用DPDK或者SPDK的时候,需要在进程刚启动的时候使用rte_eal_init初始化Environment Abstract Layer,应用进程会通过这个函数告诉EAL为它映射多大的hugep ...
- Hopfield神经网络和TSP问题
一.TSP问题 旅行商问题,又叫货郎担问题.它是指如下问题:在完全图中寻找一条最短的哈密尔顿回路. 哈密尔顿回路问题:给定一个图,判断图中是否存在哈密尔顿回路. 哈密尔顿回路:寻找一条回路,经过图中所 ...
- java struts2入门学习---异常处理和类型转换
一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...
- linux shell 脚本攻略学习16--wc命令详解,tree命令详解
在文本处理的工作中,统计文件的行数,单词数和字符数非常有用.而对于开发人员本身来说,统计LOC(line of code ,代码行数)是一件重要的工作.linux中有什么命令可以帮助我们做统计呢?没错 ...