spring源码之如何理解容器

在官网中有这两个概念:BeanFactory or ApplicationContext
这两个都可以说是容器,因为我们都可以从中取出需要的类。
但是,两者是有区别的,BeanFactory没有那么智能。

比如下面:我们想要实例化A这个类,需要自己把这个类放入BeanFactory容器中,才能使用。
并且,如果不执行beanFactory.getBean()方法的话,A类是不会被实例化的,属于懒加载。

@Component
public class A implements InitializingBean {

	ApplicationContext context;

	public A(){
		System.out.println("create a Object");
	}

	@PostConstruct
	public void init(){
		System.out.println("a init PostConstruct");
	}


}


	@Test
	public void defaultContext(){

		DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
		BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(A.class);
		beanFactory.registerBeanDefinition("a", builder.getBeanDefinition());

		//在取出这个Bean的时候,才会加载
		A bean = beanFactory.getBean(A.class);
	}

而且,类中的Autowired注解,BeanFactory也是不会自动读取的,因为BeanFactory没有加载这个AutowiredAnnotationBeanPostProcessor这个处理器。

容器,是一个抽象的概念,在spring中真正使用的时候,实际上是通过很多类来实现的,比如AnnotationConfigApplicationContext(通过指定文件初始化)或者ClassPathXmlApplicationContext(初始化xml配置文件)。这都是容器,而总结来说,分为BeanFactory和ApplicationContext两大类。

BeanFactory是一个基本的容器对象,它可以完成spring的基础功能,比如说依赖注入、Bean的实例化之类的。
ApplicationContext功能比较丰富,可以完成事件发布,注解解析等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值