001package io.avaje.inject.spi; 002 003import io.avaje.inject.InjectModule; 004 005/** 006 * A Module that can be included in BeanScope. 007 */ 008public interface Module { 009 010 /** 011 * Empty array of classes. 012 */ 013 Class<?>[] EMPTY_CLASSES = new Class<?>[]{}; 014 015 /** 016 * Return the set of types this module explicitly provides to other modules. 017 */ 018 default Class<?>[] provides() { 019 return EMPTY_CLASSES; 020 } 021 022 /** 023 * Return the types this module needs to be provided externally or via other modules. 024 */ 025 default Class<?>[] requires() { 026 return EMPTY_CLASSES; 027 } 028 029 /** 030 * Return the packages this module needs to be provided via other modules. 031 */ 032 default Class<?>[] requiresPackages() { 033 return EMPTY_CLASSES; 034 } 035 036 /** 037 * Return the classes that this module provides that we allow other modules to auto depend on. 038 * <p> 039 * This is a convenience when using multiple modules that is otherwise controlled manually by 040 * explicitly using {@link InjectModule#provides()}. 041 */ 042 default Class<?>[] autoProvides() { 043 return EMPTY_CLASSES; 044 } 045 046 /** 047 * Return the aspects that this module provides. 048 * <p> 049 * This is a convenience when using multiple modules that we otherwise manually specify via 050 * {@link InjectModule#provides()}. 051 */ 052 default Class<?>[] autoProvidesAspects() { 053 return EMPTY_CLASSES; 054 } 055 056 /** 057 * These are the classes that this module requires for wiring that are provided by other 058 * external modules (that are in the classpath at compile time). 059 * <p> 060 * This is a convenience when using multiple modules that is otherwise controlled manually by 061 * explicitly using {@link InjectModule#requires()} or {@link InjectModule#requiresPackages()}. 062 */ 063 default Class<?>[] autoRequires() { 064 return EMPTY_CLASSES; 065 } 066 067 /** 068 * Return public classes of the beans that would be registered by this module. 069 * <p> 070 * This method allows code to use reflection to inspect the modules classes 071 * before the module is wired. This method is not required for DI wiring. 072 */ 073 Class<?>[] classes(); 074 075 /** 076 * Build all the beans. 077 */ 078 void build(Builder builder); 079 080 /** 081 * Marker for custom scoped modules. 082 */ 083 interface Custom extends Module { 084 085 } 086}