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...
}