Skip to content
Snippets Groups Projects
Commit 382c396e authored by bajuglair's avatar bajuglair
Browse files

NewInstance

parent eda5b267
Branches main
No related tags found
No related merge requests found
package com.bajuglair.dicontainer;
import com.bajuglair.dicontainer.annotation.Autowired;
import com.bajuglair.dicontainer.object.Equipment;
import com.bajuglair.dicontainer.object.Furnace;
import com.bajuglair.dicontainer.object.Relation;
import java.nio.file.attribute.FileTime;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Container {
public <T> T newInstance(Class<T> dependency){
return new T();
Map<Class<?>, Object> map;
List<Relation> relations = new ArrayList<>();
Relation getRelationBetween(Class<?> dependency, Class<?> abstraction){
for(Relation r: relations){
if(r.getDependency() == dependency && r.getDependency() == abstraction){
return r;
}
}
return null;
}
void register(Class<?> dependency, Class<?> abstraction) {
map.put(dependency, abstraction);
}
public Equipment bind(Class<Furnace> equipmentClass) {
return new Furnace();
Object newInstance(Class<?> dependency) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Field[] fields = dependency.getFields();
Class<?> instance = (Class<?>) dependency.getConstructor().newInstance();
for(Field field : fields){
if(field.isAnnotationPresent(Autowired.class)){
// Already exist
// If not, create it
relations.add(new Relation(dependency, field.getClass(), new field.));
// Réaliser l'injection par setter
field.set(instance, field.getType().getConstructor().newInstance());
}
}
// if(getRelationBetween(dependency) == null){
// map.put(dependency, dependency.getDeclaredConstructor().newInstance());
// }
//
// return map.get(dependency.getClass());
}
}
......@@ -13,13 +13,11 @@ import lombok.Data;
@Data
@Component
public class Restaurant {
FridgeFactory fridgeFactory;
FurnaceFactory furnaceFactory;
private FridgeFactory fridgeFactory;
private FurnaceFactory furnaceFactory;
@Autowired
Equipment fridge;
@Autowired
Furnace furnace;
private Equipment fridge;
......
package com.bajuglair.dicontainer.object;
public class Relation {
private Class<?> dependency;
private Class<?> abstraction;
private Object instance;
public Class<?> getDependency(){
return dependency;
}
public Class<?> getAbstraction(){
return abstraction;
}
public Object getInstance(){
return instance;
}
}
......@@ -8,27 +8,27 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
public class InjectorTest {
Injector injector;
Container injector;
@BeforeEach
void createInjector() {
injector = new Injector();
injector = new Container();
}
@Test
@DisplayName("Test simple injection")
void testSimpleInjection() {
try {
injector.bind(Equipment.class).to(Furnace.class);
injector.bind(Equipment.class).to(Fridge.class);
injector.register(Equipment.class, Furnace.class);
NewsService newsService = injector.newInstance(NewsService.class);
assertTrue(newsService.getHttpService() instanceof DarkWebHttpService);
} catch (BindingException e) {
fail("Test fail because of binding error. " + e.getMessage());
Restaurant restaurant = (Restaurant) injector.newInstance(Restaurant.class);
assertTrue(restaurant.getFurnace instanceof DarkWebHttpService);
} catch(Exception e){
fail("Test fail because of binding error. " );
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment