Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Spring dependency injection β€” Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π² Spring

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ‚Π΅ΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Spring ΠΈ сСгодня рассмотрим spring dependency injection ΠΈΠ»ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π΅Ρ‰Π΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π² Π΄Π°Π½Π½ΠΎΠΌ java Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ понятиС Inversion of Control (Π΄Π°Π»Π΅Π΅ IoC) инвСрсия управлСния.

IoC β€” ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ связанности ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ классов ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² пятСрку SOLID ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ². Если Π½Π΅ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности, Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ. Π”Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций. А Ссли Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ абстракций, Π° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. Π’ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π’Π°ΡˆΠ° рСализация Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Π΅Π΅ измСнСния Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ Π²Π΅Ρ€Ρ…Π½ΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ.

Dependency injection (DI) β€” ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ IoC. Spring Framework ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ DI. Как Ρ€Π°Π· Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² Spring сСйчас Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈ посмотрим.

ΠœΡ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ абстракций. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Spring MVC ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Π΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΡ‹ прСдоставляли доступ ΠΊ нашСй сущности Order Ρ‡Π΅Ρ€Π΅Π· интСрфСйс OrderRepository ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ OrderRepositoryImpl. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ использовали OrderRepository Π² сСрвис слоС ΠΈ ΡƒΠΆΠ΅ OrderService ΠΌΡ‹ прСдоставили ΠΊΠ°ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ доступа ΠΊ сущности Order.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд такая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° каТСтся ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠΉ, Π½ΠΎ Ссли Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ β€” Π΅Π΅ рСализация ΠΎΡ‡Π΅Π½ΡŒ удобная Π² случаС добавлСния ΠΈΠ»ΠΈ измСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°. Допустим Π’Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Для этого Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ сСрвис ΠΈ Π΅Π³ΠΎ использованиС. Достаточно ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ класс OrderRepositoryImpl. Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π² курсС, Ρ‡Ρ‚ΠΎ это Π·Π° класс:

import java.util.ArrayList ;
import java.util.List ;

public class OrderRepositoryImpl implements OrderRepository <

private List Order > orders = new ArrayList Order > ( ) ;

public OrderRepositoryImpl ( ) <
Order order = new Order ( ) ;
order. setId ( 1 ) ;
order. setPrice ( 234d ) ;
order. setTitle ( «Pizza peperoni» ) ;
Order order2 = new Order ( ) ;
order2. setId ( 2 ) ;
order2. setPrice ( 123d ) ;
order2. setTitle ( «Sushi Philadelfia» ) ;
orders. add ( order ) ;
orders. add ( order2 ) ;
>

public void save ( Order order ) <
orders. add ( order ) ;
>

public void delete ( Order order ) <
orders. remove ( order ) ;
>

public List Order > getAll ( ) <
return orders ;
>

public Order getById ( Integer id ) <
return orders. get ( id ) ;
>
>

Код Π²Ρ‹ΡˆΠ΅ β€” простой DAO класс для стандартных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ. Π—Π΄Π΅ΡΡŒ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ происходило Π² спискС. Если Π’Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ систСму, ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ класс Π²Ρ‹ΡˆΠ΅. Наш сСрвис Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Он просто Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈ прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° DI Π² Spring. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Spring ΠΌΠΎΠ³ Π΄Π΅Π»Π°Ρ‚ΡŒ внСдрСния Π² классС Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ: @Component, @Service, @Repository.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Π­Ρ‚ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π°Π΄ Ρ‚Π΅ΠΌΠΈ классами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π² зависимости. На ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Π΅ простого Spring MVC прилоТСния ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.

Класс OrderRepositoryImpl ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠΌ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Repository:

import java.util.ArrayList ;
import java.util.List ;

@ Repository
public class OrderRepositoryImpl implements OrderRepository <

private List Order > orders = new ArrayList Order > ( ) ;

public OrderRepositoryImpl ( ) <
Order order = new Order ( ) ;
order. setId ( 1 ) ;
order. setPrice ( 234d ) ;
order. setTitle ( «Pizza peperoni» ) ;
Order order2 = new Order ( ) ;
order2. setId ( 2 ) ;
order2. setPrice ( 123d ) ;
order2. setTitle ( «Sushi Philadelfia» ) ;
orders. add ( order ) ;
orders. add ( order2 ) ;
>

public void save ( Order order ) <
orders. add ( order ) ;
>

public void delete ( Order order ) <
orders. remove ( order ) ;
>

public List Order > getAll ( ) <
return orders ;
>

public Order getById ( Integer id ) <
return orders. get ( id ) ;
>
>

Класс OrderServiceImpl соотвСтствСнно Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Service:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ OrderRepository Π½ΡƒΠΆΠ½ΠΎ Π² сСрвисС Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Autowired. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² сСрвисС вмСсто private OrderRepository orderRepository = new OrderRepositoryImpl(); Π±ΡƒΠ΄Π΅Ρ‚

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвис Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ строку: private OrderService orderService = new OrderServiceImpl (); Π½Π°

@Autowired
private OrderService orderService;

Spring сам Π½Π°ΠΉΠ΄Π΅Π½ Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Ρ‹ΡˆΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… интСрфСйсов.

Аннотации @Component, @Service, @Repository всСго лишь ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ для спринг, Ρ‡Ρ‚ΠΎ это Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… интСрфСйсов.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСно Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Ρ‡Π΅Ρ€Π΅Π· конструкторы ΠΈ сСттСры. Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ нСпосрСдствСнноС Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅) Π²ΠΏΠΎΠ»Π½Π΅ достаточно для Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ уровня ΠΈΠ·ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… Spring ΠΈ дальнСйшСС услоТнСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡ‚Π°Ρ‚ΡŒ читатСля.

Π•Ρ‰Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ dependency injection Π½Π° Π²ΠΈΠ΄Π΅ΠΎ Π½ΠΈΠΆΠ΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй DI Π² Java Spring

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй

ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ внСдрСния зависимостСй

Spring IOC Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ зависимости с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ внСдрСния зависимостСй, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ тСстированиС ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΊΠΎΠ΄Π°. Блабая связь ΠΌΠ΅ΠΆΠ΄Ρƒ классами ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния интСрфСйсов для ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΎΡ€ создаст экзСмпляры ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π—Π°Π΄Π°Ρ‡Π° создания экзСмпляров ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² выполняСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Π² соотвСтствии с конфигурациями, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ.

Π’ΠΈΠΏΡ‹ внСдрСния зависимостСй Spring

БущСствуСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° внСдрСния зависимостСй Spring.

Π² Ρ„Π°ΠΉΠ»Π΅ bean-config.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Допустим, Π΅ΡΡ‚ΡŒ класс GFG, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SDI ΠΈ Π·Π°Π΄Π°Π΅Ρ‚ свойства Π³ΠΈΠΊΠΎΠ². Код для Π½Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: возьмСм Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ ΠΈ SDI.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй установщика (SDI) ΠΏΡ€ΠΎΡ‚ΠΈΠ² внСдрСния зависимостСй конструктора (CDI)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Spring DI

ΠœΡ‹ использовали Ρ‚Ρ€ΠΈ класса ΠΈ интСрфСйс Π² качСствС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ CDI ΠΈ SDI. Π­Ρ‚ΠΎ классы Vehicle, ToyotaEngine, Tires ΠΈ интСрфСйс IEngine соотвСтствСнно.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ класс Vehicle зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Engine, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся интСрфСйсом. (Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² основном ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ транспортных срСдств трСбуСтся стандартный Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ индийским Π½ΠΎΡ€ΠΌΠ°ΠΌ выбросов.) Класс ToyotaEngine Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс, ΠΈ Π΅Π³ΠΎ ссылка прСдоставляСтся Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, сопоставлСнном с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· свойств класса транспортного срСдства.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ InjectwithConstructor ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚-конструктор элСмСнта с ΠΈΠΌΠ΅Π½Π΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΈ ссылкой. Атрибут Name ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° конструктора, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Vehicle. Атрибут ref ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ссылку bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ.

InjectwithSetter ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ элСмСнт свойства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ «имя» свойства ΠΈ Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» свойства. ВмСсто значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ref ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для обозначСния ссылки Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

pom.xml

Enigne.java

ToyotaEngine.java

Tyres.java

Vehicle.java

springContext.xml

ΠŸΡ€ΠΎΡ†Π΅ΡΡ создания экзСмпляра bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ внСдрСния зависимостСй ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рисункС Π½ΠΈΠΆΠ΅:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

РСзюмС

Как ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ обСспСчиваСт Π»ΡƒΡ‡ΡˆΡƒΡŽ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ, нСсмотря Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ нСдостатки. Π˜Π½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ сСттСров ΠΈ конструкторов ΠΈΠΌΠ΅ΡŽΡ‚ свои ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ³ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ прСдлагаСтся самим сообщСством Spring.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Бпособы внСдрСния зависимостСй (Dependency Injection) Π² Spring

Dependency Injection (Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй) – ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ шаблон проСктирования Π² Spring. ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π° нас Π±ΠΈΠ½Ρ‹ (ΠΈΠ½Π°Ρ‡Π΅ говоря β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹) ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ½Ρ‹. И Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ это Π΄Π΅Π»Π°Π΅Ρ‚.

Но ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ Spring, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π±ΠΈΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°? Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, Π° самых частых всСго Π΄Π²Π°: Π±ΠΈΠ½ внСдряСтся Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· конструктор класса, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСттСра. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ называСтся constructor-based injection, Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” setter-based injection.
Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ создадим Π±ΠΈΠ½ Engine ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ½Π°: Π² Π±ΠΈΠ½ CarWithConstructor с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора ΠΈ Π² CarWithSetter с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСттСра.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Maven

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±ΠΈΠ½Π°ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² pom.xml Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ:

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ классы. Π˜Ρ‚Π°ΠΊ, сначала Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ класса. Класс Engine:

Класс CarWithConstructor с конструктором:

И класс CarWithSetter с сСттСром:

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π±ΠΈΠ½, классов Π½Π°ΠΌ нСдостаточно, Spring ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Π±ΠΈΠ½Π°ΠΌΠΈ, Π° Π½Π΅ классами. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти классы Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Spring ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ создал Π½Π° ΠΈΡ… основС Π±ΠΈΠ½Ρ‹. Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π΄Π°Π½Ρ‹ ΠΈ pзависимости. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ½Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML. (Но ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ XML-конфигурация Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ устарСла.)

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π±ΠΈΠ½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ

Π”ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π±ΠΈΠ½ engine, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ:

Аннотация @Component Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ класс Π² Π±ΠΈΠ½. ΠŸΡ€ΠΈ запускС Spring создаст экзСмпляр класса Engine. Π­Ρ‚ΠΎΡ‚ экзСмпляр Π±ΡƒΠ΄Π΅Ρ‚ синглтоном Π² нашСм случаС. ΠœΡ‹ смоТСм Π΅Π³ΠΎ впослСдствии ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· контСкста прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

И ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ Π²ΠΎ всС Π±ΠΈΠ½Ρ‹, Π³Π΄Π΅ ΠΌΡ‹ Π·Π°Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ Π² качСствС зависимости. НСваТно ΠΊΠ°ΠΊΠΈΠΌ способом – Ρ‡Π΅Ρ€Π΅Π· конструктор ΠΈΠ»ΠΈ сСттСр.
Π”Π°Π²Π°ΠΉΡ‚Π΅ Π·Π°Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся Π±ΠΈΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Spring Π·Π½Π°Π», Π³Π΄Π΅ ΠΈΡ… ΠΈΡΠΊΠ°Ρ‚ΡŒ. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @ComponentScan:

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² классС Config ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π² нашСм простом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ пуст.

Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Β«ru.javalang.injectionΒ» Spring Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ @Component классы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π±ΠΈΠ½Ρ‹ ΠΏΡ€ΠΈ запускС прилоТСния ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Spring.
Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½ engine. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π³ΠΎ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ½Ρ‹. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, эти Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ½Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π½Π°Π΄ΠΎ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. И Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ зависимости (dependency injection).

Constructor Based Injection

Если Π² классС Π΅ΡΡ‚ΡŒ конструктор, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· конструктор. ΠŸΡ€ΠΈ создании класса ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Spring Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ конструктор ΠΈ пСрСдаст Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° конструктора.
Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π±ΠΈΠ½ CarWithConstructor ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Π² Π½Π΅Π³ΠΎ Π±ΠΈΠ½ Engine с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора:

Аннотация @Component ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс CarWithConstructor Π½Π°Π΄ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π±ΠΈΠ½Π°.
А аннотация @Autowired ΠΏΠ΅Ρ€Π΅Π΄ конструктором Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π±ΠΈΠ½ engine Π² качСствС зависимости Π² Π±ΠΈΠ½ CarWithConstructor.
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ начиная с вСрсии Spring 4.3 Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Ссли Ρƒ класса всСго ΠΎΠ΄ΠΈΠ½ конструктор. О Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² конструкторС Π½Π°Π΄ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π±ΠΈΠ½, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ догадаСтся сам.

Setter Based Injection

Если Π² классС Π·Π°Π΄Π°Π½ сСттСр, Ρ‚ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ. Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ создании экзСмпляра класса ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ конструктор Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° ΠΏΠΎΡ‚ΠΎΠΌ сСттСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π²ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданный Π±ΠΈΠ½.
ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π±ΠΈΠ½ CarWithSetter ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Π² Π½Π΅Π³ΠΎ Π±ΠΈΠ½ engine с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСттСра.
Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ сСттСром Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired:

Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС, Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired ΠΏΠ΅Ρ€Π΅Π΄ сСттСром ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.
Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ сСттСр. И просто Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ car:

И Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости всС Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π½ΠΈ конструктора, Π½ΠΈ сСттСра, Π° ΠΏΠΎΠ»Π΅ car ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ private. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ для создания Π±ΠΈΠ½ΠΎΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляры машин, Π½Π°Π΄ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ контСксту прилоТСния:

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ carWithConstructor Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΡƒΡŽ ссылку Π½Π° engine. Π₯отя ΠΌΡ‹ Π½Π΅ создавали Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new. ВсС Π±ΠΈΠ½Ρ‹ создал Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ссылки Π½Π° зависимости Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС Π±ΠΈΠ½Ρ‹ Ρƒ нас синглтоны, ΠΈ ΠΎΠ±Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ carWithConstructor ΠΈ carWithSetter ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ engine. Π‘ΠΈΠ½Π³Ρ‚ΠΎΠ½ β€” самый частый ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΠΈΠ½Π°.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π±ΠΈΠ½ΠΎΠ² с XML

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сконфигурируСм всС Ρ‚ΠΎ ΠΆΠ΅ самоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML:

Π’Π΅Π³ bean Π·Π°Π΄Π°Π΅Ρ‚ Π±ΠΈΠ½, это Π°Π½Π°Π»ΠΎΠ³ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Component.

Constructor Based Injection

Π’ΠΎΡ‚ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ XML, которая опрСдСляСт Π±ΠΈΠ½ CarWithConstructor:

Π’ΡƒΡ‚ constructor-arg опрСдСляСт Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора.
Атрибут ref содСрТит ссылку Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΠΈΠ½Π° engine.

Setter-Based Injection

А это Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ XML, которая Π·Π°Π΄Π°Π΅Ρ‚ Π±ΠΈΠ½ CarWithSetter:

Π—Π΄Π΅ΡΡŒ Ρ‚Π΅Π³ property Π·Π°Π΄Π°Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСттСра.
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Π±ΠΈΠ½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML, Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ сСттСр Π² классС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π˜Π½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС послаблСния Π² конфигурациях ΠΏΡ€ΠΈΡˆΠ»ΠΈ с аннотациями, с XML всС Π³ΠΎΡ€Π°Π·Π΄ΠΎ строТС.
Π—Π° контСкст, созданный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML, ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс:

Π‘ΠΈΠ½ ΠΈΠ· XML-контСкста ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ:

УбСдимся, Ρ‡Ρ‚ΠΎ engine Π²Π½Π΅Π΄Ρ€Π΅Π½:

Какой способ внСдрСния зависимости Π»ΡƒΡ‡ΡˆΠ΅

Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° большой Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅Ρ‚. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ рСкомСндуСтся ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ класса – Π΅Π³ΠΎ структуры ΠΈ Ρ†Π΅Π»ΠΈ. Если Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π° Π² Π΄Π°Π½Π½ΠΎΠΌ классС, Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ это ΠΏΠΎΠ»Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² конструкторС. А Π·Π½Π°Ρ‡ΠΈΡ‚ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· конструктор. БоотвСтствСнно Ссли какая-Ρ‚ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°, Ρ‚ΠΎ внСдряСм Π΅Π΅ Ρ‡Π΅Ρ€Π΅Π· сСттСр.

Код ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΅ΡΡ‚ΡŒ Π½Π° GitHub.

Бпособы внСдрСния зависимостСй (Dependency Injection) Π² Spring: 3 коммСнтария

Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ спасибо Π²Π°ΠΌ Π·Π° ваши ΡΡ‚Π°Ρ‚ΡŒΠΈ. ВсС ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ, ястно ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡβ€¦ΠžΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡Π΅ΠΌ любой Π²ΠΈΠ΄Π΅ΠΎ-ΡƒΡ€ΠΎΠΊ Π½Π° ΡŽΡ‚ΡƒΠ±Π΅.

Бпасибо, Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ). ΠŸΡ€Π°Π²Π΄Π°, ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ…ΠΎΡ‡Ρƒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ-ΡƒΡ€ΠΎΠΊΠΈ.

ΠžΠ³Ρ€ΠΎΠΌΠ½Π°Ρ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΎΡΡ‚ΡŒ Автору статСй ΠΏΠΎ Spring, это самыС ясныС ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я нашСл!
Π˜ΡΠΊΡ€Π΅Π½Π½Π΅ Π’Π°Ρˆ, Yustas

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Framework? ΠžΡ‚ внСдрСния зависимостСй Π΄ΠΎ Web MVC

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это руководство для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ:

9000 слов, вСроятно, Π½Π΅ стоит Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π΅ Π½Π° мобильном устройствС. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π΅ Π² Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎΠ·ΠΆΠ΅. И Π΄Π°ΠΆΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Сшь Ρ‡ΠΈΡ‚Π°ΠΉ этого слона ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ кусочку Π·Π° Ρ€Π°Π· πŸ™‚

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°:
ВСкст ΡΡ‚Π°Ρ‚ΡŒΠΈ вСсьма большой ΠΈ Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ нСточности нСсмотря Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΡƒΡŽ Π²Ρ‹Ρ‡ΠΈΡ‚ΠΊΡƒ тСкста. Π‘ΡƒΠ΄Ρƒ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ всСм Π·Π° конструктивныС замСчания.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ экосистСмы Spring

МногиС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Spring, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° сайт spring.io, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ всСлСнная Spring Π½Π° самом Π΄Π΅Π»Π΅ состоит ΠΈΠ· 21 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Ой!

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π²Ρ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Spring Π² послСдниС ΠΏΠ°Ρ€Ρƒ Π»Π΅Ρ‚, ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ нСпосрСдствСнно ΠΊ Spring Boot ΠΈΠ»ΠΈ Spring Data.

Однако это руководство касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, самого Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ ΠΈΠ· этих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²: Spring Framework. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Spring Framework являСтся основой для всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Spring Boot, Spring Data, Spring Batch β€” всС это построСно ΠΏΠΎΠ²Π΅Ρ€Ρ… Spring.

Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° послСдствия:

15 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ этого руководства, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ самыС Π²Π°ΠΆΠ½Ρ‹Π΅ 80% Spring Framework, ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ окупятся Π² вашСй ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Framework?

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚:

По сути Spring Framework прСдставляСт собой просто ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ внСдрСния зависимостСй, с нСсколькими ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ слоями (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, прокси, аспСктно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, RPC, Π²Π΅Π±-инфраструктура MVC). Π­Ρ‚ΠΎ всС позволяСт Π²Π°ΠΌ быстрСС ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Java-прилоТСния.

Волько это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚:

ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ этого руководства.

ΠžΡΠ½ΠΎΠ²Ρ‹ внСдрСния зависимостСй

Если Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ прямо ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π°Π·Π΄Π΅Π»Ρƒ ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Spring IOC / Dependency Injection. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ дальшС.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ?

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Java класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² вашСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹ Π±Ρ‹ Π½Π°Π·Π²Π°Π»ΠΈ эти классы DAO (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ) ΠΈΠ»ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ класс UserDAO.

Π’Π°Ρˆ класс UserDAO ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² вашСй Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ SQL запрос, Π²Π°ΡˆΠ΅ΠΌΡƒ классу UserDAO трСбуСтся соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. А Π² ΠΌΠΈΡ€Π΅ Java Π²Ρ‹, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ DataSource. Π˜Ρ‚Π°ΠΊ, ваш ΠΊΠΎΠ΄ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ new()

Наивным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ источник Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½. Π˜Ρ‚Π°ΠΊ, для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… MySQL ваш UserDAO ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ наш класс UserDao Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, findByFirstName.

К соТалСнию, этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ΅Π½ источник Π΄Π°Π½Π½Ρ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ этот Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ UserDAO ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΈ, ввСдя ΠΌΠ΅Ρ‚ΠΎΠ΄ newDataSource.

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° нСдостатка:

Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс ProductDAO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL? Π’Π°Ρˆ ProductDAO Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ DataSource, которая Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² вашСм классС UserDAO. Π—Π°Ρ‚Π΅ΠΌ Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс, содСрТащий ваш DataSource.

ΠœΡ‹ создаСм ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ источник Π΄Π°Π½Π½Ρ‹Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса SQL. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ DataSource ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ сокСт-соСдинСниС ΠΎΡ‚ вашСй Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊ вашСй Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ врСмя ΠΈ довольно Π΄ΠΎΡ€ΠΎΠ³ΠΎ. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ источник Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ использовали Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Ρ‚ΠΎΠ½Π½Ρ‹. Одним ΠΈΠ· способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сохранСниС источника Π΄Π°Π½Π½Ρ‹Ρ… Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ ΠΏΠΎΠ»Π΅ Π² нашСм UserDao, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, Π½ΠΎ это Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими DAO.

Зависимости Π² глобальном классС прилоТСния

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ написании глобального класса Application, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Π’Π°Ρˆ класс UserDAO Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π΄Π²ΡƒΠΌ направлСниям:

Однако Ρƒ этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько нСдостатков:

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ управлСния (IoC, Inversion of Control)

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ шаг Π²ΠΏΠ΅Ρ€Π΅Π΄.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ссли Π±Ρ‹ Π²Π°ΠΌ Π² классС UserDAO Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ поискС зависимостСй? ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Application.INSTANCE.dataSource(), ваш UserDAO ΠΌΠΎΠ³ Π±Ρ‹ (ΠΊΠ°ΠΊ-Ρ‚ΠΎ) ΠΊΡ€ΠΈΡ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ΅Π½, Π½ΠΎ большС Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠΎΠ³Π΄Π° / ΠΊΠ°ΠΊ / ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚?

Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ называСтся инвСрсиСй управлСния (Inversion of Control).

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ наш класс UserDAO, с Π½ΠΎΠ²Ρ‹ΠΌ конструктором.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния UserDao это выглядит Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅. Он большС Π½Π΅ Π·Π½Π°Π΅Ρ‚ Π½ΠΈ ΠΎ классС прилоТСния, Π½ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ сами источники Π΄Π°Π½Π½Ρ‹Ρ…. Он Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΌΠΈΡ€Ρƒ, Ρ‡Ρ‚ΠΎ «Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ) мСня, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ ΠΌΠ½Π΅ источник Π΄Π°Π½Π½Ρ‹Ρ…Β».

Но ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Если Ρ€Π°Π½ΡŒΡˆΠ΅ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Β«new UserService()Β», Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ UserDao(dataSource).

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ для внСдрСния зависимостСй

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹, ΠΊΠ°ΠΊ программист, всС Π΅Ρ‰Π΅ создаСтС UserDAO с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ… конструктора ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, устанавливаСтС Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ DataSource Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Π Π°Π·Π²Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ссли Π±Ρ‹ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ ваш UserDAO ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ конструктора DataSource, ΠΈ Π·Π½Π°Π», ΠΊΠ°ΠΊ Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ? А Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ»ΡˆΠ΅Π±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сконструируСт для вас ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ DataSource ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ UserDao?

Π­Ρ‚ΠΎΡ‚ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ являСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ внСдрСния зависимостСй ΠΈ являСтся ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ прСдставляСт собой срСда Spring.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Spring IOC / Dependency Injection

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² самом Π½Π°Ρ‡Π°Π»Π΅, Spring Framework ΠΏΠΎ своСй сути являСтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ внСдрСния зависимостСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт написанными Π²Π°ΠΌΠΈ классами ΠΈ ΠΈΡ… зависимостями для вас (см. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»). Π”Π°Π²Π°ΠΉΡ‚Π΅ выясним, ΠΊΠ°ΠΊ это происходит.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ApplicationContext? Для Ρ‡Π΅Π³ΠΎ Ρ‚Π΅Π±Π΅ это?

Π’ΠΎΡ‚, ΠΊΡ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ всС ваши классы ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (Ρ‡ΠΈΡ‚Π°ΠΉ: создайтС ΠΈΡ… с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ зависимостями), называСтся ApplicationContext Π²ΠΎ всСлСнной Spring.

Π§Π΅Π³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Ρ‚Π°ΠΊ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° (я описал UserDao ΠΈ DataSource Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ ссылкС, Ссли Π²Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ сюда ΠΈ пропустили Π΅Π³ΠΎ):

Π­Ρ‚ΠΎ довольно ΠΊΡ€ΡƒΡ‚ΠΎ, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? Π’Π°ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сторонС, большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ создании классов, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ApplicationContext ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ классы!

Но ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ApplicationContextConfiguration? Как ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ApplicationContexts ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ someConfigClass Π² конструктор AnnotationConfigApplicationContext. Π’ΠΎΡ‚ быстроС Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅:

Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² конструктор ApplicationContext, это ссылка Π½Π° класс ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π­Ρ‚ΠΎΠ³ΠΎ класса ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ достаточно для запуска самого ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ прилоТСния Spring.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ выясним, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Spring ΠΈ AnnotationConfigApplicationContext Π΄Π΅Π»Π°ΡŽΡ‚ с Ρ‚Π΅ΠΌ классом ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ написали.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ создали AnnotationConfigApplicationContext? Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы ApplicationContext?

БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ способов создания Spring ApplicationContext, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² XML, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… классов ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Java ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ. Для внСшнСго ΠΌΠΈΡ€Π° это прСдставлСно Ρ‡Π΅Ρ€Π΅Π· Π΅Π΄ΠΈΠ½Ρ‹ΠΉ интСрфСйс ApplicationContext.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° класс MyApplicationContextConfiguration свСрху. Π­Ρ‚ΠΎ класс Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Spring. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ AnnotationConfigApplicationContext.

Если вмСсто этого Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой ApplicationContext ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² XML, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ClassPathXmlApplicationContext.

Π•ΡΡ‚ΡŒ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ…, Π½ΠΎ Π² соврСмСнном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Spring Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ с контСкста прилоТСния, основанного Π½Π° аннотациях.

Π’Π°ΠΌ придСтся Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ вашСго класса ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ApplicationContext ΠΊΠ°ΠΊ ΠΎ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры UserDao, ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт экзСмпляры DataSource.

Π­Ρ‚ΠΈ экзСмпляры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ этими Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. Spring ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ создал ΠΈΡ… ΠΈ ΠΎΠ½ΠΈ находятся ΠΏΠΎΠ΄ Π΅Π³ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ.

Но это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ вопросу: сколько экзСмпляров ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ создано Spring?

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring bean scope?

Бколько экзСмпляров Π½Π°ΡˆΠΈΡ… DAO слСдуСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² Spring? Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ bean scope (ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния Π±ΠΈΠ½Π°).

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ список доступных областСй примСнСния Π±ΠΈΠ½ΠΎΠ² здСсь, Π½ΠΎ ΠΏΠΎΠΊΠ° достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.

Аннотация области (scope annotation) опрСдСляСт, сколько экзСмпляров создаст Spring. И, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, это довольно просто:

Π‘ΡƒΡ‚ΡŒ: Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Spring ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ состоят ΠΈΠ· одноэлСмСнтных bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ области дСйствия bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ, запрос, сСссия, websocket ΠΈ Ρ‚.Π΄.).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ ApplicationContexts, Beans & Scopes, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· рассмотрим зависимости ΠΈΠ»ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊ наш UserDAO ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ DataSource.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Java Config?

Π”ΠΎ сих ΠΏΠΎΡ€ Π²Ρ‹ явно настраивали свои bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ApplicationContext с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… @Bean ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Java.

Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π±Ρ‹ Π½Π°Π·Π²Π°Π»ΠΈ Spring Java Config, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ указания всСго Π² XML, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ историчСски Π±Ρ‹Π» ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ для Spring. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это выглядит:

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, Ссли ваш MyApplicationContextConfiguration находится Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ com.marcobehler, Spring Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ начинаСтся с com.marcobehler для поиска ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Spring.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Component ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ UserDAO.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Spring ΠΈΠΌΠ΅Π΅Ρ‚ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для создания bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² UserDAO:

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости Ρ‡Π΅Ρ€Π΅Π· конструктор ΠΈ Autowired

Π’ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Ρ… вСрсиях Spring Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ достаточно ΡƒΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ эти зависимости Π±Π΅Π· явной Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Autowired Π² конструкторС. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ я упомянул @Autowired Ρ‚ΠΎΠ³Π΄Π°? ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π΅Π»Π°Π΅Ρ‚ Π²Π΅Ρ‰ΠΈ Π±ΠΎΠ»Π΅Π΅ явными ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ @Autowired Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… мСстах, ΠΊΡ€ΠΎΠΌΠ΅ конструкторов.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы внСдрСния зависимостСй β€” Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ конструкторов β€” всСго лишь ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ….

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Field Injection? Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Setter Injection?

ΠŸΡ€ΠΎΡ‰Π΅ говоря, Spring Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ конструктор для внСдрСния зависимостСй.

Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ поля.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Spring Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ сСттСры.

Π­Ρ‚ΠΈ Π΄Π²Π° стиля внСдрСния (поля, сСттСры) ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ конструктора: Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Spring Bean. На самом Π΄Π΅Π»Π΅ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ здСсь ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ.

Но ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ споров ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ внСдрСния являСтся Π»ΡƒΡ‡ΡˆΠΈΠΌ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости Ρ‡Π΅Ρ€Π΅Π· конструктор ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅

Π‘Ρ‹Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ споров Π² сСти Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости Ρ‡Π΅Ρ€Π΅Π· конструктор ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅ ΠΈ мноТСством Π³Ρ€ΠΎΠΌΠΊΠΈΡ… голосов, ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π²ΡˆΠΈΡ…, Ρ‡Ρ‚ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° установки (setter) Π²Ρ€Π΅Π΄Π½Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΡˆΡƒΠΌΠ° ΠΊ этим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ сформулируСм ΡΡƒΡ‚ΡŒ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ:

РСзюмС ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Spring IoC

К настоящСму ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ зависимостСй Spring.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π΅Ρ‰Π΅ Π½Π΅ всС, Π½ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π² ApplicationContexts, Beans, зависимостях ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… внСдрСния зависимостСй, Ρ‚ΠΎ Π²Ρ‹ ΡƒΠΆΠ΅ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Spring, ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΉ чистой зависимости.

Spring AOP (АспСктно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅) ΠΈ прокси

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ вСсти вас ΠΊ Π±ΠΎΠ»Π΅Π΅ структурированным ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ, Π½ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимости здСсь ΠΈ Ρ‚Π°ΠΌ Π½Π΅ совсСм Ρ‚ΠΎ, Π² Ρ‡Π΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΡΡƒΡ‚ΡŒ экосистСмы Spring. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· посмотрим Π½Π° ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ApplicationContextConfiguration:

Π’ΠΎΡ‚ Π³Π΄Π΅ проявляСтся функция скрытая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Spring:

Однако Spring ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΌΠ°Π½Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, ΠΊΡ€ΠΎΠΌΠ΅ вашСго класса UserService. Как? ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

Spring ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прокси

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ любой ΠΌΠ΅Ρ‚ΠΎΠ΄ Spring @Bean ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Π°ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ (Π² вашСм случаС) выглядит ΠΈ ощущаСтся ΠΊΠ°ΠΊ UserService, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это Π½Π΅ Ρ‚Π°ΠΊ.

Он ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Π°ΠΌ прокси.

ΠŸΡ€ΠΎΠΊΡΠΈ-сСрвСр Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ слуТбу UserService, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ написали, Π½ΠΎ сначала ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Π’ частности, Spring ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ создаст динамичСскиС прокси-сСрвСры Cglib, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ прокси-сСрвСров (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прокси-сСрвСра JDK): вмСсто этого Cglib ΠΌΠΎΠΆΠ΅Ρ‚ прокси-классы посрСдством ΠΈΡ… подклассов Π½Π° Π»Π΅Ρ‚Ρƒ. (Если Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… шаблонов прокси, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ большС ΠΎ прокси Π² Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ.)

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Spring ΠΆΠ΅Π»Π°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прокси?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это позволяСт Spring Π΄Π°Ρ‚ΡŒ вашим ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π°. Π’ сущности, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ являСтся аспСктно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ (ΠΈΠ»ΠΈ: AOP) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

Spring аннотация @Transactional

Π’Π°ΡˆΠ° рСализация UserService Π²Ρ‹ΡˆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: хотя Spring ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ваш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ UserService Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ applicationContext, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ваш UserService. Он Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ просто Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ фиксируСт Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….

Но Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ это ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ прокси Π²ΠΎΠΊΡ€ΡƒΠ³ вашСго UserService, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прокси-сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ просто Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ UserService.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· посмотрим Π½Π° эту Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ContextConfiguration.

ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Spring ΠΎΡ‡Π΅Π½ΡŒ скоро ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с прокси Π² сСансах ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Из-Π·Π° прокси трассировки стСка Spring ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ довольно Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌΠΈ: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ сначала Π²ΠΎΠΉΡ‚ΠΈ Π² прокси β€” Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΏΡƒΠ³ΠΈΠ²Π°Π΅Ρ‚ людСй. Π­Ρ‚ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

НуТно Π»ΠΈ Spring ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прокси Cglib?

ΠŸΡ€ΠΎΠΊΡΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ AOP с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Spring. Однако Π²Ρ‹ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ использованиСм прокси, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ AspectJ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ измСняСт ваш фактичСский Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Однако ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ AspectJ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства.

Π’Π°ΠΊΠΆΠ΅ смотритС Ρ€Π°Π·Π΄Π΅Π»: Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Spring AOP ΠΈ AspectJ?

РСзюмС ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Spring AOP

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсами Spring

ΠœΡ‹ ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ зависимостСй ΠΈ прокси. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я Π±Ρ‹ Π½Π°Π·Π²Π°Π» Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ удобства Π² срСдС Spring. Одной ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ являСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° рСсурсов Spring.

ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ Π±Ρ‹ Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π² Java Ρ‡Π΅Ρ€Π΅Π· HTTP ΠΈΠ»ΠΈ FTP. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс URL Π² Java ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π±Ρ‹ Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π»ΠΈ Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠ· ΠΏΡƒΡ‚ΠΈ ΠΊ классам вашСго прилоТСния? Или ΠΈΠ· контСкста сСрвлСта, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ΠΏΠΎ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ·Π½Π°Π½ΠΈΡŽ, это становится всС Ρ€Π΅ΠΆΠ΅ ΠΈ Ρ€Π΅ΠΆΠ΅ Π² соврСмСнном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ packaged.jar).

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ довольно ΠΌΠ½ΠΎΠ³ΠΎ стандартного ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π», ΠΈ, ΠΊ соТалСнию, ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования (URL-адрСса, ΠΏΡƒΡ‚ΠΈ ΠΊ классам, контСксты сСрвлСтов).

Но Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: абстракция рСсурсов Spring. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅.

ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, Spring Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ доступа ΠΊ рСсурсам с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ приятного нСбольшого синтаксиса. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ рСсурса ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько интСрСсных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΠ½ позволяСт Π²Π°ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ самыС распространСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с рСсурсом:

Π­Ρ‚ΠΎ позволяСт Π²Π°ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ с рСсурсом, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΆΠΈΠ²Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅, Π½Π° вашСм ΠΏΡƒΡ‚ΠΈ ΠΊ классам ΠΈΠ»ΠΈ Π½Π° ТСстком дискС.

Абстракция рСсурсов выглядит ΠΊΠ°ΠΊ такая ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Π°Ρ функция, Π½ΠΎ ΠΎΠ½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сияСт Π² сочСтании со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΉ Spring: Properties.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Environment?

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ любого прилоТСния β€” это Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ свойств (properties), Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, конфигурация ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ сСрвСра, дСтализированная конфигурация ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΈ Ρ‚.Π΄.

Spring пытаСтся ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π²Π°ΠΌ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΈ автоматичСский поиск свойств Π²ΠΎ всСх этих Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… источниках с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ абстракции environment.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ environment?

Π’ Π΄Π²ΡƒΡ… словах, срСда состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… источников свойств выполняСмого Spring прилоТСния. НапримСр:

(ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π‘Ρ€Π΅Π΄Π° Ρ‚Π°ΠΊΠΆΠ΅ состоит ΠΈΠ· ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ Β«devΒ» ΠΈΠ»ΠΈ Β«productionΒ», Π½ΠΎ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности ΠΎ профилях Π² этом пСрСсмотрС этого руководства).

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ срСда Π²Π΅Π±-прилоТСния Spring MVC состоит ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ServletConfig/Context, источников систСмных свойств JNDI ΠΈ JVM. Они Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ иСрархичСскими, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ порядок ваТности ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, довольно Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ @PropertySources ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ стало Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ понятнСС, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ рСсурсами Spring Ρ€Π°Π½ΡŒΡˆΠ΅. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ΄ΡƒΡ‚ Ρ€ΡƒΠΊΠ° ΠΎΠ± Ρ€ΡƒΠΊΡƒ.

Аннотация @PropertySource Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΡŽΠ±Ρ‹ΠΌ допустимым классом ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Spring ΠΈ позволяСт Π²Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ источники с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ абстракции рСсурсов Spring: ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ всС Π΄Π΅Π»ΠΎ Π² прСфиксах: http://, file://, classpath: ΠΈ Ρ‚.Π΄.,

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ свойств Ρ‡Π΅Ρ€Π΅Π· @PropertySources β€” это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Ρ€Π°Π·Π²Π΅ Π½Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ способа, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· срСду, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ? Π”Π°, Π΅ΡΡ‚ΡŒ.

Spring аннотация @Value ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ свойств

Spring Web MVC

Spring Web MVC, Ρ‚Π°ΠΊΠΆΠ΅ извСстный ΠΊΠ°ΠΊ Spring MVC, являСтся Π²Π΅Π±-срСдой Spring. Π­Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ связано с ΡΠ΅Ρ‚ΡŒΡŽ, ΠΎΡ‚ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Π΅Π±-сайтов Π΄ΠΎ слоТных Π²Π΅Π±-сСрвисов. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Spring Boot.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ MVC?

Если Π²Ρ‹ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с MVC, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ страницу Model-View-Controller Π² Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

Π’ контСкстС Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° HTML-страниц, скаТСм, страницы ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π²ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит MVC Π² Spring:

Π˜Ρ‚Π°ΠΊ, вашСй ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ являСтся написаниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Spring, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ HTTP-запросами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ (/account), ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ HTML-страницу, которая визуализируСтся ΠΏΡƒΡ‚Π΅ΠΌ объСдинСния прСдставлСния ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для этой страницы.

Π’Π° ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° Π²Π΅Ρ€Π½Π° для написания Π²Π΅Π±-сСрвисов JSON ΠΈΠ»ΠΈ XML.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм шаг Π½Π°Π·Π°Π΄ ΠΈ посмотрим, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π±Ρ‹ Π²Π΅Π±-страницу Π² Π½ΠΈΠ·ΠΊΠΎ-Π½ΠΈΠ·ΠΊΠΎ-Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ Java: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ старого Π΄ΠΎΠ±Ρ€ΠΎΠ³ΠΎ API сСрвлСта Java (Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ основываСтся Spring MVC). ).

HttpServlet памятка

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ MVC: Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, связанноС с HTTP с Java, Π²Ρ‹ Π±Ρ‹ использовали сСрвлСты ΠΈΠ»ΠΈ, Π² частности, HttpServlets (ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ для ΠΏΡ€ΠΈΠ΄ΠΈΡ€: Π΄Π°, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы, спасибо Π·Π° Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅). Π‘Π΅Ρ€Π²Π»Π΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ HTTP-запросы, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ HTTP-ΠΎΡ‚Π²Π΅Ρ‚.

ПослС написания вашСго сСрвлСта Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ сСрвлСтов, Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠ°ΠΊ Tomcat ΠΈΠ»ΠΈ Jetty. РСгистрация сСрвлСта всСгда Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Π·Π° ΠΊΠ°ΠΊΠΈΠ΅ URL Π² вашСм Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ваш сСрвлСт. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΠΏΡƒΡ‚ΡŒ «/*», поэтому ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ входящий HTTP-запрос ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ обрабатываСтся ΠΎΠ΄Π½ΠΈΠΌ сСрвлСтом.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ этот сСрвлСт:

ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ всСго двумя способами β€” это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ, ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ MVC, трСбуСтся довольно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Π°ΡˆΠ΅ΠΌΡƒ MyServlet (ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ довольно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ HTTP-спСцифичСского ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ URI запроса, просмотра строк, прСобразования requestParameters ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ приятнСС, Ссли Π±Ρ‹ Π²Π°ΠΌ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ±ΠΎ всСм этом слСсарном Π΄Π΅Π»Π΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Spring ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π·Π° вас. Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ DispatcherServlet.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ DispatcherServlet?

Uber-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Π² срСдС Spring MVC Spring прСдставляСт собой сСрвлСт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся DispatcherServlet.

Он называСтся DispatcherServlet, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ любой входящий HTTP-запрос, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ содСрТимоС ΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ симпатичных ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Java Π² класс Controller.

Он Ρ‚Π°ΠΊΠΆΠ΅ достаточно ΡƒΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ€Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с этих ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² HTML / JSON / XML, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π’Π΅ΡΡŒ процСсс выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (с ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅ΠΌ большим количСством ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… классов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ DispatcherServlet Π½Π΅ выполняСт всю Ρ€Π°Π±ΠΎΡ‚Ρƒ сам).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° эти классы Ρ‚ΠΈΠΏΠ° Controller Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

Как ΠΏΠΈΡΠ°Ρ‚ΡŒ классы Ρ‚ΠΈΠΏΠ° Controller

НаконСц, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ наш Controller класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запросы /account.

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° /account Π±ΡƒΠ΄Π΅Ρ‚ HTML-страницСй с нСсколькими динамичСскими ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, адрСс, информация ΠΎ подпискС ΠΈ Ρ‚.Π΄.

Π’ этих Π΄Π²ΡƒΡ… строчках происходит ΠœΠΠžΠ“Πž, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ.

Наш ΠΌΠ΅Ρ‚ΠΎΠ΄ Java Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку с ΠΈΠΌΠ΅Π½Π΅ΠΌ account. На самом Π΄Π΅Π»Π΅ это Π½Π΅ просто строка, Π° ссылка Π½Π° прСдставлСниС (HTML-шаблон). Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° эти ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π½Π° сСкунду.

Как Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ HTML прСдставлСниС (view) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Spring Web MVC

Spring MVC ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ HTML. И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ сами ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ HTML-строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строк, скорСС Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Π½ΡƒΡŽ срСду, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ Velocity ΠΈΠ»ΠΈ Freemarker. Spring интСгрируСтся со всСми этими тСхнологиями.

Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ прСдставлСниС (шаблон):
classpath:/templates/account.vm

Π’ΠΎΡ‚ ΠΈ всС, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Spring MVC ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°!

Как Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JSON / XML (прСдставлСния) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Spring Web MVC

Π‘ Π²Π΅Π±-сСрвисами Π²Ρ‹ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ HTML, Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ XML ΠΈΠ»ΠΈ JSON. Π­Ρ‚ΠΎ довольно просто, с Spring MVC Ρ‚Π°ΠΊΠΆΠ΅.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, такая ΠΊΠ°ΠΊ Jackson, добавлСнная Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой Controller Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Spring: поТалуйста, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Java Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² XML / JSON, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ я Π΄Π°Π²Π°Π» Π²Π°ΠΌ ссылка Π½Π° Π²ΠΈΠ΄.

Но ΠΊΠ°ΠΊ Spring ΡƒΠ·Π½Π°Π΅Ρ‚, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ XML, JSON ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅?

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ согласованиС ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (content negotiation) Spring MVC

БущСствуСт мноТСство способов, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Spring MVC, ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Spring MVC.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ согласовании ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ.

Какой Ρ‚ΠΈΠΏ Π²Π²ΠΎΠ΄Π° HTTP-запроса ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Spring?

Spring MVC ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² основном всС, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ HTTP β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ Ρ‚Π΅Π»Π° запросов JSON, XML ΠΈΠ»ΠΈ HTTP (Multipart) Fileupload, ΠΈ Spring ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ этот Π²Π²ΠΎΠ΄ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Java.

КакиС HTTP-ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Spring MVC?

Spring MVC ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ всС Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π² HttpServletResponse β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π‘ΡƒΠ΄ΡŒ Ρ‚ΠΎ HTML, JSON, XML ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚Π΅Π»Π° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² WebSocket. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ Π±Π΅Ρ€Π΅Ρ‚ ваши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Java ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ эти Ρ‚Π΅Π»Π° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² для вас.

А ΠΊΠ°ΠΊ насчСт Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ Spring MVC?

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация Spring MVC Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ содСрТит сотни страниц, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ…, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ RequestParams, ΠœΠΎΠ΄Π΅Π»ΡΡ…, ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡΡ…, ViewHandlers, RootContexts, Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ…, ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ БСзопасности, я ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ вас ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это. Π­Ρ‚ΠΎ просто Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ всС.

Однако Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… вопросов Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… вопросов.

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° присуща Spring Boot (ΠΊΠ°ΠΊ я ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ Π΄Π΅Π»Π°Π» слишком Π΄ΠΎΠ»Π³ΠΎ), Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» ΠœΠ°Ρ†Π΅ΠΉ Волковяк, это Ρ‡Π°ΡΡ‚ΡŒ простого старого Spring MVC. Π’ΠΎΡ‚ Π΅Π³ΠΎ источник:

Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½ΠΎ, Spring MVC @RestController β€” это Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ Spring MVC @Controller Π² сочСтании с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ Spring MVC @ResponseBody β€” хотя Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ связанноС со Spring Boot.

РСзюмС: Spring MVC

Spring MVC β€” это старый Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ MVC, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт довольно Π»Π΅Π³ΠΊΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ HTML / JSON / XML Π²Π΅Π±-сайты ΠΈΠ»ΠΈ Π²Π΅Π±-сСрвисы. Он прСкрасно интСгрируСтся с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ внСдрСния зависимостСй Spring, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС Π΅Π³ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹.

Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅: ΠΎΠ½ позволяСт Π²Π°ΠΌ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° написании Java-классов, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с сланцСвым ΠΊΠΎΠ΄ΠΎΠΌ сСрвлСта, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Http-запросами ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌΠΈ, ΠΈ Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ вашСй модСлью ΠΈ прСдставлСниями.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Spring Framework

ΠœΡ‹ рассмотрСли ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ IoC Spring, Spring Web MVC ΠΈ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Spring. Но Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ. Π§Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚?

О Ρ‡Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Spring Framework?

Spring Framework состоит ΠΈΠ· Π΅Ρ‰Π΅ большСго количСства ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Ρ‡Π΅ΠΌ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·ΠΎΠ²Π΅ΠΌ ΠΈΡ… модулями ΠΈ Π½Π΅ ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅ эти ΠΌΠΎΠ΄ΡƒΠ»ΠΈ с 20 Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ Spring Π½Π° spring.io. Наоборот, всС ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ€Π°ΠΌΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Spring.

Π˜Ρ‚Π°ΠΊ, ΠΎ ΠΊΠ°ΠΊΠΎΠΌ удобствС ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ?

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² основном всС, Ρ‡Ρ‚ΠΎ Spring ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π² этих модулях, Ρ‚Π°ΠΊΠΆΠ΅ доступно Π½Π° чистой Java. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ΡΡ Π»ΠΈΠ±ΠΎ JDK, Π»ΠΈΠ±ΠΎ стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ. Spring Framework всСгда опираСтся Π½Π° эти ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Java API ΠŸΠΎΡ‡Ρ‚Ρ‹, бСзусловно, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΠ°, Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Π° Π² использовании. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΊΠΎΠ΄Π°.

Spring прСдоставляСт ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ API-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΠΏΠΎΠ²Π΅Ρ€Ρ… Java Mail API, с Ρ‚Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ прСимущСством, Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚, прСкрасно вписываСтся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ внСдрСния зависимостСй Spring.

Π˜Ρ‚Π°ΠΊ, подытоТивая, Ρ†Π΅Π»ΡŒ Spring Framework состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Β«ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒΒ» Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Java, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ ΠΊ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ зависимостСй ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ использованиС API Π² контСкстС Spring.

Π•ΡΡ‚ΡŒ Π»ΠΈ список всСх Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Spring Framework?

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Spring. Однако ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС всСх этих инструмСнтов Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства. ВмСсто этого взглянитС Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для получСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ списка.

Spring Framework: FAQ

ΠšΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Spring я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

Π’Ρ‹Π±ΠΎΡ€ вСрсии Spring ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прост:

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° Spring вСрсии 4.x-5.x, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ компаниями, хотя ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΈ Ρ€Π΅Π΄ΠΊΠΈΠ΅, унаслСдованныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° Spring 3.x (ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ выпуск: 2009).

Как часто Π²Ρ‹ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ вСрсии Spring? Как Π΄ΠΎΠ»Π³ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ?

Π’ΠΎΡ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ малСнький Π³Ρ€Π°Ρ„ΠΈΠΊ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ вСрсий Spring:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй spring

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ вСрсия Spring Π±Ρ‹Π»Π°

17 Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄, Π° основныС вСрсии ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹ΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 3-4 Π³ΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΠΈΠ»ΠΈΠ°Π»Ρ‹ обслуТивания, ΠΊΠ°ΠΊ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ EOL() (большС Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ) для всСх вСрсий Spring, ΠΊΡ€ΠΎΠΌΠ΅ 5.2, Π² настоящСС врСмя настроСн Π½Π° 31 дСкабря 2020 Π³ΠΎΠ΄Π°.

КакиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Spring?

На самом Π΄Π΅Π»Π΅ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, которая Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Spring. Π­Ρ‚ΠΎ называСтся spring-context. Π­Ρ‚ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Spring.

Для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Spring (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Spring JDBC ΠΈΠ»ΠΈ JMS) Π²Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ список всСх доступных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Spring, хотя с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния зависимостСй Maven artifactIds Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ модуля. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π§Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ вСрсии Spring?

Подобно JVM, вСрсии Spring Π±Π΅Π·ΡƒΠΌΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимы, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ (ΠΏΠΎ сущСству) ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Spring 1.0 xml с послСднСй вСрсиСй Spring 5.0 (хотя я, ΠΏΠΎ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ·Π½Π°Π½ΠΈΡŽ, Π΅Ρ‰Π΅ Π½Π΅ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» это). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ с, скаТСм, 3 Π΄ΠΎ 5 Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с нСбольшими усилиями (см. Π­Ρ‚ΠΎ руководство ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Ρ†Π΅Π»ΠΎΠΌ, Π½ΠΎΠ²Ρ‹Π΅ вСрсии Spring основаны Π½Π° Π±ΠΎΠ»Π΅Π΅ старых вСрсиях Spring ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ критичСскиС измСнСния (ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ, скаТСм, с Python 2 ΠΏΡ€ΠΎΡ‚ΠΈΠ² 3). Π˜Ρ‚Π°ΠΊ, всС основныС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ для Spring вСрсии 3 ΠΈΠ»ΠΈ 4, ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π²Π΅Ρ€Π½Ρ‹ΠΌΠΈ для Spring вСрсии 5.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ измСнилось Π·Π° послСдниС 7 Π»Π΅Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… вСрсиях Spring, здСсь:

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ Ρ€Π΅Π·ΡŽΠΌΠ΅:

Π―Π΄Ρ€ΠΎ (Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ транзакциями ΠΈ Ρ‚.Π΄.) ВсСгда остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ. Однако Spring ΠΈΠ΄Π΅Ρ‚ Π² Π½ΠΎΠ³Ρƒ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для Π½ΠΎΠ²Ρ‹Ρ… вСрсий языка Java, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ инфраструктуры тСстирования, Π²Π΅Π±-сокСтов, Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ программирования ΠΈ Ρ‚.Π΄.

Π§Ρ‚ΠΎ сСйчас происходит Π² 20 Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Spring.io? Как насчСт измСнСния Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°?

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ руководства я Π½Π΅ ΠΌΠΎΠ³Ρƒ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности всСх Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ‚Π΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹, скорСС всСго, ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ.

Π’Ρ‹Π²ΠΎΠ΄: всС эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ Spring Framework ΠΈ ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π³ΠΎ основных ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… внСдрСния зависимостСй.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Spring ΠΈ Spring Boot?

Если Π²Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ это руководство, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Spring Boot построСн ΠΏΠΎΠ²Π΅Ρ€Ρ… Spring. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ скоро появится ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ руководство ΠΏΠΎ Spring Boot, Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ «самоувСрСнныС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» Π² Spring Boot.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сами Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ всС эти ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части. Spring Boot, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π±Π΅Ρ€Π΅Ρ‚ эти ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части ΠΈ связываСт ΠΈΡ… вмСстС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Π˜Ρ‚Π°ΠΊ, Spring Boot β€” это всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ части Spring Framework, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Spring AOP ΠΈ AspectJ?

Как упомянуто Π²Ρ‹ΡˆΠ΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ НуТно Π»ΠΈ Spring ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прокси Cglib?» Π² Spring ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ AOP Π½Π° основС прокси. Он ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ваши ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² прокси для достиТСния Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ транзакциями. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΈ прСдостСрСТСний, Π½ΠΎ являСтся довольно простым ΠΈ понятным способом Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ AOP, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Spring.

AspectJ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, позволяСт Π²Π°ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ фактичСский Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΏΡƒΡ‚Π΅ΠΌ ткачСства Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ»ΠΈ ткачСства Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС возмоТностСй Π² ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Однако Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Spring Π½Π° использованиС AOP AspectJ вмСсто AOP ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° основС прокси.

Π’ΠΎΡ‚ ΠΏΠ°Ρ€Π° ссылок, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅:

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Spring ΠΈ Spring Batch?

Spring Batch β€” это Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠΉ написаниС ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Ρ… Π·Π°Π΄Π°Π½ΠΈΠΉ, Ρ‚.Π΅. Β«Π§ΠΈΡ‚Π°Ρ‚ΡŒ эти 95 CSV-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΡ‡ΡŒ Π² 3 часа Π½ΠΎΡ‡ΠΈ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ внСшнюю слуТбу ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи».

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΎΠ½ построСн Π½Π° основС Spring Framework, Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ являСтся собствСнным ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎ сути Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π±Π΅Π· Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ понимания ΠΎΠ±Ρ‰Π΅Π³ΠΎ управлСния транзакциями Π² Spring Framework ΠΈ Π΅Π³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ Spring Batch.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Spring ΠΈ Spring Web MVC?

Если Π²Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ это руководство, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Spring Web MVC являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ срСды Spring.

Π­Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ RestControllers (Π³Π΄Π΅ Π²Ρ‹ отправляСтС XML ΠΈΠ»ΠΈ JSON ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ) ΠΈΠ»ΠΈ старыС Π΄ΠΎΠ±Ρ€Ρ‹Π΅ HTML-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹, Π³Π΄Π΅ Π²Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ HTML с Ρ‚Π°ΠΊΠΈΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ Thymeleaf, Velocity ΠΈΠ»ΠΈ Freemarker.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Spring ΠΈ Struts?

Вопрос Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ: Ρ‡Π΅ΠΌ отличаСтся Spring Web MVC ΠΎΡ‚ Struts?

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ историчСский ΠΎΡ‚Π²Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ²: Spring Web MVC Π½Π°Ρ‡ΠΈΠ½Π°Π» ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ Struts, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ утвСрТдаСтся, Π±Ρ‹Π» ΠΏΠ»ΠΎΡ…ΠΎ спроСктирован Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Spring (см. Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡŽ).

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, хотя Struts 2, бСзусловно, всС Π΅Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² странном ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Spring Web MVC являСтся основой для всСго, Ρ‡Ρ‚ΠΎ связано с ΡΠ΅Ρ‚ΡŒΡŽ Π²ΠΎ всСлСнной Spring. ΠžΡ‚ Spring Webflow Π΄ΠΎ RestControllers Spring Boot.

Π§Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅? Spring XML ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Java конфигурация?

Spring начинался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ XML. Π—Π°Ρ‚Π΅ΠΌ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, всС большС ΠΈ большС появлялись Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ / возмоТности Java ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

БСгодня Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ конфигурация XML Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π±ΠΎΠ»Π΅Π΅ старых, унаслСдованных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, Π° Π² Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° основС Java ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

Π§Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅? Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π½Π° основС конструктора ΠΈΠ»ΠΈ поля?

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ зависимостСй, этот вопрос Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ½Π΅Π½ΠΈΠΉ. Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ваш Π²Ρ‹Π±ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ для всСго вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π½Π° основС конструктора для 83% Π²Π°ΡˆΠΈΡ… Π±ΠΈΠ½ΠΎΠ² ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Π½Π° основС поля для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… 17%.

Π Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ использованиС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ способа Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Spring: использованиС внСдрСния конструктора для ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй, установка / установка поля для Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° этих Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй ΠΏΠΎ всСму классу Π½Π° ноль.

Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ: ΠΎΠ±Ρ‰ΠΈΠΉ успСх вашСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π²Ρ‹Π±ΠΎΡ€Π° вашСго любимого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° внСдрСния зависимостСй.

Π•ΡΡ‚ΡŒ Π»ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ внСдрСния зависимостСй Π² Spring?

Π”Π°, Π΄Π²Π΅ популярныС Π² экосистСмС Java:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Dagger ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй, Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Guice ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ транзакциями (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Guice Persist).

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Если Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π»ΠΈ это Π΄Π°Π»Π΅ΠΊΠΎ, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Framework.

Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ это связано с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ экосистСмы Spring (Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Spring Boot ΠΈΠ»ΠΈ Spring Data) Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… руководствах, Π½ΠΎ сСйчас я Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΠ»ΠΈ эту ΠΌΠ΅Ρ‚Π°Ρ„ΠΎΡ€Ρƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопрос Β«Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ?Β»

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΌ (

= ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚).

Spring Framework β€” это ваш DIY-ΠΌΠ°Π³Π°Π·ΠΈΠ½ (

= ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΉ зависимости), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… инструмСнтов, ΠΎΡ‚ Π³ΠΎΡ€Π΅Π»ΠΎΠΊ Π‘ΡƒΠ½Π·Π΅Π½Π° (

= рСсурсы / свойства) Π΄ΠΎ ΠΊΡƒΠ²Π°Π»Π΄ (

= Web MVC) для вашСго обновлСния. Π­Ρ‚ΠΈ инструмСнты просто ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ быстрСС ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΎΡ‚Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваш Π΄ΠΎΠΌ (ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Java).

(ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π½Π΅ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΠΉΡ‚Π΅ мСня, ΠΊΠ°ΠΊ я ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» эти сравнСния;))

Π’ΠΎΡ‚ ΠΈ всС Π½Π° сСгодня. Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ вопросы ΠΈΠ»ΠΈ прСдлоТСния, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΠΎ адрСсу marco@marcobehler.com ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π½ΠΈΠΆΠ΅. Для практичСских занятий ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΌ курсом Spring Framework.

Бпасибо Π·Π° ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅. Auf Wiedersehen.

Благодарности

(Благодарности Π°Π²Ρ‚ΠΎΡ€Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².)

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *