前言
在上篇文章,我已经讲了Spring中最核心的知识点:IoC(控制反转)以及DI(依赖注入)。这篇文章,我将讲一下关于Spring框架中的其它比较琐碎但是又还是挺重要的知识点,因此,如果没有阅读过我上篇文章,建议先看一下,这会对阅读接下来的内容有着很好的帮助:【IoC控制反转】看完必定强大!立刻奏效!-CSDN博客
1.怎么理解狭义的Spring和广义的Spring?
狭义的Spring指的是Spring Framework本身,它包括核心容器、AOP(面向切面编程)、数据访问与集成、Web开发、测试、安全等模块。Spring Framework提供了许多功能和特性,例如依赖注入、面向切面编程、事务管理、数据访问、Web开发、集成测试等,使得开发者能够更加高效地构建可维护、可扩展的Java应用程序。
广义的Spring则是指整个Spring生态系统,它包括了Spring Framework以及其他与Spring相关的项目和工具。Spring生态系统涵盖了各种不同的领域,如Spring Boot、Spring Data、Spring Security、Spring Cloud等。这些项目和工具提供了更多的功能和扩展,使得开发者能够更轻松地构建分布式系统、微服务架构、云原生应用等。
2.XML管理Bean是啥东西?
XML管理对象(也称为XML管理Bean)是一种将对象的配置信息存储在XML文件中,并使用XML文件来创建和管理对象的方法。在这种模式下,XML文件用于定义对象的属性和配置,包括对象的类名、属性值、依赖关系等。XML文件可以被解析和读取,然后根据其中的配置信息创建相应的对象,并将对象的属性值设置为配置文件中指定的值。这种方式使得对象的创建和配置与代码的实现分离,提供了更大的灵活性和可配置性。
当涉及到XML管理对象(Bean)时,一个常见的例子是使用Spring Framework进行对象的配置和管理。我举一个例子,展示一下如何使用XML配置文件来定义和创建对象:
假设我们有一个名为"Person"的Java类,代表一个人的信息,包括姓名和年龄。我们将使用XML配置文件来管理"Person"对象。
首先,我们创建一个名为"beans.xml"的XML配置文件,内容如下:
在上述XML配置文件中,我们定义了一个名为"person"的Bean,它的类是"com.example.Person"。我们使用<property>
元素来设置对象的属性值,这里设置了"name"属性为"John Doe","age"属性为"30"。
接下来,我们可以编写Java代码来读取和使用这个XML配置文件。假设我们有一个名为"MainApp"的类:
在上述代码中,我们使用Spring的ClassPathXmlApplicationContext
类来加载XML配置文件,并创建一个应用程序上下文。通过调用getBean()
方法,我们可以从上下文中获取配置的对象。在这个例子中,我们获取了名为"person"的Bean,并使用它的方法打印姓名和年龄。
运行这个示例代码,它将读取"beans.xml"配置文件,并创建一个"Person"对象,输出姓名和年龄。
看到这里,相信你已经理解了XML管理Bean是啥东西了。不过很遗憾的是,XML管理对象的方式逐渐被更现代的配置和管理方式所取代,如注解驱动的配置、Java配置类等。这些方式提供了更简单、更灵活和更强大的配置和管理功能,例如Spring Framework中的注解配置和Java Config。所以,这里我们只是了解一下大概是怎么回事儿就好,不需要说刻意去记忆。
3.bean是什么?如何实例化bean?
当谈到Spring中的Bean时,可以将其比喻为餐厅的菜单和菜品。
在一家餐厅中,菜单是表示可供选择的菜品的列表,而每道菜品则是一个具体的实例。类比到Spring中,菜单可以看作是应用程序的配置文件或注解,它列出了可用的Bean定义,而每个具体的菜品则对应于由Spring容器实例化和管理的Bean。
在餐厅里,菜单上的每道菜品都有自己的特点和属性,例如名称、描述、价格等。类似地,在Spring中,每个Bean也有自己的属性和配置信息,例如类名、依赖关系、作用域等。
当顾客在餐厅点菜时,服务员会根据菜单上的信息来准备并提供相应的菜品。类似地,在Spring中,当应用程序启动时,Spring容器会根据配置文件或注解中的信息来实例化和配置Bean,并在需要时将它们提供给其他组件使用。
通过菜单,顾客可以选择自己喜欢的菜品,并根据自己的需求定制。类似地,在Spring中,开发人员可以根据应用程序的需求选择和配置自己需要的Bean,以实现功能的定制和灵活性。
那如何实例化bean呢?就像这样:
反正你其实只要大概知道一下我们经常说的bean是什么?看到类似这种代码知道是在干啥就好了。
4.能否举一个依赖注入的例子?
依赖注入有两种方法:构造函数注入和利用setter实现。下面我举一个构造函数注入的例子。为什么不举用setter实现的例子呢?因为我这篇文章只是让你简单了解一下依赖注入在代码中到底是怎么搞的,让你在脑海里有个印象,而且你不可能看了我一篇文章就直接可以徒手打出来吧哈哈。
例子如下:
假设我们有一个NBA球队管理系统,其中包含了以下几个关键组件:Team(球队)、Coach(教练)和Player(球员)。
在没有依赖注入的情况下,我们可能会在Team类中直接实例化Coach和Player,并在需要时直接调用它们的方法。就像这样:
在上述代码中,Team类直接依赖于Coach和Player,它在构造函数中创建了这两个对象的实例并使用它们。
然而,这种直接实例化的方式存在一些问题。首先,Team类与具体的Coach和Player类紧密耦合,难以进行单元测试和替换。其次,如果我们想在未来更改教练或球员的实例,需要修改Team类的代码。
通过使用依赖注入,我们就可以不修改Team的代码。我们可以将依赖的对象作为参数传递给Team类的构造函数或者通过setter方法注入。就像这样:
现在,Team类不再负责创建Coach和Player的实例,而是通过构造函数接收它们作为参数。这样,我们可以在应用程序的配置中注入具体的Coach和Player实例,实现了依赖的解耦。
例如,在Spring框架中,我们可以使用XML配置文件或注解来配置依赖注入。在配置文件中,我们可以指定具体的对象实例:
5.怎么理解注入集合对象?
还是举一个例子:
假设我们有一个NBA球队管理系统,其中球队需要管理一组球员(Players)。我们希望通过依赖注入来将球员集合注入到球队对象中。
首先,我们定义一个Player类表示球员:
然后,我们定义一个Team类表示球队,它依赖于一个Player集合。我们可以使用构造函数注入或者属性注入来实现集合对象的注入。
(1)使用构造函数注入集合对象:
在上述代码中,Team类通过构造函数接收一个Player集合作为参数,并将其赋值给类的属性。通过遍历集合对象,我们可以依次调用每个球员的play()方法。
(2)使用属性注入集合对象:
在上述代码中,Team类提供了一个setter方法来接收Player集合对象,并将其赋值给类的属性。通过调用setter方法,我们可以将集合对象注入到Team类中。
无论是构造函数注入还是属性注入,我们都可以在使用依赖注入框架(如Spring)时配置集合对象的注入。例如,在Spring框架中,我们可以使用XML配置文件或注解来配置集合对象的注入。
XML配置文件的示例:
通过上述配置,Spring容器会自动创建Player对象并注入到Team类的players属性中。
后记
对于SpringAOP编程以及Spring JDBC这两个知识点,请看下篇文章!
【面向切面编程AOP】从0开始学习Spring---AOP的相关知识(2)-CSDN博客