
在默认情况下,Spring项目启动时,会将bean都创建好放在IOC容器中,我们可以通过@Autowired注解将所需要的bean对象注入进来,其实也可以通过Spring给我们提供的这些方法主动从IOC容器中获取bean对象。那么如何从IOC容器中主动获取bean对象呢?
java">package com.gjw.springbootwebconfig2;import com.example.HeaderConfig;
import com.example.HeaderGenerator;
import com.example.HeaderParser;
import com.example.TokenParser;
import com.gjw.controller.DeptController;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;@SpringBootTest
class SpringbootWebConfig2ApplicationTests {@Autowiredprivate ApplicationContext applicationContext; // 获取IOC容器对象@Testvoid contextLoads() {}// 测试获取IOC容器中的bean对象的三种方法@Testvoid getBeanObjectTest() {// 1. 根据名称获取bean对象DeptController bean1 = (DeptController) applicationContext.getBean("deptController"); // 没有特别指定bean对象名称,默认类名小写 根据名称获取的默认为Object类型,要强转System.out.println(bean1);// 2. 根据类型获取bean对象DeptController bean2 = applicationContext.getBean(DeptController.class);System.out.println(bean2);// 3. 根据类型+名称获取bean对象DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);System.out.println(bean3);}
}
我们要想从IOC容器中主动获取bean对象,首先要拿到IOC容器,那么如何拿到IOC容器呢?我们可以使用@Autowired注入一个ApplicationContext类型的对象applicationContext,该对象就是一个IOC容器对象。这样就将IOC容器对象注入进来了。那么我们只需要调用applicationContext对象中的方法就可以获取到bean对象了。
1.根据bean的名称获取,使用getBean里面指定bean的名称,bean的名称默认类名首字母小写。根据名称获取获取的是一个Object类型的bean对象,要将其强转为DeptController类型。
2.根据bean的类型获取,使用getBean里面指定bean的类型。
3.根据类型+名称获取bean对象,使用getBean里面指定bean的名称和bean的类型。运行测试类拿到3次bean对象是同一个对象,地址一样,那也就是说默认的ioc容器中不同类型bean对象只有一个,是单例的。那么能不能每次拿到不同的bean对象呢?可以。涉及下一节bean的作用域。