Wednesday 21 October 2020

How to use @Qualifier and @Primary Annotations in Spring


@Qualifier Annotation
Due to spring development there may be a situation when you create more than one bean of the same type and want to wire only one of them with a property. In such cases, you can use the @Qualifier annotation along with @Autowired to remove the confusion by specifying which exact bean will be wired.

@Primary Annotation
There may be a situation when you create more than one bean of the same type and want to wire only one of them with a property , and not want to use @Qualifier Annotation then you can Annotate any one bean as @Primary .
This annotation can be used on any class directly or indirectly annotated with the @Component annotation or on methods annotated with the @Bean annotation.

Project Code Structure



Create pom.xml file 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.ramsis</groupId>

  <artifactId>springQualifierDemo</artifactId>

  <version>0.0.1-SNAPSHOT</version>



<properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <springframework.version>5.1.5.RELEASE</springframework.version>

    

    <maven.compiler.source>1.8</maven.compiler.source>

    <maven.compiler.target>1.8</maven.compiler.target>

  </properties>


  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${springframework.version}</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>${springframework.version}</version>

</dependency>

  </dependencies>


</project>


-------------------------------------------------------------------------------------------- 


Create CompanyInfo Class


package com.ramsis.bean;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Component;


@Component

public class CompanyInfo {


@Autowired

@Qualifier("hyundai")

CompanyType companytype;

public void getInfo() {

companytype.getCompanyType();

}

}


--------------------------------------------------------------------------------------------


Create CompanyType Class


package com.ramsis.bean;


public interface CompanyType {


public void getCompanyType();

}


--------------------------------------------------------------------------------------------


Create Hyundai Class



package com.ramsis.bean;


import org.springframework.stereotype.Component;


@Component

public class Hyundai implements CompanyType {


@Override

public void getCompanyType() {

        System.out.println("Hyundai making Automobiles.");


}


}


--------------------------------------------------------------------------------------------


Create Nokia Class


package com.ramsis.bean;


import org.springframework.stereotype.Component;


@Component

public class Nokia implements CompanyType {


@Override

public void getCompanyType() {

  System.out.println("Nokia making Mobile Phones.");


}


}


--------------------------------------------------------------------------------------------


Create Reymond Class



package com.ramsis.bean;


import org.springframework.context.annotation.Primary;

import org.springframework.stereotype.Component;


@Component

@Primary

public class Reymond implements CompanyType {


@Override

public void getCompanyType() {

        System.out.println("Reymonds making fabrics and fashion products.");

}


}


--------------------------------------------------------------------------------------------


Create Runner Class


package com.ramsis.Main;


import org.springframework.context.annotation.AnnotationConfigApplicationContext;


import com.ramsis.bean.CompanyInfo;

import com.ramsis.config.Config;


public class Runner {

public static void main(String args[]) {

AnnotationConfigApplicationContext  context = new      AnnotationConfigApplicationContext(Config.class);

CompanyInfo info =context.getBean("companyInfo",CompanyInfo.class);

info.getInfo();

context.close();

}

}


--------------------------------------------------------------------------------------------


Create Config Class


package com.ramsis.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan(basePackages="com.ramsis.bean")
public class Config {

}


--------------------------------------------------------------------------------------------


After run this project you will get the output as below mention image










Spring Core Project Configuration without xml bean, using Eclipse Maven

Project Code Structure

Following screenshot shows the structure of the project we will create.





Create pom.xml file


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.ramsis</groupId>

  <artifactId>springConfig</artifactId>

  <version>0.0.1-SNAPSHOT</version>



<properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <springframework.version>5.1.5.RELEASE</springframework.version>

    

    <maven.compiler.source>1.8</maven.compiler.source>

    <maven.compiler.target>1.8</maven.compiler.target>

  </properties>


  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${springframework.version}</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>${springframework.version}</version>

</dependency>

  </dependencies>


</project>


---------------------------------------------------------------------------------------------------------------------   


Create Config Class

package com.ramsis.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan(basePackages="com.ramsis.bean")
public class Config {
}


-----------------------------------------------------------------------------------------

Create Employee Class

package com.ramsis.bean;


import org.springframework.stereotype.Component;


@Component

public class Employee {


int id;

String name;

String department;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDepartment() {

return department;

}

public void setDepartment(String department) {

this.department = department;

}

}


------------------------------------------------------------------------------------------------------------------------


Create Runner Class

package com.ramsis.Main;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.ramsis.bean.Employee;
import com.ramsis.config.Config;

public class Runner {
public static void main(String args[]) {

AnnotationConfigApplicationContext  context = new AnnotationConfigApplicationContext(Config.class);
Employee employee =context.getBean("employee",Employee.class);

employee.setName("Aman");
employee.setDepartment("IT Prod");

System.out.println("name: "+employee.getName());
System.out.println("Department: "+employee.getDepartment());

context.close();
}
}

-------------------------------------------------------------------------------------------------

After run this project you will get the output as below mention image






Sunday 11 October 2020

Create Builder Design Pattern in Java

Builder Design Pattern in Java

The builder pattern is a design pattern that allows for the step-by-step creation of complex objects using the correct sequence of actions. The construction is controlled by a director object that only needs to know the type of object it is to create.


The builder pattern, as name implies, is an alternative way to construct complex objects. This should be used only when you want to build different immutable objects using same object building process.



package com.vehicle;


public class Car {

private final String carCompany;

private final String name;

private final String model;

private final String colour;

private final String engine;

private Car(Builder builder) {

this.carCompany=builder.carCompany;

this.name=builder.name;

this.model=builder.model;

this.colour=builder.colour;

this.engine=builder.engine;

}

//All getter, and NO setter to provde immutability in Car

public String getName() {

return this.name;

}

public String getModel() {

return this.model;

}

public String getColour() {

return this.colour;

}

public String getEngine() {

return this.engine;

}

public static class Builder{

   

private final String carCompany;

private String name;

private String model;

private String colour;

private String engine;

public Builder(String carCompany){

this.carCompany = carCompany;

}

public Builder setName(String name) {

this.name=name;

return this;

}

public Builder setModel(String model) {

this.model=model;

return this;

}

public Builder setColour(String colour) {

this.colour=colour;

return this;

}

public Builder setEngine(String engine) {

this.engine=engine;

return this;

}

public Car build() {

return new Car(this);

}

}

@Override

public String toString() {

return "Builder [carCompany=" + carCompany + ", name=" + name + ", model=" + model + ", colour=" + colour+ ", engine=" + engine + "]";

}

}


------------------------------------------------------------------------------------------------------------------------


package com.vehicle;


public class Main {


public static void main(String[] args) {


Car car1 = new Car.Builder("Maruti").setName("Alto").setEngine("900CC").setModel("k10Vxi").build();

Car car2 = new Car.Builder("Ford").setName("Escort").setEngine("1600CC").setModel("MK2").build();

System.out.println(car1);

System.out.println(car2);

}


}