文章目录
- 依赖查找的方式
- 依赖注入的方式
- 依赖查找和依赖注入的来源
- Ioc配置源信息
- BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器
- 如何使用BeanFactory和ApplcationContext
依赖查找的方式
- 根据 Bean 名称查找
- 实时查找
- 延迟查找
- 根据 Bean 类型查找
- 单个 Bean 对象
- 集合 Bean 对象
- 根据 Bean 名称 + 类型查找
- 根据 Java 注解查找
- 单个 Bean 对象
- 集合 Bean 对象
依赖注入的方式
- 根据 Bean 名称注入
- 根据 Bean 类型注入
- 单个 Bean 对象
- 集合 Bean 对象
- 注入容器內建 Bean 对象
- 注入非 Bean 对象
- 注入类型
- 实时注入
- 延迟注入
依赖查找和依赖注入的来源
- 自定义 Bean
- xml
- 注解
- 容器內建 Bean 对象
- 比如Environment类
- 容器內建依赖
- 比如BeanFactory
Ioc配置源信息
- Bean 定义配置
- 基于 XML 文件
- 基于 Properties 文件
- 基于 Java 注解
- 基于 Java API(专题讨论)
- IoC 容器配置
- 基于 XML 文件
- 基于 Java 注解
- 基于 Java API (专题讨论)
- 外部化属性配置
- 基于 Java 注解
BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器
- BeanFactory 是 Spring IoC 容器最基本的接口,提供了创建、配置、管理和依赖注入等基本功能。它是一个轻量级的容器,适合于简单的应用场景。
- ApplicationContext 是 BeanFactory 的子接口,除了继承了 BeanFactory 的所有功能外,还提供了一些高级特性。它是一个更加完整和强大的容器,适合于复杂的应用场景。ApplicationContext 除了 IoC 容器角色,还有提供:
- 面向切面(AOP)
- 配置元信息(Configuration Metadata)
- 资源管理(Resources)
- 事件(Events)
- 国际化(i18n)
- 注解(Annotations)
因此,可以说 ApplicationContext 是 Spring IoC 容器的“超集”,提供了更多的功能和更完整的支持。在实际应用中,可以根据具体的需求选择使用 BeanFactory 还是 ApplicationContext。
如何使用BeanFactory和ApplcationContext
前面我们说过,BeanFactory可以实现简单的Ioc容器的功能,如果我们只有配置并管理Bean的需求,可以使用BeanFactory,代码示例如下:
public class BeanFactoryIocContainer {public static void main(String[] args) {// 创建容器DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();// 加载Bean配置XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);String location = "classpath:/META-INF/dependency-lookup-context.xml";xmlBeanDefinitionReader.loadBeanDefinitions(location);// 获取BeanUser bean = defaultListableBeanFactory.getBean(User.class);}
}
前面我们说过,ApplicationContext除了能实现BeanFactory的基本功能以外,还可以实现注解等额外功能,代码示例如下:
public class AnnotationApplicationContextIocContainer {public static void main(String[] args) {// 创建容器AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();// 将当前类作为配置类annotationConfigApplicationContext.register(AnnotationApplicationContextIocContainer.class);// 启动容器annotationConfigApplicationContext.refresh();// 获取BeanUser bean = annotationConfigApplicationContext.getBean(User.class);// 关闭容器annotationConfigApplicationContext.close();}@BeanUser user(){User user = new User();user.setId(1);user.setName("注解");return user;}
}