Spring Framework
{{About|the Spring Framework|the Spring Boot|Spring Boot||}}
{{Short description|Application framework for Java platform}}
{{Infobox software
| name = Spring Framework
| logo = Spring Framework Logo 2018.svg
| caption =
| developer = VMware
| released = {{Start date and age|2002|10|01|df=yes}}
| discontinued =
| latest release version = {{wikidata|property|reference|edit|P348}}
| latest release date = {{start date and age|{{wikidata|qualifier|P348|P577}}}}
| latest preview version =
| latest preview date =
| operating system =
| platform = Java EE
| programming language = Java
| genre = Application framework
| license = Apache License 2.0
}}
The Spring Framework is an application framework and inversion of control container for the Java platform.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2 Spring Core Tasks | p=47}} The framework's core features can be used by any Java application, but there are extensions for building web applications on top of the Java EE (Enterprise Edition) platform. The framework does not impose any specific programming model.{{Citation needed|reason=Spring Web Flux Framework heavily uses the functional-programming paradigm according to Deinum and Cosmina's "Pro Spring MVC with WebFlux". Need supporting information for the claim that the framework does not impose any specific programming model|date=June 2023}}. The framework has become popular in the Java community as an addition to the Enterprise JavaBeans (EJB) model.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§16-2 Integrating Two Systems Using JMS | pp=694-698}} The Spring Framework is free and open source software.{{sfn|Johnson|Hoeller|2004}}{{rp | pp=121–122}}{{sfn|Deinum|Cosmina|2021|loc=§1 Setting up a Local Development Environment | p=1}}
Version history
class="wikitable" | |
Version
! Date | |
---|---|
0.9 | 2003 |
1.0 | March 24, 2004 |
2.0 | 2006 |
3.0 | 2009 |
4.0 | 2013 |
5.0 | 2017 |
6.0 | November 22, 2022 |
6.1 | November 16, 2023 |
6.2 | November 14, 2024 |
The first version was written by Rod Johnson, who released the framework with the publication of his book Expert One-on-One J2EE Design and Development in October 2002. The framework was first released under the Apache 2.0 license in June 2003. The first production release, 1.0, was released in March 2004.{{cite web |url=https://spring.io/blog/2004/03/24/spring-framework-1-0-final-released | date=24 March 2014 | title=Spring Framework 1.0 Final Released | website=Official Spring Framework blog |access-date=1 March 2021}} The Spring 1.2.6 framework won a Jolt productivity award and a JAX Innovation Award in 2006.[http://www.ddj.com/architect/187900423?pgno=10 Jolt winners 2006]{{Cite web |url=http://jax-award.de/jax_award06/gewinner_de.php |title=JAX Innovation Award Gewinner 2006 |access-date=2009-08-12 |archive-url=https://web.archive.org/web/20090817202514/http://jax-award.de/jax_award06/gewinner_de.php |archive-date=2009-08-17 |url-status=dead }} Spring 2.0 was released in October 2006, Spring 2.5 in November 2007, Spring 3.0 in December 2009, Spring 3.1 in December 2011, and Spring 3.2.5 in November 2013.{{cite web |url=https://spring.io/blog/2013/11/07/spring-framework-3-2-5-released |date=7 Nov 2013 | title=Spring Framework 3.2.5 Released | website=Official Spring website | access-date=16 October 2016}} Spring Framework 4.0 was released in December 2013.{{cite web|url=https://spring.io/blog/2013/12/12/announcing-spring-framework-4-0-ga-release/|title=Announcing Spring Framework 4.0 GA Release|publisher=Spring blog|date=12 December 2013}} Notable improvements in Spring 4.0 included support for Java SE (Standard Edition) 8, Groovy 2,{{sfn | Walls | 2016 | loc=§5 | pp=92-106}}{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§4 Spring Configuration in Detail and Spring Boot | pp=125-126 }} some aspects of Java EE 7, and WebSocket.{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc = §1 Introducing Spring | pp=1-18}}
Spring Framework 4.2.0 was released on 31 July 2015 and was immediately upgraded to version 4.2.1, which was released on 01 Sept 2015.{{cite web|url=http://spring.io/blog/2015/07/31/spring-framework-4-2-goes-ga|title=Spring Framework 4.2 goes GA|publisher=Spring Blog|date=31 July 2015}} It is "compatible with Java 6, 7 and 8, with a focus on core refinements and modern web capabilities".{{cite web|url=http://spring.io/blog/2015/07/31/spring-framework-4-2-goes-ga|title=Spring Framework 4.2 goes GA|publisher=Spring Blog}}
Spring Framework 4.3 has been released on 10 June 2016 and was supported until 2020.{{cite web|url=https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#supported-versions|title=Spring Framework Versions: Supported Versions|website=github.com}} It was announced to "be the final generation within the general Spring 4 system requirements (Java 6+, Servlet 2.5+), [...]".
Spring 5 is announced to be built upon Reactive Streams compatible Reactor Core.{{cite web|url=http://spring.io/blog/2016/02/09/reactive-spring|title=Reactive Spring|publisher=Spring Blog|date=9 February 2016}}{{Obsolete source|reason=This source is from 2016, but Spring 5.0.x was already released and was called "a major release" in the book "Pro Spring 5" by Iuliana Cosmina, Rob Harrop, Chris Schaefer and Clarence Ho|date=June 2023}}
Spring Framework 6.0 has been released on 16 November 2022 and came with a Java 17+ baseline and a move to Jakarta EE 9+ (in the jakarta
namespace), with a focus on the recently released Jakarta EE 10 APIs such as Servlet 6.0 and JPA 3.1.{{cite web|url=https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga|title=Spring Framework 6.0 goes GA|publisher=Spring Blog|date=16 November 2022}}
Modules
The Spring Framework includes several modules that provide a range of services:
- Spring Core Container: this is the base module of Spring{{sfn | Walls | 2019 | p=48}} and provides spring containers (
BeanFactory
andApplicationContext
).[http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html#beans-introduction Spring Framework documentation for the Core Container]{{sfn | Johnson | Höller | Arendsen | Risberg | 2005 | loc=Chapter §2 - The Bean Factory and ApplicationContext}}{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§3-1 Using Java Config to configure POJOs | p=137}} In this context,spring-core
is the artifact{{sfn | Johnson | Hoeller | 2004 | loc=Introducing the Spring Framework - The Core Bean Factory | p=150}} found in the core module{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}} belonging to theorg.springframework
group.{{sfn | Walls | 2016 | loc=§Appendix D Spring Boot dependencies | p=240}} Thespring-core
artifact consists of the IoC container, as well as the utility classes{{sfn | Johnson | Hoeller | 2004 | loc=Introducing the Spring Framework - The Core Bean Factory | p=150}} used throughout the application.{{sfn | Johnson | Höller | Arendsen | Risberg | 2005 | loc=Chapter §1 Introducing the Spring Framework - Module Summary}} - Aspect-oriented programming: enables implementing cross-cutting concerns.{{sfn|Johnson|Höller|Arendsen|Risberg|2005|loc=Chapter §4 - Spring and AOP}}{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§3-17 AOP introductions for POJOs | pp=196-198}} The
spring-aop
is an artifact for the AOP framework.{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}} - Authentication and authorization: configurable security processes that support a range of standards, protocols, tools and practices via the Spring Security sub-project (formerly Acegi Security System for Spring).{{sfn|Johnson|Höller|Arendsen|Risberg|2005|loc=Acegi Security System for Spring}}{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§7 Spring Security | p=331}}
- Convention over configuration: a rapid application development solution for Spring-based enterprise applications is offered in the Spring Roo module.
- Data access: working with relational database management systems on the Java platform using Java Database Connectivity (JDBC){{sfn|Walls|2019|pp=56-59}} and object-relational mapping tools and with NoSQL{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10 Data Access | pp=419-426}} databases. The
spring-jdbc
is an artifact found in the JDBC module which supports JDBC access by including datasource setup classes.{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}} - Inversion of control container: configuration of application components and lifecycle management of Java objects, done mainly via dependency injection.{{sfn|Johnson|Höller|Arendsen|Risberg|2005|loc=Chapter §2 - The Bean Factory and ApplicationContext}}
- Messaging: declarative registration of message listener objects for transparent message-consumption from message queues via Java Message Service (JMS), improvement of message sending over standard JMS APIs.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§15-4 Create Message-Driven POJOs in Spring | pp=677-681}}
- Model–view–controller: an HTTP- and servlet-based framework providing hooks for extension and customization for web applications and RESTful (representational state transfer) Web services.{{sfn | Johnson | Höller | Arendsen | Risberg | 2005 | loc=Chapter §12 - Web MVC Framework}}{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4 Spring @MVC | p=217}}
- Remote access framework: declarative remote procedure call (RPC)-style{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-3 Writing a Custom ItemWriter and ItemReader | pp=525-534}} marshalling of Java objects over networks supporting Java remote method invocation (RMI),{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-7 Expose and Invoke Services through RMI; §14-8 Expose and Invoke Services through HTTP | pp=627-632}} CORBA (Common Object Request Broker Architecture) and HTTP-based protocols including Web services such as SOAP (Simple Object Access Protocol).{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-10 Introduction to contract first SOAP Web Services,§14-11 Expose and invoke SOAP Web Services with Spring-WS,§14-12 Develop SOAP Web Services with Spring-WS and XML
Marshalling|pp=641-658}}{{sfn | Johnson | Höller | Arendsen | Risberg | 2005 | loc=Chapter §8 - Lightweight Remoting}}
- Transaction management: unifies several transaction management APIs and coordinates transactions for Java objects.{{sfn | Johnson | Höller | Arendsen | Risberg | 2005 | loc=Chapter §9 - Supporting Services}}{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11 Spring Transaction Management | p=475}}
- Remote management: declarative exposure and management of Java objects for local or remote configuration via Java Management Extensions (JMX).{{sfn | Johnson | Höller | Arendsen | Risberg | 2005 | loc=Chapter §9 - Supporting Services}}{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14 Spring Java Enterprise Services and Remoting Technologies | p=591}}
- Testing: support classes for writing unit tests{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§17-3 Unit Testing Spring MVC Controllers | pp=737-739}} and integration tests.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§17-4 Managing Application Contexts in Integration Tests | pp=739-743}}
- WebFlux support: support for using reactive runtimes or web servers such as UnderTow and Netty.{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}}{{sfn | Musib | 2022 | loc=§8.3 Introducing Spring WebFlux | p=358}}
- Web Socket support: Support for communicating using the WebSocket protocol. The artifact for this module is
spring-websocket
. - XML support: support for object-toXML mapping.{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}} Libraries such as Jakarta XML Binding(JAXB) and XStream are supported.{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}} The artifact for this module is
spring-oxm
.
Spring modules are packaged as JAR files.{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | p=21-23}} These artifacts can be accessed via the Maven Central Repository using Maven{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§2 Accessing Spring Modules Using Maven | pp=24-25}} or Gradle.{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§2 Accessing Spring Modules Using Gradle| p=26}}
= Inversion of control container =
The inversion of control (IoC) container is the core container in the Spring Framework.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2 Spring Core Tasks | p=47}} It provides a consistent means of configuring and managing Java objects{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2 Spring Core Tasks | p=47}}{{sfn|Johnson|Hoeller|2004}}{{rp|pp=127–131}} using reflection.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-2 Create POJOs by Invoking a Constructor|pp=53-62}} The container is responsible for managing object lifecycles of specific objects:{{sfn|Johnson|Hoeller|2004}}{{rp | p=128}} creating these objects,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-1 Manage and Configure POJOs with the Spring IoC Container|pp=48-52}} calling their initialization methods,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-2 Create POJOs by Invoking a Constructor|pp=53-62}} and configuring these objects by wiring them together.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-3 Use POJO References, Auto-Wiring, and Imports to Interact with Other POJOs|pp=59-67}}
In many cases, one need not use the container when using other parts of the Spring Framework, although using it will likely make an application easier to configure and customize. The Spring container provides a consistent mechanism to configure applications{{sfn | Johnson | Hoeller | 2004}}{{rp | p=122}} and integrates with almost all Java environments, from small-scale applications to large enterprise applications.
The programmer does not directly create an object, but describes how it should be created, by defining it in the Spring configuration file. Similarly, services and components are not called directly; instead a Spring configuration file defines which services and components must be called. This IoC is intended to increase the ease of maintenance and testing.
==Creating and managing beans==
Objects created by the container are called managed objects or beans.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-16 Use Property Editors in Spring|pp=112-116}} The container can be configured by loading XML (Extensible Markup Language) files{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-1 Manage and Configure POJOs with the Spring IoC Container | pp=48-52}}{{sfn | Johnson | Hoeller | 2004}}{{rp|pp=151–152}} or detecting specific Java annotations on configuration classes. These data sources contain the bean definitions that provide the information required to create the beans.
The {{code|@Configuration}} is a Spring-specific annotation that marks a class as the configuration class. The configuration class provides the beans to the Spring {{code|ApplicationContext}}.{{sfn|Walls|2019|loc=§1.1 Getting started with Spring - What is Spring|pp=4-6}} Each of the methods in the Spring configuration class is configured with the {{code|@Bean}} annotation. The {{code|ApplicationContext}} interface will then return the objects configured with the {{code|@Bean}} annotation as beans. The advantage of Java-based configuration over XML-based configuration is better type safety and refactorability.{{sfn|Walls|2019|loc=§1.1 Getting started with Spring - What is Spring | pp=4-6}}
== Types of Inversion of Control ==
There are several types of Inversion of Control. Dependency injection and dependency lookup are examples of Inversion of Control.{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§3 Introducing IoC and DI in Spring | p=37}} Objects can be obtained by means of either dependency lookup or dependency injection.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=127}}[http://forum.springsource.org/showthread.php?79731-What-is-the-difference-between-the-depencylookup-and-dependency-injection What is the difference between the depencylookup and dependency injection - Spring Forum]. Forum.springsource.org (2009-10-28). Retrieved on 2013-11-24.
===Dependency Injection===
{{main article | Dependency injection}}
Dependency injection is a pattern where the container passes objects{{sfn | Johnson | Hoeller | 2004}}{{rp | p=128}} by name to other objects, via either constructors,{{sfn | Johnson | Hoeller | 2004}}{{rp | p=128}} properties, or factory methods. There are several ways to implement dependency injection: constructor-based dependency injection, setter-based dependency injection and field-based dependency injection.{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - Dependency Injection | pp=26-32}}
===Dependency Lookup===
Dependency lookup is a pattern where a caller asks the container object for an object with a specific name or of a specific type.
==Autowiring==
The Spring framework has a feature known as autowiring, which uses the Spring container to automatically satisfy the dependencies specified in the JavaBean properties to objects of the appropriate type in the current factory.{{sfn | Johnson | Hoeller | 2004 | loc=§6 Lightweight Containers and Inversion of Control - IOC Containers | pp=135–137}} This can only occur if there is only one object with the appropriate type.{{sfn | Johnson | Hoeller | 2004 | loc=§6 Lightweight Containers and Inversion of Control - IOC Containers | pp=135–137}}
There are several annotations that can be used for autowiring POJOs, including the Spring-specific annotation {{code|@Autowire}} (as well as several other Spring-specific annotations that help resolve autowire ambiguity such as the {{code|@Qualifier}} or {{code|@Primary}} annotations),{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§3-3 Use POJO References and Auto-Wiring to Interact with other POJOs |pp=145-151}}{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§3 Introducing IoC and DI in Spring - Autowiring Your Beans | pp=112-120 }} and the standard Java annotations {{code|@Resource}} and {{code|@Inject}}.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§3-4 Auto-wire POJOs the @Resource and @Inject annotation | pp=151-154}}
The {{code|@Qualifier}} annotation can be used on a class that defines a bean to inform Spring to prioritize the bean creation when autowiring it by name.{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§3 Introducing IoC and DI in Spring - Autowiring Your Beans | pp=112-120 }}
The {{code|@Primary}} annotation can be used on a class that defines a bean to inform Spring to prioritize the bean creation when autowiring it by type.{{sfn | Cosmina | Harrop | Schaefer | Ho | 2017 | loc=§3 Introducing IoC and DI in Spring - Autowiring Your Beans | pp=112-120 }}
The {{code|@Resource}} annotation is an annotation that conforms to JSR 250, or Common Annotations for the Java Platform, and is used for autowiring references to POJOs by name.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§3-4 Auto-wire POJOs the @Resource and @Inject annotation | pp=151-154}} The {{code|@Inject}} annotation is an annotation that conforms to JSR 300, or Standard Annotations for injection, and is used for autowiring references to POJOs by type.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§3-4 Auto-wire POJOs the @Resource and @Inject annotation | pp=151-154}}
=Aspect-oriented programming framework=
{{main article | Aspect-oriented programming}}
The Spring Framework has its own Aspect-oriented programming (AOP) framework that modularizes cross-cutting concerns in aspects.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§2-12 Aspect Orientated Programming |pp=99-104}} The motivation for creating a separate AOP framework is to provide basic AOP features without too much complexity in either design, implementation, or configuration. The Spring AOP framework takes full advantage of the Spring container.
The Spring AOP framework is proxy pattern-based.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-6 Managing Transactions Declaratively with the @Transactional Annotation | pp=492-494}}{{sfn | Deinum | Cosmina | 2021 | loc=§2 Spring Framework Fundamentals - The Spring Framework | pp=22-25}} It is configured at run time.{{Citation needed|date=June 2023}} This removes the need for a compilation step or load-time weaving.{{Citation needed|date=June 2023}} On the other hand, interception only allows for public method-execution on existing objects at a join point.{{Citation needed|date=June 2023}}
Compared to the AspectJ framework, Spring AOP is less powerful, but also less complicated.{{Citation needed|date=June 2023}} Spring 1.2 includes support to configure AspectJ aspects in the container. Spring 2.0 added more integration with AspectJ; for example, the pointcut language is reused and can be mixed with Spring AOP-based aspects.{{Citation needed|date=June 2023}} Further, Spring 2.0 added a Spring Aspects library that uses AspectJ to offer common Spring features such as declarative transaction management{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-6 Managing Transactions Declaratively with the @Transactional Annotation | pp=492-494}} and dependency injection via AspectJ compile-time or load-time weaving.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-11 Managing Transactions with Load-Time Weaving | pp=509-510}} SpringSource uses AspectJ AOP in other Spring projects such as Spring Roo and Spring Insight, with Spring Security offering an AspectJ-based aspect library.{{Citation needed|date=June 2023}}
Spring AOP has been designed to work with cross-cutting concerns inside the Spring Framework.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=473}} Any object which is created and configured by the container can be enriched using Spring AOP.
The Spring Framework uses Spring AOP internally for transaction management, security, remote access, and JMX.{{cite book |last=Chidester |first=Ashlan |title=Looking Forward to the Spring Framework |date=2024 |publisher=Kindle Edition |url=https://www.amazon.com/dp/B0CFYBPFLQ?ref=KC_GS_GB_US |access-date=February 12, 2025}}
Since version 2.0 of the framework, Spring provides two approaches to the AOP configuration:
- schema-based approach[http://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-xml-configuration-example/ Spring AOP XML Configuration]{{Better source needed|date=June 2023}} and
@AspectJ
-based annotation style.[http://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/ AspectJ Annotation Configuration]{{Better source needed|date=June 2023}}
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> The Spring team decided not to introduce new AOP-related terminology. Therefore, in the Spring reference documentation and API, terms such as aspect, join point, advice, pointcut, introduction, target object (advised object), AOP proxy, and weaving all have the same meanings{{Citation needed|reason=According to the Spring Framework Reference Documentation 4.3.25.RELEASE, the guide does mention the AOP-related terminology are not Spring specific, but the terms such as "aspect" and "join point" are defined differently. The term "aspect" is defined as "a modularization of a concern that cuts across multiple classes. Transaction management is a good example of a crosscutting concern in enterprise Java applications. In Spring AOP, aspects are implemented using regular classes (the schema-based approach) or regular classes annotated with the @Aspect annotation (the @AspectJ style)". The term "joint point" is defined as "a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.". |date=June 2023}} as in most other AOP frameworks (particularly AspectJ).
=Data access framework=
Spring's data access framework addresses common difficulties developers face when working with databases in applications. Support is provided for all popular data access frameworks in Java: JDBC, iBatis/MyBatis,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10 Data Access | pp=419-426}} Hibernate,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10 Data Access | pp=419-426}} Java Data Objects (JDO, discontinued since 5.x),{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10 Data Access | pp=419-426}} Jakarta Persistence API (JPA),{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10 Data Access | pp=419-426}} Oracle TopLink, Apache OJB, and Apache Cayenne, among others.
For all of these supported frameworks, Spring provides these features
- Resource management – automatically acquiring and releasing database resources
- Exception handling – translating data access related exception to a Spring data access hierarchy{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10-5 Handling Exceptions in the Spring JDBC Framework | pp=441-446}}
- Transaction participation – transparent participation in ongoing transactions{{sfn | Johnson | Hoeller | 2004}}{{rp|pp=290–291}}
- Resource unwrapping – retrieving database objects from connection pool wrappers
- Abstraction for binary large object (BLOB) and character large object (CLOB) handling
All these features become available when using template classes provided by Spring for each supported framework.{{sfn|Deinum|Long|Mak|Rubio|2014|pp=426-441,463-465}} Critics have said these template classes are intrusive and offer no advantage over using (for example) the Hibernate API directly.[http://houseofhaug.wordpress.com/2005/08/12/hibernate-hates-spring Hibernate VS Spring]{{Failed verification|date=January 2012}} In response, the Spring developers have made it possible to use the Hibernate and JPA APIs directly. This however requires transparent transaction management, as application code no longer assumes the responsibility to obtain and close database resources,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10-8 Persisting Objects with Spring's ORM Templates | pp=463-466}} and does not support exception translation.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10-6 Problems with Using ORM Frameworks Directly | pp=446-462}}
Together with Spring's transaction management, its data access framework offers a flexible abstraction for working with data access frameworks. The Spring Framework doesn't offer a common data access API; instead, the full power of the supported APIs is kept intact.{{Citation needed|date=June 2023}} The Spring Framework is the only framework available in Java that offers managed data access environments outside of an application server or container.
{{cite web
| url = https://www.tatvasoft.com.au/blog/spring-data-jpa-for-abstraction-of-queries/
| title = Spring Data JPA for Abstraction of Queries
| date = 6 February 2018
| access-date = 2018-02-06}}
{{Better source needed|date=June 2023}}
While using Spring for transaction management with Hibernate, the following beans may have to be configured:
- A
Datasource
likecom.mchange.v2.c3p0.ComboPooledDataSource
ororg.apache.commons.dbcp.BasicDataSource
{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10 Data Access | pp=419-426}} - A
SessionFactory
likeorg.springframework.orm.hibernate3.LocalSessionFactoryBean
with aDataSource
attribute{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10-7 Configuring ORM Resource Factories in Spring | pp=456-460}}{{sfn | Johnson | Hoeller | 2004}}{{rp|p=173}} - A
HibernateProperties
{{sfn | Johnson | Hoeller | 2004}}{{rp|p=173}} likeorg.springframework.beans.factory.config.PropertiesFactoryBean
- A
TransactionManager
likeorg.springframework.orm.hibernate3.HibernateTransactionManager
with aSessionFactory
attribute{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§10-7 Configuring ORM Resource Factories in Spring | pp=456-460}}
Other points of configuration include:
- An AOP configuration of cutting points.
- {{clarify span|Transaction semantics of AOP advice|date=February 2013}}.
=Transaction management=
Spring's transaction management framework brings an abstraction mechanism to the Java platform.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-2 Choosing a Transaction Manager Implementation|pp=464-468}} Its abstraction is capable of:
- working with local and global transactions{{sfn | Johnson | Hoeller | 2004}}{{rp | p=258}} (local transaction does not require an application server)
- working with nested transactions{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-7 Setting the Propagation Transaction Attribute|pp=494-499}}
- working with savepoints{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-7 Setting the Propagation Transaction Attribute | pp=494-499}}
- working in almost all environments of the Java platform
In comparison, Java Transaction API (JTA) only supports nested transactions and global transactions, and requires an application server (and in some cases, deployment of applications in an application server).
The Spring Framework ships a PlatformTransactionManager
{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-2 Choosing a Transaction Manager Implementation | pp=482-484}} for a number of transaction management strategies:
- Transactions managed on a JDBC Connection{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-2 Choosing a Transaction Manager Implementation|pp=464-468}}
- Transactions managed on Object-relational mapping Units of Work{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-2 Choosing a Transaction Manager Implementation|pp=464-468}}
- Transactions managed via the JTA{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-2 Choosing a Transaction Manager Implementation|pp=464-468}}
JtaTransactionManager
{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-3 Managing Transactions Programmatically with the Transaction Manager API|pp=484-486}}{{sfn | Johnson | Hoeller | 2004}}{{rp | pp=255–257}} andUserTransaction
{{sfn | Johnson | Hoeller | 2004}}{{rp | p=234}} - Transactions managed on other resources, like object databases
Next to this abstraction mechanism the framework provides two ways of adding transaction management to applications:
- Procedurally, by using Spring's
TransactionTemplate
{{sfn |Deinum | Long | Mak | Rubio | 2014 | loc=§11-4 Managing Transactions Programmatically with a Transaction Template | pp=486-489}} - Declaratively, by using metadata like XML or Java annotations (
@Transactional
,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§11-6 Managing Transactions Declaratively with the @Transactional Annotation | pp=492-494}} etc.)
Together with Spring's data access framework – which integrates the transaction management framework – it is possible to set up a transactional system through configuration without having to rely on JTA or EJB. The transactional framework also integrates with messaging{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§15-4 Create Message-Driven POJOs in Spring | pp=677-685}} and caching{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§15-5 Cache and pool JMS connections | pp=685-686}} engines.
=Model–view–controller framework=
File:Spring5JuergenHoeller2.jpg
The Spring Framework features its own model–view–controller (MVC) web application framework,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4 Spring @MVC | p=217}} which was not originally planned. The Spring developers decided to write their own Web framework as a reaction to what they perceived as the poor design of the (then) popular Jakarta Struts Web framework,[http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework Introduction to the Spring Framework]{{Failed verification|date=June 2023}} as well as deficiencies in other available frameworks. In particular, they felt there was insufficient separation between the presentation and request handling layers, and between the request handling layer and the model.Johnson, Expert One-on-One J2EE Design and Development, Ch. 12. et al.
Like Struts, Spring MVC is a request-based framework.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=375}} The framework defines strategy interfaces{{sfn | Johnson | Hoeller | 2004}}{{rp | p=144}} for all of the responsibilities that must be handled by a modern request-based framework. The goal of each interface is to be simple and clear so that it's easy for Spring MVC users to write their own implementations, if they so choose. MVC paves the way for cleaner front end code. All interfaces are tightly coupled to the Servlet API. This tight coupling to the Servlet API is seen by some as a failure on the part of the Spring developers to offer a high level of abstraction for Web-based applications {{Citation needed|date=February 2007}}. However, this coupling ensures that the features of the Servlet API remain available to developers while offering a high abstraction framework to ease working with it.
The DispatcherServlet
class is the front controllerPatterns of Enterprise Application Architecture: [http://www.martinfowler.com/eaaCatalog/frontController.html Front Controller] of the framework and is responsible for delegating control to the various interfaces during the execution phases of an HTTP request.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-232}}
The most important interfaces defined by Spring MVC, and their responsibilities, are listed below:{{sfn | Deinum | Cosmina | 2021 | loc=§4 Spring MVC Architecture - The Request Processing Summary | pp=82-83}}
Controller
: comes betweenModel
andView
to manage incoming requests and redirect to proper response.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-219}}Controller
will map the http request to corresponding methods.{{sfn|Walls|2019|pp=18-19}} It acts as a gate that directs the incoming information. It switches between going intoModel
orView
.HandlerAdapter
: responsible for execution of objects that handle incoming requests.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-3 Intercepting Requests with Handler Interceptors|pp=236-239}}HandlerInterceptor
: responsible for intercepting incoming requests.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-3 Intercepting Requests with Handler Interceptors | pp=236-239}} Comparable, but not equal to Servlet filters{{sfn | Johnson | Hoeller | 2004}}{{rp | p=509}} (use is optional{{sfn | Johnson | Hoeller | 2004}}{{rp | p=511}} and not controlled byDispatcherServlet
).HandlerMapping
: responsible for selecting objects that handle incoming requests (handlers) based on any attribute or condition internal or external to those requests{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC | pp=217-232}}LocaleResolver
: responsible for resolving and optionally saving of the locale of an individual user.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-4 Resolving User Locales | pp=239-240}}MultipartResolver
: facilitate working with file uploads by wrapping incoming requests.{{sfn | Deinum | Cosmina | 2021 | loc=§4 Spring MVC Architecture - Prepare a request | pp=75-76}}View
: responsible for returning a response to the client. TheView
should not contain any business logic and should only present the data encapsulated by theModel
.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4 Spring @MVC | p=217}} Some requests may go straight toView
without going to theModel
part; others may go through all three.ViewResolver
: responsible for selecting aView
based on a logical name for theView
{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-6 Resolving Views by Names|pp=243-247}}{{sfn | Deinum | Cosmina | 2021 | loc=§4 Spring MVC Architecture - Render a view | p=81}} (use is not strictly required{{sfn | Johnson | Hoeller | 2004}}{{rp | p=511}}).Model
: responsible for encapsulating business data.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-6 Resolving Views by Names|pp=243-247}} TheModel
is exposed to the view by the controller.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=374}} (use is not strictly required).
Each strategy interface above has an important responsibility in the overall framework. The abstractions offered by these interfaces are powerful, so to allow for a set of variations in their implementations.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=144}} Spring MVC ships with implementations of all these interfaces and offers a feature set on top of the Servlet API. However, developers and vendors are free to write other implementations. Spring MVC uses the Java {{Javadoc:SE|package=java.util|java/util|Map}} interface as a data-oriented abstraction for the Model
where keys are expected to be {{Javadoc:SE|java/lang|String}} values.{{Citation needed|date=June 2023}}
The ease of testing the implementations of these interfaces is one important advantage of the high level of abstraction offered by Spring MVC.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§17 Spring Testing | p=723}}{{sfn | Johnson | Hoeller | 2004}}{{rp | p=324}} DispatcherServlet
is tightly coupled to the Spring inversion of control container for configuring the web layers of applications. However, web applications can use other parts of the Spring Framework, including the container, and choose not to use Spring MVC.
==A workflow of Spring MVC==
When a user clicks a link or submits a form in their web-browser, the request goes to the Spring DispatcherServlet
. DispatcherServlet
is a front-controller in Spring MVC.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-232}}{{sfn | Deinum | Cosmina | 2021 | loc=§4 Spring MVC Architecture - DispatcherServlet Request Processing Workflow|pp=73-74}} The DispatcherServlet
is highly customizable and flexible.{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - DispatcherServlet Request Processing Workflow|pp=73-74}} Specifically, it is capable of handling more types of handlers than any implementations of org.
springframework.web.servlet.mvc.Controller or org.
springframework.stereotype.Controller annotated classes.{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - DispatcherServlet Request Processing Workflow|pp=73-74}} It consults one or more handler mappings.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-232}} DispatcherServlet
chooses an appropriate controller and forwards the request to it. The Controller
processes the particular request and generates a result. It is known as Model
. This information needs to be formatted in html or any front-end technology like Jakarta Server Pages (also known as JSP){{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-232}}{{sfn|Walls|2019 | p=35}} or Thymeleaf.{{sfn|Walls|2019 | p=35}} This is the View
of an application.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-232}} All of the information is in the Model
And View
object. When the controller is not coupled to a particular view, DispatcherServlet
finds the actual View
(such as JSP) with the help of ViewResolver
.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§4-1 Developing a Simple Web Application with Spring MVC|pp=217-232}}{{sfn | Johnson | Hoeller | 2004}}{{rp | pp=390–391}}
==Configuration of DispatcherServlet==
As of Servlet Specification version 3.0, there are a few ways of configuring the DispatcherServlet:{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - Bootstrapping DispatcherServlet|pp=84-90}}
- By configuring it in
web.xml
as shown below:{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - Bootstrapping DispatcherServlet|pp=84-90}}
- By configuring it in
web-fragment.xml
{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - Bootstrapping DispatcherServlet|pp=84-90}} - By using
javax.servlet.ServletContainerInitializer
{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - Bootstrapping DispatcherServlet|pp=84-90}} - By implementing the
org.springframework.web.WebApplicationInitializer
interface.{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - Bootstrapping DispatcherServlet|pp=84-90}} - By using the built-in autoconfiguration for Spring Boot, which uses the
SpringBootServletInitializer
class.lm{{sfn|Deinum|Cosmina|2021|loc=§4 Spring MVC Architecture - Bootstrapping DispatcherServlet|pp=84-90}}
=Remote access framework=
Spring's Remote Access framework is an abstraction for working with various RPC (remote procedure call)-based technologies available on the Java platform both for client connectivity and marshalling objects on servers.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-7 Expose and Invoke Services through RMI|pp=627-632}} The most important feature offered by this framework is to ease configuration and usage of these technologies as much as possible by combining inversion of control and AOP.
The framework provides fault-recovery (automatic reconnection after connection failure) and some optimizations for client-side use of EJB remote stateless session beans.
Spring provides support for these protocols and products out of the box
- HTTP-based protocols
- Hessian: binary serialization protocol,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-8 Expose and Invoke Services through HTTP|pp=632-635}}{{sfn | Johnson | Hoeller | 2004}}{{rp | p=335}} open-sourced{{sfn | Johnson | Hoeller | 2004}}{{rp | p=335}} and maintained by CORBA-based protocols{{Citation needed|reason=Sources such as "Expert One-on-One J2EE Design and Development" by Rod Johnson or "Spring Recipes" by Deinum et Al. only mention that the Hessian is maintained by the company "Caucho" and they do not explicity mention that the Hessian is maintained by CORBA-based protocols|date=June 2023}}. Hessian is maintained by the company Caucho.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=335}} Hessian is suitable for stateless remoting needs, in particular, Java-to-Java communication.{{sfn | Johnson | Hoeller | 2004}}{{rp|pp=335–336}}
- Burlap: An XML-based binary protocol that is open-sourced and also maintained by the company Caucho.{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§14-8 Expose and Invoke Services through HTTP|pp=632-635}}{{sfn | Johnson | Hoeller | 2004}}{{rp | p=335}} The only advantage of using Burlap instead of Hessian is that it is XML-parsable and human readable.{{sfn | Johnson | Hoeller | 2004}}{{rp | p=335}} For Java-to-Java communication, the Hessian is preferred since it is more light-weight and efficient.{{sfn|Johnson|Hoeller|2004}}{{rp | p=335}}
- RMI (1): method invocations using RMI infrastructure yet specific to Spring{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-7 Expose and Invoke Services through RMI|pp=627-632}}
- RMI (2): method invocations using RMI interfaces complying with regular RMI usage{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-7 Expose and Invoke Services through RMI|pp=627-632}}
- RMI-IIOP (CORBA): method invocations using RMI-IIOP/CORBA
- Enterprise JavaBean client integration{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§16-1 Integrating One System with Another Using EAI|pp=692-694}}
- Local EJB stateless session bean connectivity: connecting to local stateless session beans
- Remote EJB stateless session bean connectivity: connecting to remote stateless session beans
- SOAP
- Integration with the Apache Axis Web services framework{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-9 Expose and invoke SOAP Web Services with JAX-WS|pp=635-641}}
Apache CXF provides integration with the Spring Framework for RPC-style exporting of objects on the server side.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§14-9 Expose and invoke SOAP Web Services with JAX-WS|pp=635-641}}
Both client and server setup for all RPC-style protocols and products supported by the Spring Remote access framework (except for the Apache Axis support) is configured in the Spring Core container.
There is an alternative open-source implementation (Cluster4Spring) of a remoting subsystem included in the Spring Framework that is intended to support various schemes of remoting (1-1, 1-many, dynamic services discovering).{{Citation needed|date=June 2023}}
=Convention-over-configuration rapid application development=
{{Further|Rapid application development}}
==Spring Boot==
{{main article|Spring Boot}}
Spring Boot Extension is Spring's convention-over-configuration solution for creating stand-alone, production-grade{{sfn|Walls|2016|loc=§foreword | p=vii}} Spring-based Applications that you can "just run".{{cite web|url=http://projects.spring.io/spring-boot/|title=Spring Boot|publisher=spring.io}} It is preconfigured with the Spring team's "opinionated view"{{sfn | Walls | 2016 | loc=§2.4 | p=48}}{{sfn|Deinum|Cosmina|2021|loc=§2 Spring Framework Fundamentals | pp=21-22}} of the best configuration and use of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.{{sfn|Walls|2016|loc=§2.3|pp=37-48}}
Key Features:
- Create stand-alone Spring applications
- Embed Tomcat or Jetty{{sfn|Walls|2016|loc=§1.1.3|p=7}} directly (no need to deploy WAR files)
- Provide opinionated 'starter' Project Object Models (POMs) to simplify your Maven/Gradle configuration{{sfn|Walls|2016|loc=§Preface|p=x}}
- Automatically configure Spring whenever possible{{sfn|Walls|2016|loc=§1.1.2|pp=4-5}}
- Provide production-ready{{sfn|Walls|2016|loc=§foreword|p=vii}} features such as metrics,{{sfn|Walls|2016|loc=§7|pp=124-139}} health checks{{sfn|Walls|2016|loc=§7|pp=124-139}} and externalized configuration{{sfn|Walls|2016|loc=§3.1-§3.2.3|pp=49-69}}
- Absolutely no code generation{{sfn|Walls|2016|loc=§1.1.3|p=7}} and no requirement{{sfn|Walls|2016|loc=§Preface|p=x}} for XML configuration.{{cite web | url=https://aristeksystems.com/blog/what-you-need-know-about-spring-boot/| title=About Spring Boot | accessdate=2020-03-18}}
- Smooth Integration and supports all Enterprise Integration Patterns.
==Spring Roo==
{{main article|Spring Roo}}
Spring Roo is a community project which provides an alternative, code-generation based approach at using convention-over-configuration to rapidly build applications in Java. It currently supports Spring Framework, Spring Security and Spring Web Flow. Roo differs from other rapid application development frameworks by focusing on:
- Extensibility (via add-ons)
- Java platform productivity (as opposed to other languages)
- Lock-in avoidance (Roo can be removed within a few minutes from any application)
- Runtime avoidance (with associated deployment advantages)
- Usability (particularly via the shell features and usage patterns)
=Batch framework=
{{main article|Spring Batch}}
Spring Batch is a framework for batch processing that provides reusable functions that are essential in processing large volumes of records, including:
- logging/tracing
- transaction management
- job processing statistics{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-7 Controlling Step Execution|pp=536-541}}
- job restart
It provides more advanced technical services and features that enables extremely high-volume{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§16-9 Staging Events Using Spring Batch|pp=714-717}} and high-performance batch jobs{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-7 Controlling Step Execution|pp=536-541}} through optimizations and partitioning{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-7 Controlling Step Execution|pp=536-541}} techniques.
Spring Batch executes a series of jobs; a job consists of many steps and each step consists of a "READ-PROCESS-WRITE" task or single operation task (tasklet). A "single" operation task is also known as a tasklet.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-2 Reading and Writing|pp=518-524}} It means doing a single task only, like cleaning up the resources before or after a step is started or completed.
The "READ-PROCESS-WRITE" process consists of these steps: "read" data from a resource (comma-separated values (CSV), XML, or database), "process" it, then "write" it to other resources (CSV, XML, or database). For example, a step may read data from a CSV file,{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-2 Reading and Writing|pp=518-524}} process it, and write it into the database. Spring Batch provides many classes to read/write CSV, XML, and database.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12 Spring Batch|pp=511-512}}
The steps can be chained together to run as a job.{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§12-2 Reading and Writing|pp=518-524}}
=Integration framework=
{{main article|Spring Integration}}
Spring Integration is a framework for Enterprise application integration that provides reusable functions essential to messaging or event-driven architectures.
- routers – routes a message to a message channel based on conditions{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§16-8 Conditional Routing with Routers|pp=713-714}}
- transformers – converts/transforms/changes the message payload and creates a new message with transformed payload{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§16-5 Transforming a Message from One Type to Another|pp=704-707}}
- adapters – integrates with other technologies and systems (HTTP, AMQP (Advanced Message Queuing Protocol),{{sfn | Deinum | Long | Mak | Rubio | 2014 | loc=§15-6 Send and Receive AMQP Messages with Spring|pp=686-690}} JMS (Java Message Service), XMPP (Extensible Messaging and Presence Protocol), SMTP (Simple Mail Transfer Protocol),{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§14-4 Send E-mail with Spring’s E-mail Support|pp=613-620}} IMAP (Internet Message Access Protocol), FTP (File Transfer Protocol) as well as FTPS/SFTP, file systems, etc.)
- filters – filters a message based on criteria. If the criteria are not met, the message is dropped.{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§9-2 Using Spring in Your Servlets and Filters|p=406}}
- service activators – invoke an operation on a service object. Spring supports the use of the annotation
@ServiceActivator
to declare the component that requires this functionality.{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§16-2 Integrating Two Systems Using JMS|pp=695-698}} - management and auditing
- gateways - exposes an interface to the client for the requested services. A messaging middleware is responsible for provisioning this interface. This interface decouples the messaging middleware from the client by hiding the underlying JMS or Spring Integration APIs. Gateways are related to the Facade pattern. Spring's Integration class,
SimpleMessagingGateway
, provides essential support for gateways.SimpleMessagingGateway
enables the Spring application to specify the channel that sends requests, and the channel that expects to receive responses. The primary focus ofSimpleMessagingGateway
is to deal with payloads, which spares the client from the intricate details of the transmitted and received messages.SimpleMessagingGateway
is used along with channels to enable integration with file systems, JMS, e-mail, or any other systems that require payloads and channels.{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§16-10 Using Gateways|pp=717-722}} - splitter - Separates a large payload into smaller payloads to support different processing flows. The splitter is achieved in Spring using the splitter component. The splitter component usually forwards the messages to classes with more specialized functionality. Spring supports the
@Splitter
annotation to declare the component that requires this functionality.{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§16-7 Forking Integration Control: Splitters and Aggregators|pp=710-713}} - aggregator - Used for combining many messages into a single result. Loosely speaking, the aggregator is the reverse of the splitter. The aggregator publishes a single message for all components downstream. Spring supports the
@Aggregator
annotation to declare the component that requires this functionality.{{sfn|Deinum|Long|Mak|Rubio|2014|loc=§16-7 Forking Integration Control: Splitters and Aggregators|pp=710-713}}
Spring Integration supports pipe-and-filter based architectures.
=Spring WebSocket=
An essential rule for dealing with data streams effectively is to never block.{{sfn|Deinum|Cosmina|2021|loc=§11 The WebSocket Protocol|pp=422-425}} The WebSocket is a viable solution to this problem.{{sfn|Deinum|Cosmina|2021|loc=§11 The WebSocket Protocol|pp=422-425}} The WebSocket Protocol is a low-level transport protocol that allows full-duplex communication channels over a TCP connection. The WebSocket acts as an alternative to HTTP to enable two-way communication between the client and the server. The WebSocket is especially useful for applications that require frequent and fast exchanges of small data chunks, at a high speed and volume.{{sfn|Deinum|Cosmina|2021|loc=§11 The WebSocket Protocol|pp=422-425}}
Spring supports the WebSocket protocol by providing the WebSocket API for the reactive application. The @EnableWebSocket
annotation gives Websocket request processing functionality when places in a Spring configuration class. A mandatory interface is the WebSocketConfigurer
which grants access to the WebSocketConfigurer
. Then, the Websocket URL is mapped to the relevant handlers by implementing the registerWebSocketHandlers(WebSocketHandlerRegistry) method.{{sfn|Deinum|Cosmina|2021|loc=§11 The WebSocket Protocol|pp=425-432}}
=Spring WebFlux=
Spring WebFlux is a framework following the functional programming paradigm, designed for building reactive Spring applications. This framework uses functional programming and Reactive Streams extensively. A good use case for Spring WebFlux is for applications that require sending and receiving instantaneous information, such as a web application with chatting capabilities.{{sfn|Deinum|Cosmina|2021|loc=§10 Building Reactive Applications with Spring WebFlux|p=369}}
Although applications using Spring WebFlux technology is usually less readable than their MVC counterparts, they are more resilient, and simpler to extend.{{sfn|Deinum|Cosmina|2021|loc=§11 Securing Spring WebFlux Applications|p=421}} Spring WebFlux reduces the need to deal with the complications associated with synchronizing thread access.{{sfn|Deinum|Cosmina|2021|loc=§11 Securing Spring WebFlux Applications|p=421}}
Spring WebFlux supports server-sent events (SSE), which is a server push technology that allows the client to get automatic updates from a server through an HTTP connection. This communication is unidirectional, and shares many similarities with the publish/subscribe model found in JMS.{{sfn|Deinum|Cosmina|2021|loc=§11 The WebSocket Protocol|pp=422-425}}
Relationship with Jakarta Enterprise Beans (EJB)
{{main article | Jakarta Enterprise Beans}}
The container can be turned into a partially compliant EJB (Enterprise JavaBeans) 3.0 container by means of the Pitchfork project.{{Citation needed|date=June 2023}} Some{{Who|date=May 2011}} criticize the Spring Framework for not complying with standards.[http://www.andygibson.net/blog/index.php/2008/08/28/is-spring-between-the-devil-and-the-ejb Spring VS EJB3]{{Failed verification|reason=Error 404 Page not found|date=June 2023}} However, SpringSource doesn't see EJB 3 compliance as a major goal, and claims that the Spring Framework and the container allow for more powerful programming models.
{{cite web
| url = http://www.springsource.com/web/guest/pitchfork/pitchfork-faq
| title = Pitchfork FAQ
| access-date = 2006-06-06}}
{{Failed verification|date=June 2023}}
Spring4Shell vulnerability
{{See also | Log4Shell}}
A remote code execution vulnerability affecting certain versions of Spring Framework was published in April 2022 under {{CVE|2022-22965}}. It was given the name Spring4Shell in reference to the recent Log4Shell vulnerability, both having similar proofs-of-concept in which attackers could on vulnerable machines, gain shell access{{Cite web |url=https://www.kaspersky.com/blog/spring4shell-critical-vulnerability-in-spring-java-framework/44034/ |title=Spring4Shell: critical vulnerability in Spring - Kaspersky official blog }} or even full control.{{cite news |last1=Chirgwin |first1=Richard |title=VMware sprung by Spring4shell vulnerability |url=https://itnews.com.au/news/vmware-sprung-by-spring4shell-vulnerability-578267|archive-url=https://web.archive.org/web/20240213052709/https://www.itnews.com.au/news/vmware-sprung-by-spring4shell-vulnerability-578267 |archive-date=13 February 2024 |access-date=13 February 2024 |publisher=itnews.com.au |date=4 April 2022}}
See also
{{Portal|Free and open-source software|Computer programming}}
Citations
{{Reflist|35em}}
References
{{Refbegin}}
- {{cite book | last=Cosmina | first=Iuliana | last2=Harrop | first2=Rob | last3=Schaefer | first3=Chris | last4=Ho | first4=Clarence | title=Pro Spring 5 | publisher=Apress | publication-place=Berkeley, CA | year=2017 | isbn=978-1-4842-2807-4 | doi=10.1007/978-1-4842-2808-1}}
- {{cite book | last=Deinum | first=Marten | last2=Cosmina | first2=Iuliana | title=Pro Spring MVC with WebFlux | publisher=Apress | publication-place=Berkeley, CA | year=2021 | isbn=978-1-4842-5665-7 | doi=10.1007/978-1-4842-5666-4}}
- {{cite book | last=Deinum | first=Marten | last2=Long | first2=Josh | last3=Mak | first3=Gary | last4=Rubio | first4=Daniel | title=Spring Recipes | publisher=Apress | publication-place=Berkeley, CA | year=2014 | isbn=978-1-4302-5908-4 | doi=10.1007/978-1-4302-5909-1}}
- {{cite book
| first1 = Rod
| last1 = Johnson
| first2 = Jürgen
| last2 = Höller
| first3 = Alef
| last3 = Arendsen
| first4 = Thomas
| last4 = Risberg
| first5 = Colin
| last5 = Sampaleanu
| title = Professional Java Development with the Spring Framework
| publisher = Wrox Press
| date = July 8, 2005
| page = 672
| edition = First
| isbn = 0-7645-7483-3
}}
- {{cite book
| first1 = Rob
| last1 = Harrop
| first2 = Jan
| last2 = Machacek
| title = Pro Spring
| publisher = Apress
| date = January 31, 2005
| edition = First
| isbn = 1-59059-461-4
| page = 832
| url = https://archive.org/details/prospring00harr
| url-access = registration
}}
- {{cite book
| last1 = Johnson
| first1 = Rod
| last2 = Jürgen
| first2 = Höller
| title = J2EE Development without EJB
| publisher = Wrox Press
| date = October 23, 2002
| isbn = 0-7645-5831-5
| page = 768
| edition = First
| url = https://archive.org/details/expertoneononej200john
| url-access = registration
}}
- {{cite book
| last = Johnson
| first = Rod
| last2 = Jurgen
| first2 = Holler
| title = Expert One-on-one J2EE Design and Development
| url = https://archive.org/details/expertoneononej200rodj
| url-access = registration
| publisher = Wrox Press
| date = October 2002
| edition = First
| isbn = 0-7645-4385-7
| page = [https://archive.org/details/expertoneononej200rodj/page/n777 750]
}}
- {{cite book |last1=Johnson |first1=Rod |last2=Hoeller |first2=Juergen |title=Expert One-on-One J2EE development without EJB |date=2004 |publisher=Wiley |location=Indianapolis, Ind |isbn=978-0-7645-5831-3}}
- {{cite book | last=Musib | first=Somnath | title=Spring Boot in Practice | publisher=Simon and Schuster | date=July 12, 2022 | isbn=978-1-61729-881-3}}
- {{cite book
| last1 = Pollack
| first1 = Mark
| last2 = Gierke
| first2 = Oliver
| last3 = Risberg
| first3 = Thomas
| last4 = Brisbin
| first4 = Jon
| last5 = Hunger
| first5 = Michael
| title = Spring Data
| publisher = O'Reilly
| edition = First
| date = October 31, 2012
| page = 316
| isbn = 978-1449323950
}}
- {{cite book
| last1 = Sarin
| first1 = Ashish
| title = Getting started with Spring Framework
| publisher = Self-published
| edition = Third
| date = June 27, 2016
| page = 626
| isbn = 978-1534985087
}}
- {{cite book
| last1 = Long
| first1 = Josh
| title = Spring Framework LiveLessons
| publisher = Addison-Wesley Professional
| edition = First
| date = August 27, 2013
| pages = 4+ Hours
| isbn = 978-0-13-346307-1
}}
- {{cite book | last=Walls | first=Craig | title=Spring Boot in Action | publisher=Manning | date=Jan 3, 2016 | isbn=978-1-61729-254-5}}
- {{cite book | last=Walls | first=Craig | title=Spring in Action | publisher=Manning | date=2019 | isbn=978-1-61729-494-5}}
- {{cite web
|url=http://jax-award.de/jax_award06/gewinner_de.php
|title=JAX Innovation Award Gewinner 2006
|access-date=2009-08-12
|archive-url=https://web.archive.org/web/20090817202514/http://jax-award.de/jax_award06/gewinner_de.php
|archive-date=2009-08-17
|url-status=dead
}}
- {{cite web
| url = http://www.springsource.com/web/guest/pitchfork/pitchfork-faq
| title = Pitchfork FAQ
| access-date = 2006-06-06
}}
- {{cite web
|url=https://spring.io/blog/2013/12/12/announcing-spring-framework-4-0-ga-release/
|title=Announcing Spring Framework 4.0 GA Release
|publisher=Spring blog
|date=12 December 2013
}}
{{Refend}}
External links
{{Wikibooks|Java Programming|Spring framework}}
- {{Official website|https://spring.io}}
- [https://websparrow.org/category/spring Spring Tutorials]
{{Java (Sun)}}
{{Authority control}}
Category:Aspect-oriented programming