All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.inject.internal.ConstructorInjectorStore Maven / Gradle / Ivy

package com.google.inject.internal;

import com.google.inject.spi.InjectionPoint;

/**
 * Constructor injectors by type.
 */
final class ConstructorInjectorStore {
    private final InjectorImpl injector;

    private final FailableCache> cache =
            new FailableCache<>() {
        @Override
        protected ConstructorInjector create(InjectionPoint constructorInjector, Errors errors)
                throws ErrorsException {
            return createConstructor(constructorInjector, errors);
        }
    };

    ConstructorInjectorStore(InjectorImpl injector) {
        this.injector = injector;
    }

    /**
     * Returns a new complete constructor injector with injection listeners registered.
     */
    public ConstructorInjector get(InjectionPoint constructorInjector, Errors errors)
            throws ErrorsException {
        return cache.get(constructorInjector, errors);
    }

    /**
     * Purges an injection point from the cache. Use this only if the cache is not actually valid and
     * needs to be purged. (See issue 319 and
     * ImplicitBindingTest#testCircularJitBindingsLeaveNoResidue and
     * #testInstancesRequestingProvidersForThemselvesWithChildInjectors for examples of when this is
     * necessary.)
     *
     * Returns true if the injector for that point was stored in the cache, false otherwise.
     */
    boolean remove(InjectionPoint ip) {
        return cache.remove(ip);
    }

    private  ConstructorInjector createConstructor(InjectionPoint injectionPoint, Errors errors)
            throws ErrorsException {
        int numErrorsBefore = errors.size();

        SingleParameterInjector[] constructorParameterInjectors =
                injector.getParametersInjectors(injectionPoint.getDependencies(), errors);

        @SuppressWarnings("unchecked") // the injector type agrees with the injection point type
        MembersInjectorImpl membersInjector = (MembersInjectorImpl)
        injector.membersInjectorStore.get(injectionPoint.getDeclaringType(), errors);

        ConstructionProxyFactory factory = new DefaultConstructionProxyFactory(injectionPoint);

        errors.throwIfNewErrors(numErrorsBefore);

        return new ConstructorInjector(membersInjector.getInjectionPoints(), factory.create(),
                constructorParameterInjectors, membersInjector);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy