What is difference between BeanFactory and ApplicationContext in Spring framework

BeanFactory vs ApplicationContext
The difference between BeanFactory and ApplicationContext in Spring framework is another frequently asked Spring interview question mostly asked Java programmers with 2 to 4 years experience in Java and Spring. Both BeanFactory and ApplicationContext provides a way to get a bean from Spring IOC container by calling getBean("bean name"), but there is some difference in there working and features provided by them. One difference between bean factory and application context is that former only instantiate bean when you call getBean() method while ApplicationContext instantiates Singleton bean when the container is started,  It doesn't wait for getBean to be called. This interview questions is third on my list of frequently asked spring questions e.g. Setter vs Constructor Injection and  What is default scope of Spring bean. If you are preparing for Java interview and expecting some Spring framework question, It’s worth preparing those questions. 

If you are new in Spring framework and exploring Spring API and classes than you would like check my post on some Spring utility functions e.g. calculating time difference with StopWatch and  escaping XML special characters using Spring HtmlUtils. Coming back to BeanFactory vs ApplicationContext, let’s see some more difference between them in next section.

BeanFactory vs ApplicationContext in Spring

Before seeing difference between ApplicationContext and BeanFactory, let see some similarity between both of them. Spring provides two kinds of IOC container, one is BeanFactory and other is ApplicationContext. Syntactically BeanFactory and ApplicationContext both are Java interfaces and ApplicationContext extends BeanFactory. Both of them are configuration using XML configuration file. In short BeanFactory provides basic IOC and DI features while ApplicationContext provides advanced features. Apart from these, Here are few more difference between BeanFactory and ApplicationContext which is mostly based upon features supported by them.

1) BeanFactory doesn't provide support for internationalization i.e. i18n but ApplicationContext provides support for it.

2) Another difference between BeanFactory vs ApplicationContext is ability to publish event to beans that are registered as listener.

3) One of the popular implementation of BeanFactory interface is XMLBeanFactory while one of the popular implementation of ApplicationContext interface is ClassPathXmlApplicationContext. On Java web application we use WebApplicationContext  which extends ApplicationContext interface and adds getServletContext method.

4) If you are using auto wiring and using BeanFactory than you need to register AutoWiredBeanPostProcessor using API which you can configure in XML if you are using  ApplicationContext. In summary BeanFactory is OK for testing and non production use but ApplicationContext is more feature rich container implementation and should be favored over BeanFactory

Difference between BeanFactory and ApplicationContext in Spring frameworkThese were some worth noting difference between BeanFactory and ApplicationContext in Spring framework. In most practical cases you will be using ApplicationContext but knowing about BeanFactory is important to understand fundamental concept of spring framework. I mostly use XML configuration file and ClassPathXmlApplicationContext to quickly run any Spring based Java program from Eclipse  by using following snippet of code :

public static void main(String args[]){
    ApplicationContext ctx =
new ClassPathXmlApplicationContext("beans.xml");
    Hello hello =
(Hello) ctx.getBean("hello");

here beans.xml is your spring configuration file and “hello” is a bean defined in that spring configuration file. Here we have used ClassPathXmlApplicationContext  which is an implementation of ApplicationContext interface in Spring.

Other Spring questions and articles in Java

P.S. - If you are an experienced Java/JEE Program and want to learn Spring Security end-to-end, I recommend Learn Spring Security course by Eugen Paraschiv, The definitive guide to secure your Java application. It's useful for both junior and experienced Java Web developers.

He is also author of REST with Spring course, one of the best online course to learn RESTful WebServices using Spring framework.

P.S - If you like to learn from book, then Spring in Action by Craig Walls is a good starting point. The content is good enough for both junior and senior developers. It's a great book to startwith core spring.


Anonymous said...

I have never really faced any situation where I have used BeanFactory, I mostly use ApplicationContext that too ClassPathXmlApplicationContext and its more than sufficient for almost all core Java programs. In web application you can use ClassPathXmlApplicationContext, forget about BeanFactory, they are just there due to legacy.


Bean Factory :-
Bean instantiation/wiring

Application Context :-
Bean instantiation/wiring
Automatic BeanPostProcessor registration
Automatic BeanFactoryPostProcessor registration
Convenient MessageSource access (for i18n)
ApplicationEvent publication

So if you need any of the points presented on the Application Context side, you should use ApplicationContext.

Javin @ data structure interview question said...

@Saral, Great summary. I use ApplicationContext by default, but from interview point of view, it's good to remember these differences.

Ariady Putra said...

Hi, do you have any guide when to use which XmlApplicationContext?

I'm new to Spring and I have no idea when to use GenericXmlApplicationContext, ClassPathXmlApplicationContext, etc.


Javin Paul said...

@Ariady, you need ClassPathXmlApplicationContext because mostly you keep your application context file in Classpath and if you use this context then Spring will look for that file in classpath only.

Post a Comment