一:举一个最简单的例子()
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(ac.getBean(DeviceService.class));
二:这段代码内部实现原理如图所示
image.png
1.调用构造方法
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this(); //调用父类构造方法 创建默认工厂 this.beanFactory = new DefaultListableBeanFactory();
register(annotatedClasses); //注册spring原有必须的bean 看以看到beanFactory中的BeanDefinitionMap 和 BeanDefinitionNames 都有了值
refresh(); //注册并实例化普通的bean,最终存储在beanFactory中的SingleonObjects中。
}
其它:
- 对象和springbean的区别
对象不一定是springbean
但springbean一定是个对象,并且一定要经过完整的spring生命周期 - beanFactory 和 FactoryBean 的区别:
FactoryBean就是一个特殊的bean
而BeanFactory才是生产bean的地方 - lazy加载的时候
BeanDefinitionMap(描述这个bean的所有信息,上图的中间粉色框)会有值,但是SingleonObjects中没有值。只有程序第一次用到时才会实例化(就一次)。
-原型模式:实际上就是懒加载,只不过每次加载都会实例化。
网友评论