Gradle中ListenerManager的初始化流程
来源:互联网 发布:网络综合布线施工要求 编辑:程序博客网 时间:2024/05/16 05:55
接口实现 public void addListener(Object listener) { //interface 1 synchronized (lock) { if (allListeners.add(listener)) { for (BroadcastDispatch<?> broadcaster : dispatchers.values()) { maybeAddToDispatcher(broadcaster, listener); } } } }------------------------------------------------------------------------------public void useLogger(Object logger) {//interface 2 synchronized (lock) { if (allLoggers.add(logger)) { for (LoggerDispatch dispatch : loggers.values()) { dispatch.maybeSetLogger(logger); } } } }--------------------------------------------------------------------------------public <T> T getBroadcaster(Class<T> listenerClass) {//interface 3 return getBroadcasterInternal(listenerClass).getSource(); }private <T> ListenerBroadcast<T> getBroadcasterInternal(Class<T> listenerClass) { synchronized (lock) { ListenerBroadcast<T> broadcaster = broadcasters.get(listenerClass); if (broadcaster == null) { broadcaster = new ListenerBroadcast<T>(listenerClass);//Add dispatch object into broadcaster's handlers queue. broadcaster.add(getLogger(listenerClass)); broadcaster.add(getDispatcher(listenerClass)); if (parent != null) { broadcaster.add(parent.getDispatcher(listenerClass)); } broadcasters.put(listenerClass, broadcaster); } return broadcaster; } }private LoggerDispatch getLogger(Class<?> listenerClass) { synchronized (lock) { LoggerDispatch dispatch = loggers.get(listenerClass); if (dispatch == null) { dispatch = new LoggerDispatch(listenerClass, parent == null ? null : parent.getLogger(listenerClass));
<span style="white-space:pre"></span>//when called by parent, the dispatch.dispath is null, but the 'allLoggers' is not, so it try to assign a value to dispath.dispatch by calling maybeSetLogger function for (Object logger : allLoggers) { dispatch.maybeSetLogger(logger); } loggers.put(listenerClass, dispatch); } return dispatch; } } private LoggerDispatch(Class<?> type, LoggerDispatch parentDispatch) { this.type = type; this.dispatch = parentDispatch; }//1.In org.gradle.initialization DefaultGradleLauncherFactory.java//The constructor of DefaultGradleLauncherFactory // Register default loggers ListenerManager listenerManager = sharedServices.get(ListenerManager.class); buildProgressLogger = new BuildProgressLogger(sharedServices.get(ProgressLoggerFactory.class));//interface 1, 'allListeners' is empty, and only add item to Set<>, do nothing else. listenerManager.addListener(new BuildProgressFilter(buildProgressLogger));//interface 2, 'allLoggers' is empty, and only add item to Set<>, do nothing else listenerManager.useLogger(new DependencyResolutionLogger(sharedServices.get(ProgressLoggerFactory.class)));//2. Same package, DefaultGradleLauncherFactory.java//doNewInstance function//小插曲,调用了一下函数 from BuildScopeServies::createListenerManager/*public ListenerManager createChild() {return new DefaultListenerManager(this);}*///Then the 'listenerManager' is a totally new object, //and the one before becomes its 'parent'ListenerManager listenerManager = serviceRegistry.get(ListenerManager.class); //this hooks up the ListenerManager and LoggingConfigurer so you can call Gradle.addListener() with a StandardOutputListener.//Interface 3, 'broadcasters' map is empty , then new an ListenerBroadcast object 'broadcaster'//In 'getLogger', the 'loggers' is empty, //in new LoggerDispatch, it will call parent.getLogger first (递归), parent's loggers is empty //so parent listenerManager will return a LoggerDispatch object, with 'dispatch' null, and put it into parent's loggers queue.//To son's turn, the new LoggerDispatch will be an object with 'dispatch' point to the object returned from parent.//Parent.loggers.values constains a value of DefaultListenerManager$LoggerDispatch (id=196), its dispatch is null//this.loggers.values constains value of DefaultListenerManager$LoggerDispatch, it's dispatch var member is also a DefaultListenerManager$LoggerDispatch//with id=196, so the parent/child chain is made loggingManager.addStandardOutputListener(listenerManager.getBroadcaster(StandardOutputListener.class));
执行完
listenerManager.getBroadcaster(StandardOutputListener.class)以后,listenerManager 和它的parent的成员结构大致如下, 数字是调试时候的id
0 0
- Gradle中ListenerManager的初始化流程
- java中对象的初始化流程
- 应用程序的初始化流程
- Android的初始化流程
- java的初始化流程
- DispatcherServlet的初始化流程
- Linux中console初始化流程
- 2410的初始化流程(设备初始化)
- Struts框架的初始化流程
- SD卡的初始化流程
- Android系统的初始化流程
- Java类的初始化流程
- irq-proc的初始化流程
- SD卡的初始化流程
- Android系统的初始化流程
- SD卡的初始化流程
- Spring DispatcherServlet的初始化流程
- spring的应用初始化流程
- 508 - Morse Mismatches
- 黑马程序员——java中的多线程(二)
- linux下minicom和USB转串口
- OC语言(七)Block复习
- C++ STL 算法:复制元素
- Gradle中ListenerManager的初始化流程
- js模式
- Linux使用curl访问https站点时报错汇总
- JSP学习笔记(一):JSP基础
- log4j配置文件 mybaits怎么在控制台打印出sql语句
- MarkDown中一键贴图 for Mac
- 把相同的精灵装上车——使用CCSpriteBatchNode优化
- Observer观察者模式
- 技术揭秘12306改造(一):建立可伸缩扩展的云应用平台