Spring IOC 容器
-
Bean Factory 和 ApplicationContext 谁才是 Spring IOC 容器?
package org.xiaoge.thinking.in.spring.ioc.overview.dependency.injection; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.ObjectFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.env.Environment; import org.xiaoge.thinking.in.spring.ioc.overview.annotation.Super; import org.xiaoge.thinking.in.spring.ioc.overview.domain.User; import org.xiaoge.thinking.in.spring.ioc.overview.repository.UserRepository; import java.util.Map; /** * 注意: 依赖注入/依赖查找 它们的来源并不是一个 * 依赖注入示例 看 UserRepository * 1. 名称集合注入: util:list * 2. 类型集合注入: autowire * 3. 注入内部bean: users * 4. 注入非内建bean: BeanFactory * 5. 延迟注入: ObjectFactory * * @Classname DependencyInjectionDemo * @Date 2022/10/17 14:56 * @Created by ZhangXiao * @Description TODO */ public class DependencyInjectionDemo { public static void main(String[] args) { // 配置xml配置文件 // 启动spring应用上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/dependency-injection-context.xml"); // 依赖来源一: 自定义Bean UserRepository userRepository = applicationContext.getBean("userRepository", UserRepository.class); // 依赖来源二: 容器内建依赖 System.out.println(userRepository.getBeanFactory()); // 依赖来源三: 容器内建Bean Environment environment = applicationContext.getBean(Environment.class); System.out.println("获取 Environment 类型的 Bean: " + environment); whoIsIoCContainer(applicationContext, userRepository); } /** * ApplicationContext/BeanFactory 谁才是Ioc容器 * * 1. BeanFactory这个接口提供了一些高级配置的机制, 能够来管理这些对象 * 2. ApplicationContext是BeanFactory的一个子接口 * 特性: * 1. 简化了和spring aop的整合 * 2. 消息资源的一个处理(国际化支持) * 3. 事件的发布 * 4. 应用级别的一些上下文比如说WebApplication在web使用场景上面 * 总而言之BeanFactory是提供一个配置的框架, 并且是一个基本功能, 所以BeanFactory是一个基本容器 而 ApplicationContext 是它的一个超集 * * @param applicationContext * @param userRepository */ public static void whoIsIoCContainer(ApplicationContext applicationContext, UserRepository userRepository) { // ConfigurableApplicationContext <- ApplicationContext <- BeanFactory // 这个表达式为什么会不成立 System.out.println(userRepository.getBeanFactory() == applicationContext); // ApplicationContext 就是 BeanFactory } } /* 运行结果 org.springframework.beans.factory.support.DefaultListableBeanFactory@22f71333: defining beans [user,objectFactory,superUser,userRepository]; root of factory hierarchy 获取 Environment 类型的 Bean: StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[PropertiesPropertySource {name='systemProperties'}, SystemEnvironmentPropertySource {name='systemEnvironment'}]} false */
-
相当于是代理对象getBean, 我们可以看出DefaultListableBeanFactory是一个组合对象