spring依赖注入_Spring依赖注入

spring依赖注入

介绍:

在设计良好的Java应用程序中,这些类应尽可能独立。 这样的设计提高了组件的可重用性。 它还使对各个组件进行单元测试变得更加容易。

依赖注入的概念促进了Java对象之间的松散耦合。

在本教程中,我们将讨论Spring框架中的依赖项注入。

控制反转(IoC):

控制反转是一种软件工程原理,将控制应用程序流的责任委托给框架。 为了使之成为可能, 框架使用抽象并依赖于运行时生成的对象图。

使用IoC原理有几个优点:

  • 使任务实现与执行分离
  • 模块是可插拔的,并且可以轻松替换为同等模块
  • 简化了模块化测试

通过使用策略设计模式,服务定位器模式或依赖注入,我们可以实现控制反转

依赖注入:

依赖注入是允许我们实现控制反转的设计模式之一

在传统的编程风格中,我们将类编写为:

public class Person {private Address address;public Person() {this.address = new Address();}...
}

使用依赖项注入时,我们不会自己创建对象而是注入它们。 然后,我们的Person类将类似于:

public class Person {private Address address;public Person(Address address) {this.address = address;}...
}

Spring的依赖注入:

Spring提供了一个IoC容器,该容器负责实例化,配置和管理Spring bean的生命周期。 在Spring中,任何POJO都称为Spring bean。

Spring ApplicationContext接口代表其IoC容器,我们有几个可用的实现类。 其中一些包括ClassPathXmlApplicationContextFileSystemXmlApplicationContextWebApplicationContext

让我们使用ClassPathXmlApplicationContext实例化Spring容器:

ApplicationContext appContext= new ClassPathXmlApplicationContext("applicationContext.xml");

在这里, applicationContext.xml是保存在运行时组装bean所需的元数据的文件。

Spring支持三种类型的依赖项注入:

1.基于构造函数的注入:

在基于构造函数的注入中,Spring将使用匹配的构造函数来解析和注入依赖性。

我们可以在applicationContext.xml中配置bean

<bean id="address" class="com.programmergirl.domain.Address"/><bean id="person" class="com.programmergirl.domain.Person"><constructor-arg ref="address"/>
</bean>

或者,我们可以在我们的applicationContext.xml中启用<component-scan />

<context:component-scan base-package="com.programmergirl.domain" />

启用组件扫描后,我们可以使用注释进行Spring配置。 我们的课程如下:

package com.programmergirl.domain;
@Component
public class Person {private Address address;@Autowiredpublic Person(Address address) {this.address = address;}
}package com.programmergirl.domain;
@Component
public class Address {...
}

默认情况下,Spring按其类型对bean进行接线。 如果有多个相同类型的bean,我们可以使用@Qualifier批注按其名称引用bean:

@Component
public class Person {private Address address;@Autowired@Qualifier("address1")public void setAddress(Address address) {this.address = address;}
}

假设我们有两个Address Bean – address1address2 ,我们的address1 Bean将在依赖关系解析时注入Person类。

2.二传手注射:

基于setter的依赖项注入是通过使用no-arg构造函数或no-argument静态工厂实例化bean之后,通过在bean上使用setter方法实现的。

我们可以使用XML将其配置为:

<bean id="address" class="com.programmergirl.domain.Address"/><bean id="person" class="com.programmergirl.domain.Person"><property name="address" ref="address"/>
</bean>

另一方面,使用注释时,我们将拥有:

@Component
public class Person {private Address address;...@Autowiredpublic void setAddress(Address address) {this.address = address;}}

3.基于属性的注入:

我们还可以使用类的字段或属性注入依赖项。 为此,我们可以简单地在字段上使用@Autowired批注:

@Component
public class Person {@Autowiredprivate Address address;...
}

考虑到我们正在使用基于注释的配置。

值得注意的要点:

根据Spring文档:

  • 我们应该使用构造函数注入来强制依赖
  • 基于Setter的注入应该用于本质上是可选的依赖项
  • Spring使用反射来注入字段注入的依赖项。 因此,基于现场的注入是一种成本更高的方法,我们应该避免使用它

结论:

在这篇快速文章中,我们讨论了什么是依赖注入。 我们还讨论了Spring框架中依赖项注入的类型。

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

spring依赖注入

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

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

相关文章

excel 时间戳_我没有Excel基础,可以学Power BI吗

当然可以&#xff01;没有Excel基础一样可以熟练掌握Power BI !Excel基础可以略微影响Power BI的上手速度&#xff0c;却不能决定最终对Power BI的运用能力。如果有Excel基础学习Power BI在最初阶段会更快&#xff0c;但经过实践证明&#xff0c;Excel基础对于PBI的学习进度影响…

Windows下查看wifi密码的命令

netsh wlan show profiles namewifi名称 keyclear

lemon geci_创建一个Java :: Geci生成器

lemon geci几天前&#xff0c;我写了有关Java :: Geci架构&#xff0c;代码生成原理以及生成Java源代码的可能不同方式的文章。 在本文中&#xff0c;我将讨论在Java :: Geci中创建生成器有多么简单。 您好&#xff0c;Wold生成器 HelloWorld1 最简单的生成器是Hello, World…

安卓 图像清晰度识别_OCR文字识别的功能及注意事项

首先OCR文字识别是指电子设备检查纸上打印的字符&#xff0c;然后用OCR文字识别技术翻译成计算机文字的过程&#xff1b;就是对文本资料进行扫描&#xff0c;然后对图像文件进行分析处理&#xff0c;获取文字及版面信息的过程。那么在日常生活中有很多公司有文字识别这方面需求…

薪资/薪水/金额的数据类型

MySQL 数据库中&#xff0c;金额字段使用的数据类型和长度建议为&#xff1a;decimal(11,2) 而对应的实体类的成员变量的数据类型建议为&#xff1a;BigDecimal

java中list去除空值_Java –从列表中删除所有空值

java中list去除空值介绍&#xff1a; 在本文中&#xff0c;我们将学习如何使用普通的Java&#xff0c;Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 。 所以&#xff0c;让我们开始吧&#xff01; 从Java中的 让我们探索从Java 列表中删除null的不同方法&#xf…

URI is not registered (Settings | Languages Frameworks | Schemas and DTDs)

参考&#xff1a; https://www.cnblogs.com/ttflove/p/6341469.html https://blog.csdn.net/c_learner_/article/details/107228678

无法识别的属性“targetframework”。请注意属性名称区分大小写。_神奇!你思考过计算机是怎么识别玻璃和透明物体的吗?...

真实场景中的镜面/玻璃检测和语义分割Charmve | English | Chinesehttps://github.com/Charmve/Mirror-Glass-Detection在这个项目中&#xff0c;我正在学习反射镜和玻璃检测/分段技术。镜子是反射表面&#xff0c;可以反射前面的场景&#xff0c;而玻璃是透明表面&#xff0c;…

Java中的out.write()和out.print()的区别

out 就是 PrintWriter 对象。 out.print() 有处理空值&#xff0c;如果传入的字符串为 null&#xff0c;则会转换为"null"字符串&#xff0c;print() 后续还是调用的 write() 方法&#xff0c;write() 传入的字符串不能为空。这个可以通过 PrintWriter 的源码中看到…

python if else用法_python列表推导式中使用if-else

今天在处理自动化邮件数据时碰到数据行中包含字符串后&#xff0c;从hive中拿到的整数型数据自动转化成了浮点数&#xff0c;严重影响美观性。因此想到了用列表推导式来做转化&#xff0c;将其中的数字型数据全部转化为整型&#xff0c;而字符型数据保留原样。 列表推导式总共有…

java使用:: 表达式_Java 12:开关表达式

java使用:: 表达式在Java 12中&#xff0c;对switch语句进行了增强&#xff0c;以便可以将其用作表达式。 现在也可以在一种情况下打开多个常量&#xff0c;从而使代码更简洁易读。 这些增强功能是一种预览语言功能 &#xff0c;这意味着必须使用--enable-preview标志在Java编译…

jsp中request.getAttributeNames()报红

缺少 servlet-api 依赖&#xff1a; <dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency>

fluent瞬态_Java中的瞬态关键字及其使用

fluent瞬态最近&#xff0c;我在一个朋友的一个研究项目中遇到了一个十字架&#xff0c;他们正在学习Java编程的基础知识&#xff0c;其中一些被遗忘的敏感信息打印在文本文件中&#xff0c;并记住了Java中的瞬时关键字。 Java中的瞬时关键字在安全性方面起着重要作用&#xf…

jsp中out.println()报红

需要引入 jsp-api&#xff1a; <dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2.1-b03</version> </dependency>

graphql 有必要吗_您准备好观看GraphQL了吗?

graphql 有必要吗在上一篇文章中&#xff0c;我们讨论了GraphQL与REST相比的优势。 在本文中&#xff0c;我们将看到GraphQL的实际应用。 我创建了一个示例应用程序来展示REST和GraphQL之间的差异。 首先&#xff0c;我们将看到简单产品细节端点的REST实现。 我已经使用Spring …

报错java.lang.NoClassDefFoundError: ognl/DefaultMemberAccess

不要使用新版的 ognl&#xff0c;从 3.2 开始&#xff0c;会报各种乱七八糟的错误。建议使用 3.1.x 版本的&#xff0c;例如下面的版本&#xff1a; <dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.1.15&l…

spring 注释_Spring核心注释

spring 注释介绍&#xff1a; org.springframework.beans.factory.annotation和org.springframework.context.annotation包中存在的Spring注释通常称为Spring Core注释。 我们可以将它们分为两大类&#xff1a;DI相关的注释和上下文配置注释&#xff1a; 在本教程中&#xff0…

Struts2 <s:debug/> 标签无法显示

首先&#xff0c;确保在 JSP 页面中引入 Struts2 的标签库&#xff1a; <% taglib uri"/struts-tags" prefix"s"%>在 Struts 2 项目中需要查看值栈&#xff08;Value Stack &#xff09;的内容&#xff0c;但是在 JSP 页面中添加了 <s:debug/&g…

JSTL/EL表达式/Struts2标签/OGNL表达式

文章目录JSTL EL表达式Struts 标签 OGNL表达式JSTL EL表达式 JSTL 只能用在 JSP 文件中&#xff0c;不可以在 XML 和 HTML 文件中使用&#xff0c;不可以用在 JS 语境中&#xff0c;不可以用在 Java 的语境中。在 JSP 文件中&#xff0c;JSTL 标签可以使用在 HTML 标签的属…

spring 注释_Spring @Value注释

spring 注释介绍&#xff1a; Spring Value批注用于将值注入变量和方法参数。 我们可以读取spring环境变量或系统变量。 它还支持SpEL。 在本快速教程中&#xff0c;我们将探讨如何使用Spring Value批注。 建立&#xff1a; 让我们首先在app.properties文件中定义一些属性&am…