Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ dependency injection spring
ΠΡΠ΅ ΠΎΠ΄Π½Π° ΡΡΠ°ΡΡΡ ΠΎ DI Π² Spring Boot
ΠΠ°ΠΊ ΡΠΊΠ°Π·Π°Π» ΠΎΠ΄ΠΈΠ½ ΠΌΡΠ΄ΡΠ΅Ρ: Π²Π΅ΡΠ½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° ΡΡΠΈ Π²Π΅ΡΠΈ: ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Ρ Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ Π³ΠΎΡΠΈΡ ΠΎΠ³ΠΎΠ½Ρ ΠΈ ΠΊΠ°ΠΊ ΠΊΡΠΎ-ΡΠΎ ΠΏΠΈΡΠ΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ ΡΡΠ°ΡΡ ΠΎ DI Π² Spring Boot. Π‘Π΅Π³ΠΎΠ΄Π½Ρ Ρ ΡΠ΄Π΅Π»Π°Ρ ΠΏΠΎΠΏΡΡΠΊΡ ΠΊΠΎΡΠΎΡΠΊΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ Π²ΡΡ ΡΡΡ ΠΏΠ΅ΡΡΡΡΠΊΡ.
DI (Dependency Injection, Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ) β ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠ»ΠΈ ΡΠΎΡΠ½Π΅Π΅ ΡΡΠΎ ΡΠΎ ΠΌΠ΅ΡΡΠΎ, Π³Π΄Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ Π²Π½Π΅Π΄ΡΠ΅Π½Π° Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ. ΠΠΎΠ½ΡΡΠ½Π΅Π΅ Π±ΡΠ΄Π΅Ρ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΡΡΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ Β«ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΒ» Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ ΠΊΠ»Π°ΡΡΠ° Β«ΠΠ²ΠΈΠ³Π°ΡΠ΅Π»ΡΒ». ΠΠ΅ΡΡΠΎ Π³Π΄Π΅ Β«ΠΠ²ΠΈΠ³Π°ΡΠ΅Π»ΡΒ» Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π² Β«ΠΠ²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Π΅Β» ΠΈ Π±ΡΠ΄Π΅Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
Π Spring Boot ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ 4 ΡΠΈΠΏΠ° DI:
DI ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅ ΠΊΠ»Π°ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ΅Π΄ΠΊΠΎ ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΠΈ, Π²Π΅Π΄Ρ Π²Π½Π΅Π΄ΡΡΠ΅ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΎ ΠΊΠ°ΠΊ public.
DI Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° β Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΡ DI. Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ Π²Ρ ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄Π΅ΡΠ΅ Π·Π½Π°ΡΡ ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ IoC ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡ Π²ΡΠ·ΠΎΠ².
Π Spring Boot Π² ΠΌΠ΅ΡΡΠ΅, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½Π° ΠΈΠ½ΡΠ΅ΠΊΡΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠ°Π²ΠΈΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @Autowired (Π°Π²ΡΠΎΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅). ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ DI Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠΈΠΆΠ΅ Ρ ΠΏΡΠΈΠ²Π΅Π΄Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° DI ΠΊΡΠΎΠΌΠ΅ 2, Π²Π΅Π΄Ρ, ΠΌΡ Π½Π° ΡΠ²Π΅ΡΠ»ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Π΅ ΡΠΈΠ»Ρ, ΡΠ°ΠΊ?
DI ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅ ΠΊΠ»Π°ΡΡΠ°
ΠΠ»Π°Π²Π½ΡΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ ΠΎΠΏΠΈΡΠ°Π½ Π²ΡΡΠ΅.
DI ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
ΠΠ°ΠΊΠΎΠΉ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ β ΡΠ΅ΡΠ°ΡΡ Π²Π°ΠΌ. ΠΠ»Π°Π²Π½ΠΎΠ΅, ΡΡΠΎΠ±Ρ ΡΡΠΎ Π±ΡΠ» DI Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°.
Dependency Injection in Spring
Join the DZone community and get the full member experience.
Spring is a Dependency Injection (DI) framework used in a majority of enterprise Java applications, including web services, microservices, and data-driven systems. The power of Spring stems from its ability to perform a vast array of tasks β such as DI, database abstraction, and web-endpoint abstractionβ with minimal code. In many cases, we are only required to write a small amount of code with the help of a few, well-place annotations to configure a complex application.
While this simplicity and abstraction have been essential to Spring’s widespread adoption, we often overlook its fundamentals and lack an intuitive understanding of the concepts that underpin the framework. This muddled view can lead to poor design, increase implementation time, and frustrated debugging, all of which hinder the quality of our applications. To remedy this, we need to break down the complexities of Spring into their atomic pieces and build our understanding from these central components.
In this article, we will delve into the concepts behind the Spring Framework, including Inversion of Control (IoC), DI, and the ApplicationContext interface. Leveraging these fundamentals, we will look at how to create applications with Spring, using both Java-based and eXtensible Markup Language (XML)-based configurations. Lastly, we will explore some of the common problems encountered while creating a Spring application, including bean uniqueness and circular dependencies.
The interested reader can find the source code used for this article on GitHub.
Inversion of Control
We can add complexity to our Car class by defining an Engine interface and including an Engine object as a field within the Car class:
Calling our start method for our Car class would result in a NullPointerException (NPE), though, since we have failed to initialize the engine field within the Car constructor. The most basic approach to resolving this problem is to make a decision about which Engine implementation should be used within the Car constructor and directly assign that implementation to the engine field.
For example, suppose that we create the following Engine implementations:
If we decide to use the CombustionEngine implementation, we must change our Car constructor to assign our engine field with an instantiated CombusionEngine object:
If we execute our start method on our Car object, we see the following output:
While this does resolve our Engine issue, it is a poor design choice for two reasons:
The latter problem is particularly difficult to solve and worsens as the number of Engine implementations grows. Additionally, we do not control the Engine implementations, and there is no restriction on another developer creating his or her own implementation.
Using this approach, we successfully removed the duplicate code, but this solution begs the question: Why not just go back to our original Car class and allow the client instantiating Car objects to pass in the Engine implementation as a constructor argument? This approach would also remove the need to create a new Car implementation for each Engine implementation, since the Car class only depends on the Engine interface and has no knowledge of any particular Engine implementation.
Following this approach, we can change our Car implementation to:
By adding the Engine constructor argument, we have changed the decision of which Engine implementation to use from the Car class itself β which originally decided on a CombustionEngine β to the client that instantiates the Car class. This reversal of the decision process is called the IoC principle. Instead of the Car class itself controlling which Engine implementation is used, now the client controls which implementation is used.
For example, suppose we create the following snippet:
If we execute this snippet, we receive the following output:
From this example, it is clear that the client that instantiates the Car class has control over the Engine implementation used and depending on which implementation is passed to the Car constructor, the behavior of the Car object changes drastically.
An additional benefit of IoC is that it also makes testing the Car class much easier. Since the Engine implementation can be supplied by the client, we can supply a mock Engine object within our testing framework that can be used to ensure that specific methods are called on the Engine implementation when actions on the Car are performed.
Dependency Injection
Therefore, we have created a dependency in the construction process. This dependency differs from the compile-time dependency that the Car class has on the Engine interface, though. Instead, we have introduced a run-time dependency. Before a Car object can be instantiated at run-time, an Engine object must be instantiated first.
Dependency Trees
We can formalize this process by creating a graph of these dependencies, where the nodes of the graph represent an object and the edges represent the dependency relationship (with the arrow pointing to the depended-upon object). This graph is called a dependency tree β or dependency graph. In the case of our Car class, the dependency tree is simple:
This dependency tree can become more complex if the terminal nodes of the tree have additional dependencies of their own. For example, if the CombustionEngine had other dependencies, we would be required to first satisfy the dependencies of the CombustionEngine before we could instantiate a CombustionEngine object to be passed to our Car constructor during instantiation of the Car object:
Dependency Injection Frameworks
This complexity would continue to grow as we continue to introduce more dependencies. To resolve this complication, we need to abstract the creation process for an object based on its dependency tree. This process is what constitutes a DI framework.
In general, we can reduce this process into three parts:
Either an explicit declaration of dependencies or introspection of the constructor for a class satisfies (1). With reflection, we can know that the Car object requires an Engine object in the same way we discovered this in the previous sections: We look at the constructor of the Car class β from which a Car object would be instantiated β and see that it requires an Engine argument.
Since we know that a Car object requires an Engine object, we must declare at least one implementation of the Engine class to be eligible to be used as a dependency. For example, if we declare that the CombustionEngine is eligible to be used as a dependency, then we can create a CombustionEngine object, which satisfies the Engine requirement for the Car object.
This process is recursive, though. Since we declared the CombustionEngine class to be eligible as a dependency, we would need to know how to create an object of the CombustionEngine class. This necessitates that we introspect the CombustionEngine constructor β as we did in (1) β which tells us that in order to create a CombustionEngine object, we require Camshaft and Crankshaft objects. Thus, we would now require that the Camshaft and Crankshaft classes be declared as eligible to be used as dependencies before we could create a Car object.
Lastly, (3) we take the previous two requirements and puts them into action. In practice, this means that when an object is requested, such as a Car object, we must walk the dependency tree and check that there is at least one eligible class for all dependencies. For example, declaring the CombustionEngine class as eligible satisfies the Engine node requirement. If such a dependency exists, we instantiate the dependency and then move to the next node.
If there is more than one class that satisfies a required dependency, then we must explicitly state which of the possibilities should be selected. We will cover how Spring does this later. Similarly, if the dependency graph contains a cycle, where an object of class A is required to instantiate an object of class B, but class B requires an object of class A, then we must throw an error. We will also see later how Spring handles cyclical dependencies.
Once we are sure that all dependencies are satisfied, we can then construct the dependencies, starting with the terminal nodes. In the case of our Car object, we first instantiate Camshaft and Crankshaft objects β since those objects do not have dependencies β and then pass those objects to the CombustionEngine constructor to instantiate a CombunstionEngine object. Finally, we pass the CombustionEngine object to the Car constructor to instantiate our desired Car object.
With the fundamentals of DI understood, we can now move on to how Spring performs DI.
Dependency Injection in Spring
At its core, Spring is a DI framework that facilitates the translation of DI configurations into Java applications. While often considered hair-splitting, it is essential that a distinction is made between a library and a framework. A library is a set of standalone code that is used within another set of code. For example, a math library may provide classes and methods that allow us to perform complex operations. These classes and methods are imported by our application and are adapted within our code to make up our application.
A framework, on the other hand, can be thought of as a skeleton in which our code slots into to create an application. Many frameworks stub out application-specific portions and require that we as developers provide code that fits into the framework. In practice, this means writing implementations of interfaces and then registering the implementations with the framework.
ApplicationContext
Throughout this article, we will focus on a single ApplicationContext per application, but the concepts described below apply even when an application has multiple ApplicationContext instances.
Java-Based Configuration
Spring provides two Java-based mechanisms for configuration: (1) basic and (2) automated.
Basic Java-Based Configuration
In order to simplify the configuration process, Spring allows developers to provide DI configurations using Java code. At its core, two main annotations make up this process:
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Spring, ΠΈΠ»ΠΈ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΡ @Autowired ΠΈ @Component, Π° Π²Ρ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅, ΡΡΠΎ ΡΡΠΎ
ΠΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡ ΡΠ΅Π±Ρ, Π₯Π°Π±Ρ!
ΠΡΠ° ΡΡΠ°ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½Π° ΡΠ΅ΠΌ, ΠΊΡΠΎ ΡΠΆΠ΅ Π½Π°ΡΠ°Π» ΠΈΠ·ΡΡΠ°ΡΡ Java ΠΈ Π΄Π°ΠΆΠ΅ ΡΡΠΏΠ΅Π» Π΄ΠΎΠ±ΠΈΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠΏΠ΅Ρ ΠΎΠ² Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Java Core, ΠΈ Π²ΠΎΡ ΡΡΠ»ΡΡΠ°Π» ΡΠ»ΠΎΠ²ΠΎ Spring. Π, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·: Π·Π½Π°Π½ΠΈΠ΅ Spring Framework, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΠΈΠ³ΡΡΠΈΡΡΠ΅Ρ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π²Π°ΠΊΠ°Π½ΡΠΈΠΉ Π΄Π»Ρ Π΄ΠΆΠ°Π²ΠΈΡΡΠΎΠ². ΠΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ Π²Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π½Π° ΡΠ°ΠΌΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΡΠΏΠ΅Π½ΡΠΊΡ: ΠΏΠΎΠ½ΡΡΡ ΠΎΠ±ΡΡΡ ΠΈΠ΄Π΅Ρ ΡΡΠΎΠ»Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
ΠΠ°ΡΠ½Π΅ΠΌ ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ°. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅ ΠΊΠ°ΠΊ Inversion of Control, ΠΏΠΎ-ΡΡΡΡΠΊΠΈ β ΠΠ½Π²Π΅ΡΡΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΠΎ β IoC. IoC β ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ², ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ°ΡΡΠΈΠΉ Π½Π°Ρ ΠΊΠΎΠ΄ ΠΊ ΡΠ»Π°Π±ΠΎΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ. IoC β ΡΡΠΎ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈ Π½Π°ΡΠΈΡ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠ΅ΠΉ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ IoC ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°, Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ β Dependency Injection, Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. Π§ΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΡ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅Π±Ρ, ΡΠ°ΠΊ ΡΡΠΎ ΡΠ°ΡΠΊΡΡΡΡ Π΅Π΅ Ρ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΡ ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΡΡΠ΅Π΅ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠΈ ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠ². ΠΡΡΡ ΠΊΠ»Π°ΡΡΡ Shop (ΠΌΠ°Π³Π°Π·ΠΈΠ½) ΠΈ Seller (ΠΏΡΠΎΠ΄Π°Π²Π΅Ρ). Π£ ΠΊΠ»Π°ΡΡΠ° Seller ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ ΡΠΈΠΏΠ° Shop β ΠΌΠ°Π³Π°Π·ΠΈΠ½, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΎΠ΄Π°Π²Π΅Ρ. ΠΠΎΡ ΠΌΡ ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ: Seller Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Shop. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°Π΄ΡΠΌΠ°Π΅ΠΌΡΡ, ΠΊΠ°ΠΊ Π² ΠΎΠ±ΡΠ΅ΠΊΡ Seller ΠΏΠΎΠΏΠ°Π΄Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Shop? ΠΡΡΡ Π²Π°ΡΠΈΠ°Π½ΡΡ:
ΠΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° β ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Dependency Injection (Π½ΠΎ ΠΏΠΎΠΊΠ° Π΅ΡΠ΅ ΡΡΠΎ Π½Π΅ IoC). Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΌΡ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π»ΠΈΡΡ ΠΊ ΡΠΏΡΠΈΠ½Π³Ρ: ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± Π²Π½Π΅Π΄ΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ (Π° ΡΡΡ ΡΠΆΠ΅ IoC).
ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Spring β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠΈΡΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΆΠΈΠ·Π½ΠΈ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Spring MVC Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ Spring Security Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΈ Spring Data Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ Π΅ΡΠ΅ ΠΊΡΡΠ° Π²ΡΠ΅Π³ΠΎ. ΠΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΡΠΎΠΈΡ Spring IoC β ΡΡΠΎ Π±Π°Π·ΠΎΠ²ΡΠΉ Π²ΠΈΠ΄ ΡΠΏΡΠΈΠ½Π³Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ·ΡΡΠ°Π΅ΠΌΡΡ Π½Π°ΠΌΠΈ ΡΠ΅ΠΌΡ β Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. Spring IoC Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠΏΡΠΈΠ½Π³Π° ΠΏΠΎ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅. ΠΠ°ΠΊ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π²ΠΈΠ΄Π°ΠΌΠΈ ΡΠΏΡΠΈΠ½Π³Π°, Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΏΡΠΈΠ½Π³ΠΎΠ² Spring IoC ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠ°ΡΠΊΠ°Ρ.
ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ ΡΠΎ Spring IoC Π½Π°ΡΠ½Π΅ΠΌ Ρ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°: Π±ΠΈΠ½ (Π°Π½Π³Π». β bean). Π‘Π°ΠΌΡΠΌΠΈ ΠΏΡΠΎΡΡΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ,
ΠΠΈΠ½ β ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Spring-ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄ΡΠΈΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΠΈΠ½ β ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠΎΠ±ΠΎΠΉ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π±ΠΈΠ·Π½Π΅Ρ-ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π»ΠΈΠ±ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Spring’Π°, ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π±ΠΈΠ½ΠΎΠ².
ΠΠ°ΠΊ Π²Ρ ΡΠΆΠ΅ ΠΏΠΎΠ½ΡΠ»ΠΈ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π² Seller ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²Π½Π΅Π΄ΡΠΈΡΡ Shop, Shop Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΠ°ΡΡ Π±ΠΈΠ½ΠΎΠΌ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠΌΠ΅ΡΡ Π³ΠΎΡΠ΄ΠΎΠ΅ ΠΏΡΠ°Π²ΠΎ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ Π±ΠΈΠ½Π°ΠΌΠΈ, Π²ΡΠ΅ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ Π½Π°Ρ ΠΊ ΠΏΠΎΠ½ΡΡΠΈΡ ApplicationContext. ApplicationContext β ΡΡΠΎ ΡΠ΅ΡΠ΄ΡΠ΅ ΡΠΏΡΠΈΠ½Π³Π°. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Β«ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΡΡΡΒ») ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ Π±ΠΈΠ½ΠΎΠ². ΠΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ Π΅ΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ Π±ΠΈΠ½ΠΎΠ².
ΠΠΎΠ΄Π±ΠΈΡΠ°Π΅ΠΌΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡ. ΠΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ Π½Π°ΡΠΈ ΠΊΠ»Π°ΡΡΡ, ΡΡΠΎΠ±Ρ Spring IoC ΠΈ Π΅Π³ΠΎ ΡΠ»ΡΠ³Π° ApplicationContext ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ Shop ΠΎΠ±ΡΠ΅ΠΊΡΡ Seller? ΠΠΎΡ ΡΠ°ΠΊΠΈΠΌ:
ΠΡΠΎΡΡΠΎ? ΠΡΠ΄Π° ΡΠΆ ΠΏΡΠΎΡΠ΅! ΠΠ»Π΅Π³Π°Π½ΡΠ½ΠΎ? ΠΠΏΠΎΠ»Π½Π΅. ΠΠ΄Π΅ΡΡ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Component ΡΠΊΠ°Π·Π°Π»Π° ΡΠΏΡΠΈΠ½Π³Ρ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΅ΠΉ Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΠΌ, ΡΡΠΎ Π±ΠΈΠ½. ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ Autowired ΠΏΠΎΠΏΡΠΎΡΠΈΠ»Π° Spring Π² ΠΏΠΎΠ»Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½Π° Π°Π½Π½ΠΎΡΠΈΡΡΠ΅Ρ, ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Β«ΠΈΠ½ΠΆΠ΅ΠΊΡΠ½ΡΡΡΒ» (inject). ΠΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½ΠΎ? ΠΠ± ΡΡΠΎΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅, ΡΠ½Π°ΡΠ°Π»Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ, ΠΊΠ°ΠΊ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π±ΠΈΠ½Π°ΠΌΠΈ.
ΠΡ ΡΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π½ΡΡΡΡΡ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ Π²ΡΠ΅Ρ Π±ΠΈΠ½ΠΎΠ² ApplicationContext. ΠΠ½-ΡΠΎ ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠ°Π·Ρ Π²ΡΠ΅ Π±ΠΈΠ½Ρ. ΠΠΎΡΡΠΈ Π²ΡΠ΅. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π»ΡΠ±ΠΎΠΉ Π±ΠΈΠ½ ΠΈΠΌΠ΅Π΅Ρ Π²Π½ΡΡΡΠΈΡΠΏΡΠΈΠ½Π³ΠΎΠ²ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ scope Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ singleton. ΠΠ½ΡΡΡΠΈΡΠΏΡΠΈΠ½Π³ΠΎΠ²ΠΎΠ΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠΌ Π² ΠΏΡΡΠΌΠΎΠΌ ΡΠΌΡΡΠ»Π΅ ΡΠ»ΠΎΠ²Π° ΠΎΠ½ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ. ΠΠ½ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠΌ Π΄Π»Ρ ΡΠΏΡΠΈΠ½Π³Π°: ΠΏΡΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Spring ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ-Π±ΠΈΠ½ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Spring ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΈΠ½Π° ΠΈ ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, Π½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ ΠΎΠ± ΡΡΠΎΠΌ.
ΠΡΠ°ΠΊ, ΠΏΡΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ ApplicationContext ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π²ΡΠ΅ Π±ΠΈΠ½Ρ. ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΡΡΡΠ½ΠΈΠΌ, Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π³Π΄Π΅ ΠΆΠΈΠ²Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅: ΠΊΠ°ΠΊ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±ΠΈΠ½Ρ. ΠΠ°ΡΠΈΠ°Π½ΡΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΏΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ : ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°ΠΉΠ»Π° xml. ΠΠΎΡ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Ρ:
Π ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½ Π·Π°ΠΏΡΡΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΈΠ½ΠΎΠ² Π΄Π²ΡΠΌΡ ΠΏΡΡΡΠΌΠΈ. ΠΠ΅ΡΠ²ΡΠΉ, ΡΠΊΠ°ΠΆΠ΅ΠΌ ΡΠ°ΠΊ, ΡΡΡΠ½ΠΎΠΉ. ΠΠΈΠ΄ΠΈΡΠ΅, Π·Π΄Π΅ΡΡ Π΅ΡΡΡ ΡΠ΅Π³ bean Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ°. ΠΡΠΎ ΠΈ Π΅ΡΡΡ Π±ΠΈΠ½. ΠΠ· Π²ΡΠ΅Π³ΠΎ, ΡΡΠΎ ΠΏΡΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Ρ ΡΠ΅Π³ΠΎΠΌ bean, Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ Π±ΠΈΠ½Ρ.
ΠΡΠΎΡΠΎΠΉ ΠΏΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π΅Π½. ΠΠΎΠΌΠ½ΠΈΡΠ΅, Π½Π°Π΄ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ ΠΌΡ ΠΏΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Component. ΠΠ· Π²ΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠΎΠ², Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ, Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ Π±ΠΈΠ½Ρ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΈΠ· xml-ΡΠ°ΠΉΠ»Π°:
ΠΠ½Π° Π³ΠΎΠ²ΠΎΡΠΈΡ ΡΠΏΡΠΈΠ½Π³Ρ: ΠΏΡΠΎΡΠΊΠ°Π½ΠΈΡΡΠΉ Π²Π΅ΡΡ ΠΏΠ°ΠΊΠ΅Ρ main ΠΈ ΠΈΠ· Π²ΡΠ΅Π³ΠΎ, Π½Π°Π΄ ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ ΡΡΠΎΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Component (ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ, ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ°ΠΌΠΈ Component), ΡΠΎΠ·Π΄Π°ΠΉ Π±ΠΈΠ½Ρ. ΠΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎ, Π½Π΅ ΠΏΡΠ°Π²Π΄Π° Π»ΠΈ? ΠΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, Π² ΠΊΠ°ΠΊΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ ΠΊΠ»Π°ΡΡΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±ΠΈΠ½Ρ, ΠΈ Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΡΡΠΈ ΠΊΠ»Π°ΡΡΡ.
ΠΠΎΠ΄Π½ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ xml-ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΠΎΡΠΊΠΎΠΉ ΠΊΠΎΠ΄Π°:
Π³Π΄Π΅ beans.xml β ΠΏΡΡΡ ΠΊ xml-Π½ΠΈΠΊΡ, ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ»Π° ΡΠ΅ΡΡ Π²ΡΡΠ΅.
Π‘ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ½ΠΎΠ² ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ. ΠΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Spring Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ ΠΏΠΎΠ»Π΅ Shop ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ SellerβΠ°? ΠΡΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π±ΠΈΠ½-ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Shop. Π’Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π±ΠΈΠ½-ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Seller, ΠΎΠ½ ΠΆΠ΅ ΡΠΎΠΆΠ΅ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ Component. Π£ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ ΡΠΈΠΏΠ° Shop, Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Autowired. ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ Autowired Π³ΠΎΠ²ΠΎΡΠΈΡ ΡΠΏΡΠΈΠ½Π³Ρ: Π² ΡΡΠΎ ΠΏΠΎΠ»Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΠ½ΠΆΠ΅ΠΊΡΠ½ΡΡΡ Π±ΠΈΠ½. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π½Π°Ρ Π΅ΡΡΡ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ Π½Π° ΡΡΡ ΡΠΎΠ»Ρ, ΡΠΎ Π΅ΡΡΡ ΡΠΈΠΏ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠΈΠΏΠΎΠΌ ΠΏΠΎΠ»Ρ: ΡΡΠΎ Π±ΠΈΠ½ β ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Shop. ΠΠ½ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ½ΠΆΠ΅ΠΊΡΠ΅Π½ Π² ΠΎΠ±ΡΠ΅ΠΊΡ Seller, ΡΡΠΎ ΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ. Π― ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΠ΅ΠΉΡΠ°Ρ Π²ΠΎΠΏΡΠΎΡΠΈΠΊΠΈ ΠΏΠΎΠ»Π΅Π·Π»ΠΈ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ²ΡΡΠΊΠΈ: Π° ΡΡΠΎ Π±ΡΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ Spring Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ Π½ΡΠΆΠ½ΡΠΉ Π±ΠΈΠ½, ΠΈΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, Π° Π½Π΅ ΠΏΠΎ ΠΊΠ»Π°ΡΡΡ). Spring ΡΠΌΠ΅Π½, Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈ ΠΎΡ Π½Π°Ρ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ Autowired, Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΡΠ°ΡΡ Spring Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌ ΠΏΡΠΈ ΡΠ°ΠΊΠΈΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ°Ρ (ΠΎΠ± ΡΡΠΎΠΌ ΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, Π²Ρ ΠΈ ΡΠ°ΠΊ ΡΡΡΠ°Π»ΠΈ, ΠΊΡΠ΅ΠΏΠΈΡΠ΅ΡΡ, ΡΡΠ°ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΊΠΎΠ½ΡΡ).
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Seller β ΡΡΠΎ ΡΠΎΠΆΠ΅ Π±ΠΈΠ½. ΠΡΠ»ΠΈ Π±Ρ ΠΎΠ½ Π±ΡΠ» Π½Π΅ Π±ΠΈΠ½ΠΎΠΌ, Π° ΡΠΎΠ·Π΄Π°Π²Π°Π»ΡΡ ΡΠ΅ΡΠ΅Π· new, ΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π±Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π² Π½Π΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ½ΠΆΠ΅ΠΊΡΠ½ΡΠ»ΠΎΡΡ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ ΡΠ΅ΠΉΡΠ°Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅, Π·Π°ΡΠ΅ΠΌ Π²ΡΠ΅ ΡΡΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Ρ Π½Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ· 2 ΠΊΠ»Π°ΡΡΠΎΠ², Π° Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ² Π±ΠΎΠ»ΡΡΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ ΡΠΆΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅ ΡΠ°ΠΌΠΎΠΉ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ ΡΠ΅ΠΉΡΠ°Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΊΡΠ°ΡΠΈΠ²ΠΎ, ΠΏΡΠΎΡΡΠΎ ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎ Spring ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π½Π΅Π΄ΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ ΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π΅Π±Π°ΠΆΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π Π²ΡΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠΆΠ΅ Π½Π΅ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎβ¦
ΠΠ°ΡΠΎΡΠΊΠ° Ρ ΠΈΠ½ΡΠΎΠ² Π½Π°ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠΊ:
ΠΡΠΎ Π»Π΅Π³Π°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±ΠΈΠ½, Ρ ΠΎΡΡ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΡΡ ΡΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ. ΠΠΎ Π΄Π»Ρ ΡΡΠ΅Π±Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ.
UPD (20.04.2021). Dependency Injection ΡΡΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° IoC! Π ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ Ρ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΏΡΠΈΠ²ΠΎΠΆΡ ΠΏΡΠΈΠΌΠ΅ΡΡ Dependency Injection, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ IoC.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ dependency injection spring
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ°ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Π²Π½ΡΡΡΠΈ Springa:
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΈ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Spring Framework?
Spring Framework ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΈΡ Π·Π°Π΄Π°Ρ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Java-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ Java. ΠΠ·-Π·Π° ΡΠΈΡΠΎΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΡΠ΄Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΡΠΈΠΌΡΠ΅ ΡΡΡΡΠΊΡΡΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ ΡΠΎΡΡΠΎΠΈΡ. Spring Framework Π½Π΅ Π²ΡΠ΅ΡΠ΅Π»ΠΎ ΡΠ²ΡΠ·Π°Π½ Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΎΠΉ Java Enterprise, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π΅Π³ΠΎ ΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Π½Π΅ΠΉ, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π΅Π³ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΠΈ.
Spring Framework, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ (features), Π½ΡΠΆΠ½ΡΡ Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²Π½Π΅ ΡΡΠΆΠ΅Π»ΠΎΠ²Π΅ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ Π±ΡΠ»ΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΡΡΡΠΈΠΌΠΈ Π² ΠΏΡΠΎΠΌΡΡΠ»Π΅Π½Π½ΠΎΡΡΠΈ. ΠΡΡ ΠΎΠ΄Π½ΠΎ Π΅Π³ΠΎ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ Π²Π²Π΅Π» ΡΠ°Π½Π΅Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΡΠ΅Π³ΠΎΠ΄Π½ΡΡΠ½ΠΈΠ΅ Π³ΠΎΡΠΏΠΎΠ΄ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π΄Π°ΠΆΠ΅ Π²Π½Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Java. ΠΡΠΎΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΠΉ ΠΊ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ ΡΠΈΠΏΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Java. Π‘ΡΠΈΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Spring Framework ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° Π»ΡΡΡΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ°Ρ ΠΈΠ½Π΄ΡΡΡΡΠΈΠΈ, ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΎΠ±Π»Π°ΡΡΡΡ Java.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°ΠΌ Spring ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈ:
Spring BeanFactory Container ΠΡΠΎ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±Π°Π·ΠΎΠ²ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ DI ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ org.springframework.beans.factory.BeanFactory. Π’Π°ΠΊΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΊΠ°ΠΊ BeanFactoryAware ΠΈ DisposableBean Π²ΡΡ Π΅ΡΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π² Spring Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ.
ΠΠΈΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° getBean().
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° BeanFactory β XmlBeanFactory. XmlBeanFactory ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ XML ΡΠ°ΠΉΠ»Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΅Π³ΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ. BeanFactory ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Ρ (ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°). ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡΡΡΡ Π½Π΅ ΡΠΈΠ»ΡΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Ρ, ΡΠΎ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ApplicationContext.
Spring ApplicationContext Container ApplicationContext ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠΌ Spring Container-ΠΎΠΌ. ΠΠ°ΡΠ»Π΅Π΄ΡΠ΅Ρ BeanFactory ΠΈ ΡΠ°ΠΊ ΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π±ΠΈΠ½Ρ, ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡ Π²ΠΌΠ΅ΡΡΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅Ρ ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΠΎ ΠΊΡΠΎΠΌΠ΅ ΡΡΠΎΠ³ΠΎ, ApplicationContext ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡΡ: ΠΎΠ±ΡΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ. ΠΡΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ org.springframework.context.ApplicationContext.
ΠΠΈΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΡΠΈ «ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ» ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π²ΡΠ΅ ΡΡΠ°Π·Ρ. ΠΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°Π½Π° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ AppicationContext:
AnnotationConfigApplicationContext β ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΠΏΡΡΠΌΠΎ Π½Π° ΠΊΠ»Π°ΡΡΠ°Ρ .
Groovy β ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΉ Π΄Π»Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Java ΠΊΠ°ΠΊ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΡΠ·ΡΠΊΡ Java Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Python, Ruby ΠΈ Smalltalk. Groovy ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Java-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠ΅ΠΉ Π² JVM Π±Π°ΠΉΡ-ΠΊΠΎΠ΄ ΠΈ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π΄ΡΡΠ³ΠΈΠΌ Java ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ. Π―Π·ΡΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ Java ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡΠΊΡΠΈΠΏΡΠΎΠ²ΡΠΉ ΡΠ·ΡΠΊ.
ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Spring.
ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» Context
ΠΠ°ΠΊ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°
ΠΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎ Π΅ΡΡΡ 2 ΡΠΏΠΎΡΠΎΠ±Π°:
Π Spring Boot ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: Spring Boot ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ shutdown-hook Π·Π° Π²Π°Ρ.
ΠΠΈΠ½ (bean) β ΡΡΠΎ Π½Π΅ ΡΡΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΡΠ°ΠΌΡΠΉ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. Π Π°Π·Π½ΠΈΡΠ° Π»ΠΈΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π±ΠΈΠ½Π°ΠΌΠΈ ΠΏΡΠΈΠ½ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Spring-ΠΎΠΌ ΠΈ ΠΆΠΈΠ²ΡΡ Π²Π½ΡΡΡΠΈ Π΅Π³ΠΎ DI-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠΏΡΠΈΠ½Π³ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π²ΡΠ΅ Π±ΠΈΠ½Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π² Spring Context. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Spring ApplicationContext Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ xml ΡΠ°ΠΉΠ» ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π² Π½Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΎΡ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π² ΡΠ°ΠΉΠ»Π΅ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΎΠ² (interceptors), view resolvers, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π΄Ρ.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ: ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ Π±ΠΈΠ½; ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅ Π±ΠΈΠ½Π°; ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΠΈΠ½Π°.
Π Spring Framework ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠ΅ Π±ΠΈΠ½Ρ:
ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» Π±ΠΈΠ½ΠΎΠ²:
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ BeanPostProcessor ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΡΠ°ΠΌΠΎΠΌΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π±ΠΈΠ½ΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² Π±ΠΈΠ½Π°. ΠΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ BeanPostProcessor ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ Π±ΠΈΠ½ΠΎΠ², Π° ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Spring IoC ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π±ΠΈΠ½Π°, Π° Π·Π°ΡΠ΅ΠΌ BeanPostProcessor Ρ Π½ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ApplicationContext Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ Π»ΡΠ±ΡΠ΅ Π±ΠΈΠ½Ρ, Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ BeanPostProcessor ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΈΡ ΠΊΠ°ΠΊ βpost-processorsβ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ BeanPostProcessor ΠΈΠΌΠ΅Π΅Ρ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π°: postProcessBeforeInitialization ΠΈ postProcessAfterInitialization
ΠΠ°ΠΊ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΊΠ»Π°ΡΡ ΠΊΠ°ΠΊ Spring Bean
ΠΠ»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ Π±ΠΈΠ½Π°:
ΠΡΠ»ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΡΠΎ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ (ΠΈΠ·-Π·Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ), Π° ΠΏΠΎΡΠΎΠΌ ΡΠΆΠ΅ Bean, ΠΊΠΎΡΠΎΡΡΠΉ «Π½Π°Π²Π΅ΡΠΈΠ²Π°Π΅ΡΡΡ» Π½Π° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄.
Inversion of Control
Π¦Π΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ Spring ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Inversion of Control, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Java Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠΈ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΡΠ½ΠΎΠ³ΠΎ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π·Π°Π±ΠΈΡΠ°Π΅Ρ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΡΡΠΎ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΡΡΠΌ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ.
ΠΠ±ΡΠ΅ΠΊΡΡ, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ, ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ (beans). ΠΠ±ΡΡΠ½ΠΎ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΡΠΌ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ (Π½Π°ΡΠΈΠ½Π°Ρ Ρ 5 Π²Π΅ΡΡΠΈΠΈ J2SE), Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅, Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ, ΠΏΠΎ ΡΡΠ°ΡΠΈΠ½ΠΊΠ΅, Π·Π°Π³ΡΡΠ·ΠΈΡΡ XML-ΡΠ°ΠΉΠ»Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ beanβΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ beanβΠΎΠ².
ΠΠ±ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ²:
Dependency Lookup ΠΠΎΠΈΡΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ β ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
Dependency Injection ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ β ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎ ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°, ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈΠ»ΠΈ ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°.
Dependency Injection (DI)
ΠΠΎΠ΄ DI ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎ Dependency Inversion (ΠΈΠ½Π²Π΅ΡΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ Π½Π΅ Π΄Π΅Π»Π°ΡΡ ΠΆΠ΅ΡΡΠΊΠΈΡ ΡΠ²ΡΠ·Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π²Π°ΡΠΈΠΌΠΈ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ/ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ, Π³Π΄Π΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠ»Π°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Π·Π°Π²ΡΠ·Π°Π½ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ), ΡΠΎ Dependency Injection (Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΈΠΊΠΎΠ² ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π½Π΅ Π²Ρ Π² main-Π΅ ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ ΠΈΡ Π² ΡΠ²ΠΎΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π° Π·Π° Π²Π°Ρ ΠΈΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΏΡΠΈΠ½Π³, Π° Π²Ρ Π΅ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΡΡΠΎ-ΡΠΎ ΡΠΈΠΏΠ° «Ρ ΠΎΡΡ ΡΡΠ΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΡΠΈΠΊΠ°» ΠΈ ΠΎΠ½ Π²Π°ΠΌ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π² Π²Π°Ρ ΠΌΠ΅ΡΠΎΠ΄). ΠΡ ΡΠ°ΡΠ΅ Π±ΡΠ΄Π΅ΠΌ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΡ ΡΡΠ°ΡΡΡΡ ΡΠΎ Π²ΡΠΎΡΡΠΌ.
ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ (Dependency injection, DI) β ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠ΅ΡΠ΅Π· Π΄ΡΡΠ³ΠΎΠΉ. Π―Π²Π»ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠΎΠΉ Β«ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΒ» (Inversion of control, IoC), ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ. Π ΠΏΠΎΠ»Π½ΠΎΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠΌ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΡΠ΄Π°ΡΡ Π·Π°Π±ΠΎΡΡ ΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ Π΅ΠΌΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΠΎΠΌΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΌΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ.
Π Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°ΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ DI ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈ:
ΠΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ DI Π² Spring Framework?
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ DI Π² Spring ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° Π΄Π²ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡ Java β ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ JavaBean ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°Ρ . ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Spring Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° DI Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π³ΠΈΠ±ΠΊΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π²Π½ΡΡΡΠΈ ΡΠ²ΠΎΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ (Ρ.Π΅. Π²Π½Π΅ΡΠ½Π΅ Π² XML-ΡΠ°ΠΉΠ»Π°Ρ , Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ Java ΠΊΠ»Π°ΡΡΠΎΠ² Spring ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Java Π² ΠΊΠΎΠ΄Π΅). ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ JavaBean (ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ POJO (Plain Old Java Object β ΠΏΡΠΎΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Java)) ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² Java, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ². ΠΠ° ΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ DI ΠΎΠ±ΡΠ΅ΠΌ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², ΡΠ½ΠΈΠΆΠ°Π΅ΡΡΡ ΠΏΠΎΡΡΠΈ Π΄ΠΎ Π½ΡΠ»Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΠΎΡΠ΄Π°ΡΡ ΠΎΡ DI, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π±ΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π»Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
Π ΡΠΈΠΏΠ°ΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² Spring ΠΎΡΠ½ΠΎΡΡΡ:
Constructor Dependency Injection β ΡΡΠΎ ΡΠΈΠΏ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π΅ΠΌΡ Π² Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ (ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°Ρ ). Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±, Ρ.ΠΊ. Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΡΠΏΡΠΈΠ½Π³Π° Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ.
Setter Dependency Injection β ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ IoC Π²Π½Π΅Π΄ΡΡΠ΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² ΡΡΠΈΠ»Π΅ JavaBean. Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΠ΅ΡΡ. ΠΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ, Π² ΠΎΡΠ»ΠΈΡΠΈΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΠ½ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ.
Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΈ @Autowired
ΠΡΠΎΡΠ΅ΡΡ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² Π±ΠΈΠ½Ρ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Spring Bean Wiring. Π‘ΡΠΈΡΠ°Π΅ΡΡΡ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ²Π½ΡΠ΅ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ, Π½ΠΎ Π² Spring ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ @Autowired. ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π°Π΄ ΠΏΠΎΠ»Π΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠΈΠΏΡ. Π§ΡΠΎΠ±Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΡΠΏΡΠΈΠ½Π³ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° context:annotation-config/.
Spring ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ MVC-ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π±ΡΠ»Π° ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ Π·Π°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½Π°. Spring MVC ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠΌ, ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π½Π° Π·Π°ΠΏΡΠΎΡΡ. Π Π½Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. Π¦Π΅Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° β Π±ΡΡΡ ΠΏΡΠΎΡΡΡΠΌ ΠΈ ΡΡΠ½ΡΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π±ΡΠ»ΠΎ Π»Π΅Π³ΠΊΠΎ Π΅Π³ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΡΠΎΠ³ΠΎ ΠΏΠΎΠΆΠ΅Π»Π°ΡΡ. MVC ΠΏΡΠΎΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΠΏΡΡΡ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΡΠΎΠΌΡ front-end-ΠΊΠΎΠ΄Ρ. ΠΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΡΠ΅ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Ρ Ρ Servlet API. ΠΡΠ° ΡΠ²ΡΠ·Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΊΠ°ΠΊ Π½Π΅ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Spring ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ Π΄Π»Ρ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠ° ΡΠ²ΡΠ·Ρ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ Servlet API Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΎΠ±Π»Π΅Π³ΡΠ°Ρ Π²ΡΠ΅ ΠΆΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Spring MVC, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π½ΠΈΠΆΠ΅:
HandlerMapping: Π²ΡΠ±ΠΎΡ ΠΊΠ»Π°ΡΡΠ° ΠΈ Π΅Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠΉ Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π»ΡΠ±ΠΎΠ³ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π°ΡΡΠΈΠ±ΡΡΠ° ΠΈΠ»ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
HandlerAdapter: Π²ΡΠ·ΠΎΠ² ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°.
Controller: Π²ΠΊΠ»ΡΡΠ΅Π½ ΠΌΠ΅ΠΆΠ΄Ρ ΠΠΎΠ΄Π΅Π»ΡΡ (Model) ΠΈ ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ (View). Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΡΠ΅ ΠΎΡΠ²Π΅ΡΡ. ΠΠ΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ Π²ΠΎΡΠΎΡΠ°, Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ Π²ΡΡ ΠΏΠΎΡΡΡΠΏΠ°ΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΡΠΎΠΊ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.
ΠΠ»Π°ΡΡ DispatcherServlet ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°ΠΌΠΈ. @RequestsMapping ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡΠΎΡΡ Π±ΡΠ΄ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² DispatcherServlet, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΡ Π·Π° ΡΠ°Π·Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ (ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, REST ΡΠ»ΡΠΆΠ± ΠΈ Ρ.Π΄.). ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ DispatcherServlet ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ WebApplicationContext, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΡΡΠΎΠ²Π½Ρ ΡΠ΅ΡΠ²Π»Π΅ΡΠ°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠ΅ ΡΠ΅ΡΠ²Π»Π΅Ρ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΠΌΠΈ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΠΈ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ.ΠΏ.
Model: ΠΡΠΎΡ Π±Π»ΠΎΠΊ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ (ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ) Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΡΠΎ POJO-ΠΊΠ»Π°ΡΡΡ.
View: ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π·Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ΅ΠΊΡΡΠΎΠ² ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΠ΄ΡΠΈ ΠΏΡΡΠΌΠΎ Π²ΠΎ View, Π½Π΅ Π·Π°Ρ ΠΎΠ΄Ρ Π² Model; Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· Π²ΡΠ΅ ΡΡΠΈ ΡΠ»ΠΎΡ.
ViewResolver: Π²ΡΠ±ΠΎΡ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ View Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ. ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡ UrlBasedViewResolver ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΡΠΌΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠΌΠ΅Π½ Π² URL.
ΠΠ»Π°ΡΡ ContentNegotiatingViewResolver ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° ΠΌΠ΅Π΄ΠΈΠ°, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ (XML, PDF, JSON ΠΈ Ρ.Π΄.). Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ FreeMarker (FreeMarkerViewResolver), Velocity (VelocityViewResolver) ΠΈ JasperReports (JasperReportsViewResolver).
HandlerInterceptor: ΠΏΠ΅ΡΠ΅Ρ Π²Π°Ρ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². Π‘ΠΎΠΏΠΎΡΡΠ°Π²ΠΈΠΌ, Π½ΠΎ Π½Π΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ ΡΠ΅ΡΠ²Π»Π΅Ρ-ΡΠΈΠ»ΡΡΡΠ°ΠΌ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ Π½Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ DispatcherServlet-ΠΎΠΌ).
LocaleResolver: ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ (ΡΠ·ΡΠΊ, ΡΡΡΠ°Π½Π°, ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ) ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
MultipartResolver: ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Upload β Π·Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠΎΡΠ»Π΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π»ΡΠ±ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΡΡΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ.
Spring MVC ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:
ΠΠΎΠ³Π΄Π° Π°Π½Π½Π°ΡΠΎΡΠ°ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π°Π΄ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, ΠΎΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠ΅Π»ΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π² ΠΌΠΎΠ΄Π΅Π»Ρ. ΠΡΠΈ ΡΡΠΎΠΌ Spring-MVC Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ². Π’ΠΎ Π΅ΡΡΡ, ΠΌΠ΅ΡΠΎΠ΄Ρ @ModelAttribute Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ @RequestMapping.
Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ Π±ΡΠ» ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ @ControllerAdvice. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΌΠΎΠ΄Π΅Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅. ΠΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΡΠ°ΡΡΠΈ ΠΎΡΠ²Π΅ΡΠ°.
ΠΠΎΠ³Π΄Π° Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ ΡΡΠ°Π²ΠΈΡΡΡ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΎΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°ΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΌΠΎΠ΄Π΅Π»Ρ, Π° ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΏΠΎΠ»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ ΠΈΠ· Π²ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π·Π°ΠΏΡΠΎΡΠ°, ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°.
ΠΡΡΠΈΠ±ΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ° Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈΠ· ΡΠΎΡΠΌΡ, ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΠΎΡΠΊΡ addEmployee. Spring MVC Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ Π·Π° ΠΊΡΠ»ΠΈΡΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° submit. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΠ½ ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡΠΌΡ Ρ Bean. ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @RequestMapping ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠ»Π°ΡΡΠ° Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @ModelAttribute. ΠΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ Π² Spring-MVC, ΠΎΠ±ΡΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅Ρ Π²Π°Ρ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡΠΎΡΠΌΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² Spring MVC
Π Spring MVC ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ HandlerExceptionResolver (ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° org.springframework.web.servlet) ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΡΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠΌΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ DispatcherServlet ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ ΠΊΠ»Π°ΡΡ DefaultHandlerExceptionResolver (ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° org.springframework.web.servlet.mvc.support). ΠΡΠΎΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Spring MVC, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ°. ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π² ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @ExceptionHandler ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΡΠΈΠ±ΡΡΠ° ΡΠΈΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Spring MVC
Spring MVC ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡΡ ΠΈ ΡΠ΄ΠΎΠ±Π½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΈ Π² Spring (Spring Interceptor) ΡΠ²Π»ΡΡΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Servlet Filter ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈΡ . ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΠΈΡΡ Π·Π°ΠΏΡΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΡΠ΅Ρ ΠΌΠ΅ΡΡΠ°Ρ : preHandle, postHandle ΠΈ afterCompletion.
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ HandlerInterceptorAdapter ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ HandlerInterceptor. Π’Π°ΠΊ ΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Spring.
CommandLineRunner ΠΈ ApplicationRunner
ΠΡΠΈ ΠΈΠ½ΡΡΠ΅ΡΠ΅ΠΉΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Spring.
ApplicationRunner.run() ΠΈ CommandLineRunner.run() Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ applicationcontext ΠΈ Π΄ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ±Π° ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, ΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ CommandLineRunner ΠΈ ApplicationRunner ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ CommandLineRunner.run() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ String array[], ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ApplicationRunner.run() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ApplicationArguments Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
ΠΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ CommandLineRunner ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠΎΠ±Ρ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π΅Π»ΠΈΡΡ ΡΠ»ΠΎΠΆΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ. Π£ΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠΌ ΡΠ΅ΡΠ΅Π· @Order. ΠΠ°ΠΆΠ΄ΡΠΉ Runner ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
Π Π΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅.
Π Π΅Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΡΡΠΎΠ²Π΅Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠΎΠ½ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° Π²Π·Π°ΠΈΠΌΠΎΡΠ²ΡΠ·ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ΄ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎΠ΄ Π² ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ ΠΊΠΎΡΠΎΡΠ΅.
ΠΠΎΡΠΎΠΊ β ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΡΠΎΡΡΠΎΡΡΠ°Ρ ΠΈΠ· ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π Π½Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠΈ ΡΠΈΠΏΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ: Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°), ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΡΠΈΠ³Π½Π°Π» ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎ, ΡΡΠΎ ΡΠΈΠ³Π½Π°Π» ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π·Π°ΠΊΡΡΡΠΈΡ.
ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠΈ cΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ, Π²ΡΠ΅Π³Π΄Π°. Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΡΠΈ Π²ΠΈΠ΄Π° ΡΡΠ½ΠΊΡΠΈΠΉ: ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ, ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π΄Π²Π° ΠΏΡΠ½ΠΊΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΡΡΠΈΡΡ ΠΈ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΡΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. Π‘Π»ΡΡΠ°ΡΡ(listening) ΠΏΠΎΡΠΎΠΊ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ(subscribing) Π½Π° Π½Π΅Π³ΠΎ. Π’ΠΎ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΡΠΎ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΠΈ(observers). Π ΠΏΠΎΡΠΎΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ.
ΠΡΠΈΡΠ΅ΡΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: Responsive. Π Π°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠ°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π±ΡΡΡΡΠΎ ΠΈ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π°ΡΠ°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π³ΠΈΠ±ΠΊΠΎΠΉ Π΄Π»Ρ ΡΠ°ΠΌΠΎΠ΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ ΠΈ ΠΏΠΎΡΠΈΠ½ΠΊΠΈ.
Π§ΡΠΎ ΡΡΠΎ Π·Π½Π°ΡΠΈΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΡΠ΅? Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΌΡ ΠΈΠ΄Π΅ΠΌ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π²ΡΠ½ΠΈΠΌΠ°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ ΠΎΡΠ΄Π°Π΅ΠΌ Π΅Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ΄Π΅ΡΡ Π²ΡΠ΅ Ρ ΠΎΡΠΎΡΠΎ, Π΅ΡΠ»ΠΈ Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΡΡΡΠ°Ρ ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠ°Ρ. ΠΠΎ ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ΠΌΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° Π³ΠΎΡΠ°Π·Π΄Π½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ? ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠ³ ΠΏΡΠΎΠΏΠ°ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄. Π’ΠΎΠ³Π΄Π° Π²ΡΠ΅ ΡΡΠΈΠ»ΠΈΡ ΠΏΠΎ Π²ΡΠ±ΠΎΡΠΊΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΏΡΠΎΠΏΠ°Π΄Π°ΡΡ. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ gmail ΠΈΠ»ΠΈ facebook. ΠΠΎΠ³Π΄Π° Ρ Π²Π°Ρ ΠΏΠ»ΠΎΡ ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π²Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ, Π° ΠΏΡΠΎΡΡΠΎ ΠΆΠ΄Π΅ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎΡ ΠΏΡΠ½ΠΊΡ Π³ΠΎΠ²ΠΎΡΠΈΡ Π½Π°ΠΌ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠ²Π΅ΡΡ ΠΈ Π·Π°ΠΏΡΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Ρ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½Ρ.
Resilient. Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΎΡΡΠ°Π΅ΡΡΡ Π² ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π΄Π°ΠΆΠ΅, Π΅ΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΎΡΠΊΠ°Π·Π°Π».
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠΎΡΠ½ΠΎ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°. ΠΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΡΡΠΎ ΠΏΡΡΠ΅ΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΉ. ΠΡΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ΄Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° PostgreSQL ΠΎΡΠΊΠ°Π·Π°Π»Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ»Π° Π΄ΠΎΡΡΡΠΏΠ½Π° Π΄ΡΡΠ³Π°Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ².
Elastic. Π‘ΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΡΡΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠ»ΠΈ Ρ Π½Π°Ρ Π²ΡΡΠΎΠΊΠ°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ°, ΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΊΠ·Π΅ΠΏΠ»ΡΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΡΠ»ΡΡΠ°Π΅ ΠΌΠ°Π»ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ΅ΡΡΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΠΌΠ°ΡΠΈΠ½ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΡΠΈΡΠ΅Π½Ρ. Π’ΠΈΠΏΠΈΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°: Kubernetes.
Message Driven. ΠΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΡΠ΅ΡΠ΅Π· Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΈΡΡΠ΅ΠΌΡ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, Π½ΠΎ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΡΡΠ°Π·Ρ ΠΆΠ΅. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡ ΡΠ²ΠΎΠΈ Π·Π°Π΄Π°ΡΠΈ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·Ρ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠΌΠΈ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ. ΠΠ±ΡΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
ΠΠ°ΡΡΠ΅ΡΠ½Ρ Π² Spring Framework
ΠΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² Spring Framework:
AOP ΠΈ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ ΡΠ°ΡΡΠΈ
ΠΡΠΏΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (ΠΠΠ) β ΡΡΠΎ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ΅Π»ΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎΡΡΠΈ Π·Π° ΡΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄ΠΈΡΡΠΈΠΏΠ»ΠΈΠ½Π°ΡΠ½ΡΡ Π·Π°Π΄Π°Ρ. ΠΡΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΠΊΠΎΠ΄Ρ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
Spring AOP vs ASPECTJ
AspectJ Π΄Π΅-ΡΠ°ΠΊΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΠΠ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΠΠ ΠΎΡ Spring ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ:
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Spring
Π Π°Π·Π»ΠΈΡΠΈΡ @Component, @Service, @Repository, @Controller
ΠΠ½ΠΈ Π²ΡΠ΅ ΡΠ»ΡΠΆΠ°Ρ Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΠΊΠ°ΠΊ ΠΠΈΠ½.
Π Π°Π·Π»ΠΈΡΠΈΡ @Controller ΠΈ @RestController
@Controller ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠ»Π°ΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ HTTP Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π Spring 4.0 Π±ΡΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @RestController. ΠΡΠΈΠΌΠ΅Π½ΠΈΠ² Π΅Π΅ ΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @Controller, Π° ΡΠ°ΠΊ ΠΆΠ΅ @ResponseBody ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ.
@Qualifier and @Primary
ΠΡΠ»ΠΈ Π΅ΡΡΡ Π΄Π²Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ Π±ΠΈΠ½Π° (ΠΏΠΎ ΡΠΈΠΏΡ ΠΈ ΠΈΠΌΠ΅Π½ΠΈ) ΡΠΏΡΠΈΠ½Π³ Π½Π΅ Π·Π½Π°Π΅Ρ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π²ΡΠ΄Π°ΡΡ exeption. ΠΡΠ»ΠΈ Π½Π°Π΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΡΠΈΡ Π±ΠΈΠ½ΠΎΠ² ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Π° @Primary, ΡΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅. ΠΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ°Π±ΠΎΡΠ΅ ΠΎΠ±Π° ΡΡΠΈΡ Π±ΠΈΠ½Π°, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ @Qualifier ΠΈ Π·Π°Π΄Π°ΡΡ ΠΈΠΌΡ, Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΠΈΡ Π±ΠΈΠ½ΠΎΠ².
ΠΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ @Profile(«postgres») ΠΈ @Profile(«mysql»), Π° Π² application.properties ΡΠΊΠ°Π·Π°ΡΡ, Π±ΠΈΠ½ Ρ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ = spring.profiles.active = mysql
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ prototype bean Π² singleton bean.
Π‘ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄-Π·Π°Π³Π»ΡΡΠΊΡ Π² Π±ΠΈΠ½Π΅ Car ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΠ΅ Π΅Π³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ β Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Lookup. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π±ΠΈΠ½ Passenger, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π½ΠΎΠ²ΡΠΉ. ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Spring ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π±ΡΠ΄Π΅Ρ Π²Π°ΠΌ Π²ΡΠ΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π±ΠΈΠ½Π° Passenger ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π² Π²Π°ΡΠ΅ΠΉ Π·Π°Π³Π»ΡΡΠΊΠ΅ ΠΎΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ null (Π° ΡΠ°ΠΊ ΠΈ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°ΡΡ, Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½).
@Target ΠΈ @Retention
@Autowired vs @Resource vs @Inject
ΠΠ½Π½ΠΎΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
@Resource (java) ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ: ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΠΎ ΡΠΈΠΏΡ, Π·Π°ΡΠ΅ΠΌ ΠΏΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ. ΠΠΌΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΡΡΡ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ΅ΡΠ° ΠΈΠ»ΠΈ ΠΏΠΎΠ»Ρ, Π»ΠΈΠ±ΠΎ Π±Π΅ΡΠ΅ΡΡΡ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° name.
@Inject (java) ΠΈΠ»ΠΈ @Autowired (spring) Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΏΠΎ ΡΠΈΠΏΡ, Π·Π°ΡΠ΅ΠΌ ΠΏΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.
ΠΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ Π² Spring
Spring ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΡΠΈΠΏΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ:
ΠΡΠΎΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ PlatformTransactionManager ΡΡΠΎ DataSourceTransactionManager, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² ΠΠ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Connection.
ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ ΡΠ°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ±Π»Π°ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΠ. Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΠ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²Π½ΡΡΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ persistence context.
Persistence ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ Π² JPA ΡΠ²Π»ΡΠ΅ΡΡΡ EntityManager, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡ Session ORM-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Hibernate (ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Hibernate ΠΊΠ°ΠΊ persistence ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°). Persistence ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ-ΡΠΈΠ½Ρ ΡΠΎΠ½Π°ΠΉΠ·Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Java ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΠ.
ΠΡΠΈ ΡΡΠΎΠΌ @PersistenceContext Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²Π½Π΅Π΄ΡΠΈΡΡ entity manager Π½Π°ΠΏΡΡΠΌΡΡ. Entity Manager ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΈ ΡΠΎ ΡΡΠΎ Π²Π½Π΅Π΄ΡΡΠ΅ΡΡΡ Π² Π±ΠΈΠ½ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΠΈΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠΌ, ΡΡΠΎ context aware proxy, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅.
ΠΠΎ ΠΏΡΠΎΠΊΡΠΈ persistence ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠΌΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΡΠ΅Ρ EntityManager Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π΄Π»Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½ΡΠΆΠ½ΠΎ ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
ΠΡΠΏΠ΅ΠΊΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ β Β«aroundΒ» Π°ΡΠΏΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈ Π΄ΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΠ·Π½Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ Π°ΡΠΏΠ΅ΠΊΡΠ° ΡΡΠΎ TransactionInterceptor.
ΠΡΠΏΠ΅ΠΊΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π΅ Π³Π»Π°Π²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
Transaction ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ²ΠΈΡΡ ΠΎΡΠ²Π΅Ρ Π½Π° Π΄Π²Π° Π²ΠΎΠΏΡΠΎΡΠ°: ΠΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠΉ Entity Manager? ΠΠΎΠ»ΠΆΠ½Π° Π»ΠΈ ΡΡΠ°ΡΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΠ?
ΠΡΠ²Π΅ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ° Π°ΡΠΏΠ΅ΠΊΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Β«Π΄ΠΎΒ». ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°ΠΊΡΠ°Ρ : Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π»ΠΈ Ρ ΠΎΡΡ ΠΎΠ΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ; Π½Π΅Ρ Π»ΠΈ Π°ΡΡΠΈΠ±ΡΡΠ° Β«propagationΒ» Ρ ΠΌΠ΅ΡΠΎΠ΄Π°, Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ @Transactional (Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°, REQUIRES_NEW Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°ΡΡΡΠ΅Ρ Π½ΠΎΠ²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ).
ΠΡΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΠΈΠ» ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΡΠΎΠ³Π΄Π°: Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ
Β«ΠΡΠΈΠ²ΡΠ·ΠΊΠ°Β» entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΏΠΎΡΠΎΠΊΡ (Thread)
Β«ΠΠ·ΡΡΠΈΠ΅Β» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΠ· ΠΏΡΠ»Π° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΠ
Β«ΠΡΠΈΠ²ΡΠ·ΠΊΠ°Β» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΏΠΎΡΠΎΠΊΡ
Π entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΈ ΡΡΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΏΠΎΡΠΎΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ThreadLocal. ΠΠ½ΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΠΏΠΎΡΠΎΠΊΠ΅, ΠΏΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΎΡΠΈΡΡΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΡΠΆΠ΅ Π±ΡΠ΄ΡΡ Π½Π΅ Π½ΡΠΆΠ½Ρ. ΠΡΠ±Π°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠΉ Π½ΡΠΆΠ΅Π½ ΡΠ΅ΠΊΡΡΠΈΠΉ entity manager ΠΈΠ»ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅Π»Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ Entity Manager Proxy.
EntityManager proxy ΠΠΠΎΠ³Π΄Π° Π±ΠΈΠ·Π½Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ Π²ΡΠ·ΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, entityManager.persist(), ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Ρ entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π±ΠΈΠ·Π½Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠΊΡΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΡΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠΈΠΉ entity ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ°, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ» ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ.
ΠΠΊΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π·Π°ΠΏΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠΌ xml ΡΠ°ΠΉΠ»Π΅ Π²Π°ΡΠ΅Π³ΠΎ spring-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΠΠ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ @EnableTransactionManagement Π² Π²Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ»
ΠΠΎΠ±Π°Π²ΠΈΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @Transactional Π² ΠΊΠ»Π°ΡΡ (ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ°) ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°).
Π£ @Transactional Π΅ΡΡΡ ΡΡΠ΄ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
ΠΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Ρ @Transactional ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠΎΠ±Π°Ρ ΡΠ»ΠΈΡΠ½Π°Ρ ΠΌΠ°Π³ΠΈΡ: proxy, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π» Spring, ΡΠΎΠ·Π΄Π°ΡΡ persistence context (ΠΈΠ»ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ), ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π² Π½ΡΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π²ΡΡ ΡΡΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π½ΠΈΡΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (Π½Π°ΡΡΡΠ°Π»ΡΠ½ΠΎ, Π² ThreadLocal). ΠΠΎ ΠΌΠ΅ΡΠ΅ Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡΠΈ Π²ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ½Π½ΠΎΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΡ ΠΈ Π²Π½Π΅Π΄ΡΡΠ΅ΡΡΡ Π² Π±ΠΈΠ½Ρ. ΠΡΠΈΠ²ΡΠ·ΠΊΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΊ Π½ΠΈΡΡΠΌ (threads) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ J2EE, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π½ΠΈΡΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π½ΠΈΡΠ΅ΠΉ, Ρ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΡΠΎΠ²Π½ΡΠΌ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ. ΠΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅ΡΠΎΠ΄ Ρ @Transactional Π²ΡΠ·ΠΎΠ²Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ Ρ @Transactional? Π Spring ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ.
NESTED β ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΌΠ΅ΡΡ savepoints (Postgres Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅). Savepoints β ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π²Π½ΡΡΡΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ. Savepoint ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Π½ΡΡΡΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΠΎΡΠΊΠ°ΡΠΈΡΡΡΡ ΠΊ Π½Π΅ΠΌΡ, Π½Π΅ ΠΎΡΠΊΠ°ΡΡΠ²Π°Ρ Π²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ. ΠΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² ΠΌΠ΅ΡΠΎΠ΄ Π² ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ savepoint, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π±ΡΠ΄Π΅Ρ Π»ΠΈΠ±ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΠ½, Π»ΠΈΠ±ΠΎ ΠΎΡΠΊΠ°ΡΠ΅Π½. ΠΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π²Π½Π΅ΡΡΠ½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ·Π΄Π΅Π΅, Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½Π° Π½ΠΎΠ²Π°Ρ.
ΠΡΠ΄Π° ΠΆΠ΅ ΡΡΠ°Π²ΠΈΡΡ @Transactional? ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠΉΠ½ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ:
ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ > ΡΠ»ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ > ΡΠ»ΠΎΠΉ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ > ΡΠ»ΠΎΠΉ ORM
ΠΠ΄Π΅ Π·Π΄Π΅ΡΡ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ @Transactional? Π‘Π»ΠΎΠΉ ORM ΠΎΠ±ΡΡΠ½ΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΠΈΡΠ΅Ρ ΡΠ°ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π½Π΅ Π²ΡΡΠ°Π²ΠΈΡΡ.
Π‘Π»ΠΎΠΉ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΡΠΎΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ @Transactional, ΡΠΎ, Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ, Π° Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΡΡΠ΅ΡΡΡ ΡΠΌΡΡΠ» ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΠΊΠ°ΠΊ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² ΠΎΠ΄Π½Ρ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ΅Π΄Ρ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°, ΡΠΎ Π΅ΡΡΡ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΎΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½Π°Ρ, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ.
Π‘Π»ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ ΠΌΠ΅ΡΡΠΎΠΌ Π΄Π»Ρ @Transactional: ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π΄Π΅ΡΡ Π½Π°Π±ΠΎΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ Π±Π°Π·Π΅ ΠΎΡΠΎΡΠΌΠ»ΡΠ΅ΡΡΡ Π² Π΅Π΄ΠΈΠ½ΡΡ ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΠ½Π°Ρ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅ΡΠΊΠΎ ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠΈΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Π² Π½ΡΠΌ ΠΈ ΡΠ°ΡΡΡΠ°Π²ΠΈΡΡ Π³ΡΠ°Π½ΠΈΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ.
Π‘Π»ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΈΠΌ ΠΌΠ΅ΡΡΠΎΠΌ Π΄Π»Ρ @Transactional, Π½ΠΎ Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ Π΄Π²Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ°, ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΎ ΡΠ»ΠΎΠ΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠΠΎ ΠΏΠ΅ΡΠ²ΡΡ ΠΎΠ½ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π΄Π΅Π»Π°ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄Π»ΠΈΠ½Π½Π΅Π΅: ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΆΠ΄Π°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π² ΡΡΠΎΠΌ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π½Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΠΎ Π²ΡΠΎΡΡΡ ΡΡΠΎ Π½Π°ΡΡΡΠ°Π΅Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ: ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π΅Π½ Π·Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΌΠΈΡΠΎΠΌ, ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π΅Π½ ΠΈ Π·Π° ΡΠ°ΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ β Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π°Π½Π½ΠΎΡΠΈΡΡΠΉΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. ΠΠ½Π½ΠΎΡΠ°ΡΠΈΠΈ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Spring, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±Π΅Π· ΡΠ²ΠΎΠΈΡ @Transactional
ΠΠ°ΠΊ Spring ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ DAO
Spring DAO ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ Π΄Π°Π½Π½ΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ Π²ΡΠΎΠ΄Π΅ JDBC, Hibernate Π² ΡΠ΄ΠΎΠ±Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ: JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport, JpaDaoSupport.
Model vs ModelMap vs ModelAndView
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Model ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ (ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ) Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ModelMap ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π²Π½ΡΡΡΠΈ Map. Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² Model ΠΈ ModelMap ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΠ΅. ΠΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΈΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ.
Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ModelAndView ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π²ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ°ΠΊΡΡ ΠΊΠ°ΠΊ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΈΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ.
Π ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ model.put() ΠΈ model.addAttribute()?
ΠΠ΅ΡΠΎΠ΄ addAttribute ΠΎΡΠ΄Π΅Π»ΡΠ΅Ρ Π½Π°Ρ ΠΎΡ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ hashmap. ΠΠΎ ΡΡΡΠΈ addAttribute ΡΡΠΎ ΠΎΠ±Π΅ΡΡΠΊΠ° Π½Π°Π΄ put, Π³Π΄Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° null. ΠΠ΅ΡΠΎΠ΄ addAttribute Π² ΠΎΡΠ»ΠΈΡΠΈΠΈ ΠΎΡ put Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ modelmap.
SOAP β ΡΡΠΎ ΡΠ΅Π»ΠΎΠ΅ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠ², Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΆΠ΅Π»ΠΎΠ²Π΅ΡΠ½ΡΠΉ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠΎΡΡΠΎΠΌΡ REST ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±ΡΡΡΡΠ΅Π΅.
Give every βthingβ an ID;
Π’Π΅ΡΠΌΠΈΠ½ RESTful (Π²Π΅Π±-)ΡΠ΅ΡΠ²ΠΈΡ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ΅ΡΠ²ΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² REST.
ΠΡΠΈ ΡΡΠΎΠΌ SOAP ΠΈ REST β Π½Π΅ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΡ. ΠΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ Π²Π΅ΡΠΎΠ²ΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΈ Π²ΡΡΠ΄ Π»ΠΈ Π½Π°ΠΉΠ΄Π΅ΡΡΡ Π·Π°Π΄Π°ΡΠ°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ°ΡΠΈΠΎΠ½Π°Π»ΡΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ β SOAP ΠΈΠ»ΠΈ REST.
Spring Data β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΡΡΠ½ΠΎΡΡΡΠΌΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ , ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, Π² ΠΊΠ°ΠΊΠΈΡ ΡΠΎ ΡΠ»ΡΡΠ°ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π² Π½Π΅ΠΌ, Π±Π΅Π· ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅ Π² Spring Data β ΡΡΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. ΠΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ JPA Entity Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π½Π΅ΠΉ. Π’Π°ΠΊ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ( public interface CrudRepository extends Repository ) ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠΈΡΠΊΡ, ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ, ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ (CRUD ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ).
Π’.Π΅. Π΅ΡΠ»ΠΈ ΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ½Ρ ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΡΡΠ½ΠΎΡΡΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΡΠΌΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Π³ΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
ΠΠΎΠ½ΡΡΠ½ΠΎ ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ½Ρ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π½Π΅ Ρ Π²Π°ΡΠΈΡ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΡΡΠ½ΠΎΡΡΡΡ, ΠΈ ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ°ΠΏΡΠΎΡΡ ΠΊ ΡΡΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠΎΠΈΡΡ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠ² findβ¦By, readβ¦By, queryβ¦By, countβ¦By, ΠΈ getβ¦By, Π΄Π°Π»Π΅Π΅ ΠΎΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠ° ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ°Π·Π±ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ. ΠΠ²ΠΎΠ΄Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Distinct. ΠΠ°Π»Π΅Π΅ ΠΏΠ΅ΡΠ²ΡΠΉ By Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ Π½Π°ΡΠ°Π»ΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠ΅Π². ΠΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π΄Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ² ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ And ΠΈ Or.
ΠΡΠ»ΠΈ Π½ΡΠΆΠ΅Π½ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅Π»ΡΠ·Ρ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΈΠΌΡ ΠΌΠ΅ΡΠΎΠ΄Π°, ΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ Customized ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ( CustomizedEmployees) ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ. Π ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΡΠ΅ΠΌ, ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° (HQL ΠΈΠ»ΠΈ SQL), ΠΊΠ°ΠΊ Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠΌΠ΅ΡΠΈΠ² Π·Π°ΠΏΡΠΎΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Query.
ΠΠ°ΡΠΈΠ²Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Spring Data
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ JPA, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ Π² ΡΠ°ΠΉΠ»Π΅ persistence.xml, Π° Π½Π΅ Π² hibernate.cfg.xml. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ META-INF Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² Π½Π΅Π³ΠΎ ΡΠ°ΠΉΠ» persistence.xml.
ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ Π² Π²Π°ΠΉΠ»Π΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Spring Data JPA Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π²Π° beans-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°: EntityManagerFactory ΠΈ JpaTransactionManager. ΠΠΎΡΡΠΎΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ JpaConfig:
@EnableJpaRepositories: ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Spring Data JPA, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ ΠΊΠ»Π°ΡΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π² ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ (net.codejava) Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
@EnableTransactionManagement: ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Spring Data JPA, ΡΡΠΎΠ±Ρ ΡΠΎΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π» ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ EntityManagerFactory Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Persistence Unit Π½Π°ΡΠ΅ΠΉ SalesDB (ΡΡΠΎ ΠΈΠΌΡ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅ Π² persistence.xml).
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ JpaTransactionManager Π΄Π»Ρ EntityManagerFactory, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΡΠ°Π½Π΅Π΅.
ΠΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Spring Data JPA.
Spring Security ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΡΠΎΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΎΠΌΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡ, ΡΡΡΠ»ΠΎΠΊ ΠΈ Ρ.ΠΏ., ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π°ΡΠ°ΠΊ
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ UserDetails ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ Spring Security.
ΠΠΎ ΡΡΡΠΈ, Spring Boot ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΡΠΆΠ½ΡΠ΅ Π±ΠΈΠ½Ρ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅. Π’ΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠΊΠ°ΠΌΠΈ, ΠΏΡΠΎΡΡΠΎ Boot ΡΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΡΠ°Π·Π½ΡΡ Π²Π΅ΡΡΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
Π§ΡΠΎΠ±Ρ ΡΡΠΊΠΎΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ, Spring Boot Π½Π΅ΡΠ²Π½ΠΎ ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Spring ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ starter-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² (spring-boot-starter-web, spring-boot-starter-data-jpa ΠΈ Ρ.Π΄.)
Starter-ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΠ΄ΠΎΠ±Π½ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ Π² ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠ΅Ρ , ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠΎ Spring ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, ΠΈΠ·Π±Π°Π²Π»ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° ΠΎΡ Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΠ· Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π½Π°ΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Spring Data JPA Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΎΡΡΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Π² ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ spring-boot-starter-data-jpa ΠΈ Π²ΡΠ΅ Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ²ΠΎ (Π²Π°ΠΌ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΊΠ°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Hibernate)
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Spring-boot-starter-web, Spring Boot Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅Ρ ΡΠ°ΠΊΠΈΠ΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π±ΠΈΠ½Ρ, ΠΊΠ°ΠΊ DispatcherServlet, ResourceHandlers, MessageSource. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ spring-boot-starter-jdbc, Spring Boot Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ Π±ΠΈΠ½Ρ DataSource, EntityManagerFactory, TransactionManager ΠΈ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° application.properties
Π ΠΎΡΠ½ΠΎΠ²Π΅ «ΠΌΠ°Π³ΠΈΠΈ» Spring Boot Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ ΠΈΠ· Spring Framework. Π ΠΊΡΠ°ΡΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
ΠΠ°ΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅ Spring Boot ΡΡΠΎ Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠΎ ΡΡΡΠΈ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π±ΠΈΠ½Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΠΎ Π±ΠΎΠ»ΡΡΠΎΠΌΡ ΡΡΠ΅ΡΡ, Π΄Π°ΠΆΠ΅ ΡΠ°ΠΌ Embedded Servlet Container β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ! ΠΠ°ΡΠ° Π²Π°ΠΆΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΎΠ± Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
ΠΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π±ΠΈΠ½ΠΎΠ² ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π°Π±ΠΎΡΠΎΠΌ @ConditionalOn* Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎΠ±Ρ Π±ΠΈΠ½ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΡΡ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° Π² classpath (@ConditionalOnClass), Π½Π°Π»ΠΈΡΠΈΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π±ΠΈΠ½Π° (@ConditionalOnBean), ΠΎΡΡΡΡΡΠ²ΠΈΠΈ Π±ΠΈΠ½Π° (@ConditionalOnMissingBean) ΠΈ Ρ.ΠΏ.
ΠΡΠΊΠ»ΡΡΠΈΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ²ΠΎΠΉΡΡΠ² exclude ΠΈ excludeName Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ @EnableAutoConfiguration, @ImportAutoConfiguration ΠΈ @SpringBootApplication. ΠΠ»ΠΈ Π² property Π·Π°Π΄Π°ΡΡ SpringAutoconfiguration exclude ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈΠΌΠ΅Π½Π° ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΡΡΠ½ΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ @SpringBootApplication ΠΈ @EnableAutoConfiguration Π² ΠΊΠΎΠ΄Π΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π° Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π½ΡΠΆΠ½ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @SpringBootConfiguration ΠΈ @ImportAutoConfiguration. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎΠΈΡ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΡ Π΅ΡΡ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ.
Π§ΡΠΎΠ±Ρ ΡΡΠΊΠΎΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ, Spring Boot Π½Π΅ΡΠ²Π½ΠΎ ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Spring ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ starter-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². Starter-ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΠ΄ΠΎΠ±Π½ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ Π² ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ΅Π»Π°Π΅ΠΌ ΡΠ²ΠΎΠΉ Starter-ΠΏΠ°ΠΊΠ΅Ρ:
ΠΠ°ΠΊ Π²Π½Π΅Π΄ΡΠΈΡΡ java.util.Properties Π² Spring Bean
ΠΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ propertyConfigure bean Π² XML.
Π§ΡΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π² Spring 5
RestTemplate ΠΈ JDBCTemplate
ΠΠ»Π°ΡΡ RestTemplate ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ HTTP-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π² Spring. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΈΠ»ΠΈΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠ²Π΅ΡΠΎΠ².
ΠΠ»Π°ΡΡ Π΄Π»Ρ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ°ΡΠΈΡΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΡΠΎΠΊΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ»ΠΊΡ Π΄Π°Π½Π½ΡΡ .