Узнайте, как написать пример внедрения зависимостей Spring Setter . Инъекция сеттера является типом инжекции зависимостей пружины . Spring поддерживает Field Injection, Setter Injection, а также Constructor инъекцию для внедрения зависимостей в управляемый bean-компонент Spring. Сфера действия этого урока ограничена сеттерными инъекциями.
Подробнее о инъекции зависимостей весной:
- Пример инжекции зависимостей Spring Constructor
- Пример впрыска зависимостей пружинного поля
- Внедрение зависимостей Spring — Field vs Setter vs Constructor Injection
- Пружинная зависимость и инверсия управления
Предположим , у нас есть DogsService , который является службой REST на основе Spring.
Мы напишем DogsController
, DogsService
и DogsDao
. Это фиктивная служба, которая ничего не делает. Здесь мы рассмотрим, как Spring Inpendency Injection работает с методами Setter.
Не знаете, как написать Spring Boot Rest Service?
Читать это: Spring Boot Rest Service
Хотите узнать больше о Spring Framework?
Прочитай это:
- Введение в Spring Framework
- Spring Framework Архитектура
- Пружинная зависимость и инверсия управления
- Spring Boot Rest Service
DogsDao.java
Там нет полей, следовательно, нет зависимости. Мы добавили конструктор без аргументов с сообщением печати.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package com.amitph.spring.dogs.dao; 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 ; } } |
DogsService.java
DogsService
зависит от DogsDao
. В приведенном ниже классе метод установки имеет @Autowired
. Чтобы увидеть, как работает Setter Injection, мы добавили оператор print в метод setter . Наряду с методом установки, мы также добавили конструктор без аргументов и параметризованный конструктор с соответствующими сообщениями печати.
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
|
package com.amitph.spring.dogs.service; 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(); } @Autowired public void setDao(DogsDao dao) { System.out.println( "DogsService setter called" ); this .dao = dao; } public DogsService(){ System.out.println( "DogsService no-arg constructor called" ); } public DogsService(DogsDao dao) { System.out.println( "DogsService arg constructor called" ); this .dao = dao; } } |
DogsController.java
DogsController
зависит от DogsService
. @Autowired
и имеет оператор печати. Наряду с методом установки мы также добавили конструктор без аргументов и параметризованный конструктор вместе с соответствующими сообщениями печати.
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
|
package com.amitph.spring.dogs.web; 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(); } @Autowired public void setService(DogsService service) { System.out.println( "DogsController setter 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
34
35
36
37
38
39
40
41
42
43
44
|
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | ' _| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/= /_/_/_/ :: Spring Boot :: (v2.1.0.RELEASE) 2019-02-04 19:06:17.058 INFO 68545 --- [ main] com.amitph.spring.dogs.Application : Starting Application on Amitsofficemac.gateway with PID 68545 ( /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:06:17.061 INFO 68545 --- [ main] com.amitph.spring.dogs.Application : No active profile set , falling back to default profiles: default 2019-02-04 19:06:17.670 INFO 68545 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. 2019-02-04 19:06:17.724 INFO 68545 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 48ms. Found 1 repository interfaces. 2019-02-04 19:06:17.992 INFO 68545 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$4a5366ed] is not eligible for getting processed by all BeanPostProcessors ( for example: not eligible for auto-proxying) 2019-02-04 19:06:18.225 INFO 68545 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2019-02-04 19:06:18.237 INFO 68545 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019-02-04 19:06:18.237 INFO 68545 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat /9 .0.12 2019-02-04 19:06:18.242 INFO 68545 --- [ 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:06:18.315 INFO 68545 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019-02-04 19:06:18.315 INFO 68545 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1205 ms 2019-02-04 19:06:18.339 INFO 68545 --- [ main] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2019-02-04 19:06:18.342 INFO 68545 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2019-02-04 19:06:18.342 INFO 68545 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2019-02-04 19:06:18.342 INFO 68545 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] 2019-02-04 19:06:18.342 INFO 68545 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2019-02-04 19:06:18.434 INFO 68545 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2019-02-04 19:06:18.524 INFO 68545 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2019-02-04 19:06:18.645 INFO 68545 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...] 2019-02-04 19:06:18.690 INFO 68545 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {5.3.7.Final} 2019-02-04 19:06:18.691 INFO 68545 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found 2019-02-04 19:06:18.779 INFO 68545 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.4.Final} 2019-02-04 19:06:18.868 INFO 68545 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect 2019-02-04 19:06:19.279 INFO 68545 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' DogsDao no-arg constructor called DogsService no-arg constructor called DogsService setter called DogsController no-arg constructor called DogsController setter called 2019-02-04 19:06:19.650 INFO 68545 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019-02-04 19:06:19.681 WARN 68545 --- [ 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:06:19.856 INFO 68545 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2019-02-04 19:06:19.859 INFO 68545 --- [ main] com.amitph.spring.dogs.Application : Started Application in 3.138 seconds (JVM running for 3.647) |
Здесь произошло то, что Spring сначала попытался создать экземпляр DogsController
и нашел зависимость от DogsService
. Следовательно, это пошло на создание экземпляра DogsService
, который, в свою очередь, имеет зависимость от DogsDao
. Следовательно, DogsDao
будет создан экземпляр DogsService
, затем DogsService
и, наконец, DogsController
.
Посмотрим, что получилось подробно.
- Строка # 36:
DogsDao
конструктор без аргументовDogsDao
. - Строка № 37:
DogsService
конструктор без аргументовDogsService
. Примечание: параметризованный конструктор никогда не вызывался . - Строка № 38:
DogsService
. ГдеDogsDao
экземплярDogsDao
(созданный в строке # 36). - Строка № 39:
DogsController
конструктор без аргументовDogsController
. - Строка № 40:
DogsController
. ЭкземплярDogsService
(созданный в строке # 37) внедряется.
Резюме
Вы узнали, как написать инъекцию сеттера в приложении Spring . В случае инъекции сеттера методы сеттера аннотируются с помощью @Autowired
. Spring сначала использует конструктор без аргументов для создания экземпляра bean-компонента, а затем вызывает методы- установщики для внедрения зависимостей.
В следующем уроке мы увидим, как работает Constructor Based Injection .
См. Оригинальную статью здесь: Пример внедрения зависимостей Spring Setter Мнения, высказанные участниками Java Code Geeks, являются их собственными. |