小马哥课程笔记
- 自定义 Bean
- 容器內建 Bean 对象
- 容器內建依赖
这里的BeanFactory
- 会让人误以为是 容器內建 Bean 对象,但是无法通过beanFactory.getBean(BeanFactory.class)查找到
- 所以其实是容器內建依赖,它不是一个Spirng的Bean
/**
* 依赖注入示例
* 可以发现BeanFactory不是一个普通的Bean 通过依赖注入可以获得但是又不和通过上下文获取的beanFactory相等 通过依赖查找无法获得
* 此处的beanFactory和applicationContext相等
*
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
* @since
*/
public class DependencyInjectionDemo {
public static void main(String[] args) {
// 配置 XML 配置文件
// 启动 Spring 应用上下文
// BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-injection-context.xml");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-injection-context.xml");
// 依赖来源一:自定义 Bean
UserRepository userRepository = applicationContext.getBean("userRepository", UserRepository.class);
// System.out.println(userRepository.getUsers());
// 依赖来源二:依赖注入(內建依赖)
System.out.println(userRepository.getBeanFactory());
//延时注入
ObjectFactory userFactory = userRepository.getObjectFactory();
System.out.println(userFactory.getObject() == applicationContext);
// 依赖查找(错误)
// System.out.println(beanFactory.getBean(BeanFactory.class));
// 依赖来源三:容器內建 Bean (这是Environment 抽象,是外部化配置和profile的综合体)
Environment environment = applicationContext.getBean(Environment.class);
System.out.println("获取 Environment 类型的 Bean:" + environment);
}
private static void whoIsIoCContainer(UserRepository userRepository, ApplicationContext applicationContext) {
// ConfigurableApplicationContext <- ApplicationContext <- BeanFactory
// ConfigurableApplicationContext#getBeanFactory()
// 这个表达式为什么不会成立
System.out.println(userRepository.getBeanFactory() == applicationContext);
// ApplicationContext is BeanFactory
}
}