Spring Setter依赖注入示例

学习如何编写Spring Setter依赖注入示例Setter注入Spring依赖注入的一种 。 Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的bean中。 本教程的范围仅限于Setter注入。

有关Spring依赖注入的更多信息:

考虑一下,我们有一个DogsService ,它是一个基于Spring的REST服务。

我们将编写一个DogsControllerDogsServiceDogsDao 。 这是一个不执行任何操作的虚拟服务。 这里的目的是了解Spring Dependency Injection如何与Setter方法一起使用。

不知道如何编写Spring Boot Rest Service?

阅读: Spring Boot Rest Service

想更多地了解Spring Framework?

读这个:

DogsDao.java

没有字段,因此没有依赖性。 我们添加了带有打印消息的无参数构造函数。

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 。 在下面的类中, setter方法用@Autowired注释。 为了查看Setter注入的工作方式,我们在setter方法中添加了一条print语句。 除了使用setter方法外,我们还添加了无参数构造函数和带有相应打印消息的参数化构造函数

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注释,并具有打印语句。 除了setter方法外,我们还添加了无参数参数化构造函数以及相应的打印消息。

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;
    }
}

应用启动

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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 ,最后是DogsController

让我们详细看看发生了什么。

  • 第36行:调用DogsDao无参数构造函数。
  • 第37行:调用DogsService无参数构造函数。 注意:参数化的构造函数永远不会被调用
  • 第38行:调用DogsService Setter。 注入DogsDao实例(在第36行创建)的位置。
  • 第39行:调用DogsController无参数构造函数。
  • 第40行:调用DogsController Setter方法。 DogsService实例(在第37行中创建)。

摘要

您学习了如何在Spring应用程序中编写Setter注入 。 如果使用Setter注入 ,则使用@Autowired注释setter方法。 Spring将首先使用无参数构造函数实例化Bean,然后调用setter方法来注入依赖项。

在接下来的教程中,我们将了解基于构造函数的注入是如何工作的。

翻译自: https://www.javacodegeeks.com/2019/02/spring-setter-dependency-injection-example.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值