Tag Archives: java

[SpringIDE] 다중 컨텍스트 XML 관리시 다른 파일의 참조 문제점

 

SpringIDE를 설치한 상태에서 프로젝트를 진행 하다 보면 별 문제도 없는데 자꾸 경고가 뜨곤 한다. 그당시에는 무시를 하였지만 나의 결벽증 개발자 무의식이 나타나 이것을 잡기로 하였다.

그 경우는 바로 다음과 같은 경우이다.

datasource-context.xml

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
  <property name="dataSource" ref="dataSource"/>
</bean>

dao-context.xml

<bean id="userWidgetDao" class="com.twinkr.widget.dao.UserWidgetDataDaoImpl" >
  <property name="sqlMapClient" ref="sqlMapClient" />
</bean>

이경우 dao-context.xml의 두번째 줄에는 다음과 같은 경고가 발생한다.

“Referenced bean ‘sqlMapClient’ not found”

하지만 실행해보면 전혀 문제없음을 알 수 있다. 어차피 xml들은 모두 통합 관리되는건데 어쩌란 말인가?
SpringIDE만 꺼보면 바로 에러가 사라진다. SpringIDE가 문제라고 치부한다는것인데…

Project → Properties → Spring → Bean Support → Config Sets

에 들어가서 묶을 필요가 있는 xml파일들을 한데 묶어 Config Set으로 지정해 주자. 묶인 파일들 사이에는 어떠한 공유도 가능하다는 암묵적인 약속이 체결된다. 물론 SpringIDE맘데로; 그리고 서로 마음껏 끌어다 써도 에러는 발생하지 않는다.

Virtual Method Invoke

Virtual Method Invoke를 이용하면 무엇을 실행하게 될지 알수 없는 동적 바인딩인 메서드를 실행할수 있다.

이를 통해 웹서비스에서 많이 볼수 있는 플러그인이라던가, 위젯을 손쉽게 구현할 수 있다.

[code]import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class DynamicClassLoader {
  public Object execute(Class clazz, String runner, Object… args)
  throws ClassNotFoundException, SecurityException,
  InstantiationException, IllegalAccessException {

    Method[] methods = clazz.getMethods();

    try {
      for (Method method : methods) {
        if (method.getName().equals(runner)) {
          return method.invoke(this, args);
        }
      }
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
    return null;
  }
}[/code]

첫번째 인자로 읽어들일 클래스를 넣어주고, 두번째 인자로 수행할 메서드명을 입력한다.

그 이후에는 인자값들을 넣어주면 된다. 가변인자를 사용한다.

가변인자와 발전된 for문 형식때문에 위의 소스는 JDK 5이상에서만 작동한다.

invoke를 통해서 마치 자신이 해당 클래스에서 호출한 메서드인것처럼 작동하게 된다.