Friday 13 September 2019

Spring Boot: Bean is singleton by default


In spring, a bean is singleton by default.

Let’s confirm it with an example.

Employee.java

package com.sample.app.model;

public class Employee {

 private int id;
 private String firstName;
 private String lastName;

 public Employee() {
  System.out.println("Constructor Called");
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public void print() {
  StringBuilder builder = new StringBuilder();
  builder.append("Employee [id=").append(id).append(", firstName=").append(firstName).append(", lastName=")
    .append(lastName).append("]");
  System.out.println(builder.toString());

 }

}


EmployeeConfiguration.java
package com.sample.app.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.sample.app.model.Employee;

@Configuration
public class EmployeeConfiguration {

 @Bean
 public Employee newEmployee() {
  System.out.println("New bean is getting initialized");
  Employee emp = new Employee();
  emp.setId(1);
  emp.setFirstName("Krishna");
  emp.setLastName("Majety");
  return emp;
 }
}

application.properties
logging.level.root=WARN


App.java
package com.sample.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.sample.app.configuration.EmployeeConfiguration;
import com.sample.app.model.Employee;

@SpringBootApplication
public class App {
 public static void main(String args[]) {
  System.out.println("Main Application running.......");
  ApplicationContext applicationContext = SpringApplication.run(App.class, args);

  System.out.println("ApplicationContext initialized");

  Employee emp1 = applicationContext.getBean(Employee.class);
  Employee emp2 = applicationContext.getBean(Employee.class);

  EmployeeConfiguration configuration = applicationContext.getBean(EmployeeConfiguration.class);
  Employee emp3 = configuration.newEmployee();

  System.out.println("emp1 = " + emp1);
  System.out.println("emp2 = " + emp2);
  System.out.println("emp3 = " + emp3);
 }
}


Total project structure looks like below.

Run App.java.


You can see below messages in console.
Main Application running.......

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

New bean is getting initialized
Constructor Called
ApplicationContext initialized
emp1 = com.sample.app.model.Employee@31920ade
emp2 = com.sample.app.model.Employee@31920ade
emp3 = com.sample.app.model.Employee@31920ade

Analysis
As you see the output, application starts with below message
Main Application running.......

'SpringApplication.run(App.class, args)' method starts initializing new beans. Now whenever I call new bean via ‘applicationContext’ or via ‘EmployeeConfiguration’ spring always returns me the initialized bean (you can confirm the same by the messages ‘New bean is getting initialized’ and ‘Constructor Called’ messages).

You can download complete working application from this link.





Previous                                                    Next                                                    Home

No comments:

Post a Comment