spring 构造函数注入_Spring构造函数依赖注入示例
spring 构造函数注入
欢迎使用Spring构造函数依赖注入示例指南。 基于构造器的依赖注入是Spring 依赖注入的一种 。 依赖注入的另一种类型是Setter注入和字段注入。
有关Spring依赖注入的更多信息:
- Spring二传手注射的例子
- Spring田间注入
- 依赖注入–构造函数与现场注入
- 依赖注入和控制反转
基于构造函数的依赖注入
它是Spring Dependency Injection的一种 ,其中对象的构造函数用于注入依赖项。 这种注入方式比较安全,因为如果不存在依赖项或无法解决依赖项,则不会创建对象。
要理解, 基于构造函数的依赖注入在Spring中是如何工作的-显然-我们需要一个Spring应用程序。 考虑一下,我们有一个非常简单的Spring应用程序,称为DogsService ,这是一个虚拟服务。
不知道如何编写Spring Boot Rest Service?
阅读: Spring Boot Rest Service
想更多地了解Spring Framework?
读这个:
- Spring框架介绍
- Spring框架架构
- Spring Bean–单例与原型
- Spring自动布线
狗狗
DAO类没有任何依赖关系。 我们在print语句中添加了无参数构造函数。
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
。 服务类具有setter方法, 无参数构造函数和带有相应打印语句的参数化构造函数 。
注意:参数化的构造函数以@Autowrired
注释。
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
注释。
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; } }
运行应用程序
启动应用程序时,我们应该在控制台上看到以下日志。
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] .sdrcRepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. 2019 - 02 - 04 19 : 56 : 47.428 INFO 68906 --- [ main] .sdrcRepositoryConfigurationDelegate : Finished Spring Data repository scanning in 45ms. Found --- [ main] .sdrcRepositoryConfigurationDelegate : 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] osbwembedded.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] oacatalina.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] oaccC[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019 - 02 - 04 19 : 56 : 48.021 INFO 68906 --- [ main] osweb.context.ContextLoader : Root WebApplicationContext: initialization completed in 1158 ms 2019 - 02 - 04 19 : 56 : 48.042 INFO 68906 --- [ main] osbwservlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2019 - 02 - 04 19 : 56 : 48.045 INFO 68906 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.046 INFO 68906 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.046 INFO 68906 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] 2019 - 02 - 04 19 : 56 : 48.046 INFO 68906 --- [ main] osbwservlet.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] ossconcurrent.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 . Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable . 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] osbwembedded.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
的参数化构造函数,DogsService
在第27行创建了DAO实例。 - 第29行:调用控制器的参数化构造函数,并在第28行创建一个服务实例。
请注意,Spring 不会调用设置器和无参数构造器 。 依赖项是通过 构造函数 纯粹注入的 。 此方法优于Spring中的Spring Setter注入和Field注入 。
摘要
在这个Spring构造函数依赖注入示例指南中,您学习了基于构造函数的依赖注入在Spring应用程序中如何工作。 我们还使用构造函数注入编写了可执行代码。
当构造函数用于在对象上设置实例变量时,称为构造函数注入。 在深入使用Spring Framework之前,重要的是要了解Setter注入与字段注入与构造函数注入之间的区别 。
快乐编码!
翻译自: https://www.javacodegeeks.com/2019/02/spring-constructor-dependency-injection-example.html
spring 构造函数注入
spring 构造函数注入_Spring构造函数依赖注入示例相关推荐
- Spring构造函数依赖注入示例
欢迎使用Spring构造函数依赖注入示例指南. 基于构造器的依赖注入是Spring 依赖注入的一种 . 依赖注入的另一种类型是Setter注入和字段注入. 有关Spring依赖注入的更多信息: Spr ...
- 梦想成现实:用xUnit.net在单元测试中实现构造函数依赖注入
英文关键词:Constructor Dependency Injection and Unit Testing(为了方便英文搜索) 自从博客园开发团队将开发架构迁移至DDD(领域驱动开发),就开始正式 ...
- spring依赖注入_Spring的依赖注入陷阱
spring依赖注入 Spring框架中有三种注入变量: 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法. 例如现场注入: @Aut ...
- java什么是依赖注入_spring的依赖注入是什么意思
最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...
- spring学习(34):构造函数依赖注入
目录结构 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- spring学习(25):通过构造函数依赖注入
目录结构 pox.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- spring注入私有字段_Spring字段依赖注入示例
spring注入私有字段 了解如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关S ...
- spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
spring 构造函数注入 欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们 ...
- 来谈谈Spring构造函数注入的循环依赖问题
作者:服务端开发 blog.csdn.net/u010013573/article/details/90573901 一.循环依赖 spring的循环依赖主要是指两个类相互之间通过@Autowired ...
最新文章
- 如何使用HTML5 Canvas元素来裁剪图像
- codeforces 拼手速题2
- 一张图一个表——CSS选择器总结
- OpenCV--SIFT算法检测特征点
- xampp中apache点击启动失败解决方法
- 平时上机练习的注意点(NOIP2019)
- Linux ALSA驱动框架(一)--ALSA架构简介--声卡的创建
- 网页视频之win7下无法升级到最新的IE11
- 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
- 无损检测技术知识大全
- http和https协议下,http可以正常下载,但是https却不能
- 批量管理微信社群,社群助手
- jclasslib安装
- 一文看懂主流区块链攻击底层逻辑 | 博文精选
- 线性与非线性规划:可行方向法
- GitHub创建仓库
- VFP表单返回对像、数组、值,这个细节要注意,防止崩溃
- 什么是对象?对象的属性和存储又是什么?
- Python的特点及数据的存储单位(¥4)
- 舵机分类和控制原理简述(180°模拟电机)SG90 MG996R
热门文章
- 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master
- [AtCoder Educational DP Contest] V - Subtree(树形dp + 前缀积/后缀积)
- 染色(树链剖分 洛谷-P2486)
- AT2370-[AGC013D]Piling Up【dp】
- P3750-[六省联考2017]分手是祝愿【期望dp】
- jzoj6311-Mobitel【dp,整除分块】
- P3402-[模板]可持久化并查集【主席树】
- P2513-[HAOI2009]逆序对数列【dp,前缀和】
- POJ1015-Jury Compromise【01背包,dp】
- 【枚举】LAGNO(jzoj 1149)