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
*/
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SX74COlE-1667361419483)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102112749409.png)]](https://1000bd.com/contentImg/2024/05/01/8ce135cca0e40766.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lr4rNBzJ-1667361419484)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102112819003.png)]](https://1000bd.com/contentImg/2024/05/01/9e91e837c384b028.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jq8yaQwy-1667361419484)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102113021845.png)]](https://1000bd.com/contentImg/2024/05/01/33fcf30b54162985.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h64Ep7J7-1667361419485)(C:\Users\13301\AppData\Roaming\Typora\typora-user-images\image-20221102113039495.png)]](https://1000bd.com/contentImg/2024/05/01/9a1764eed98e0c01.png)
相当于是代理对象getBean, 我们可以看出DefaultListableBeanFactory是一个组合对象