Adds DI and SPI examples

This commit is contained in:
2020-03-15 18:59:33 +01:00
parent 9f120b6317
commit e407698e84
20 changed files with 302 additions and 3 deletions

15
spi/pom.xml Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>fr.gasser</groupId>
<artifactId>java-cookbook</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spi</artifactId>
</project>

View File

@ -0,0 +1,32 @@
package ovh.gasser.spi;
import ovh.gasser.spi.commands.Command;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.stream.Stream;
public class CommandProvider {
private static CommandProvider instance = new CommandProvider();
private final ServiceLoader<Command> loader;
private CommandProvider() {
loader = ServiceLoader.load(Command.class);
}
public static CommandProvider getInstance() {
return instance;
}
public Stream<Command> getCommands() {
return loader.stream().map(ServiceLoader.Provider::get);
}
public Optional<Command> getCommand(String commandId) {
return loader.stream()
.filter(commandProvider -> commandProvider.get().getId().equalsIgnoreCase(commandId))
.findFirst()
.map(ServiceLoader.Provider::get);
}
}

View File

@ -0,0 +1,16 @@
package ovh.gasser.spi;
public class Main {
public static void main(String[] args) {
CommandProvider commandProvider = CommandProvider.getInstance();
// Execute all commands
commandProvider.getCommands()
.forEach(command -> System.out.println(command.execute("Hello")));
// Execute command with specific ID
String result = commandProvider.getCommand("reverse")
.map(command -> command.execute("Reverse command"))
.orElse("Unknown command");
System.out.println(result);
}
}

View File

@ -0,0 +1,7 @@
package ovh.gasser.spi.commands;
public interface Command {
String getId();
String execute(String input);
}

View File

@ -0,0 +1,14 @@
package ovh.gasser.spi.commands;
public class EchoCommand implements Command {
private static final String COMMAND_NAME = "echo";
public String getId() {
return COMMAND_NAME;
}
public String execute(String input) {
return input;
}
}

View File

@ -0,0 +1,16 @@
package ovh.gasser.spi.commands;
public class ReverseCommand implements Command {
private static final String COMMAND_NAME = "reverse";
@Override
public String getId() {
return COMMAND_NAME;
}
@Override
public String execute(String input) {
return new StringBuilder(input).reverse().toString();
}
}

View File

@ -0,0 +1,16 @@
package ovh.gasser.spi.commands;
public class UpperCommand implements Command {
private static final String COMMAND_NAME = "upper";
@Override
public String getId() {
return COMMAND_NAME;
}
@Override
public String execute(String input) {
return input.toUpperCase();
}
}

View File

@ -0,0 +1,3 @@
ovh.gasser.spi.commands.EchoCommand
ovh.gasser.spi.commands.UpperCommand
ovh.gasser.spi.commands.ReverseCommand