1. What is the Spring Framework?
In short, Spring is an Integration Framework for developing Enterprise Applications easily.
Spring framework simplifies the complexity of enterprise applications because it uses Java
beans to implement enterprise applications that were previously possible only with enterprise
beans.
Spring is an Open Source framework, developed by Rod Johnson.
Read more at https://www.javaguides.net/2018/06/spring-framework-overview.html
2. What are the benefits of using Spring?
Spring targets to make Java EE development easier. Here are the advantages of using it:
      Lightweight: Lightweight development with Java POJOs.
      Inversion of Control (IoC): Spring container takes care of wiring dependencies of
       various objects, instead of creating or looking for dependent objects
      Aspect-Oriented Programming (AOP): Spring supports AOP to separate business logic
       from system services
      IOC container: It is responsible for instantiating, configuring, and assembling the Spring
       beans by reading configuration metadata
      MVC framework: that is used to create web applications or RESTful web services,
       capable of returning XML/JSON responses
      Transaction management: reduces the amount of boiler-plate code in JDBC
       operations, file uploading, etc., either by using Java annotations or by Spring Bean XML
       configuration file
      Exception Handling: Spring provides a convenient API for translating technology-
       specific exceptions into unchecked exceptions
3. What is Dependency Injection?
In simple terms, Dependency Injection an aspect of Inversion of Control (IoC), is a general
concept stating that you do not create your objects manually but instead describe how they
should be created. An IoC container will instantiate required classes if needed.
From Spring documentation - Dependency injection (DI) is a process whereby objects
define their dependencies, that is, the other objects they work with, only through constructor
arguments, arguments to a factory method, or properties that are set on the object instance
after it is constructed or returned from a factory method. The container then injects those
dependencies when it creates the bean.
This process is fundamentally the inverse, hence the name Inversion of Control (IoC), of the
bean itself controlling the instantiation or location of its dependencies on its own by using
direct construction of classes, or the Service Locator pattern.
4. How do we implement DI in Spring
Framework?
There are three ways we can do a spring configuration:
      XML-based configuration
      Annotation-based configuration
      Java-based configuration
We can use the above configurations to implement DI in spring applications. For a better
understanding, please read the https://www.javaguides.net/2018/06/guide-to-
dependency-injection-in-spring.html article.
5. How can we inject beans in Spring?
Spring provides different options to inject beans:
   1. Setter-based Injection
   2. Constructor-based Injection
   3. Field-based Injection
The spring configuration can be done using XML files or annotations or Java configuration.
Read more about setter-based injection at Spring Dependency Injection via Setter Example.
Read more about constructor-based injection at Spring Dependency Injection via Constructor
Example.
6. What is the Spring IOC container?
The Spring IOC container is responsible for instantiating, configuring, and assembling the
Spring beans. The container gets its instructions on what objects to instantiate, configure, and
assemble by reading configuration metadata.
The configuration metadata is represented in XML, Java annotations, or Java code. It lets you
express the objects that compose your application and the rich interdependencies between
those objects.
Read more about Spring IOC container at Spring IOC Container Overview.
7. What are the responsibilities of the Spring
IOC Container?
The responsibilities of the IOC container are:
      Instantiating the bean
      Wiring the beans together
      Configuring the beans
      Managing the bean’s entire life-cycle
Read more about Spring IOC container at Spring IOC Container Overview.
8. What are the Advantages of Dependency
Injection?
      Decoupling: Code is cleaner with the DI principle and decoupling is more effective
       when objects are provided with their dependencies.
      Easier to test: As such, your classes become easier to test, in particular when the
       dependencies are on interfaces or abstract base classes, which allow for stub or mock
       implementations to be used in unit tests.
9. How to Create a Spring Container?
Spring provides many ApplicationContext interface implementations that we use are;
   1. AnnotationConfigApplicationContext: If we are using Spring in standalone Java
      applications and using annotations for Configuration, then we can use this to initialize
      the container and get the bean objects.
   2. ClassPathXmlApplicationContext: If we have a spring bean configuration XML file in a
      standalone application, then we can use this class to load the file and get the container
      object.
   3. FileSystemXmlApplicationContext: This is similar
      to ClassPathXmlApplicationContext except that the XML configuration file can be
      loaded from anywhere in the file system.
AnnotationConfigWebApplicationContext and XmlWebApplicationContext for web
applications.
Let's write a code to create a Spring container:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Note that we are supplying configuration metadata via the applicationContext.xml file(XML-
based configuration).
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(AppConfig.class);
Note that we are supplying configuration metadata via AppConfig.class file.
The most used API that implements the BeanFactory is the XmlBeanFactory.
 XmlBeanFactory factory = new XmlBeanFactory (new
ClassPathResource("applicationContext.xml"));
10. How to Retrieve Bean from Spring
Container?
Both BeanFactory and ApplicationContext interface provides a getBean() method to retrieve
bean from the spring container.
ApplicationContext getBean() Example:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
BeanFactory getBean() Example:
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
11. What are the different types of
dependency injections in spring?
1. Constructor-based DI is accomplished by the container invoking a constructor with a number of
arguments, each representing a dependency.
In the below diagram, the highlighted code shows a Constructor-based dependency injection example.
2. Setter-based DI is accomplished by the container calling setter methods on your beans
after invoking a no-argument constructor or no-argument static factory method to instantiate
your bean.
In the below diagram, the highlighted part shows the setter-based dependency injection.
Read more about setter-based injection at Spring Dependency Injection via Setter Example.
Read more about constructor-based injection at Spring Dependency Injection via Constructor
Example.
12. When to Use Constructor-based and
Setter-based DI in Spring?
From spring Framework documentation, since we can mix constructor-based and setter-
based DI, it is a good rule of thumb to use constructors for mandatory dependencies and
setter methods or configuration methods for optional dependencies. Note that use
of the @Required annotation on a setter method can be used to make the property a required
dependency.
Which of these DI methods is better purely depends on your scenario and some requirements.
The following best practices may provide a guideline:
   1. Use constructor-based DI for mandatory dependencies so that your bean is ready to
      use when it is first called.
   2. When your constructor gets stuffed with a large number of arguments, it's the figurative
      bad code smell. It's time to break your bean into smaller units for maintainability.
   3. Use setter-based DI only for optional dependencies or if you need to reinject
      dependencies later, perhaps using JMX.
   4. Avoid circular dependencies that occur when a dependency (say, bean B) of your bean
      (bean A) directly or indirectly depends on the same bean again (bean A), and all beans
      involved use constructor-based DI. You may use setter-based DI here.
   5. You can mix constructor-based and setter-based DI for the same bean, considering
      mandatory, optional, and circular dependencies.
In a typical Spring application, you can see dependencies injected using both approaches, but
this depends on the scenario, considering the preceding guidelines.
Read more at When to Use Constructor-based and Setter-based DI in Spring?
13. What is the difference between
BeanFactory and ApplicationContext in the
Spring framework?
      One main between BeanFactory and ApplicationContext is that BeanFactory only
       instantiates bean when we call getBean() method
       while ApplicationContext instantiates singleton bean when the container is started, It
       doesn't wait for getBean() method to be called.
      BeanFactory uses a lazy initialization approach whereas ApplicationContext uses an eager
       initialization approach.
      The below diagram summarize the features provided
       by BeanFactory and ApplicationContext interfaces and implementations:
Read more at BeanFactory vs ApplicationContext in Spring.
14. What is a Spring Bean?
The Spring Beans are Java Objects that are initialized by the Spring IoC container.
15. What is the default bean scope in the
Spring framework?
By default, a Spring Bean is initialized as a singleton.
16. What are the types of Spring IOC
containers?
Spring provides the following two distinct types of containers.
      BeanFactory container
      ApplicationContext container
Read more about the BeanFactory interface at Spring BeanFactory Interface Example.
Read more about ApplicationContext at BeanFactory vs ApplicationContext in Spring.
17. Are singleton beans thread-safe?
No, singleton beans are not thread-safe, as thread safety is about execution, whereas singleton
is a design pattern focusing on creation. Thread safety depends only on the bean
implementation itself.
18. What are the different scopes of Spring
Beans?
Spring Framework supports the following bean scopes :
      singleton: (Default) Scopes a single bean definition to a single object instance per
       Spring IoC container
      prototype: Scopes a single bean definition to any number of object instances
      request: Scopes a single bean definition to the lifecycle of a single HTTP request; that is,
       each HTTP request has its own instance of a bean created off the back of a single bean
       definition. Only valid in the context of a web-aware Spring ApplicationContext
      session: Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in
       the context of a web-aware Spring ApplicationContext
      application: Scopes a single bean definition to the lifecycle of a ServletContext. Only
       valid in the context of a web-aware Spring ApplicationContext
      WebSocket: Scopes a single bean definition to the lifecycle of a WebSocket. Only valid
       in the context of a web-aware Spring ApplicationContext.
Read more at https://www.javaguides.net/2018/06/guide-to-spring-bean-scopes.html
19. What Is Aspect-Oriented Programming
(AOP)?
Aspect-oriented programming is a programming paradigm that tries to solve problems with cross-cutting
concerns. Aspect-oriented programming (AOP) complements object-oriented programming (OOP) by
providing a different way to think about program structure.
Basically, enterprise applications have some common cross-cutting concerns that are applicable to
different types of Objects and application modules, such as logging, transaction management, data
validation, authentication, etc. In Object-Oriented Programming, the modularity of the application is
achieved by Classes whereas in AOP application modularity is achieved by Aspects and they are
configured to cut across different class methods.
20. What is a cross-cutting concern?
A cross-cutting concern is a functionality that is tangled with business code, which usually
cannot be separated from the business logic. Auditing, security, and transaction
management are good examples of cross-cutting concerns. They are mingled with the
business code, heavily coupled with the functionality that might be affected if they fail. These
are good candidates for separation using aspects because there is no design pattern that
would allow writing the code in such a way that they would be separated from the business
logic.
Examples of cross-cutting concerns:
      Logging
      Security
      Transaction management
      Auditing,
      Caching
      Internationalization
      Error detection and correction
      Memory management
      Performance monitoring
      Synchronization
21. What are Aspect, Advice, Pointcut,
JointPoint, and Advice Arguments in AOP?
Aspect: Aspect is a class that implements cross-cutting concerns, such as transaction
management. Aspects can be a normal class configured and then configured in the Spring
Bean configuration file or we can use Spring AspectJ support to declare a class as Aspect using
@Aspect annotation.
Advice: Advice is the action taken for a particular join point. In terms of programming, they are
methods that get executed when a specific join point with a matching pointcut is reached in
the application. You can think of Advice as Spring interceptors or Servlet Filters.
Pointcut: Pointcut is regular expression that are matched with join points to determine
whether advice needs to be executed or not. Pointcut uses different kinds of expressions that
are matched with the join points. Spring framework uses the AspectJ pointcut expression
language for determining the join points where advice methods will be applied.
JoinPoint: A join point is a specific point in the application such as method execution,
exception handling, changing object variable values, etc. In Spring AOP a join point is always
the execution of a method.
Advice Arguments: We can pass arguments in the advice methods. We can
use args() expression in the pointcut to be applied to any method that matches the argument
pattern. If we use this, then we need to use the same name in the advice method from where
the argument type is determined.