容器获取和操作

存放 Spirng 创建的对象的容器,也叫 IOC 容器

@Component("userService") // Spring 会创建一个 UserService 的实例,存放在容器中
public class UserService{
  
}

获取容器

  1. 通过 xml 方式:Spring1 只支持 XML 方式

    /*
     * 通过 <context:component-scan base-package="xxx" /> 标签指定包根路径
     * 通过 <bean class="xxx" id="" name="" /> 标签配置 bean
     */
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
  2. 通过注解方式:Spring2 开始支持注解配置 bean

    /*
     * 只是 bean 可以通过注解配置,其余的配置还需要 XML 文件
     * 1,@Component、@Bean 配置 bean
     * 2,XML 文件中还是要存在 <context:component-scan base-package="xxx" /> 标签来指定包的根路径
     */
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
  3. 通过配置类+注解方式:Spring3 开始不再需要 XML 文件了

    /* 
     * 既然不再需要 XML,那么 AppConfig 必然要通过别的方式实现 XML 的功能
     * 1,通过 @ComponentScan(basePackages="xxx") 指定包根路径,如果为空默认就是配置类的包路径
     * 2,通过 @Configuration 注解标明这是配置类
     */
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    
  4. SpringBoot 方式

    • Spring3 开始不需要XML配置文件指的是纯 Spring 环境(SSH、SSM 环境还是需要 XML)
    • Spring4+SpringBoot 真正实现零 XML
    @SpringBootApplication // 组合注解,等价于 @Configuration+@Component+@EnableAutoConfiguration
    public class SpringIocApplication {
        public static void main(String[] args) {
            ConfigurableApplicationContext ioc = SpringApplication.run(SpringIocApplication.class, args);
        }
    }
    

获取 bean

方法 作用 说明
public Object getBean(String name) 根据名称获取 只能获取一个
public <T> T getBean(Class<T> type)
public <T> Map<String, T> getBeansOfType(Class<T> type)
根据类型获取 可以获取一个,也可以获取多个
public <T> T getBean(String name, Class<T> type) 根据名称+类型获取 期望精准获取一个

当获取的 bean 不唯一(同类型的 bean 有多个)时

获取方式 结果 解释
根据名称获取 能正常获取 ICO 容器中 bean 的名称是唯一的(不会后面覆盖前面,而是只存在最先创建的)
根据名称+类型获取 能正常获取 原因同上
根据类型获取 如果获取一个,报错
如果获取多个,正常获取
public <T> T getBean(Class<T> type) 会报错
public <T> Map<String, T> getBeansOfType(Class<T> type) 正常获取

示例

// 获取 ioc 容器
ConfigurableApplicationContext ioc = SpringApplication.run(SpringIocApplication.class, args);

// 所有的 bean(输出 bean 名称)
String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
    System.out.println(beanDefinitionName);
}

// bean 不存在:NoSuchBeanDefinitionException
Person zhangsan = (Person) ioc.getBean("zhangsan");

// bean 名称重复:获取到最先注册的 bean(其实是不能重复注册,后面注册的不会覆盖前面的)
Person person = (Person) ioc.getBean("person");

// 某个种类型的 bean 是多个,可以全部获取,返回 Map(key 是 neam 名称,value 是 bean 对象)
Map<String, Person> beansOfType = ioc.getBeansOfType(Person.class);

// 某种类型的 bean 是多个,根据类型只获取一个:NoUniqueBeanDefinitionException
Person bean = ioc.getBean(Person.class);

// 某种类型的 bean 是多个,根据名称只获取一个:精准获取
Person person3 = (Person) ioc.getBean("person3");

// 根据名称+类型来精确获取 bean
Person person4 = ioc.getBean("person4", Person.class);
posted @ 2024-06-29 12:10  CyrusHuang  阅读(28)  评论(0)    收藏  举报