Phân tích cấu trúc Bean Factory trong Spring Framework

Để hiểu rõ hơn về cách hoạt động của IOC container trong Spring, chúng ta có thể xem xét các giao diện chính của BeanFactory và các lớp con của nó.

public interface ComponentContainer {
    String FACTORY_COMPONENT_PREFIX = "&";

    Object fetchComponent(String id) throws ComponentException;

    <T> T fetchComponent(String id, Class<T> type) throws ComponentException;

    Object fetchComponent(String id, Object... args) throws ComponentException;

    <T> T fetchComponent(Class<T> type) throws ComponentException;

    <T> T fetchComponent(Class<T> type, Object... args) throws ComponentException;

    <T> Provider<T> getProvider(Class<T> type);

    <T> Provider<T> getProvider(ResolvableType type);

    boolean hasComponent(String id);

    boolean isSingleton(String id) throws NoSuchComponentDefinitionException;

    boolean isPrototype(String id) throws NoSuchComponentDefinitionException;

    boolean matchesType(String id, ResolvableType type) throws NoSuchComponentDefinitionException;

    boolean matchesType(String id, Class<?> type) throws NoSuchComponentDefinitionException;

    @Nullable
    Class<?> getType(String id) throws NoSuchComponentDefinitionException;

    @Nullable
    Class<?> getType(String id, boolean cache) throws NoSuchComponentDefinitionException;

    String[] getAliases(String id);
}

Giao diện ListableComponentContainer cho phép truy cập danh sách các thành phần:

public interface ListableComponentContainer extends ComponentContainer {
    boolean hasComponentDefinition(String id);

    int getComponentDefinitionCount();

    String[] getComponentDefinitionNames();

    <T> Provider<T> getProvider(Class<T> type, boolean cache);

    <T> Provider<T> getProvider(ResolvableType type, boolean cache);

    String[] getComponentNamesForType(ResolvableType type);

    String[] getComponentNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);

    String[] getComponentNamesForType(@Nullable Class<?> type);

    String[] getComponentNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);

    <T> Map<String, T> getComponentsOfType(@Nullable Class<T> type) throws ComponentException;

    <T> Map<String, T> getComponentsOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws ComponentException;

    String[] getComponentNamesWithAnnotation(Class<? extends Annotation> annotation);

    Map<String, Object> getComponentsWithAnnotation(Class<? extends Annotation> annotation) throws ComponentException;

    @Nullable
    <A extends Annotation> A findAnnotationOnComponent(String id, Class<A> annotation) throws NoSuchComponentDefinitionException;

    @Nullable
    <A extends Annotation> A findAnnotationOnComponent(String id, Class<A> annotation, boolean cache) throws NoSuchComponentDefinitionException;
}

Giao diện HierarchicalComponentContainer hỗ trợ phân cấp giữa các container:

public interface HierarchicalComponentContainer extends ComponentContainer {
    @Nullable
    ComponentContainer getParentContainer();

    boolean containsLocalComponent(String id);
}

Giao diện ConfigurableComponentContainer cung cấp khả năng tùy chỉnh:

public interface ConfigurableComponentContainer extends HierarchicalComponentContainer, SingletonRegistry {
    void setClassLoader(@Nullable ClassLoader loader);
    @Nullable
    ClassLoader getClassLoader();
    void setTempClassLoader(@Nullable ClassLoader loader);
    @Nullable
    ClassLoader getTempClassLoader();

    void setCacheMetadata(boolean cache);
    boolean isCacheMetadata();
    ComponentDefinition getMergedComponentDefinition(String id) throws NoSuchComponentDefinitionException;
    boolean isFactoryComponent(String id) throws NoSuchComponentDefinitionException;

    void registerScope(String scopeName, Scope scope);
    String[] getRegisteredScopeNames();
    @Nullable
    Scope getRegisteredScope(String scopeName);

    void registerDependency(String componentId, String dependentComponentId);
    String[] getDependentComponents(String componentId);
    String[] getDependenciesForComponent(String componentId);
}

Cuối cùng, giao diện AutowireCapableComponentContainer thực hiện tự động lắp ráp:

public interface AutowireCapableComponentContainer extends ComponentContainer {
    int AUTOWIRE_NONE = 0;
    int AUTOWIRE_BY_NAME = 1;
    int AUTOWIRE_BY_TYPE = 2;
    int AUTOWIRE_CONSTRUCTOR = 3;
    /** @deprecated */
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;
    String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";

    <T> T createComponent(Class<T> type) throws ComponentException;

    void autowireComponent(Object component) throws ComponentException;

    Object configureComponent(Object component, String id) throws ComponentException;

    Object createComponent(Class<?> type, int autowireMode, boolean dependenciesCheck) throws ComponentException;

    Object autowireComponent(Class<?> type, int autowireMode, boolean dependenciesCheck) throws ComponentException;

    void autowireProperties(Object component, int autowireMode, boolean dependenciesCheck) throws ComponentException;

    void applyPropertyValues(Object component, String id) throws ComponentException;

    Object initializeComponent(Object component, String id) throws ComponentException;

    Object applyPreInitializationProcessors(Object component, String id) throws ComponentException;

    Object applyPostInitializationProcessors(Object component, String id) throws ComponentException;

    void destroyComponent(Object component);

    <T> NamedComponentHolder<T> resolveNamedComponent(Class<T> type) throws ComponentException;

    Object resolveComponentByName(String id, DependencyDescriptor descriptor) throws ComponentException;

    @Nullable
    Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingComponentId) throws ComponentException;

    @Nullable
    Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingComponentId, @Nullable Set<String> excludedComponents, @Nullable TypeConverter converter) throws ComponentException;
}

Thẻ: Spring Framework Java BeanFactory IOC Container Dependency Injection

Đăng vào ngày 20 tháng 7 lúc 13:35