| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring IOC笔记——DI(依赖注入)的使用详解 -> 正文阅读 |
|
[Java知识库]Spring IOC笔记——DI(依赖注入)的使用详解 |
😎前言内容主要参考自《Spring实战》一书和尚硅谷-Spring5框架最新版教程,算是读书笔记或是原书的补充。 本文主要涉及IOC的部分,依照书中内容以及个人理解对Spring IOC容器进行了总结 😎IOC🍉什么是IOC?Spring IOC,我们又通常将其称为 IOC 容器,IOC 的2个实现方式分别为 依赖注入(DI)和 依赖查找(DL)。由于依赖查找(DL)使用的很少,因此 IOC 也被叫做依赖注入。 🍉IOC 底层原理xml 解析、工厂模式、反射 🍉Spring 提供 IOC 容器实现两种方式:Spring容器并不是只有一个。Spring自带了多个容器实现,可以归为两种不同的类型。 bean 工厂(由org.springframework.beans. factory.beanFactory接口定义) 是最简单的容器,提供基本的DI支持。 是 Spring 内部的使用接口,不提供开发人员进行使用 注:加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象 应用上下文(由org.springframework.context.Applicationcontext 接口定义) 基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。一般由开发人员进行使用 注:加载配置文件时候就会把在配置文件对象进行创建
🍉使用应用上下文Spring自带了多种类型的应用上下文。下面罗列的几个是最有可能遇到的。
😎装配beanSpring具有非常大的灵活性,它提供了三种主要的装配机制:
🍉自动化装配 beanSpring从两个角度来实现自动化装配:
为了阐述组件扫描和装配,我们使用在mvc三层架构中使用的service层调用dao层的例子来说明 在装配bean之前,需要先创建可发现的bean 🍑创建可发现的bean在传统的mvv架构中,我们是通过new的方式创建service层对象(bean),在使用spring后,只需通过一个注解即可实现对象的创建 创建User的service层接口以及实现类,如下
下面列出Spring 针对 Bean 管理中创建对象提供的注解
注:上面四个注解功能是一样的,只是起到标识作用,都可以用来创建 bean 实例 🌟为组件扫描的bean命名Spring应用上下文中所有的bean都会给定一个默认的ID。也就是将类名的第一个字母变为小写。 如果想为这个bean设置不同的ID,有以下两种方式
在创建bean的注解上添加value属性来为bean设置id
使用@Named注解来为bean设置id
Spring支持将 🌟设置组件扫描的基础包组件扫描默认是不启用的。我们还需要显式配置一下 Spring,从而命令它去寻找带有 开启组件扫描有以下两种方式
基于Java的配置
ok,到这里就可以来测试bean是否已创建,由于我们使用的是Java配置类,因此可以使用
下面来详细说下@ComponentScan注解的使用 若没有为@ComponentScan 设置任何属性,则它会以配置类所在的包作为基础包(base package)来扫描组件。
如果你想更加清晰地表明你所设置的是基础包,那么你可以通过basePackages属性进行配置:
basePackages属性使用的是复数形式。因此还可以设置多个基础包,只需要将basePackages属性设置为要扫描包的一个数组即可:
在上面的例子中,所设置的基础包是以string类型表示的。我认为这是可以的,但这种方法是类型不安全的。如果你重构代码的话,那么所指定的基础包可能就会被修改,因此会出现错误。可以通过下面的方法来解决 除了将包设置为简单的String类型之外,@ComponentScan还提供了另外一种方法,那就是将其指定为包中所包含的类或接口,可以使用basePackageClasses属性来实现
基于xml的配置
可以使用 现在测试基于xml的配置是否同样可以创建bean,由于使用的xml配置,因此可以使用
🍑通过为bean添加注解实现自动装配简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他 bean。为了声明要进行自动装配,我们可以通过以下五种注解实现
🌟Spring IOC容器中bean的两种注入方式在spring ioc可以通过两种方式注入,如下
由于两种注入方式是类似的,所以下面在前面例子的基础上测试 set 方法进行注入 使用 set 方法进行注入 创建User的dao层接口以及实现类
@Autowired:根据属性类型进行自动装配
在set方法上添加了 @Qualifier:根据名称进行注入
@Resource:可以根据类型注入,可以根据名称注入
补充:其实自动装配的注解可以直接使用在属性上,因为它对set方法进行了封装 🍉通过Java代码装配bean尽管在很多场景下通过组件扫描和自动装配实现Spring 的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加 在这种情况下,我们可以采用显式装配的方式。 🍑创建配置类在前面的程序中,我们第一次见识到JavaConfig,它使用了 但是在这里我们关注的是显示装配,因此需要把
下面介绍如何在JavaConfig中声明bean来替换 🍑声明简单的bean要在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加
默认情况下,bean的ID与带有@Bean注解的方法名是一样的,即userDao。如果你想为其设置成一个不同的名字的话,也可以通过 🍑借助JavaConfig实现注入同样地,在JavaConfig 中装配bean的也有两种方式:set方法注入,构造器注入,下面分别演示 构造器注入
看起来, set方法注入 🍉通过XML装配bean到此为止,我们已经看到了如何让Spring自动发现和装配 bean,还看到了如何进行手动干预,即通过JavaConfig 显式地装配bean。但是,在装配 bean 的时候,还有一种可选方案,即XML配置 不过,我不推荐使用XML,因为Spring 现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了。 但是,鉴于已经存在那么多基于XML的Spring 配置,所以理解如何在 Spring中使用XML还是很重要的,用来帮助你维护已有的XML配置,在完成新的Spring工作时,希望你会使用自动化配置和 JavaConfig. 🍑创建XML配置规范在使用XML 为Spring 装配 bean之前,你需要创建一个新的配置规范。在使用JavaConfig的时候,这意味着要创建一个带有@Configuration注解的类,而在XML配置中,这意味着要创建一个XML文件 最简单的spring xml配置如下 在配置文件的顶部声明多个 用来装配 bean的最基本的XML元素包含在 🍑声明一个简单的<bean>要在基于XML的Spring 配置中声明一个bean,我们要使用spring-beans模式中的另外一个元素:
这里声明了一个很简单的bean,创建这个bean的类通过class属性来指定的,并且要使用全限定的类名。 因为没有明确给定ID,所以这个bean将会根据全限定类名来进行命名。在这里,bean的ID将会是“scom.zhuo.spring5.dao.impl.UserDaoImpl#0”。 其中,“#O”是一个计数的形式,用来区分相同类型的其他bean。如果你声明了另外一个UserDaoImpl,并且没有明确进行标识,那么它自动得到的ID将会是“scom.zhuo.spring5.dao.impl.UserDaoImpl#1”。 如果你想给bean命名,可以借助<bean>的id属性
在 bean 元素中有很多属性,下面介绍常用的属性
注:创建对象时候,默认也是执行无参数构造方法完成对象创建 🍑借助构造器注入初始化 bean在XML 中通过构造器声明DI时,有两种基本的配置方案可供选择
🌟<constructor-arg>元素通过<constructor-arg>在构造器注入 bean引用 当Spring遇到这个<bean>元素时,它会创建一个UserService实例。 通过<constructor-arg>在构造器注入字面量 迄今为止,我们所做的DI通常指的都是类型的装配——也就是将对象的引用装配到依赖于它们的其他对象之中——-而有时候,我们需要做的只是用一个字面量值来配置对象。为了阐述这一点,我们需要要创建Order类如下所示:
在 spring xml配置文件中进行配置
我们再次使用元素进行构造器参数的注入。但是这次我们没有使用“ref”属性来引用其他的bean,而是使用了value属性,通过该属性表明给定的值要以字面量的形式注入到构造器之中。 通过<constructor-arg>在构造器注入null值 通过<constructor-arg>在构造器注入集合 在构造器中可以注入包含字面量或引用的集合,下面以list举例 创建Course类,定义String类型属性,生成对应构造器方法
创建Student类,定义list、set 类型属性,生成对应构造器方法
在 spring xml配置文件中进行配置 与之类似,我们也可以使用 🌟c-命名空间c-命名空间是在 Spring 3.0中引入的,它是在 XML中更为简洁地描述构造器参数的方式。要使用它的话,必须要在XML的顶部声明其模式,如下所示: 通过c-命名空间在构造器注入 bean引用 c-命名空间有两种方式注入属性 通过构造器参数注入 下图描述了这个属性名是如何组合的 通过构造器参数索引注入 参数的名称替换成了“0”,也就是参数的索引。因为在XML中不允许数字作为属性的第一个字符,因此必须要添加一个下画线作为前缀。 通过c-命名空间在构造器注入字面量 可以看到,装配字面量与装配引用的区别在于属性名中去掉了“-ref”后缀。 🍑借助set方法注入初始化 bean在XML 中通过set方法声明DI时,有两种基本的配置方案可供选择
🌟<property>元素<property>元素为属性的Setter方法所提供的功能与<constructor-arg>元素为构造器所提供的功能是一样的 在Course类和Student类中提供属性的set方法 在 spring xml配置文件中进行配置 🌟p-命名空间Spring 提供了更加简洁的p-命名空间,作为<property>元素的替代方案。为了启用p-命名空间,必须要在 XML文件中与其他的命名空间一起对其进行声明:
但需要注意的是,我们不能使用p-命名空间来装配集合,没有便利的方式使用 p-命名空间来指定一个值(或bean引用)的列表。但是,我们可以使用Spring util-命名空间中的一些功能来简化集合的注入 🌟util-命名空间首先,需要在XML中声明util-命名空间及其模式:
<util:list>只是util-命名空间中的多个元素之一。下表列出了util-命名空间提供的所有元素。
😎总结在本文中,我们看到了在Spring中装配 bean的三种主要方式:自动化配置、基于Java的显式配置以及基于XML的显式配置。不管你采用什么方式,这些技术都描述了Spring应用中的组件以及这些组件之间的关系。 我同时建议尽可能使用自动化配置,以避免显式配置所带来的维护成本。但是,如果你确实需要显式配置Spring 的话,应该优先选择基于Java的配置,它比基于XML 的配置更加强大、类型安全并且易于重构。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 12:39:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |