public class EmailSender {
void send(Message message) {
try {
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
Простая разработка с POJOs (Plain Old Java Objects)
Слабая связь через dependency injection и ориентация на интерфейсное взаимодействие
Упрощенная конфигурация приложения
Сокращение объема программного кода через аспекты и шаблоны
Декларативная разработка через применение аспектов и общих соглашений
Возможность управления общими зависимостями в единственном репозитории
Actual version (Spring Framework): 5.2.8 (21.07.2020)
Site and Docs: https://spring.io/
Spring Boot
Spring Framework
Spring Data
Spring Cloud
Spring Cloud Data Flow
Spring Security
Spring Session
Spring Integration
Spring HATEOAS
Spring REST Docs
Spring Batch
Spring AMQP
Spring for Android
Spring CredHub
Spring Flo
Spring for Apache Kafka
Spring LDAP
Spring Mobile
Spring Roo
Spring Shell
Spring Statemachine
Spring Vault
Spring Web Flow
Spring Web Services
Spring Framework
Spring Data
Spring Security
Spring Boot
GroupId | ArtifactId | Description |
|
| Proxy-based AOP support |
|
| AspectJ based aspects |
|
| Beans support, including Groovy |
|
| Application context runtime, including scheduling and remoting abstractions |
|
| Support classes for integrating common third-party libraries into a Spring application context |
|
| Core utilities, used by many other Spring modules |
|
| Spring Expression Language (SpEL) |
GroupId | ArtifactId | Description |
|
| Instrumentation agent for JVM bootstrapping |
|
| Instrumentation agent for Tomcat |
|
| JDBC support package, including DataSource setup and JDBC access support |
|
| JMS support package, including helper classes to send/receive JMS messages |
|
| Support for messaging architectures and protocols |
|
| Object/Relational Mapping, including JPA and Hibernate support |
|
| Object/XML Mapping |
GroupId | ArtifactId | Description |
|
| Support for unit testing and integration testing Spring components |
|
| Transaction infrastructure, including DAO support and JCA integration |
|
| Foundational web support, including web client and web-based remoting |
|
| HTTP-based Model-View-Controller and REST endpoints for Servlet stacks |
|
| WebSocket and SockJS infrastructure, including STOMP messaging support |
spring-core
- provides the fundamental parts of the framework, including the IoC and Dependency Injection features
spring-beans
- provides BeanFactory
, which is a sophisticated implementation of the factory pattern
spring-context
- builds on the solid base provided by the spring-core
and spring-beans
, and it is a medium to access any objects defined and configured. The ApplicationContext
interface is the focal point
spring-context-support
spring-expression
- provides a powerful expression language for querying and manipulating an object graph at runtime
Inversion of Control
Dependency Inversion Principle
Dependency Injection
public class EmailSender {
void send(Message message) {
try {
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
public class SenderService {
private EmailSender sender;
public SenderService() {
}
public SenderService(EmailSender sender) {
this.sender = sender;
}
public void sendMessage(Message message) {
sender.send(message);
}
public void setSender(EmailSender message) {
this.sender = sender;
}
}
public interface Sender {
void send(Message message);
}
public class EmailSender implements Sender {
void send(Message message) {
try {
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
public class SenderService {
private Sender sender;
public SenderService() {
}
public SenderService(Sender sender) {
this.sender = sender;
}
public void sendMessage(Message message) {
sender.send(message);
}
public void setSender(Sender message) {
this.sender = sender;
}
}
SenderService
не привязан к конкретной реализации Sender
SenderService
неважно какой вид адреса передается в конструктор, т.к. передаются классы-потомки Sender
weak coupling - объект знает о связи по интерфейсу, таким образом зависимость может быть вынесена с различными реализациями, без информации о конкретной реализации
IoC - Inversion of Control, инверсия управления
Принцип объектно-ориентированного управления, который используется для уменьшения зацепления в программе.
Упрощает расширение возможностей системы
Подход в проектировании, при котором зависимости объекта передаются ему извне, а не создаются в нём
Упрощает тестирование системы
Позволяет настраивать процесс создания объектов извне
Объект в терминах IoC-контейнера, жизненный цикл которого управляется этим контейнером
Может представлять собой любой объект:
service
dao
util (вспомогательный класс)
т.д.
Описание правил, по которым создаётся бин, а также его зависимостей и правил их внедрения
Может задаваться различными способами:
xml
java-config
annotations
groovy-config
Spring provides following two types of containers:
BeanFactory
container
ApplicationContext
container
BeanFactory
public class Program {
public static void main(String[] args) {
InputStream is = new FileInputStream("beans.xml");
BeanFactory factory = new XmlBeanFactory(is);
//Get bean
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
}
}
BeanFactory
public class Program {
public static void main(String[] args) {
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
}
}
BeanFactory
methodsboolean containsBean(String)
Object getBean(String)
Object getBean(String, Class)
Class getType(String name)
boolean isSingleton(String)
String[] getAliases(String)
ApplicationContext
Фактически ApplicationContext
- является IoC Container, в котором хранятся все beans
Представляет собой HashMap
ApplicationContext
FileSystemXmlApplicationContext
- считывает определения beans из xml-файла, расположенного где-то в файловой системе
ClassPathXmlApplicationContext
- считывает определения beans из xml-файла, расположенного в classpath
AnnotationConfigApplicationContext
- считывает определения beans из конфигурационных Java-файлов
ApplicationContext
XmlWebApplicationContext
- считывает определения beans из xml-файла в web-приложении
AnnotationConfigWebApplicationContext
- считывает определения beans из конфигурационных Java-файлов в web-приложении
GenericGroovyApplicationContext
(Spring 4+) - считывает определения beans из конфигурационных Groovy-файлов
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="quest" class="by.rakovets.course.spring.example.bean.knights.SlayDragonQuest">
<property name="steps">
<list>
<value type="java.lang.String">Find dragon lair</value>
<value type="java.lang.String">Create trap</value>
<value type="java.lang.String">Slay dragon</value>
</list>
</property>
</bean>
<bean class="by.rakovets.course.spring.example.bean.knights.BraveKnight">
<constructor-arg name="quest" ref="quest"/>
<property name="name" value="Fedor"/>
</bean>
</beans>
ApplicationContext
public class XmlFileConfigApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext context
= new ClassPathXmlApplicationContext("application-context.xml");
Knight knight = context.getBean(BraveKnight.class);
knight.embarkOnQuest();
}
}
aop
– предоставляют элементы для декларирования аспектов, и для автоматического проксирования @AspectJ
– аннотированные классы как Spring аспекты.
beans
– базовые примитивы Spring namespace, включая декларирование beans и как они должны быть связаны.
context
– приходят с элементами для конфигурирования Spring контекст приложения, включая возможность для автоопределения и autowired beans и введения объектов не прямо управляемых Spring.
jee
– предлагает интеграцию с Jakarta EE API таких, как JNDI и EJB
jms
– предоставляет конфигурационные элементы для декларирования message-driven POJOs
lang
– включает декларирование beans, которые реализованы на Groovy, JRuby или BeanShell скриптов.
mvc
– включает Spring MVC возможности, такие как annotation-based (аннотационно-ориентированных) controllers, view-controllers, и interceptors.
oxm
– поддержка конфигурации Spring object-to-XML маппинг возможности.
tx
– предоставляет декларативные транзакционные конфигурации.