Constructor injection – ambiguities
|
We are familiar ambiguities that may arise due to parameter type mismatch while making a call to a simple method in java. Similarly, care needs to be taken while passing values to a class using constructor injection. What about classes that contain multiple constructors with ambiguous , partially compatible dataTypes. Which exact parameters are about to match the provided constructor definition needs to be clear.
While injecting values to the properties of a bean through constructor injection, we need to make sure that the values are set as intended, on the right properties. Let us take an example.
Step 1 : Create the POJO
File : InjectionAmbiguity
package com.simpleCodeStuffs; public class InjectionAmbiguity { private String name; private String score; private int age; //constructor 1 public InjectionAmbiguity(String name, String score,int age){ this.name=name; this.age=age; this.score=score; } //constructor 2 public InjectionAmbiguity(String name, int age, String score){ this.name=name; this.age=age; this.score=score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } }
Step 2 : Provide the Bean definition in the xml file
File : Beans.xml
Sandy 200 22
Note :
Here I have simply assumed that the 3 property values will get set in the order they are passed to the constructor. i.e., name,Score,Age and hence constructor 1 will get called.
Step 3: Create the Main Class
File : MainClass.java
package com.simpleCodeStuffs; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainClass { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); InjectionAmbiguity amb=(InjectionAmbiguity)context.getBean("ambiguity"); System.out.println("name "+amb.getName()); System.out.println("Age "+amb.getAge()); System.out.println("Score "+amb.getScore()); } }
Step 4 : Lets check if the output is as expected
Oopsies !!!! This is because, the constructor-arg value has been passed as
200
This value has been converted from String to int and hence constructor 2 was called.
Step 5 :
To avoid such unexpected results, it is always better to make the constructor-arg injection as clear as possible. The use of type is adviced.
Beans.xml
Sandy 200 22
Now, the output is –
Hence the ambiguity in the parameter is resolved using more specific attributes alone with the ‘property’ tag like type to specify the intended data type of the value.
|