# DI

### Wrong:

```java
package com.gs.ilp.logic;

public class Car {
	private int carId;
	private FordWheel FordWheel;

	public Car() {
	}

	public Car(int carId, com.gs.ilp.logic.FordWheel fordWheel) {
		this.carId = carId;
		FordWheel = fordWheel;
	}

	public int getCarId() {
		return carId;
	}

	public void setCarId(int carId) {
		this.carId = carId;
	}

	public FordWheel getFordWheel() {
		return FordWheel;
	}

	public void setFordWheel(FordWheel fordWheel) {
		FordWheel = fordWheel;
	}

	@Override
	public String toString() {
		return "Car [carId=" + carId + ", FordWheel=" + FordWheel + "]";
	}

}
```

```java
package com.gs.ilp.logic;

public class FordWheel {

	private int id;
	private String nameOfTheWheel;

	public FordWheel(int id, String nameOfTheWheel) {
		this.id = id;
		this.nameOfTheWheel = nameOfTheWheel;
	}

	public FordWheel() {
	}

	public int getId() {
		return id;
	}

	public void setId(int idd) {
		id = idd;
	}

	public String getNameOfTheWheel() {
		return nameOfTheWheel;
	}

	public void setNameOfTheWheel(String nameOfTheWheel) {
		this.nameOfTheWheel = nameOfTheWheel;
	}

	@Override
	public String toString() {
		return "FordWheel [id=" + id + ", nameOfTheWheel=" + nameOfTheWheel + "]";
	}

}
```

```java
package com.gs.ilp.logic;

public class MakeCar {
	public static void main(String[] args) {
//
//		FordWheel fordWheel = new FordWheel(90, "Ford's Tyre");
//		Car genericCar = new Car(1, fordWheel);
//		System.out.print(figo);
		
		
		MarutiWheel marutiWheel = new MarutiWheel(90, "Maruti's Tyre");
		Car genericCar = new Car(1, marutiWheel);
		System.out.print(genericCar);
	}

}
```

```java
package com.gs.ilp.logic;

public class MarutiWheel {

	private int id;
	private String nameOfTheWheel;

	public MarutiWheel(int id, String nameOfTheWheel) {
		this.id = id;
		this.nameOfTheWheel = nameOfTheWheel;
	}

	public MarutiWheel() {
	}

	public int getId() {
		return id;
	}

	public void setId(int idd) {
		id = idd;
	}

	public String getNameOfTheWheel() {
		return nameOfTheWheel;
	}

	public void setNameOfTheWheel(String nameOfTheWheel) {
		this.nameOfTheWheel = nameOfTheWheel;
	}

	@Override
	public String toString() {
		return "MarutiWheel [id=" + id + ", nameOfTheWheel=" + nameOfTheWheel + "]";
	}

}
```

### Right:

```java
package com.gs.ilp.logic;

public interface Wheel {

}
```

```java
public class MarutiWheel implements Wheel {
.....
.....
.....
}
```

```java
public class FordWheel implements Wheel {
.....
.....
.....
}
```

```java
package com.gs.ilp.logic;

public class Car {
	private int carId;
	private Wheel wheel;

	public Car() {
	}

	public Car(int carId, Wheel wheel) {
		this.carId = carId;
		this.wheel = wheel;
	}

	@Override
	public String toString() {
		return "Car [carId=" + carId + ", wheel=" + wheel + "]";
	}

}
```

```java
package com.gs.ilp.logic;

public class MakeCar {
	public static void main(String[] args) {

		Wheel fordWheel = (Wheel) new FordWheel(90, "Ford's Tyre");

		Car genericCar = new Car(1, fordWheel);
		System.out.println(genericCar);

		Wheel marutiWheel = (Wheel) new MarutiWheel(90, "Maruti's Tyre");
		Car genericCar1 = new Car(1, marutiWheel);
		System.out.println(genericCar1);
	}

}
```

### ServiceFactory :

```java
package com.gs.ilp.logic;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ServiceFactory {

	public static Object getInstance(Class classType) {

		try {

			File fXmlFile = new File("D:/factotybinding.xml");
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(fXmlFile);

			// optional, but recommended
			// read this -
			// http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
			doc.getDocumentElement().normalize();

			System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

			NodeList nList = doc.getElementsByTagName("bean");

			System.out.println("----------------------------");

			for (int temp = 0; temp < nList.getLength(); temp++) {

				Node nNode = nList.item(temp);

				System.out.println("\nCurrent Element :" + nNode.getNodeName());

				if (nNode.getNodeType() == Node.ELEMENT_NODE) {

					Element eElement = (Element) nNode;
					if (classType.getName().equalsIgnoreCase(eElement.getAttribute("class"))) {

						System.out.println("bean id : " + eElement.getAttribute("id"));
						System.out.println("class  : " + eElement.getAttribute("class"));

						Constructor c = classType.getDeclaredConstructor();
						c.setAccessible(true); // solution
						Object obj = c.newInstance();

						// Wheel wheel = (Wheel)
						// Class.forName(eElement.getAttribute("class")).newInstance();

						NodeList nListd = (NodeList) eElement.getElementsByTagName("property");
						for (int temp1 = 0; temp1 < nListd.getLength(); temp1++) {
							Node nNode1 = nListd.item(temp1);
							if (nNode1.getNodeType() == Node.ELEMENT_NODE) {

								Element eElement1 = (Element) nNode1;

								String field = String.valueOf(eElement1.getAttribute("name"));
								String value = String.valueOf(eElement1.getAttribute("value"));

								System.out.println("name :" + field);

								Field[] fields = classType.getDeclaredFields();
								String fieldReturned = checkAndReturnFieldName(fields, field);
								fieldReturned = fieldReturned.substring(0, 1).toUpperCase()
										+ fieldReturned.substring(1);
								Class type = checkAndReturnFieldType(fields, field);

								try {
									Method method = obj.getClass().getMethod("set" + fieldReturned, type);
									if (isNumeric(value)) {
										int val = Integer.parseInt(value);
										method.invoke(obj, val);
									} else {

										method.invoke(obj, value);
									}
								} catch (Exception ex) {
									ex.printStackTrace();
								}

							}
						}

						return obj;
					}

				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private static String checkAndReturnFieldName(Field[] fields, String field) {
		for (Field f : fields) {
			if (String.valueOf(f.getName()).equals(field)) {
				return field;
			}
		}
		return null;
	}

	private static Class checkAndReturnFieldType(Field[] fields, String field) {
		for (Field f : fields) {
			if (String.valueOf(f.getName()).equals(field)) {
				return f.getType();
			}
		}
		return null;
	}

	public static boolean isNumeric(String str) {
		for (char c : str.toCharArray()) {
			if (!Character.isDigit(c))
				return false;
		}
		return true;
	}
}

```

```java
package com.gs.ilp.logic;

public class MakeCar {
	public static void main(String[] args) {

		Wheel fordWheel = (Wheel) ServiceFactory.getInstance(FordWheel.class);

		Car genericCar = new Car(1, fordWheel);
		System.out.println(genericCar);

		Wheel marutiWheel = (Wheel) ServiceFactory.getInstance(MarutiWheel.class);
		Car genericCar1 = new Car(1, marutiWheel);
		System.out.println(genericCar1);
	}

}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gyansetu-core-java-for-java.gitbook.io/project/design-patterns/di.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
