Добро пожаловать в руководство по внедрению зависимостей Spring Constructor . Инжекция зависимостей на основе конструктора является типом инъекции зависимостей Spring. Другой тип инъекций зависимости — Инъекция сеттера и Инъекция поля.
Подробнее о инъекции зависимостей весной:
- Пример инъекции сеттера весной
- Инъекция поля весной
- Внедрение зависимостей — Конструктор против внедрения поля
- Внедрение зависимостей и инверсия контроля
Внедрение зависимостей на основе конструктора
Это тип Spring Dependency Injection , где конструктор объекта используется для внедрения зависимостей. Этот тип внедрения более безопасен, поскольку объекты не будут созданы, если зависимости недоступны или зависимости не могут быть разрешены.
Чтобы понять, как на основе Constructor Inpendency Injection работает в Spring — очевидно, — нам нужно Spring Application. Предположим , у нас есть очень простое Spring-приложение, называемое DogsService , которое является фиктивным сервисом.
Не знаете, как написать Spring Boot Rest Service?
Читать это: Spring Boot Rest Service
Хотите узнать больше о Spring Framework?
Прочитай это:
- Введение в Spring Framework
- Spring Framework Архитектура
- Spring Beans — Синглтон против прототипа
- Автопроводка весной
Собаки ДАО
Класс DAO не имеет никакой зависимости. Мы добавили конструктор без аргументов с оператором print.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
import com.amitph.spring.dogs.repo.Dog; import org.springframework.stereotype.Component; import java.util.List; @Component public class DogsDao { public DogsDao(){ System.out.println( "DogsDao no-arg constructor called" ); } public List<Dog> getAllDogs() { System.out.println( "DogsDao.getAllDogs called" ); return null ; } } |
Собаки Сервис
Служба HAS-A DogsDao
. У класса обслуживания есть метод установки, конструктор без аргументов и параметризованный конструктор с соответствующими операторами печати.
Примечание: параметризованный конструктор аннотируется @Autowrired
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import com.amitph.spring.dogs.dao.DogsDao; import com.amitph.spring.dogs.repo.Dog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @Component public class DogsService { private DogsDao dao; public List<Dog> getDogs() { System.out.println( "DogsService.getDogs called" ); return dao.getAllDogs(); } public void setDao(DogsDao dao) { System.out.println( "DogsService setter called" ); this .dao = dao; } public DogsService(){ System.out.println( "DogsService no-arg constructor called" ); } @Autowired public DogsService(DogsDao dao) { System.out.println( "DogsService arg constructor called" ); this .dao = dao; } } |
Контроллер собак
Контроллер HAS-A DogsService
. Класс контроллера также имеет один установщик, конструктор без аргументов и параметризованный конструктор с соответствующими операторами печати.
Примечание: параметризованный конструктор аннотируется @Autowrired
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import com.amitph.spring.dogs.repo.Dog; import com.amitph.spring.dogs.service.DogsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping ( "/dogs" ) public class DogsController { private DogsService service; @GetMapping public List<Dog> getDogs() { return service.getDogs(); } public void setService(DogsService service) { System.out.println( "DogsController setter called" ); this .service = service; } public DogsController(){ System.out.println( "DogsController no-arg constructor called" ); } @Autowired public DogsController(DogsService service) { System.out.println( "DogsController arg constructor called" ); this .service = service; } } |
Запустите приложение
Когда мы запускаем приложение, мы должны видеть ниже журналы на консоли.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
2019 - 02 - 04 19 : 56 : 46.812 INFO 68906 --- [ main] com.amitph.spring.dogs.Application : Starting Application on Amitsofficemac.gateway with PID 68906 (/Users/aphaltankar/Workspace/personal/dog-service-jpa/out/production/classes started by aphaltankar in /Users/aphaltankar/Workspace/personal/dog-service-jpa) 2019 - 02 - 04 19 : 56 : 46.815 INFO 68906 --- [ main] com.amitph.spring.dogs.Application : No active profile set, falling back to default profiles: default 2019 - 02 - 04 19 : 56 : 47.379 INFO 68906 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. 2019 - 02 - 04 19 : 56 : 47.428 INFO 68906 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 45ms. Found 1 repository interfaces. 2019 - 02 - 04 19 : 56 : 47.682 INFO 68906 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$EnhancerBySpringCGLIB$86296a04] is not eligible for getting processed by all BeanPostProcessors ( for example: not eligible for auto-proxying) 2019 - 02 - 04 19 : 56 : 47.931 INFO 68906 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2019 - 02 - 04 19 : 56 : 47.944 INFO 68906 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019 - 02 - 04 19 : 56 : 47.944 INFO 68906 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/ 9.0 . 12 2019 - 02 - 04 19 : 56 : 47.949 INFO 68906 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/aphaltankar/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] 2019 - 02 - 04 19 : 56 : 48.021 INFO 68906 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019 - 02 - 04 19 : 56 : 48.021 INFO 68906 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1158 ms 2019 - 02 - 04 19 : 56 : 48.042 INFO 68906 --- [ main] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2019 - 02 - 04 19 : 56 : 48.045 INFO 68906 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.046 INFO 68906 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.046 INFO 68906 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.046 INFO 68906 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.136 INFO 68906 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool- 1 - Starting... 2019 - 02 - 04 19 : 56 : 48.230 INFO 68906 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool- 1 - Start completed. 2019 - 02 - 04 19 : 56 : 48.322 INFO 68906 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...] 2019 - 02 - 04 19 : 56 : 48.366 INFO 68906 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core { 5.3 . 7 .Final} 2019 - 02 - 04 19 : 56 : 48.366 INFO 68906 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found 2019 - 02 - 04 19 : 56 : 48.461 INFO 68906 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations { 5.0 . 4 .Final} 2019 - 02 - 04 19 : 56 : 48.546 INFO 68906 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect 2019 - 02 - 04 19 : 56 : 48.960 INFO 68906 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' DogsDao no-arg constructor called DogsService arg constructor called DogsController arg constructor called 2019 - 02 - 04 19 : 56 : 49.304 INFO 68906 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019 - 02 - 04 19 : 56 : 49.330 WARN 68906 --- [ main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default . Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2019 - 02 - 04 19 : 56 : 49.479 INFO 68906 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2019 - 02 - 04 19 : 56 : 49.482 INFO 68906 --- [ main] com.amitph.spring.dogs.Application : Started Application in 3.003 seconds (JVM running for 3.521 ) |
- Строка № 27: Как и ожидалось, вызывается конструктор без аргументов DAO.
- Строка # 28: параметризованный конструктор
DogsService
вызывается вместе с экземпляром DAO, созданным в строке # 27. - Строка № 29: параметризованный конструктор контроллера вызывается вместе с экземпляром службы, созданным в строке № 28.
Обратите внимание, что Spring не вызывал ни сеттеры, ни конструкторы без аргументов . Зависимости были введены исключительно с помощью конструкторов . Этот подход предпочтительнее, чем Spring Setter Injection и Field Injection in Spring .
Резюме
В этом руководстве «Пример внедрения зависимостей Spring» вы узнали, как на основе конструкторов работает внедрение зависимостей в приложении Spring . Мы также написали исполняемый код с помощью Constructor Injection.
Когда конструктор используется для установки переменных экземпляра на объектах, он называется «Внедрение в конструктор». Прежде чем углубляться в использование Spring Framework, важно понять разницу между внедрением сеттера и инжекцией поля против инжектора конструктора .
Удачного кодирования!
Смотрите оригинальную статью здесь: Spring Instructor Dependency Injection Пример Мнения, высказанные участниками Java Code Geeks, являются их собственными. |