Spring字段依赖注入示例

学习如何编写Spring Field Injection示例字段注入Spring框架 依赖注入的一种 。 在本教程中,我们将编写几个类,并看一看现场注入工程。

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

  • Spring Setter依赖注入示例
  • Spring构造函数依赖注入示例
  • Spring依赖注入–字段vs设置器vs构造函数注入
  • Spring依赖注入和控制反转

基于字段的依赖注入

在这种类型的依赖关系注入中,Spring将依赖关系直接分配给字段。 它不同于构造函数注入或基于Setter的依赖注入 。

有趣的是,即使字段是私有的,Spring也会注入依赖项。 Spring使用Java Reflections来做到这一点。 因此,许多专家称它为不安全。

字段注入可能是依赖注入的最简单(但有风险)形式。 为了更好地理解它,我们假设我们有一个正在运行的Spring Boot Service 。 它是一项虚拟服务,旨在了解现场注入。

不知道如何编写Spring Boot Rest Service?
读这个: Spring靴休息服务

想更多地了解Spring Framework?
读这个:

  • Spring框架介绍
  • Spring建筑
  • 春天@Autowired
  • Spring中的@Autowired注释

首先让我们编写DogsService类

狗服务

此类对DogsDao具有依赖关系。 用@Autowired注释参考变量。 有一个setter和两个构造函数 ,分别带有打印消息。

 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 { @Autowired 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" ); } public DogsService(DogsDao dao) { System.out.println( "DogsService arg constructor called" ); this .dao = dao; }  } 

狗的控制器

控制器对DogsService具有依赖性。 与服务类类似,将@Autowired批注添加到参考变量。 有带有打印消息的setter和构造函数。

 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 { @Autowired 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" ); } public DogsController(DogsService service) { System.out.println( "DogsController arg constructor called" ); this .service = service; }  } 

运行代码

 .  ____         _           __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \  ( ( )\___ | '_ | ' _| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::       (v2. 1.0 .RELEASE)  2019 - 02 - 05 06 : 34 : 14.956 INFO 69421 --- [          main] com.amitph.spring.dogs.Application      : Starting Application on Amits-office-mac.local with PID 69421 (/Users/aphaltankar/Workspace/personal/dog-service-jpa/out/production/classes started by aphaltankar in /Users/aphaltankar/Workspace/personal/dog-service-jpa)  2019 - 02 - 05 06 : 34 : 14.957 INFO 69421 --- [          main] com.amitph.spring.dogs.Application      : No active profile set, falling back to default profiles: default  2019 - 02 - 05 06 : 34 : 15.655 INFO 69421 --- [          main] .sdrcRepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.  2019 - 02 - 05 06 : 34 : 15.711 INFO 69421 --- [          main] .sdrcRepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50ms. Found --- [          main] .sdrcRepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50ms. Found 1 repository interfaces.  2019 - 02 - 05 06 : 34 : 16.013 INFO 69421 --- [          main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$EnhancerBySpringCGLIB$1cc57cd7] is not eligible for getting processed by all BeanPostProcessors ( for example: not eligible for auto-proxying)  2019 - 02 - 05 06 : 34 : 16.318 INFO 69421 --- [          main] osbwembedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)  2019 - 02 - 05 06 : 34 : 16.335 INFO 69421 --- [          main] o.apache.catalina.core.StandardService  : Starting service [Tomcat]  2019 - 02 - 05 06 : 34 : 16.335 INFO 69421 --- [          main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/ 9.0 . 12  2019 - 02 - 05 06 : 34 : 16.342 INFO 69421 --- [          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 - 05 06 : 34 : 16.429 INFO 69421 --- [          main] oaccC[Tomcat].[localhost].[/]      : Initializing Spring embedded WebApplicationContext  2019 - 02 - 05 06 : 34 : 16.429 INFO 69421 --- [          main] osweb.context.ContextLoader           : Root WebApplicationContext: initialization completed in 1419 ms  2019 - 02 - 05 06 : 34 : 16.454 INFO 69421 --- [          main] osbwservlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/]  2019 - 02 - 05 06 : 34 : 16.457 INFO 69421 --- [          main] osbwservlet.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]  2019 - 02 - 05 06 : 34 : 16.458 INFO 69421 --- [          main] osbwservlet.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]  2019 - 02 - 05 06 : 34 : 16.458 INFO 69421 --- [          main] osbwservlet.FilterRegistrationBean  : Mapping filter: 'formContentFilter' to: [/*]  2019 - 02 - 05 06 : 34 : 16.458 INFO 69421 --- [          main] osbwservlet.FilterRegistrationBean  : Mapping filter: 'requestContextFilter' to: [/*]  2019 - 02 - 05 06 : 34 : 16.581 INFO 69421 --- [          main] com.zaxxer.hikari.HikariDataSource      : HikariPool- 1 - Starting...  2019 - 02 - 05 06 : 34 : 16.702 INFO 69421 --- [          main] com.zaxxer.hikari.HikariDataSource      : HikariPool- 1 - Start completed.  2019 - 02 - 05 06 : 34 : 16.830 INFO 69421 --- [          main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...]  2019 - 02 - 05 06 : 34 : 16.906 INFO 69421 --- [          main] org.hibernate.Version                   : HHH000412: Hibernate Core { 5.3 . 7 .Final}  2019 - 02 - 05 06 : 34 : 16.907 INFO 69421 --- [          main] org.hibernate.cfg.Environment           : HHH000206: hibernate.properties not found  2019 - 02 - 05 06 : 34 : 17.059 INFO 69421 --- [          main] o.hibernate.annotations.common.Version  : HCANN000001: Hibernate Commons Annotations { 5.0 . 4 .Final}  2019 - 02 - 05 06 : 34 : 17.188 INFO 69421 --- [          main] org.hibernate.dialect.Dialect           : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect  2019 - 02 - 05 06 : 34 : 17.783 INFO 69421 --- [          main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'  DogsDao no-arg constructor called  DogsService no-arg constructor called  DogsController no-arg constructor called  2019 - 02 - 05 06 : 34 : 18.208 INFO 69421 --- [          main] ossconcurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'  2019 - 02 - 05 06 : 34 : 18.244 WARN 69421 --- [          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 - 05 06 : 34 : 18.420 INFO 69421 --- [          main] osbwembedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''  2019 - 02 - 05 06 : 34 : 18.422 INFO 69421 --- [          main] com.amitph.spring.dogs.Application      : Started Application in 3.878 seconds (JVM running for 4.57 ) 

所有三个无参数的控制器按顺序调用。 没有调用setter参数化的构造函数 。 需要注意的另一件事是这些字段,这些字段被标记为@Autowiredprivate

春天可以设置

Spring使用反射在对象上设置私有字段。 这听起来很有用,但另一方面,它也不安全。 现场注射,其安全性和实用性一直备受争议。 Spring不遵守对象访问规则。 现在,有些人可能会支持这种说法,或者说spring IoC容器管理所有对象,应该获得对这些对象的最高控制权。

 @Component  public class MyClass { @Autowired private DogsController controller; @Autowired private DogsService service; @Autowired private DogsDao dao; @Autowired private ApplicationProperties properties;  / business methods  } 

作为开发人员,我一直喜欢使用Field Injection,因为它真的很简单并且可读性更高。 您实际上可以避免编写setter方法构造函数,而将精力放在业务方法上。

摘要

您了解了Field InjectionSpring Dependency Injection的一种 ,并编写了几类来查看它的工作原理。 字段注入很简单,使类更具可读性。 但是,出于安全考虑,许多人讨厌它并避免使用它。

在接下来的部分中,我们将看到Setter注入Field注入Constructor注入 这三种方法之间的详细区别 。

快乐编码!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java8 新特性之流式数据处理_Java8新特性 - 集合流式编程 - 最终操作

2、数据源的获取2.1、数据源的简介数据源&#xff0c;顾名思义&#xff0c;既是流中的数据的来源。是集合的流式编程的第一步&#xff0c;将数据源中的数据读取到流中&#xff0c;进行处理。注意&#xff1a;将数据读取到流中进行处理的时候&#xff0c;与数据源中的数据没有关…

【渝粤教育】电大中专电大中专职业健康与安全考试考核试题作业 题库

试卷答案 1根据系统安全工程的观点&#xff0c;危险是指系统中存在导致发生不期望后果的可能性超过了&#xff08; &#xff09; A极限 B人们的承受程度 C危险度 D安全系数 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2对职工来说&#xff0c;安全是&#xff0…

java jdt_在JDT中使用Java 8 Lambda

java jdt旧 Curmudgeon 认识Smalltalk的Dude 在修改Eclipse Java开发工具 &#xff08;JDT&#xff09;项目正在开发的Java 8支持时&#xff0c;我一直在使用这种语言。 我承认我对Java 8中的lambda有点不满意。 当然&#xff0c;这来自于知道Smalltalk &#xff08;和LISP…

java 1.8签名apk_给Android的APK程序签名和重新签名的方法

签名工具的使用Android源码编译出来的signapk.jar既可给apk签名&#xff0c;也可给rom签名的。使用格式&#xff1a;java –jar signapk.jar [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar-w 是指对ROM签名时需使用的参数publickey.x509[.pem] 是公钥文件pri…

【渝粤教育】电大中专职业生涯规划 (3)作业 题库

1职业价值观具有明确的目的性、&#xff08; &#xff09;和坚定性的职业选择的态度和行为。 A自由性 B动机性 C自觉性 D制约性 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2不属于探索价值观方法的是&#xff08; &#xff09;。 A澄清反应法 B意见表决法 C间接…

使用Oracle验证外部数据

我经常在Corda Slack频道中闲逛&#xff0c;并尽可能回答问题。 我尝试回答的合理数量的问题与Oracle有关。 更具体地说&#xff0c;何时使用一个。 我觉得我可以回答&#xff0c;“当您需要验证可能经常更改的外部数据时使用Oracle”。 我可能在某个时候写了一个类似的答案。 …

【渝粤教育】电大中专药理学基础 (2)_1作业 题库

1.关于苯二氮卓类镇静催眠药的叙述&#xff0c;不正确的是&#xff08;&#xff09;。 A.长期应用不会产生依赖性和成瘾性 B.是目前最常用的镇静催眠药 C.可用于治疗小儿高热惊厥 D.临床上用于治疗焦虑症 E.可用于心脏电复律前给药 错误 正确答案&#xff1a;左边查询 学生答案…

【渝粤教育】电大中专计算机职业素养 (11)作业 题库

1.用冰山模型说明职业素养构成时&#xff0c;我们把浮在水面上面的知识、技能等部分称为&#xff08; &#xff09;的职业素养。 A.获得 B.显性 C.专业 D.隐性 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.职业素养的基本内容包括&#xff1a;职业道德、职业意…

java 2d 教程_Java 2D开发技巧之“灯光与阴影”

Java 2D开发技巧之“灯光与阴影”(2016-12-14 02:12:25)标签&#xff1a;杂谈一、 引言在本文中&#xff0c;我们将向你展示如何为扁平形状添加一种灯光效果以实现一种类3D外观。也许你比较满意于自己的文字表达能力&#xff0c;但一幅图片往往能够产生更好的效果。对于图形处理…

【渝粤教育】电大中专跨境电子商务理论与实务 (17)作业 题库

1.在按照交易主体类型中&#xff0c;&#xff08; &#xff09;面对的最终客户为企业或集团客户&#xff0c;提供企业、产品、服务等相关信息。 A.C2C跨境电商或平台 B.B2C跨境电商或平台 C.O2O跨境电商或平台 D.B2B跨境电商或平台 错误 正确答案&#xff1a;左边查询 学生答案…

jooq代码生成_将jOOQ与Spring结合使用:代码生成

jooq代码生成我们可能在本教程的第一部分中还记得jOOQ指出 jOOQ从您的数据库生成Java代码&#xff0c;并允许您通过其流畅的API构建类型安全SQL查询。 本教程的第一部分描述了如何配置使用jOOQ的Spring驱动的应用程序的应用程序上下文&#xff0c;但没有描述如何使用jOOQ创建类…

【渝粤题库】陕西师范大学151109财务报告分析 作业(高起专)

《财务分析》作业 一、单选题 1.以下哪个不属于杜邦分析法的优点&#xff08; &#xff09;。 2.以下哪个不是比率的具体表现形式&#xff08; &#xff09;。 3.根据财务报表的审计结果&#xff0c;具有较大可信度的审计意见类型是&#xff08; &#xff09;。 4.关于杠杆的…

【渝粤题库】陕西师范大学200131中国古代文论 作业(专升本)

《中国古代文论》作业 一、注明下列文献的作者及年代&#xff1a; 1、《典论论文》 2、《文选序》 3、《戏为六绝句》 5、《与元九书》 6、《送孟东野序》 7、《六一诗话》 8、《雪涛阁集序》 9、《文赋》 10、《诗品》 11、《诗品序》 12、《文心雕龙》 13、《沧浪诗话》 14、…

java连接到mysql_[操作系统]Java如何连接到MySQL数据库的

[操作系统]Java如何连接到MySQL数据库的0 2016-05-01 15:00:15下载&#xff1a;mysql-connector-java-5.1.38.tar.gzhttp://dev.mysql.com/downloads/connector/j/tar zxvfmysql-connector-java-5.1.38.tar.gz解压后zhouspubuntu:~/Downloads$cd ./mysql-connector-java-5.1.38…

Spark Run本地设计模式

现在&#xff0c;许多Spark应用程序已成为遗留应用程序&#xff0c;很难在本地进行增强&#xff0c;测试和运行。 Spark具有很好的测试支持&#xff0c;但仍有许多Spark应用程序不可测试。 当您尝试运行一些旧的Spark应用程序时&#xff0c;我将分享一个常见错误。 Exceptio…

【渝粤题库】陕西师范大学201771 中国古代文学(一) 作业

《中国古代文学&#xff08;一&#xff09;》作业 一、单选题&#xff08;共30小题&#xff0c;每题2分&#xff0c;共60分&#xff09; 1、先秦以“笔法”、“微言大义”著称于世的史书是&#xff08; &#xff09; A《尚书》 B《国语》 C《春秋》 D《战国策》 2、汉代“四家诗…

mave本地导入mysql的jar包_将本地的jar包引入到maven项目中

首先进入到maven的目录下&#xff0c;并且将要引入的jar包也放在这个目录下然后执行命令mvn install:install-file -DfilecheckDataAdapter-api.jar -DgroupIdorg.cegn.des -DartifactIdcheckDataAdapter-api -Dversion2.0 -Dpackagingjar等到success成功后&#xff0c;在maven…

【渝粤教育】广东开放大学 网页设计与制作 形成性考核 (25)

选择题 题目&#xff1a; 当链接指向下列哪一种文件时&#xff0c;不打开该文件&#xff0c;而是提供给浏览器下载&#xff1f;( ) 答案&#xff1a;看左侧 题目&#xff1a; 若要获得名为login的表单中名为txtuser的文本输入框的值&#xff0c;以下获取方法中&#xff0c;正…

mysql导入创建表空间_oracle创建表空间 导入数据库

oracle2 然后是创建表空间创建表空间需要创建两个一个临时表空间 一个表空间--创建表空间create tablespace abc datafile ‘D:\tablespce\LANDHIGH_SFTMS.dbf‘ size 500m;--创建用户并指定表空间create user admin identified by admin default tablespace abc quota 500m …

【渝粤教育】广东开放大学 软件工程 形成性考核 (50)

选择题 题目&#xff1a; 关于协作图的描述&#xff0c;下列哪个不正确&#xff08;&#xff09; 题目&#xff1a;多对象是UML哪个视图中的概念&#xff08; &#xff09;。 题目&#xff1a;在UML中&#xff0c;接口有几种表达方式&#xff08;&#xff09;。 题目&#xff1…