2_Spring【IOC容器中获取组件Bean】

Spring中IOC容器中获取组件Bean

实体类

java 复制代码
//接口
public interface TestDemo {
    public void doSomething();
}
// 实现类
public class HappyComponent implements TestDemo {
    public void doSomething() {
        System.out.println("HappyComponent is doing something...");
    }
}

创建Bean配置文件

spring-03.xml

xml 复制代码
<?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">

<!--    组件信息做ioc配置 ->applicationContext读取->实例化对象-->
    <bean id="happyComponent" class="com.atguigu.ioc_03.HappyComponent"/>
</beans>

IOC容器中获取组件Bean

java 复制代码
    /**
     * 在IOC容器中获取组件Bean
     */
    @Test
    public void getBeanFormIocTest() {
//        1.创建IOC容器
        ClassPathXmlApplicationContext applicationContext1 = new ClassPathXmlApplicationContext();
        applicationContext1.setConfigLocations("spring-03.xml"); // 外部配置文件设置
        applicationContext1.refresh(); // 刷新容器 IOC、DI的动作
//        2.读取IOC容器的组件
//        方式一:直接根据BeanId获取 获取的是一个Object对象 需要强制转换[不推荐]
        HappyComponent happyComponent = (HappyComponent)applicationContext1.getBean("happyComponent");
//        方式二:根据BeanId和类型获取 获取的是一个指定类型的对象[推荐]
        HappyComponent happyComponent1 = applicationContext1.getBean("happyComponent", HappyComponent.class);
//        方式三:根据类型获取 获取的是一个指定类型的对象
//        TODO 根据bean的类型获取,同一个类型,在ioc容器中只能有一个bean!!!(如果ioc容器存在多个同类型的bean,会出现NoUniqueBeanDefinitionException[不唯一]异常)
        HappyComponent happyComponent2 = applicationContext1.getBean(HappyComponent.class);
//        3.使用组件
        happyComponent.doSomething();
        happyComponent1.doSomething();
        happyComponent2.doSomething();
        System.out.println(happyComponent == happyComponent1); // true
        System.out.println(happyComponent == happyComponent2); // true
//        4.IOC的bean配置一定是实现类,但是可以根据接口类型获取值
//        getBean(,类型) 其中的类型判断采用  instanceof ioc容器的类型 == true  (接口与实现类之间是true的关系)
//        在实际业界使用这种方式,可以将部分逻辑抽离出来,封装工具,只留接口作为对外暴露的api,继承自该接口的直接实现类可以直接使用
        TestDemo testDemo = applicationContext1.getBean("happyComponent", TestDemo.class);
        TestDemo testDemo1 = applicationContext1.getBean(TestDemo.class); // 这样更简洁但是要注意 bean中同一类型只能有一个!!!
        testDemo.doSomething(); // HappyComponent is doing something...
    }
相关推荐
野生风长5 小时前
c++类和对象(this指针,重载operator,习题总结)
java·开发语言·c++
霸道流氓气质5 小时前
基于 Spring 事务同步机制的事务后置动作收集器 Starter 实践
java·后端·spring
过期动态5 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
刘小八6 小时前
Spring AI Tool Calling 生产化:参数校验、权限控制与超时隔离
java·人工智能·spring
奶糖 肥晨6 小时前
一次Spring Boot编译报错排查:三元运算符与包装类型的“隐形陷阱”
java·spring boot·后端
谢栋_6 小时前
设计模式从入门到精通之(七)责任链模式
java·设计模式·责任链模式
愚公移码6 小时前
蓝凌EKP18产品:核心执行流程
java·流程引擎
VortMall6 小时前
全维度打磨细节体验,赋能商城稳定有序运营|VortMall 微服务商城 v1.3.11 版本发布
java·微服务·云原生·架构·商城系统·开源商城·vortmall
Tirzano6 小时前
java 精简使用ffmpeg
java·开发语言·ffmpeg
唐青枫6 小时前
Java Jersey 实战指南:用 JAX-RS 注解写清晰的 REST API
java