2013-06-21 4 views
0

동적 프록시가 AOP에 사용됨을 알고있었습니다.
그러나 게으른로드에도 사용할 수 있습니다.
기사의 다음 예제는이를 입증하기위한 것입니다.
그러나 이것이 일반적인 접근 자와 다른 점과 정확히 무엇이 '느슨하게'로드되고 있는지 이해하지 못합니까?
작성자가 지연로드로 의도 한 내용을 이해하는 데 도움이되는 정보가 있습니다. 이 다음에서 어떤 다를 수 woul 어떻게동적 대 지연로드

private Category tupleToObject(Serializable[] tuple) {  
    Category category = new Category((String)tuple[1], 
     (YearMonthDay) tuple[2]); 
     category.setId((Long) tuple[0]); 
    category.setParent(lazyGet((Long) tuple[3])); 
    return category; 
} 


protected CategoryItf lazyGet(Long id) {  
    if (id == null) {   
    return null;  
    }  
    return (CategoryItf)Proxy.newProxyInstance( 
     CategoryItf.class.getClassLoader(), 
     new Class[] { CategoryItf.class }, 
     new LazyLoadedObject() { 
      protected Object loadObject() { 
       return get(id); 
      }   
    }); 
} 


public abstract class LazyLoadedObject implements InvocationHandler { 
    private Object target; 
    public Object invoke(Object proxy, 
         Method method, Object[] args) 
        throws Throwable { 
     if (target == null) { 
      target = loadObject(); 
     } 
     return method.invoke(target, args); 
    } 
    protected abstract Object loadObject(); 
} 

: 필요한 경우 두 경우 모두

private Category tupleToObject(Serializable[] tuple) {  
    Category category = new Category((String)tuple[1], 
     (YearMonthDay) tuple[2]); 
     category.setId((Long) tuple[0]); 
    category.setParent(get((Long) tuple[3])); 
    return category; 
} 

은 부모 만 생성됩니다.

private Object target; 
public Object invoke(Object proxy, 
        Method method, Object[] args) 
       throws Throwable { 
    if (target == null) { 
     target = loadObject(); 
    } 

당신은 상관없이 당신이 동일한 개체마다 시간을 얻을이 코드를 호출하는 방법을 여러 번 볼 수 있습니다 :

답변

0

다음 코드는 "게으른"구현한다. 그래서, 사실 그것은 싱글 톤입니다. 그러나 그것은 프로그램의 시작 부분에 만들어지는 것이 아니라 처음으로 필요할 때만 만들어집니다. 이것은 "게으른"의미입니다. 따라서으로 분류 부모를 채 웁니다 tupleToObject()를 호출

private Category tupleToObject(Serializable[] tuple) {  
    Category category = new Category((String)tuple[1], 
     (YearMonthDay) tuple[2]); 
     category.setId((Long) tuple[0]); 
    category.setParent(get((Long) tuple[3])); 
    return category; 
} 

get() 방법은 직접 실제 객체를 반환합니다 :이 코드에서

:

+0

내 질문에 더 초점을 맞추기 위해 편집되었습니다. – IUnknown

+0

AlexR, 나는 내 대답을 얻지 못하고 새로운 것으로 질문을 제기 할 수 없다. 지금은 너무 낮아서 여기서 도와 줘. http://stackoverflow.com/questions/17220399/cannot-instantiate-a -class-using-a-button –

0

것은 제가 코드를 이해하는 방법에서 설명하려고하자 실제 개체. 이 코드에서

동안 다음 lazyGet() 방법은 실제로 프록시 (NOT 실제 객체)을 반환

private Category tupleToObject(Serializable[] tuple) {  
    Category category = new Category((String)tuple[1], 
     (YearMonthDay) tuple[2]); 
     category.setId((Long) tuple[0]); 
    category.setParent(lazyGet((Long) tuple[3])); 
    return category; 
} 

. 프록시에서 첫 번째 메서드 호출은 실제로 개체로드를 트리거합니다. 여기서 프록시는 지연에 실제로 사용될 때까지 실제 오브젝트의 실제 검색 즉, 지연로드에 사용됩니다.

희망 사항. 질문에 대한 답변입니다.

+0

심지어 'get'은 첫 번째 호출에서만 인스턴스를 반환 할 것인가? 그래서 다른 점은 무엇입니까? 동적 로딩 비트를 이해할 수 있습니다. 그러나 어떻게 '게으른'것이 여기에 들어 맞지는 않습니다. – IUnknown

+0

'tupleToObject()'->'get()'->'로드 된 객체'. 이것을 'tupleToObject()'->'lazyGet()'->'PROXY'와 비교하십시오. 'PROXY'에서 어떤 메소드를 호출하는 코드가 없다면, 실제 객체는 결코로드되지 않을 것입니다. 코드에서 PROXY 즉 'PROXY.xxx'에 액세스하면'PROXY' -> 'loaded object'가 표시됩니다. IMHO에서 직접로드되지 않았으므로 _lazy_라고합니다. – user2507946