NO.01 如何在Spring配置文件中获取Bean

目录

1、前言

1.1 IOC容器在Spring中的实现

1.2 ApplicationContext的主要实现类

 2、工作准备

2.1 创建Module工程配置以来信息

2.2 创建bean所对应的类

2.3 创建Spring的配置文件,命名为applicationContext

3、从IOC容器中获取Bean

3.1 根据id获取bean

3.2 根据类型获取bean

3.2.1 扩展

3.3 根据id和类型获取bean

4、测试类完整代码


1、前言

1.1 IOC容器在Spring中的实现

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:分别为BeanFactory和ApplicationContext。

  • BeanFactory 是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
  • ApplicationContext是BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext。

1.2 ApplicationContext的主要实现类

  • ClassPathXmlApplicationContext:通过读取类路径下的XML格式的配置文件创建IOC容器对象
  • FileSystemXmlApplicationContext 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容 器对象
  • ConfigurableApplicationContext ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、 关闭和刷新上下文的能力。
  • WebApplicationContext 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对 象,并将对象引入存入 ServletContext 域中。

以上四个接口的实现关系如下图所示: 

 2、工作准备

2.1 创建Module工程配置以来信息

在进行Bean的获取之前先创建一个Module工程,工程的打包方式为jar,在pom.xml文件中配置以下依赖:

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.20</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

2.2 创建bean所对应的类

创建HelloWorld类,之后在测试类中获取HelloWorld的Bean。HelloWorld类如下:

public class HelloWorld {
    public void SayHolleWorld(){
        System.out.println("Holle World!");
    }
}

2.3 创建Spring的配置文件,命名为applicationContext

bean的详细信息配置在bean标签中,首先配置一个bean标签配置文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="HelloWorldOne" class="com.review.spring.pojo.HelloWorld" ></bean>
</beans>

通过bean标签配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理, 通过bean标签配置IOC容器所管理的bean。

bean标签中的属性:

id:设置bean的唯一标识,通过id的value值获取指定的bean

class:设置bean所对应类型的全类名

3、从IOC容器中获取Bean

获取bean的方式有三种,分别为:根据id获取bean、根据类型获取bean、根据id和类型获取bean。以下演示三种获取bean的方式。

3.1 根据id获取bean

由于bean标签中的 id 属性指定了 bean 的唯一标识,所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。

以下是获取bean的演示:

    @Test
    public void getBeanById() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=(HelloWorld)ioc.getBean("HelloWorldOne");
        helloWorld.SayHolleWorld();
    }

3.2 根据类型获取bean

根据id获取容器需要进行类型转换,因此可以类型获取bean,从而省去类型转换的工作。

    @Test
    public void getBeanByType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean(HelloWorld.class);
        helloWorld.SayHolleWorld();
    }

 值得注意的是,当根据类型获取bean时,要求IOC容器中指定类型的bean有且只能有一个,当IOC容器中一共配置了两个bean时,如下

    <bean id="HelloWorldOne" class="com.review.spring.pojo.HelloWorld" ></bean>
    <bean id="HelloWorldTwo" class="com.review.spring.pojo.HelloWorld"></bean>

再根据类型获取bean时会抛出异常。

3.2.1 扩展

如果组件类实现了接口,可以根据接口类型获取 bean ,前提是bean唯一;如果一个接口有多个实现类,这些实现类都配置了bean,就不可以根据接口类型获取 bean。因此根据类型来获取bean时,在满足bean唯一性的前提下,看:『对象 instanceof 指定的类型』的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。

3.3 根据id和类型获取bean

根据id获取bean需要进行类型转换,根据类型获取bean要求Spring配置文件中一个类只能有一个bean。而根据id和类型获取bean可以解决以上两种方式的缺点。

    @Test
    public void getBeanByIdAndType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean("HelloWorldTwo",HelloWorld.class);
        helloWorld.SayHolleWorld();
    }

4、测试类完整代码

public class HelloWorldTest {

    @Test
    public void getBeanById() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=(HelloWorld)ioc.getBean("HelloWorldOne");
        helloWorld.SayHolleWorld();
    }
    @Test
    public void getBeanByType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean(HelloWorld.class);
        helloWorld.SayHolleWorld();
    }
    @Test
    public void getBeanByIdAndType() {
        //获取IOC容器
        ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloWorld=ioc.getBean("HelloWorldTwo",HelloWorld.class);
        helloWorld.SayHolleWorld();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值