Узнайте, как написать пример внедрения зависимостей 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; @Componentpublic 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; @Componentpublic 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: default2019-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.122019-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 WebApplicationContext2019-02-04 19:06:18.315 INFO 68545 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1205 ms2019-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 found2019-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.MySQL5InnoDBDialect2019-02-04 19:06:19.279 INFO 68545 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'DogsDao no-arg constructor calledDogsService no-arg constructor calledDogsService setter calledDogsController no-arg constructor calledDogsController setter called2019-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 warning2019-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, являются их собственными. |