/******************************************************************************* * Copyright (c) 2010-present Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stuart McCulloch (Sonatype, Inc.) - initial API and implementation *******************************************************************************/ /** * Dynamic bean lookup across multiple injectors. * <p><p> * The {@link org.eclipse.sisu.inject.BeanLocator} lets you lookup and keep watch for bean implementations; * it does this by processing binding information from one or more {@code BindingPublisher}s, such as injectors. * <p><p> * You can add or remove {@link org.eclipse.sisu.inject.BindingPublisher}s using the {@link org.eclipse.sisu.inject.MutableBeanLocator} * view; any existing watchers or returned collections are updated to reflect the latest binding information. * <p><p> * {@link org.eclipse.sisu.inject.DefaultBeanLocator} will automatically add any injectors it's bound in by virtue * of an injected setter. This makes it easy to share across multiple injectors with a simple instance binding: * * <pre> * Module locatorModule = new AbstractModule() { * private final DefaultBeanLocator locator = new DefaultBeanLocator(); * * @Override protected void configure() { * bind( DefaultBeanLocator.class ).toInstance( locator ); * } * }; * * Injector injectorA = Guice.createInjector( new WireModule( locatorModule, spaceModuleA ) ); // adds injectorA to locator * Injector injectorB = Guice.createInjector( new WireModule( locatorModule, spaceModuleB ) ); // adds injectorB to locator</pre> * * If you want to use a {@code DefaultBeanLocator} in a given injector, but don't want that injector * added automatically, wrap the locator inside a provider to hide the injected setter from Guice: * <p><p> * <pre> * bind( DefaultBeanLocator.class ).toProvider( Providers.of( locator ) );</pre> * * By default all bindings in an injector are separated into two partitions (default vs non-default) * and ranked according to their sequence number. This is so bindings from multiple injectors can be * interleaved to keep default components prioritized before non-default, while still maintaining an * overall ordering between injectors. To override the default bind your own {@link org.eclipse.sisu.inject.RankingFunction}: * <p><p> * <pre> * bind( RankingFunction.class ).to( MyRankingFunction.class );</pre> */ package org.eclipse.sisu.inject;