在Spring IoC容器中获取Bean可以通过以下几种方式:
1、context.getBean(Class<T> requiredType):根据类型获取Bean。其中:
- requiredType为要获取bean的类型
- 如果容器中有多个实现该类型的Bean,但是没有配置优先使用哪个Bean,则会抛出NoUniqueBeanDefinitionException异常
2、context.getBean(String name):根据名称获取Bean。其中:
- name为Bean在Spring IoC容器中的名称
- 默认情况下,Bean的名称是类名进行了首字母小写的处理后的结果
- 可以通过在Spring注解中设置名称来设置Bean的名称,如:@Component("myBean")
3、context.getBean(String name, Class<T> requiredType):根据Bean名称和类型获取Bean。
- 该方法相当于在getBean(String name)方法的基础上添加了Bean类型的验证
- 如果获取的Bean对象与requiredType指定的类型不同,将抛出BeanNotOfRequiredTypeException
4、context.getBeansOfType(Class<T> type):根据类型获取容器中所有实现该类型的Bean。
- type为要获取bean的类型
- 该方法返回Map类型,其中key为Bean在容器中的名称,value为Bean实例
【案例】IoC获取对象示例
在Application类中,测试IoC获取对象的方式:
- public class Application {
- public static void main(String[] args) {
- ApplicationContext context =
- new AnnotationConfigApplicationContext(BeanDefineConfig.class);
- // IoC容器中存在多个相同类型的Bean时,
- // 使用.class获取会抛出异常:NoUniqueBeanDefinitionException
- // ArrayList<String> names = (ArrayList<String>) context.getBean(ArrayList.class);
- // 使用name+type的方式,不需要再进行强制类型转换
- ArrayList<String> moreLanguages = context.getBean("moreLanguages", ArrayList.class);
- moreLanguages.forEach(System.out::println);
- // getBeansOfType方法返回的类型为Map
- context.getBeansOfType(ArrayList.class).forEach((name, bean) -> {
- System.out.println(name + " : " + bean);
- });
- }
- }