spring注入私有字段_Spring字段依赖注入示例

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?

读这个: Sprint Boot休息服务

想更多地了解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参数化的构造函数 。 还有一点要注意的是标记为@Autowired的字段是private

春天可以设置

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方法构造函数,而将精力放在业务方法上。

摘要

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

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

快乐编码!

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

spring注入私有字段

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

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

相关文章

简述html的3种列表uloldl,语义化HTML:ul、ol和dl

一、语义化元素1. ul标签W3C草案&#xff1a;The ul element represents an unordered list of items; that is, a list in which changing the order of the items would not change the meaning of list.语义化元素&#xff1a;表示包含一组无序列表项内容。在不同的浏览器默…

centos8 kernel source 安装_什么?你在物理机上安装Oracle总失败?那就试试Docker吧

写在前面有些小伙伴按照我写的《【Oracle】什么&#xff1f;作为DBA&#xff0c;你竟然不会安装Oracle&#xff1f;&#xff1f;》一文&#xff0c;在CentOS 8.0服务器上来安装Oracle&#xff0c;总是说&#xff1a;安装不成功&#xff01;但是我确实也是在CentOS 8.0服务器上安…

Maven的资源坐标

在 Maven 中&#xff0c;坐标是资源包的唯一标识&#xff0c;Maven 通过坐标在仓库中找到唯一的资源。 下面就是 javax.servlet-api-4.0.1.jar 的坐标&#xff1a; <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</…

starter_您是否尝试过MicroProfile Starter?

starterhttps://start.spring.io的SPRING INITIALIZR已经存在了一段时间&#xff0c;并且是引导新的Spring Boot应用程序的最佳方法。 到目前为止&#xff0c;即使不同的供应商为其实施提供了启动器&#xff0c;也没有类似的方式来引导新的MicroProfile项目。 但是等待已经结束…

html2image乱码问题,HtmlImageGenerator字体乱码问题解决、html2image放linux上乱码问题解决...

使用html2image-0.9.jar生成图片。在本地window系统正常&#xff0c;放到服务器linux系统时候中文乱码问题。英文可以&#xff0c;中文乱码应该就是字体问题了。一、首先需要在linux安装字体&#xff0c;simsun.ttc simsun.ttf simsunb.ttf1、新建目录/user/share/fonts/chine…

java每个阶段的学习时间_每个Java学习者都会犯的10个最常见的1个错误

java每个阶段的学习时间据说&#xff1a;“您的朋友会吞下您的错误&#xff0c;您的敌人会将它们呈现在盘子上”。 我绝对不是你的敌人&#xff0c;但我想向您介绍一些针对每个Java初学者的错误&#xff0c;我将在此博客“标牌”上就此做错。 当然只有其中一些&#xff0c;我是…

高速信号传输约翰逊 pdf_高速数字电路仿真设计与测试技术发展趋势综述 (一)...

近十多年来&#xff0c;数字集成电路和各种接口总线标准的发展令人眼花缭乱&#xff0c;目不暇接。各个总线标准通常由不同团队制订&#xff0c;其纷繁芜杂的测试和测量技术给从业人员带来许多困扰。本文将就当下的一些主要接口总线标准的仿真设计与测试技术发展趋势作一些简明…

Maven的继承

文章目录什么是继承&#xff1f;如何实现继承&#xff1f;什么是继承&#xff1f; 在聚合多个项目时&#xff0c;如果这些被聚合的项目中需要引入相同的Jar&#xff0c;那么可以将这些Jar写入父pom中&#xff0c;各个子项目继承该pom即可。 如何实现继承&#xff1f; 父pom配…

八中计算机是学啥的,北京八中:居然有这么好玩的课

北京八中&#xff1a;居然有这么好玩的课中国青年报北京12月13日电(记者堵力)种种“稀奇古怪”的科技知识纳入了北京八中学生们的正式课程。每周&#xff0c;所有的学生都会面对各种仪器&#xff0c;学习电台、电脑&#xff0c;以及兵器装备的知识等等———12月13日上午9&…

@builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

一.说明SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目…

web前端面试问答_Web服务面试问答

web前端面试问答在这篇文章中&#xff0c;我们涵盖了您需要熟悉的Web服务概念的几乎所有部分&#xff0c;以回答任何层级问题。 您还将在分类中找到最佳的Web服务面试问题和答案&#xff0c;因此只有在必要时才可以使用特定条款。 今天可以在各种编程平台上开发各种Web应用程序…

Maven项目的pom.xml文件详解

文章目录pom.xml文件解读标签 dependency 的解读pom.xml文件解读 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0http://maven.…

u盘装系统学计算机好,教你如何使用u盘做系统

电脑对人们来说是了越来越重要了&#xff0c;怎么说呢&#xff0c;不论是在工作中&#xff0c;还是小孩的学习都需要使用电脑&#xff0c;所以说人们是越来越离不开对电脑的使用了。不过&#xff0c;电脑毕竟是电子产品&#xff0c;所以免不了会出现一些故障问题&#xff0c;比…

使用junit进行单元测试_使用JUnit对ADF应用程序进行单元测试

使用junit进行单元测试JUnit是Java语言的单元测试软件包&#xff0c;由于ADF构建在J2EE框架之上&#xff0c;因此可以用于测试Oracle ADF应用程序。 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的过程。 在这里&#xff0c;我将说明如何在JDeveloper 12.2.1…

spring mvc是什么_狂神说SpringMVC01:什么是SpringMVC

狂神说SpringMVC系列连载课程&#xff0c;通俗易懂&#xff0c;基于Spring5版本(视频同步)&#xff0c;欢迎各位狂粉转发关注学习。未经作者授权&#xff0c;禁止转载1、回顾MVC1.1、什么是MVCMVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设…

Maven的settings.xml范本(含资源仓库镜像配置)

文章目录一、settings.xml 范本二、资源仓库镜像一、settings.xml 范本 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

java gradle构建_在Gradle中为JPMS构建Java 6-8库

java gradle构建通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS&#xff08; Java平台模块系统 &#xff09;的Java 6-8库。 介绍 如果您需要JPMS本身的介绍&#xff0c;请查看此概述 。 这篇文章主要针对Java库维护者。 任何此类维护人员都必须选择要针对…

tcppwebbrower 关闭安全警报_【知识】锅炉与压力容器安全

一、锅炉的主要安全附件1.安全阀安全阀属于泄压装置&#xff0c;能够自动将锅炉工作压力控制在允许范围之内。当炉内超压时&#xff0c;安全阀自动开启&#xff0c;自动泄压&#xff0c;同时发出警报&#xff1b;当炉内压力降到允许范围时&#xff0c;安全阀自动关闭。安全阀使…

macOS下查看Java/JDK的安装目录_查看Java/JDK的版本信息_配置环境变量JAVA_HOME

文章目录查看JDK的安装目录查看系统当前正在使用的 JDK 版本信息配置环境变量 JAVA_HOME查看JDK的安装目录 通常情况下&#xff0c;macOS安装JDK&#xff0c;默认是安装在 /Library/Java/JavaVirtualMachines 目录下。 使用 java_home 命令查看&#xff1a; [~]$ /usr/libex…

java_home命令详解

文章目录命令介绍命令选项说明帮助信息命令介绍 The java_home command returns a path suitable for setting the JAVA_HOME environment variable. It determines this path from the user’s preferred JVM based on configured environment variables. Additional constra…