35 | 注册Spring Bean:如何将BeanDefinition注册到IoC容器?
- BeanDefinition注册
- XML 配置元信息
- Java 注解配置元信息
- @Bean
- @Component
- @Import
- Java API 配置元信息
- 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String, BeanDefinition)
- 非命名方式:BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition, BeanDefinitionRegistry )
- 配置类方式:AnnotatedBeanDefinitionReader#register(Class …)
- XML 配置元信息
36 | 实例化Spring Bean:Bean实例化的姿势有多少种?
作用和注册一样,都是生成bean
40 | 回收Spring Bean:Spring IoC容器管理的Bean能够被垃圾回收吗?
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//注册bean
applicationContext.register(BeanInitializationDemo.class);
//启动应用上下文
applicationContext.refresh();
System.out.println("Spring 应用上下文已启动");
//依赖查找
UserFactory bean = applicationContext.getBean(UserFactory.class);
System.out.println(bean.createUser());
//关闭
applicationContext.close();
//触发垃圾回收
bean=null;
System.gc();
Thread.sleep(5000);
在ApplicationContext关闭之前,GC是不会回收Bean的,纵然显示的调用也是如此。而在ApplicationContext关闭之后,JVM会在垃圾回收周期中去回收掉Bean。
调用close方法好像就是调用存放bean的concurrentHashMap的clear方法,导致GCRoot不可达,所以就被回收了