DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Related

  • Building a CRUD Application With Spring and SimpleJdbcMapper
  • How to Marry MDC With Spring Integration
  • How Spring and Hibernate Simplify Web and Database Management
  • Functional Endpoints: Alternative to Controllers in WebFlux

Trending

  • Logging What AI Agents Do in Salesforce: A Simple One-Object Audit Framework
  • Implementing Secure API Gateways for Microservices Architecture
  • Self-Hosted Inference Doesn’t Have to Be a Nightmare: How to Use GPUStack
  • Production-Grade RAG: Why Vector Search Isn't Enough (and How Hybrid Search Fills the Gaps)
  1. DZone
  2. Coding
  3. Frameworks
  4. Instanciating Spring component with non-default constructor from another component

Instanciating Spring component with non-default constructor from another component

By 
Lubos Krnac user avatar
Lubos Krnac
·
May. 30, 13 · Interview
Likes (2)
Comment
Save
Tweet
Share
53.0K Views

Join the DZone community and get the full member experience.

Join For Free

I'd like to show how to instantiate Spring's component with non-default constructor (constructor with parameters) from other Spring driven component because it seems to me that a lot of Java developers doesn't know that this is possible in Spring. 

First of all, simple annotation based Spring configuration. It's it is scanning target package for components.

@Configuration
@ComponentScan("sk.lkrnac.blog.componentwithparams")
public class SpringContext {
}

Here is component with non-default constructor. This component needs to be specified as prototype, because we will be creating new instances of it. It also needs to be named (will clarify why below).

@Component(SpringConstants.COMPONENT_WITH_PARAMS)
@Scope("prototype")
public class ComponentWithParams {
 private String param1;
 private int param2;
 
 public ComponentWithParams(String param1, int param2) {
  this.param1 = param1;
  this.param2 = param2;
 }

 @Override
 public String toString() {
  return "ComponentWithParams [param1=" + param1 + ", param2=" + param2
    + "]";
 }
}

Next component instantiates ComponentWithParams. It needs to be aware of Spring's context instance to be able to pass arguments into non-default constructor. getBean(String name, Object... args) method is used for that purpose. First parameter of this method is name of the instantiating component (that is why component needed to be named). Constructor parameters follow.

@Component
public class CreatorComponent implements ApplicationContextAware{
 ApplicationContext context;
 
 public void createComponentWithParam(String param1, int param2){
  ComponentWithParams component = (ComponentWithParams)
    context.getBean(SpringConstants.COMPONENT_WITH_PARAMS, 
      param1, param2);
  System.out.println(component.toString() + " instanciated...");
 }

 @Override
 public void setApplicationContext(ApplicationContext context)
   throws BeansException {
  this.context = context;
 }
}

Last code snippet is main class which loads Spring context and runs test.

public class Main {

 public static void main(String[] args) {
  AnnotationConfigApplicationContext context = 
    new AnnotationConfigApplicationContext(SpringContext.class);
  CreatorComponent invoker = context.getBean(CreatorComponent.class);
  
  invoker.createComponentWithParam("Fisrt", 1);
  invoker.createComponentWithParam("Second", 2);
  invoker.createComponentWithParam("Third", 3);
  context.close();
 }
}

Console output:

ComponentWithParams  instanciated...
ComponentWithParams  instanciated...
ComponentWithParams  instanciated...

And that's it. You can download souce code on Github

Spring Framework

Opinions expressed by DZone contributors are their own.

Related

  • Building a CRUD Application With Spring and SimpleJdbcMapper
  • How to Marry MDC With Spring Integration
  • How Spring and Hibernate Simplify Web and Database Management
  • Functional Endpoints: Alternative to Controllers in WebFlux

Partner Resources

×

Comments

The likes didn't load as expected. Please refresh the page and try again.

  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook