在官网中有这两个概念: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功能比较丰富,可以完成事件发布,注解解析等等