CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-insert-koin--koin-core-jvm

Core dependency injection framework for Kotlin multiplatform applications with DSL-based configuration and type-safe dependency resolution.

Pending
Overview
Eval results
Files

java-interop.mddocs/

Java Interoperability

Java-specific API for dependency injection in mixed Kotlin/Java projects with static access patterns. Enables seamless integration of Koin dependency injection in Java codebases and Java-Kotlin interop scenarios.

Capabilities

KoinJavaComponent

Static access point for dependency injection in Java code with full feature parity to Kotlin APIs.

/**
 * Java-compatible component providing static access to Koin functionality
 */
object KoinJavaComponent {
    /**
     * Inject dependency lazily in Java code
     * @param clazz - Class type to inject
     * @param qualifier - Optional qualifier for disambiguation
     * @param parameters - Optional parameters for injection
     * @return Lazy instance of the requested type
     */
    @JvmStatic
    @JvmOverloads
    fun <T> inject(
        clazz: Class<*>,
        qualifier: Qualifier? = null,
        parameters: ParametersDefinition? = null
    ): Lazy<T>
    
    /**
     * Inject dependency lazily with null safety in Java code
     * @param clazz - Class type to inject
     * @param qualifier - Optional qualifier for disambiguation
     * @param parameters - Optional parameters for injection
     * @return Lazy instance of the requested type or null
     */
    @JvmStatic
    @JvmOverloads
    fun <T> injectOrNull(
        clazz: Class<*>,
        qualifier: Qualifier? = null,
        parameters: ParametersDefinition? = null
    ): Lazy<T?>
    
    /**
     * Get dependency instance immediately in Java code
     * @param clazz - Class type to get
     * @param qualifier - Optional qualifier for disambiguation
     * @param parameters - Optional parameters for injection
     * @return Instance of the requested type
     */
    @JvmStatic
    @JvmOverloads
    fun <T> get(
        clazz: Class<*>,
        qualifier: Qualifier? = null,
        parameters: ParametersDefinition? = null
    ): T
    
    /**
     * Get dependency instance with null safety in Java code
     * @param clazz - Class type to get
     * @param qualifier - Optional qualifier for disambiguation
     * @param parameters - Optional parameters for injection
     * @return Instance of the requested type or null
     */
    @JvmStatic
    @JvmOverloads
    fun <T> getOrNull(
        clazz: Class<*>,
        qualifier: Qualifier? = null,
        parameters: ParametersDefinition? = null
    ): T?
    
    /**
     * Get the global Koin instance
     * @return Global Koin instance
     */
    @JvmStatic
    fun getKoin(): Koin
}

Usage Examples:

Java Code:

import org.koin.java.KoinJavaComponent;
import org.koin.core.qualifier.Qualifier;
import org.koin.core.parameter.ParametersDefinition;

// Basic injection in Java
public class UserController {
    // Lazy injection - resolved on first access
    private final Lazy<UserService> userService = 
        KoinJavaComponent.inject(UserService.class);
    
    // Direct injection - resolved immediately
    private final Logger logger = 
        KoinJavaComponent.get(Logger.class);
    
    public User createUser(UserData userData) {
        logger.info("Creating user");
        return userService.getValue().create(userData);
    }
}

// Injection with qualifiers
public class PaymentService {
    private final Lazy<PaymentGateway> primaryGateway = 
        KoinJavaComponent.inject(
            PaymentGateway.class,
            KoinKt.named("primary")
        );
    
    private final PaymentGateway backupGateway = 
        KoinJavaComponent.getOrNull(
            PaymentGateway.class,
            KoinKt.named("backup")
        );
    
    public boolean processPayment(Payment payment) {
        try {
            return primaryGateway.getValue().process(payment);
        } catch (Exception e) {
            if (backupGateway != null) {
                return backupGateway.process(payment);
            }
            throw e;
        }
    }
}

// Injection with parameters
public class ReportGenerator {
    public Report generateReport(String reportType, Date fromDate, Date toDate) {
        ParametersDefinition params = () -> ParametersKt.parametersOf(
            reportType, fromDate, toDate
        );
        
        ReportBuilder builder = KoinJavaComponent.get(
            ReportBuilder.class,
            null,
            params
        );
        
        return builder.build();
    }
}

// Advanced usage with Koin instance
public class DatabaseManager {
    private final Koin koin = KoinJavaComponent.getKoin();
    
    public void switchDatabase(String environment) {
        // Use Koin instance directly for advanced operations
        DatabaseConfig config = koin.get(
            DatabaseConfig.class,
            KoinKt.named(environment),
            null
        );
        
        // Reconfigure database connection
        reconfigure(config);
    }
}

Mixed Java/Kotlin Usage:

// Kotlin module definition
val javaInteropModule = module {
    single<UserService> { UserServiceImpl(get()) }
    single<Logger> { LoggerImpl() }
    
    single<PaymentGateway>(named("primary")) { StripePaymentGateway() }
    single<PaymentGateway>(named("backup")) { PayPalPaymentGateway() }
    
    factory<ReportBuilder> { (type: String, from: Date, to: Date) ->
        ReportBuilderImpl(type, from, to)
    }
    
    single<DatabaseConfig>(named("production")) { ProductionDbConfig() }
    single<DatabaseConfig>(named("development")) { DevelopmentDbConfig() }
}

// Start Koin with Java-compatible setup
startKoin {
    modules(javaInteropModule)
}
// Java classes using the Kotlin-defined dependencies
public class Application {
    public static void main(String[] args) {
        // Dependencies are available via KoinJavaComponent
        UserController controller = new UserController();
        PaymentService paymentService = new PaymentService();
        
        // Use the services
        User user = controller.createUser(new UserData("John", "john@example.com"));
        boolean success = paymentService.processPayment(new Payment(100.0));
    }
}

Integration Patterns

Common patterns for integrating Koin in Java applications and frameworks.

Usage Examples:

Servlet Integration:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class KoinServletListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // Initialize Koin when servlet context starts
        ServletContext context = sce.getServletContext();
        
        // Start Koin with configuration
        KoinApplication app = StartKoinKt.startKoin(koinApp -> {
            koinApp.modules(WebModulesKt.getWebModules());
            return null;
        });
        
        // Store Koin instance in servlet context
        context.setAttribute("koin", app.getKoin());
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // Clean up Koin when servlet context stops
        StopKoinKt.stopKoin();
    }
}

// Servlet using Koin
public class UserServlet extends HttpServlet {
    private final Lazy<UserService> userService = 
        KoinJavaComponent.inject(UserService.class);
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        String userId = req.getParameter("userId");
        User user = userService.getValue().findById(userId);
        
        // Handle response
        resp.getWriter().write(user.toJson());
    }
}

Spring Integration:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class KoinSpringBridge {
    
    // Expose Koin dependencies as Spring beans
    @Bean
    public UserService userService() {
        return KoinJavaComponent.get(UserService.class);
    }
    
    @Bean
    public PaymentProcessor paymentProcessor() {
        return KoinJavaComponent.get(PaymentProcessor.class);
    }
    
    // Initialize Koin alongside Spring
    @Bean
    public KoinApplication koinApplication() {
        return StartKoinKt.startKoin(app -> {
            app.modules(ApplicationModulesKt.getAppModules());
            return null;
        });
    }
}

JUnit Test Integration:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

public class ServiceTest {
    
    @BeforeEach
    void setUp() {
        // Start Koin for testing
        StartKoinKt.startKoin(app -> {
            app.modules(TestModulesKt.getTestModules());
            return null;
        });
    }
    
    @AfterEach
    void tearDown() {
        // Clean up after each test
        StopKoinKt.stopKoin();
    }
    
    @Test
    void testUserService() {
        UserService userService = KoinJavaComponent.get(UserService.class);
        
        User user = userService.create(new UserData("Test User"));
        assertNotNull(user);
        assertEquals("Test User", user.getName());
    }
    
    @Test
    void testPaymentServiceWithQualifier() {
        PaymentGateway gateway = KoinJavaComponent.get(
            PaymentGateway.class,
            KoinKt.named("test")
        );
        
        assertTrue(gateway instanceof MockPaymentGateway);
    }
}

Types

Java-Compatible Types

// All standard Koin types are available in Java through static imports
// Qualifiers
val named: (String) -> Qualifier = ::named
val qualifier: (String) -> Qualifier = ::qualifier

// Parameters
val parametersOf: (Array<Any>) -> ParametersHolder = ::parametersOf

// Type aliases for Java compatibility
typealias ParametersDefinition = () -> ParametersHolder

Install with Tessl CLI

npx tessl i tessl/maven-io-insert-koin--koin-core-jvm

docs

application-setup.md

component-integration.md

configuration-logging.md

constructor-reference.md

index.md

java-interop.md

module-definition.md

property-management.md

qualifiers-parameters.md

scope-management.md

tile.json