SpiderMonitor { public synchronized SpiderMonitor register(Spider... spiders) throws JMException { for (Spider spider : spiders) { MonitorSpiderListener monitorSpiderListener = new MonitorSpiderListener(); if (spider.getSpiderListeners() == null) { List<SpiderListener> spiderListeners = new ArrayList<SpiderListener>(); spiderListeners.add(monitorSpiderListener); spider.setSpiderListeners(spiderListeners); } else { spider.getSpiderListeners().add(monitorSpiderListener); } SpiderStatusMXBean spiderStatusMBean = getSpiderStatusMBean(spider, monitorSpiderListener); registerMBean(spiderStatusMBean); spiderStatuses.add(spiderStatusMBean); } return this; } protected  SpiderMonitor(); synchronized SpiderMonitor register(Spider... spiders); static SpiderMonitor instance();  }
@Test public void testInherit() throws Exception { SpiderMonitor spiderMonitor = new SpiderMonitor(){ @Override protected SpiderStatusMXBean getSpiderStatusMBean(Spider spider, MonitorSpiderListener monitorSpiderListener) { return new CustomSpiderStatus(spider, monitorSpiderListener); } }; Spider zhihuSpider = Spider.create(new ZhihuPageProcessor()) .addUrl("http: Spider githubSpider = Spider.create(new GithubRepoPageProcessor()) .addUrl("https: spiderMonitor.register(zhihuSpider, githubSpider); }