Signup/Sign In
PUBLISHED ON: JANUARY 16, 2021

Spring Method Injection

Similar to field injection, Spring allows method dependency injection to inject the dependency into the bean. Spring uses primarily two types of dependency injection: Constructor and Setter Injection but we can also use another injection technique called method injection. The method injection is similar to setter injection except that method can be any regular method. It uses the @Autowired annotation to mark a method as method injection.

In this topic, we are using the method based DI technique. The project is a Maven-Based Spring Project and contains the following files.

  • App.java

  • AppConfig.java

  • Award.java

  • FictionWriter.java

  • TechnicalWriter.java

  • Writer.java

  • pom.xml

Project Structure:

// App.java

This file contains code to create an IOC container for our application. The AnnotationConfigApplicationContext class is used to create an object for application context.

package com.studytonight.community;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {

	public static void main(String[] args) {
		
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
		Writer writer = context.getBean("fictionWriter", Writer.class);
		writer.write();
		writer.getAward();
		// Close the context
		context.close();
	}
}

// AppConfig.java

This is a configuration file in Java which is an alternate of the applicationContext.xml file that we created for the XML-based configuration example. The @Configuration annotation indicates that this is not a simple class but a configuration class and the @ComponentScan annotation is used to indicate the location of the component class in our spring project.

package com.studytonight.community;

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

@Configuration
@ComponentScan("com.studytonight.community")
public class AppConfig {

}

// Award.java

This is a component class that will be read by the Spring IOC container.

package com.studytonight.community;

import org.springframework.stereotype.Component;

@Component
public class Award {
	
	public void award() {
		
		System.out.println("Your Writting got Award!");
	}
}

// FictionWriter.java

This is another component class and it implements the Writer interface. This class uses @Autowired annotation with method to implement method dependency injection and no setter method is created only the getter method is created.

package com.studytonight.community;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class FictionWriter implements Writer {

	Award award;
	
	@Autowired
	public void awardInstance(Award award) {
		this.award = award;
	}
	@Override
	public void write() {
		
		System.out.println("Write Fiction Novels...");
	}
	@Override
	public void getAward() {
		
		award.award();
	}
}

// TechnicalWriter.java

This is another component class and it implements the Writer interface. This class uses @Autowired annotation with the method to implement method dependency injection and no setter method is created only the getter method is created.

package com.studytonight.community;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class TechnicalWriter implements Writer{

	private Award award;
	
	@Autowired
	public void awardInstance(Award award) {
		this.award = award;
	}
	@Override
	public void write() {
		
		System.out.println("Write technical stuffs...");
	}
	@Override
	public void getAward() {
		award.award();
	}
}

// Writer.java

It is an interface that contains two methods and each class that implements it will have to implement its methods as well.

package com.studytonight.community;

public interface Writer {
	
	void write();
	void getAward();
}

// pom.xml

This file contains all the dependencies of this project such as spring jars, servlet jars, etc. Put these dependencies into your project to run the application.

<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.studytonight</groupId>
  <artifactId>springproject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
  <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
	</dependencies>
	<properties>
		<spring.version>5.2.8.RELEASE</spring.version>
	</properties>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
    
  </build>
</project>


Write Fiction Novels...
Your Writting got Award!



About the author:
I am a Java developer by profession and Java content creator by passion. I have over 5 years of experience in Java development and content writing. I like writing about Java, related frameworks, Spring, Springboot, etc.