写点什么

Spring 之依赖注入

作者:andy
  • 2022-10-27
    北京
  • 本文字数:2351 字

    阅读完需:约 8 分钟

一、依赖注入(Dependency Injection)


依赖注入,也就是在 Spring 框架负责创建 Bean 对象时,动态的将依赖对象注入到 Bean 组件。依赖注入有三种方式:构造方法注入,setter 注入,基于注解的注入。

IoC 容器的初始化过程完成的主要工作是在 IoC 容器中建立 BeanDefinition 数据。在此过程中没有看到 IoC 容器对 Bean 依赖关系进行注入,接下来分析一下 IoC 容器是怎么样对 Bean 的依赖关系进行注入的。

假设 IoC 容器已经载入了用户定义的 Bean 信息。首先,注入到依赖注入的过程是“用户第一次向 IoC 容器索要 Bean”时,触发索要 Bean 的相关属性和方法的依赖注入。当然也有例外,也就是我们可以在 BeanDefinition 信息中通过控制 lazy-init 属性来让容器完成对 Bean 的预实例化。这个预实例化实际上也是一个完成依赖注入的过程,但它是在初始化的过程中完成的,稍后我们分析这个预实例化处理。



1、对象注入


setter,通过类中的 setter 方法进行依赖的注入。

构造器,通过类中的构造方法进行依赖的注入。

spring 容器通过 setter 方法注入实例化的对象,这也是为什么一定要提供 setter 方法,源于属性私有化。同时,对对象之间的依赖关系进行控制。在 applicationContext.xml 配置文件中体现为 bean 元素,单例对象注入成功后,可通过 id 对其进行调用。

通过对 applicationContext.xml 文件下的 bean 配置,对类对象进行属性赋值以及引用对象的传递。对于容器启动时即具有默认值的对象,进行属性配置,方便了程序开发,避免了 Java 硬编码问题。

范例:


	<bean id="user" class="org.fuys.own.vo.User">		<constructor-arg index="0" value="andy"/>		<constructor-arg index="1" ref="province"/>	</bean>	<bean id="province" class="org.fuys.own.vo.Province">		<property name="name" value="GuiZhou"/>		<property name="country" ref="country"/>	</bean>	<bean id="country" class="org.fuys.own.vo.Country">		<property name="name">			<value>china</value>		</property>	</bean>
复制代码


2、基于 annotation 的依赖注入(重点)


当需要定义的 bean 越来越多时,在 applicationContext.xml 文件里进行配置,显然已经不是一个合适的方式,所以,spring 提供了一个基于 annotation 的方式进行 bean 的注入和依赖关系传递。Java 代码亦可以进行初始值的设置,至于是采用配置文件进行初始值设置还是采用该方式,具体问题具体看。

applicationContext.xml 文件需要添加注解支持以及配置扫描目录。


<context:annotation-config/><context:component-scan base-package="org.fuys.own"/>
复制代码


spring 基于注解的常见注入类型:


【控制层】控制配置类:@Controller(org.springframework.stereotype.Controller)

【业务层】业务配置类:@Service(org.springframework.stereotype.Service)

【数据层】仓库配置类:@Repository(org.springframework.stereotype.Repository)

【工具组件】组件配置类:@Component(org.springframework.stereotype.Component)


需要注意的是,引用的对象名称分为两种情况(不可完全相信老李)

当首字母是大写,接下来的第二字母是小写,则对象名称是首字母小写的类名称,如 AopDemo 类,对象名称为 aopDemo;

当首字母是大写,接下来有多个大写字母,则对象名称就是类名称,如 AOPDemo 类,对象名称为 AOPDemo。


3、p 命名空间


spring 提供了 p 命名方式对配置进行了简化,实现一行大多多行的配置。

范例:

<bean id="order" class="org.fuys.own.vo.Order" p:orderId="***" p:user-ref="user"/>
复制代码


4、集合注入


诸如属性类(Properties)、数组(Array)和集合(List、Set、Map)而言,spring 也同样提供了强大注入支持。

范例:

<bean id="goods" class="org.fuys.own.vo.Goods">		<property name="name" value="iphone x"/>		<property name="information">			<map>				<entry>					<key><value>producer</value></key>					<value>GuangZhou factory</value>				</entry>			</map>		</property>		<property name="properties">			<props>				<prop key="price">7999.00</prop>			</props>		</property></bean>
复制代码


二、使用 Maven 搭建 Spring 开发项目


1、创建 Maven 项目


集成开发工具使用 eclipse。创建 Maven 项目的过程中,需要注意以下几点:

1.1、“Select an Archetype”选择“maven-archetype-webapp”模式

1.2、“Group Id”、“Artifact Id”、“Version”、“Package”可自行设置

1.3、修改 Maven 项目中的 Java 开发环境支持,“Java Build Path”下的“libraries”添加“JRE System Library”支持。同时,添加“Server Runtime”支持。

1.4、“Project Facets”选项下的“Dynamic Web Module”和“Java”修改最新的版本。其中,“Dynamic Web Module”的修改,需要先取消支持,进行更新保存。然后再重新选择最新版本进行应用保存,这样的修改才会起作用。


2、添加网站和 Spring 框架支持


2.1、添加 web.xml 文件至 WEB-INF 目录下

2.2、pom.xml 文件添加 spring 开发包支持,也包含公共基础的开发包,如 javaEE api、servlet api、jstl api 以及日志处理等。

2.3、添加 spring 核心配置文件 applicationContext.xml 至 src/main/resources/目录下。


建立好基础的项目配置后,便可以进行项目开发了。这里有个小小的建议。对于 spring 中的 applicationContext.xml 的 xml 元素命名规则验证,在网络环境下,可能因为网络阻塞导致无法通过互联网进行验证,所以,可以采用以下方式进行弥补。

1、下载 spring 相关的 xsd 文件;

2、关闭 xml 验证,【首选项】下的【Validation】取消 XML 规则验证;



图 取消 XML 验证


3、配置 XSD 文件


将 xsd 文件配置到项目里,【Preference】下的【XML】下【XML Catelog】,选择"User Specified Entries",进行添加,但需要注意 key type 要选择 Schema location。



图 XML Catalog



图 Add XML Catalog Element


4、重启 eclipse


重启 eclipse,即可使用


用户头像

andy

关注

还未添加个人签名 2019-11-21 加入

还未添加个人简介

评论

发布
暂无评论
Spring之依赖注入_andy_InfoQ写作社区