Spring Boot / Spring Framework
Spring Framework
Das Spring Framework hat sich in den letzten Jahren bei der schnellen Entwicklung von Java Backend Anwendungen etabliert. Spring macht es den Entwicklern leicht, produktionsreife Anwendungen in kurzer Zeit zu erstellen. Das Spring Framework ergänzt dabei die bekannten JakartaEE Spezifikationen wie zum Beispiel Servlet API (JSR 340), WebSocket API (JSR 356), JSON Binding API (JSR 367) oder JPA (JSR 338).
Das Spring Framework basiert auf einem objektorientierten Entwurfsmuster, das als Dependency Injection bekannt geworden ist. Hierbei geht es darum, Objekte möglichst lose miteinander zu koppeln. Dies wird dadurch erreicht, dass ein Objekt andere Objekte, deren Hilfe es für seine Aufgabe benötigt, von außen "injiziert" bekommt, anstatt diese selbst zu erzeugen oder sich auf andere Art und Weise eigenverantwortlich zu beschaffen.
Spring Boot
Spring Boot hilft bei der Entwicklung von Spring basierten stand-alone Anwendungen, was sehr gut in die Welt von Microservices passt. Das jadice web toolkit und Spring Boot geben dabei einen Weg vor, der unserer Ansicht nach am besten funktioniert, um möglichst schnell und einfach eine Anwendung zu entwickeln. Dies wird unter anderem dadurch erzielt, dass es sinnvolle Defaults gibt und möglichst wenig Konfiguration erforderlich ist, um eine Anwendung zu entwickeln.
Integratoren, die das jadice web toolkit in eine Spring- oder Spring-Boot-Applikation integrieren möchten, können das ausgelieferte Integrationsmodul nutzen.
Spring Boot-Integrationsmodul
Das jadice web toolkit folgt dem Spring-Boot-Starter-Konzept, so, dass
das Aufsetzen einer Spring-Boot-Anwendung mit dem jadice web toolkit
sich sehr einfach gestaltet. Das webtoolkit-spring-boot-starter
als
Starter für das jadice web toolkit ist Bestandteil der Auslieferung und
kann als Maven-Dependency eingebunden werden. Er bringt die
erforderlichen Dependencies auf die einzubindenden jadice-web-toolkit-
und Spring-Boot-Module mit:
<dependency>
<groupId>com.levigo.jadice.webtoolkit</groupId>
<artifactId>webtoolkit-spring-boot-starter</artifactId>
</dependency>
Ein einführendes Tutorial, basierend auf Spring Boot, existiert unter Getting Started - jadice web toolkit mit Spring Boot.
Der Grundgedanke des webtoolkit-spring-boot-starter
liegt darin, die
Spring-Paradigmen für das jadice web toolkit zu unterstützen, so, dass
die erforderlichen Komponenten deklarativ injiziert bzw. konfiguriert
werden können. Dies umfasst DocumentDataProvider
, ServerOperations
,
ContextualFactories
sowie Annotationsprofile und Konfigurationswerte -
wie nachfolgend ausführlich beschrieben. Die programmatische
Registrierung dieser Komponenten, die früher typischerweise über einen
WebtoolkitServletContextListener
vorgenommen wurde, kann dadurch
vollständig entfallen.
Spring Boot Dependencies
Das jadice web toolkit erwartet, dass die Spring Boot Dependencies von der Integration bereitgestellt werden. Dadurch haben Sie die Kontrolle, über die konkret eingebundene Version. Wir empfehlen, die BOM (Bill of Materials) zu nutzen, um die Versionen und Abhängigkeiten zu setzen. Weitere Informationen hierzu finden Sie in unserer Knowledge Base.
Threadmanagement
Das Spring-Modul sorgt dafür, dass bei asynchron ausgeführten Operationen der zuständige Thread mit dem Spring-SecurityContext assoziiert wird. Dies passiert allerdings nur, sofern Spring Security im Klassenpfad gefunden wird. Andernfalls wird ein gewöhnlicher ThreadPoolExecutor aufgerufen.
Spring Boot Application
Eine jadice web toolkit-Spring-Boot-Anwendung wird durch Hinzufügen der
Annotationen @SpringBootApplication
und
@EnableJWTSpringBootApplication(...)
definiert:
-
@SpringBootApplication
: zur Aktivierung einer Spring Boot Application, entsprechend Using the @SpringBootApplication Annotation -
@EnableJWTSpringBootApplication(...)
: Diese Annotation bringt derwebtoolkit-spring-boot-starter
mit. Sie sorgt im Hintergrund für ein Autowiring von DocumentDataProvidern, ServerOperations und Annotationsprofilen.
@SpringBootApplication
// Activate jadice web toolkit support specifying the GWT module name for the entry point
@EnableJWTSpringBootApplication("com.levigo.jadice.web.demo.springboot.Application")
public class DemoApplication extends SpringBootServletInitializer {
public static void main(final String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Automatische Registrierung von DocumentDataProvidern
DocumentDataProvider-Implementierungen lassen sich mittels Dependency
Injection automatisch registrieren. Eine programmatische Registrierung
an der DocumentDataProviderRegistry (siehe
DocumentDataProviderRegistry) ist dann
nicht mehr erforderlich. Hierzu ist die entsprechende Klasse lediglich
mit der Spring-Annotation @Component
zu versehen:
@Component
public class MyDocumentDataProvider implements DocumentDataProvider<MySource, MyPageSegmentHandle> {
...
}
Automatische Registrierung von ServerOperations
Auch ServerOperations lassen sich als @Component
injizieren. Die
manuelle Registrierung bei der ServerOperationRegistry im
ServletContextListener
lt. Server Operations
entfällt dann.
@Component
public class SampleServerOperation implements ServerOperation<SampleServerOperationParameters, SampleServerOperationMessage> {
...
}
Automatische Registrierung von ContextualFactories
Genauso können auch ContextualFactories als @Component
injiziert
werden, ohne dass diese programmatisch registriert werden müssen:
@Component
public class MyContextualServerOperationFactory implements ContextualFactory<ServerOperation<MyContextualServerOperationParameters, MyContextualServerOperationMessage>> {
@Override
public MyContextualServerOperation create(InvocationContext context) {
ServletInvocationContext servletInvocationContext = (ServletInvocationContext) context;
return new MyContextualServerOperation(servletInvocationContext.getSession().getId());
}
}
@Component
public class MyContextualDocumentDataProviderFactory implements ContextualFactory<DocumentDataProvider<ClassPathSource, ClassPathHandle>> {
@Override
public DocumentDataProvider<ClassPathSource, ClassPathHandle> create(InvocationContext context) {
return new ClassPathDocumentDataProvider();
}
}
Konfiguration serverseitiger Einstellungen
In einer Spring-Boot-Umgebung lassen sich Einstellungen des jadice web
toolkit, die für gewöhnlich programmatisch über die
ServerConfiguration vorgenommen werden, deklarativ über eine
application.yml
bzw. application.properties
konfigurieren.
Dabei werden die für das jadice web toolkit spezifischen Einstellungen
mit dem Prefix webtoolkit
angesprochen und die Werte über
entsprechende Selektoren konfiguriert. Die Namen der Selektoren
entsprechen dabei den Namen der Setter der ServerConfiguration.
Im folgenden Beispiel wird eine programmatische Konfiguration ihrem deklarativen Pendant gegenübergestellt:
ConfigurationManager.getServerConfiguration().getNetworkConfiguration().setSessionTimeout(Duration.ofSeconds(30));
ConfigurationManager.getServerConfiguration().getNetworkConfiguration().setResponseAggregationWindow(Duration.ofMillis(20));
ConfigurationManager.getServerConfiguration().setTileCompressionType(TileCompressionType.PNGJ_BEST_COMPRESSION);
ConfigurationManager.getServerConfiguration().getNetworkConfiguration().setKeepAliveInterval(Duration.ofSeconds(30));
Konfiguration per application.properties:
webtoolkit.tileCompressionType: PNGJ_BEST_COMPRESSION
webtoolkit.networkConfiguration.sessionTimeout: 30s
webtoolkit.networkConfiguration.responseAggregationWindow: 20ms
webtoolkit.networkConfiguration.keepAliveInterval: 30s
Konfiguration per application.yml:
webtoolkit:
tileCompressionType: PNGJ_BEST_COMPRESSION
networkConfiguration:
sessionTimeout: 30s
responseAggregationWindow: 20ms
keepAliveInterval: 30s