Статьи

Пример впрыска зависимостей пружинного установщика

Узнайте, как написать пример внедрения зависимостей Spring Setter . Инъекция сеттера является типом инжекции зависимостей пружины . Spring поддерживает Field Injection, Setter Injection, а также Constructor инъекцию для внедрения зависимостей в управляемый bean-компонент Spring. Сфера действия этого урока ограничена сеттерными инъекциями.

Подробнее о инъекции зависимостей весной:

Предположим , у нас есть DogsService , который является службой REST на основе Spring.

Мы напишем DogsController , DogsService и DogsDao . Это фиктивная служба, которая ничего не делает. Здесь мы рассмотрим, как Spring Inpendency Injection работает с методами Setter.

Не знаете, как написать Spring Boot Rest Service?

Читать это: Spring Boot Rest Service

Хотите узнать больше о Spring Framework?

Прочитай это:

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, являются их собственными.