Skip to content

step 2 DI 컨테이너 구현하기(힌트) #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: newvelop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.interface21.beans.factory.config;

public class BeanDefinitionImpl implements BeanDefinition {
public class DefaultBeanDefinition implements BeanDefinition {
private String beanClassName;
private Class<?> type;

public BeanDefinitionImpl(String beanClassName, Class<?> type) {
public DefaultBeanDefinition(String beanClassName, Class<?> type) {
this.beanClassName = beanClassName;
this.type = type;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

import com.interface21.beans.BeanUtils;
import com.interface21.beans.factory.config.BeanDefinition;
import com.interface21.beans.factory.config.BeanDefinitionImpl;
import com.interface21.beans.factory.config.MethodBeanDefinitionImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

public class BeanInjector {
private final Logger logger = LoggerFactory.getLogger(BeanInjector.class);

private Map<String, BeanDefinition> beanDefinitionMap;

public BeanInjector(Map<String, BeanDefinition> beanDefinitionMap) {
Expand Down Expand Up @@ -55,20 +58,7 @@ private void generateBeanFromConstructor(
// TODO 일단은 생성자가 하나만 있다고 가정하는데 여러개 있는걸 다음스텝으로
Constructor<?> constructor = BeanFactoryUtils.getInjectedConstructor(targetClass);
if (constructor == null) {
try {
objectByClass.put(
targetClass,
targetClass.getDeclaredConstructor().newInstance()
);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
createInstanceWithoutConstructor(targetClass, objectByClass);
return;
}

Expand All @@ -77,12 +67,26 @@ private void generateBeanFromConstructor(
instantiateConstructor(
constructor,
objectByClass,
visited,
beanDefinition
visited
)
);
}

private void createInstanceWithoutConstructor(
Class<?> targetClass,
Map<Class<?>, Object> objectByClass
) {
try {
objectByClass.put(
targetClass,
targetClass.getDeclaredConstructor().newInstance()
);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
logger.error(e.getMessage(), e);
}
}


private void generateBeanFromMethod(
Map<Class<?>, Object> objectByClass,
BeanDefinition beanDefinition,
Expand All @@ -99,11 +103,10 @@ private void generateBeanFromMethod(
private Object instantiateConstructor(
Constructor<?> constructor,
Map<Class<?>, Object> objectByClass,
Set<BeanDefinition> visited,
BeanDefinition targetBeanDefinition
Set<BeanDefinition> visited
) {
Class<?>[] parameterTypes = constructor.getParameterTypes();
List<Object> args = new ArrayList();
List<Object> args = new ArrayList<>();
for (Class<?> clazz : parameterTypes) {
Object object = getBean(clazz, objectByClass);
if (object == null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.interface21.beans.factory.support;

import com.interface21.beans.factory.config.BeanDefinition;
import com.interface21.beans.factory.config.BeanDefinitionImpl;
import com.interface21.beans.factory.config.DefaultBeanDefinition;
import com.interface21.beans.factory.config.MethodBeanDefinitionImpl;
import com.interface21.context.annotation.Bean;
import com.interface21.context.stereotype.Component;
Expand Down Expand Up @@ -53,7 +53,7 @@ private void insertBeanDefinitionFromClass(
) {
for (Class<?> clazz : beanClasses) {
String name = decapitalize(clazz.getName());
BeanDefinition beanDefinition = new BeanDefinitionImpl(
BeanDefinition beanDefinition = new DefaultBeanDefinition(
clazz.getName(),
clazz
);
Expand All @@ -76,13 +76,10 @@ private void insertBeanDefinitionFromMethod(
}

private String decapitalize(String string) {
if (string == null || string.length() == 0) {
if (string == null || string.isBlank()) {
return string;
}

char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);

return new String(c);
return Character.toLowerCase(string.charAt(0)) + string.substring(1);
}
}