35 | 注册Spring Bean:如何将BeanDefinition注册到IoC容器?

  • BeanDefinition注册
    • XML 配置元信息
    • Java 注解配置元信息
      • @Bean
      • @Component
      • @Import
    • Java API 配置元信息
      • 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String, BeanDefinition)
      • 非命名方式:BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition, BeanDefinitionRegistry )
      • 配置类方式:AnnotatedBeanDefinitionReader#register(Class …)

36 | 实例化Spring Bean:Bean实例化的姿势有多少种?

作用和注册一样,都是生成bean

40 | 回收Spring Bean:Spring IoC容器管理的Bean能够被垃圾回收吗?

  1. AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
  2. //注册bean
  3. applicationContext.register(BeanInitializationDemo.class);
  4. //启动应用上下文
  5. applicationContext.refresh();
  6. System.out.println("Spring 应用上下文已启动");
  7. //依赖查找
  8. UserFactory bean = applicationContext.getBean(UserFactory.class);
  9. System.out.println(bean.createUser());
  10. //关闭
  11. applicationContext.close();
  12. //触发垃圾回收
  13. bean=null;
  14. System.gc();
  15. Thread.sleep(5000);

在ApplicationContext关闭之前,GC是不会回收Bean的,纵然显示的调用也是如此。而在ApplicationContext关闭之后,JVM会在垃圾回收周期中去回收掉Bean。

调用close方法好像就是调用存放bean的concurrentHashMap的clear方法,导致GCRoot不可达,所以就被回收了