容器获取和操作
存放 Spirng 创建的对象的容器,也叫 IOC 容器
@Component("userService") // Spring 会创建一个 UserService 的实例,存放在容器中
public class UserService{
}
获取容器
-
通过 xml 方式:Spring1 只支持 XML 方式
/* * 通过 <context:component-scan base-package="xxx" /> 标签指定包根路径 * 通过 <bean class="xxx" id="" name="" /> 标签配置 bean */ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); -
通过注解方式:Spring2 开始支持注解配置 bean
/* * 只是 bean 可以通过注解配置,其余的配置还需要 XML 文件 * 1,@Component、@Bean 配置 bean * 2,XML 文件中还是要存在 <context:component-scan base-package="xxx" /> 标签来指定包的根路径 */ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); -
通过配置类+注解方式:Spring3 开始不再需要 XML 文件了
/* * 既然不再需要 XML,那么 AppConfig 必然要通过别的方式实现 XML 的功能 * 1,通过 @ComponentScan(basePackages="xxx") 指定包根路径,如果为空默认就是配置类的包路径 * 2,通过 @Configuration 注解标明这是配置类 */ ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); -
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);

浙公网安备 33010602011771号