BAEL-2051 Spring Autowiring of Generic Types (#4921)
This commit is contained in:
parent
3d820aaea4
commit
7bb5fb6176
@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.dependencyinjectiontypes.annotation;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.METHOD,
|
||||||
|
ElementType.TYPE, ElementType.PARAMETER})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Qualifier
|
||||||
|
public @interface CarQualifier {
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baeldung.dependencyinjectiontypes.app;
|
||||||
|
|
||||||
|
import com.baeldung.dependencyinjectiontypes.annotation.CarQualifier;
|
||||||
|
import com.baeldung.dependencyinjectiontypes.model.Car;
|
||||||
|
import com.baeldung.dependencyinjectiontypes.model.CarHandler;
|
||||||
|
import com.baeldung.dependencyinjectiontypes.model.Motorcycle;
|
||||||
|
import com.baeldung.dependencyinjectiontypes.model.Vehicle;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@ComponentScan("com.baeldung.dependencyinjectiontypes.model")
|
||||||
|
public class CustomConfiguration {
|
||||||
|
@Bean
|
||||||
|
@CarQualifier
|
||||||
|
public Car getMercedes() {
|
||||||
|
return new Car("E280", "Mercedes", "Diesel");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws NoSuchFieldException {
|
||||||
|
ConfigurableApplicationContext context = SpringApplication.run(CustomConfiguration.class, args);
|
||||||
|
CarHandler carHandler = context.getBean(CarHandler.class);
|
||||||
|
carHandler.getVehicles().forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@CarQualifier
|
||||||
|
public Car getBmw() {
|
||||||
|
return new Car("M5", "BMW", "Petrol");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Motorcycle getSuzuki() {
|
||||||
|
return new Motorcycle("Yamaguchi", "Suzuki", true);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.dependencyinjectiontypes.model;
|
||||||
|
|
||||||
|
public class Car extends Vehicle {
|
||||||
|
private String engineType;
|
||||||
|
|
||||||
|
public Car(String name, String manufacturer, String engineType) {
|
||||||
|
super(name, manufacturer);
|
||||||
|
this.engineType = engineType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEngineType() {
|
||||||
|
return engineType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEngineType(String engineType) {
|
||||||
|
this.engineType = engineType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Car{" +
|
||||||
|
"engineType='" + engineType + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.baeldung.dependencyinjectiontypes.model;
|
||||||
|
|
||||||
|
import com.baeldung.dependencyinjectiontypes.annotation.CarQualifier;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class CarHandler {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@CarQualifier
|
||||||
|
private List<Vehicle> vehicles;
|
||||||
|
|
||||||
|
public List<Vehicle> getVehicles() throws NoSuchFieldException {
|
||||||
|
ResolvableType vehiclesType = ResolvableType.forField(getClass().getDeclaredField("vehicles"));
|
||||||
|
System.out.println(vehiclesType);
|
||||||
|
ResolvableType type = vehiclesType.getGeneric();
|
||||||
|
System.out.println(type);
|
||||||
|
Class<?> aClass = type.resolve();
|
||||||
|
System.out.println(aClass);
|
||||||
|
return this.vehicles;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.dependencyinjectiontypes.model;
|
||||||
|
|
||||||
|
public class Motorcycle extends Vehicle {
|
||||||
|
private boolean twoWheeler;
|
||||||
|
|
||||||
|
public Motorcycle(String name, String manufacturer, boolean twoWheeler) {
|
||||||
|
super(name, manufacturer);
|
||||||
|
this.twoWheeler = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTwoWheeler() {
|
||||||
|
return twoWheeler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTwoWheeler(boolean twoWheeler) {
|
||||||
|
this.twoWheeler = twoWheeler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Motorcycle{" +
|
||||||
|
"twoWheeler=" + twoWheeler +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.baeldung.dependencyinjectiontypes.model;
|
||||||
|
|
||||||
|
public abstract class Vehicle {
|
||||||
|
private String name;
|
||||||
|
private String manufacturer;
|
||||||
|
|
||||||
|
|
||||||
|
public Vehicle(String name, String manufacturer) {
|
||||||
|
this.name = name;
|
||||||
|
this.manufacturer = manufacturer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getManufacturer() {
|
||||||
|
return manufacturer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setManufacturer(String manufacturer) {
|
||||||
|
this.manufacturer = manufacturer;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user