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.
No comments:
Post a Comment