클래스 맴버 필드(변수)에 Annotation(어노테이션)를 적용하여 외부에서 초기화하는 방법(인젝션)에 대해 알아보겠습니다.
1. 이전 "TestClass.java"에 클래스 맴버 필드(변수)를 추가합니다.
private String name;
2. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭합니다.
"New Annotation Type"창에서 "Name"에 "TestAnnStringInit"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Field"를 선택하고 "Finish"버튼을 클릭합니다.
문자열에 주입(인젝션)하기 위해 문자열인 "value"를 추가합니다. 기본값으로 ""(공백)를 설정합니다.
public String value() default "";
3. "TestClass.java"의 "name" 맴버 필드(변수)에 "@TestAnnStringInit"어노테이션을 적용합니다.
@TestAnnStringInit("외부에서 값을 주입했습니다.")
private String name;
어노테이션을 적용하면 "The value of the field TestClass.name is not used"라는 자바 문제(Java Problem)이 없어집니다.
새로운 방법으로 "name" 맴버 필드(변수)에 대한 "Getter/Setter"메서드를 추가하겠습니다.
이클립스 메뉴 [Source > Generate Getters and Setters...]를 선택합니다.
"Generate Getters and Setters"에서 "name" 맴버 필드(변수)를 선택하고 "Generate"버튼을 클릭합니다.
4. 테스트를 위해 "TestRootController.java"의 "test2"메소드에 추가합니다.
"TestClass" 클래스를 찾아서 인스턴스를 생성합니다.
Class<?> finedClass = Class.forName("com.home.project.test2.service.TestClass");
TestClass controllerInstance = (TestClass)finedClass.newInstance();
"TestClass" 클래스에서 선언된 맴버 필드(변수) 리스트를 가져옵니다.
Field[] fields = finedClass.getDeclaredFields();
for (Field field : fields) {
}
가져온 맴버 필드(변수)에서 "@TestAnnStringInit"어노테이션이 있고 타입이 "String"인지 확인합니다.
TestAnnStringInit testAnnStringInit = field.getAnnotation(TestAnnStringInit.class);
if (null != testAnnStringInit && String.class == field.getType()) {
}
맴버 필드(변수)에 접근할 수 있게 설정하고 "set"메소드를 통해 값을 주입(인젝션)합니다.
field.setAccessible(true);
String names = testAnnStringInit.value();
field.set(controllerInstance, names);
생성된 클래스 인스턴스에서 메소드를 통해 값을 가져옵니다.
System.out.println("name : " + controllerInstance.getName());
전체 소스입니다.
try {
Class<?> finedClass = Class.forName("com.home.project.test2.service.TestClass");
TestClass controllerInstance = (TestClass)finedClass.newInstance();
Field[] fields = finedClass.getDeclaredFields();
for (Field field : fields) {
TestAnnStringInit testAnnStringInit = field.getAnnotation(TestAnnStringInit.class);
if (null != testAnnStringInit && String.class == field.getType()) {
field.setAccessible(true);
String names = testAnnStringInit.value();
field.set(controllerInstance, names);
}
}
System.out.println("name : " + controllerInstance.getName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
5. "Servers"탭에서 "tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다.
웹 브라우저에서 "http://localhost:8080/test2/test2.do"를 입력합니다.
"Console"탭을 클릭하면 주입(인젝션)된 "name"값을 확인할 수 있습니다.
[Console]
name : 외부에서 값을 주입했습니다.
추가 테스트로 랜덤으로 이름을 주입(인젝션)해주는 어노테이션을 생성하겠습니다.
6. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭하고 "name"은 "TestAnnRandomName"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Field"를 선택하고 "Finish"버튼을 클릭합니다.
랜뎜으로 주입(인젝션)하기 위해 문자열 배열인 "value"를 추가합니다. 기본값으로 {""}(공백배열)을 설정합니다.
public String[] value() default {""};
7. "TestClass.java"의 "name" 맴버 필드(변수)에 "@TestAnnStringInit"어노테이션을 적용합니다.
@TestAnnRandomName({"영희", "숙희", "정희"})
private String name;
8. 테스트를 위해 "TestRootController.java"의 "test2"메소드에 수정합니다.
"@TestAnnStringInit"어노테이션를 "@TestAnnRandomName"어노테이션으로 수정합니다.
TestAnnRandomName testAnnRandomName = field.getAnnotation(TestAnnRandomName.class);
"@TestAnnRandomName"어노테이션에서 문자열 배열을 가져와 랜덤으로 처리합니다.
String[] names = testAnnRandomName.value();
Random random = new Random();
int num = random.nextInt(names.length);
field.set(controllerInstance, names[num]);
생성된 클래스 인스턴스에서 메소드를 통해 랜덤으로 처리된 이름을 추가합니다.
modelAndView.addModel("name", controllerInstance.getName());
전체 소스입니다.
for (Field field : fields) {
TestAnnRandomName testAnnRandomName = field.getAnnotation(TestAnnRandomName.class);
if (null != testAnnRandomName && String.class == field.getType()) {
field.setAccessible(true);
String[] names = testAnnRandomName.value();
Random random = new Random();
int num = random.nextInt(names.length);
field.set(controllerInstance, names[num]);
}
}
modelAndView.addModel("name", controllerInstance.getName());
9. "Servers"탭에서 "tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다.
웹 브라우저에서 "http://localhost:8080/test2/test2.do"를 입력합니다.
새로고침할 때마다 이름이 변경됩니다.