Showing posts with label DispatcherServlet. Show all posts
Showing posts with label DispatcherServlet. Show all posts

Wednesday, August 5, 2020

Java Technical interview @ Candela Labs - Round 2

Hi friends,

In this post , I am sharing interview questions answers asked in Candela Labs in round - 2.



Question 1:

Is the DispatcherServlet instantiated via Application context?

Answer:

No,the DispatcherServlet is instantiated by Servlet containers like tomcat or jetty. We must define the Dispatcher Servlet into the web.xml file.

We also include load-on-startup tag = 1, which means DispatcherServlet  is instantiated when you deploy the spring MVC application to Tomcat or any other servlet container.
During instantiation, it looks for a file servlet-name-context.xml and then initializes beans defined in this file. 



Question 2:

Do we need spring-mvc.jar in our classpath or is it part of spring-core?

Answer: 

The spring-mvc.jar is not part of spring-core, which means that if we want to use spring MVC framework in the java project, we must include spring-mvc.jar in the application's classpath.
In a java web application, spring-mvc.jar is usually placed inside the /WEB-INF/lib folder.



Question 3:

How Spring MVC framework works? How HTTP request is processed?

Answer:

  • Client sends a request to a URL.
  • That request hit the web container e.g. Tomcat or Jetty. Then it looks into web.xml and find the servlet or filter which is mapped to that URL.
  • It then delegates the control to servlet or filter to process the request. Web container(Tomcat) is responsible for creating servlet and filter instances and invoking their various lifecycle methods e.g. init(), service() and destroy().  In the case of HTTP request, HTTPServlet handles that and depending upon the HTTP request method, various do...() methods are invoked by container e.g. doGet(), doPost() to process GET request and POST request.
  • To enable spring MVC, we need to declare the DispatcherServlet from spring MVC jar into web.xml. This servlet listens for a URL pattern * as shown below in web.xml, which means all requests are mapped to DispatcherServlet.
  •     Then DispatcherServlet then passes the request to a specific controller depending on the URL requested. It uses handler mapping [@RequestMapping annotation] or spring mvc configuration file to find out the mapping of request URL to difference controllers. Controller classes are also identified using @Controller and @RestController annotations.
  • After processing the request , controller returns a logical view name and model to DispatcherServlet and it consults view resolvers until an actual view is determined to render the output.
  • DispatcherServlet then contacts the chosen view e.g. Freemarker  or JSP with model data and it renders the output.
  • This rendered output is returned to the client as HTTP response. On it's way back, it can pass to any configured filgter as well e.g. Spring security filter chain or filters configured to convert the response to JSON or XML.



Question 4:

Which cache you have used and explain the steps to use that cache?

Answer:

There are multiple types of caches:

  • Caffeine
  • HazelCast
  • Redis
  • EHCache
  • CouchBase
I have used Redis cache.

Redis is an open source in-memory data structure store used as a database, cache and message broker.

It supports data structures such as strings, hashes, lists, set, sorted set and streams.
Redis has built-in replication.

Redis cache limits:

On 32-bit machine,it can store upto 3 GB of data. When cache size reaches the memory limit, old data is removed to make place for new one.

Annotations used:

  • @Cacheable : To cache some values
  • @Cacheput : To update the cache
  • @CacheEvict : To empty the cache

Maven Dependency:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>


application properties:

#Redis config:
spring.cache.type=redis
spring.redis.host-localhost
sprint.redis.port=6379


@EnableCaching annotation on SpringBootApplication main class.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository{

}

@RestController
public class UserController{

    private final Logger log = LoggerFactory.getLogger(getClass());

    private final UserRepository userRepository;

    @Autowired
    public UserController(userRepository userRepository){
    
        this.userRepository = userRepository;
    }

    @Cacheable(value="users", key="#userId", unless="#result.followers<12000")
    @RequestMapping(value"/{userId}", method=RequestMethod.GET)
    public user getUser(@PathVariable String userId){

        log.info("Getting user with ID {}", userId);
        return userRepository.findOne(Long.valueOf(userId));
    }
}



Question 5:

What will be the output of below code?

public class StringClass{

    public static void main(int[] args){

        final String str = "First String is computer";
        String str1 = str.replaceAll("First", "Last");

        System.out.println(str);
    }

}

Answer:

It says, main type is not found. Because JVM requires a main method with String[] as arguments.
In the same code, if we try replacing str1 with str, then compiler shows exception that str is declared as final and cannot be changed.



Question 6:

What happens internally when we invoke main method?

Answer:

The purpose of main method in java is to be program execution start point.

When we run java.exe,it makes some JNI calls. These calls load the DLL that is really the JVM.

It will parse the command line arguments , creates a new string array in the JVM to hold these arguments , parses the class name that we specify as containing main() method, uses JNI calls to find the main() method, then invokes the main() method passing the parameters list.



Thanks for reading!!

Tuesday, August 4, 2020

Java Technical Interview @ CandelaLabs

Hi Friends,

In this post, I'm sharing interview questions answers asked in telephonic round of CandelaLabs.

You can also read my other interviews:



Question1: 

What is DispatcherServlet and why it is used for?

Answer:

The DispatcherServlet is the implementation of front controller design pattern that handles all incoming web requests to a spring MVC application.
A front controller pattern is a common pattern in web applications whose job is to receive all requests and route it to different components of application for actual processing.

In Spring MVC, the DispatcherServlet routes web requests to spring MVC controllers.

DispatcherServlet uses handler mapping like @RequestMapping annotation to find correct controller to process a request.

It s also responsible for delegating logical view name to ViewResolver and then sending the rendered response to the client.



Question 2:

What is the root application context in spring MVC? How is it loaded?

Answer:

In Spring MVC, the context loaded using ContextLoaderListener  is called the root application context which belongs to the whole application. While the one initialized using DispatcherServlet is actually specific to that servlet.

Technically, spring MVC allows multiple DispatcherServlet in a spring MVC web application and so are multiple contexts , each specific for the specific servlet. 



Question 3:

How many types of Dependency injection types are there in Spring?
 
Answer:

Spring documentation strictly defines only twp types of injection : constructor and setter injection.

However there are more ways to inject a dependency like a field injection , lookup method injection.

Constructor Injection: Enforcing immutability:

In this, a dependent class has a constructor , where all dependencies are set. These will be provided by spring container according to xml, java or annotation based configuration.

 e.g.:

class Service1{

}

class Service2{

}

class DependentService{
    private Service1 ser1;
    private Service2 ser2;

    public DependentService(Service ser1, Service2 ser2){
        this.ser1 = ser1;
        this.ser2 = ser2;
    }
}


public class Main{

    public static void main(String[] args){

        ApplicationContext container = new ClassPathApplicationContext("spring.xml");

        (DependentService) container.getBean("dependentService");
    }
}


spring.xml is:

<?xml version = "1.0" encoding = "utf-8"?>
    // bean xmlns namespaces goes here.....

    <bean id = "service1" classs ="eample.service1"/>
    <bean id = "service2" class = "example.service2"/>

    <bean id="deoenddentService" class = "example.DepenentService">
        <constructor-arg type = "example.Service1" ref = "service1"/>
        <constructor-arg type = "example.Service2" ref = "service2"/>
    </bean>



Constructor injection using annotation:

@Service
class Service1{

}

@Service
class Service2{

}

@Service
class DependentService{

    private final Service1 ser1;
    private final Service2 ser2;

    @Autowired
    public DependentService(Service1 ser1, Service2 ser2){
        
        this.ser1 = ser1;
        this.ser2 = ser2;
    }

}

public class Main{

    public static void main(String[] args){

        ApplicationContext container = new ClassPathAppplicationContext("spring.xml");
        (DependentService) container.getBean("dependentService");
    
    }
}

Now in spring.xml file:

we do not need to add any <bean>.

Just add <context:component-scan base-package= "example"/>

Drawback of this approach: 

We need to use @Qualifier annotation to tell spring, which implementation of a specific interface to use , in case w e are using two implementations of an interface.

Higher chance to have circular dependencies.


Note: We can have many more constructors in or class, but only one of them should qualify for dependency injection.


Advantage of this approach: Can be combined with setter injection and field injection.


Setter injection:

With XML:

class Service1{

}


class Service2{

}

class DependentService{

    private Service1 ser1;
    private Service2 ser2;

    public DependentService(){

        
    }

    public void setService1(Service1 ser1){

        this.ser1 = ser1;
    }

    public void setService2(Service2 ser2){
    
        this.ser2 = ser2;
    }

}

XML is:

<bean id = "service1" class = "example.Service1"/>
<bean id= "service2" class = "example.Service2"/>

<bean id = "dependentService" class = "example.DependentService">
    <property name="service1" ref="service1"/>
    <property name="service2" ref="service2"/>
</bean>


Setter Injection with annotations:

class Service1{

}


class Service2{

}

class DependentService{

    private Service1 ser1;
    private Service2 ser2;

    public DependentService(){

        
    }

    @Autowired
    public void serService1(Service1 ser1){

        this.ser1 = ser1;
    }

     @Autowired
     public void setService2(Service2 ser2){
    
        this.ser2 = ser2;
    }

}


Note: We can combine setter injection and constructor injection.

  
Field Injection:

@Service
class DependentService{

    @Autowired
    private Service1 ser1;
    
    @Autowired
    private Service2 ser2;
}


Advantages:

  • Easy to use. No constructors or setters required.
  • Can be easily combined with the constructor and /or setter approach.

Disadvantages:

  • A number of dependencies can reach dozens until we notice that something went wrong in the design.



Question 4:

What are java Microservices frameworks?

Answer:

There are multiple java microservices frameworks:

  • Spring and Spring boot
  • DropWizard
  • Eclipse MicroProfile

Spring and Spring Boot:

    The framework propagates building the application into a jar and running it on the embedded Tomcat server , making it a perfect combination with Docker to manage a virtualized  deployment environment.

DropWizard:

Like Spring boot, DropWizard application is packages into jar file with the jetty server embedded.

DropWizard integrates the tried-and-tested java libraries into a fully functional platform: Jersey for REST, Jackson for JSON, Freemarker for template   and Mustache for java based UIs.

DropWizard ships with no built-in dependency injection solution, but integrations exist for Guice and Dagger.




Thanks for reading!!.
 

CAP Theorem and external configuration in microservices

 Hi friends, In this post, I will explain about CAP Theorem and setting external configurations in microservices. Question 1: What is CAP Th...