Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎ DI Π² Spring Boot

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

Как сказал ΠΎΠ΄ΠΈΠ½ ΠΌΡƒΠ΄Ρ€Π΅Ρ†: Π²Π΅Ρ‡Π½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° Ρ‚Ρ€ΠΈ Π²Π΅Ρ‰ΠΈ: ΠΊΠ°ΠΊ Ρ‚Π΅Ρ‡Π΅Ρ‚ Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ Π³ΠΎΡ€ΠΈΡ‚ огонь ΠΈ ΠΊΠ°ΠΊ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒ ΠΎ 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:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

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 spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

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.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

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.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

ApplicationContext

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ dependency injection spring

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-запросов ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².

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

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

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

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