Spring 의 단일 모델 바 텀 학습 노트 실현

단일 사례 모델 도 생 성 모델 에 속 합 니 다. 단일 사례 라 는 것 은 말 그대로 하나의 인 스 턴 스 를 말 합 니 다. 즉, 하나의 인 스 턴 스 만 있 도록 하 는 것 입 니 다.단일 모드 는 다음 과 같은 특징 이 있 습 니 다. ① 단일 클래스 는 하나의 인 스 턴 스 만 있 을 수 있 습 니 다 ② 단일 클래스 는 자신의 유일한 인 스 턴 스 를 만들어 야 합 니 다 ③ 단일 클래스 는 모든 다른 대상 에 게 이 인 스 턴 스 를 제공 해 야 합 니 다. 다음은 간단 한 단일 모드 의 예 를 쓰 겠 습 니 다.
package spring;

public class SingletonWW {
    private static final SingletonWW instance=new SingletonWW();    
    //             
    private SingletonWW(){}    
    //          
    public static SingletonWW getInstance(){    
        return instance;    
    }
}

이 클래스 가 불 러 올 때 정적 변수 인 스 턴 스 가 초기 화 되 는 것 을 알 수 있 습 니 다. 이때 이러한 사유 구조 함수 가 호출 되 었 습 니 다. 이때 단일 사례 류 의 유일한 인 스 턴 스 가 생 성 되 었 습 니 다. 주의해 야 할 것 은 구조 함수 가 사유 이기 때문에 이 클래스 는 계승 되 지 못 하고 하나의 쓰기 도 실현 할 수 있 습 니 다.
package spring;

public class SingletonWW {
    private static SingletonWW instance = null;    
    //             
    private SingletonWW(){}    
    //          
    public synchronized static SingletonWW getInstance(){    
        if(instance==null){    
            instance = new SingletonWW();    
        }    
        return instance;   
    }
}

이러한 표기 법 과 첫 번 째 차 이 는 인 스 턴 스 가 직접적 으로 예화 되 지 않 고 정적 공장 방법 이 호출 될 때 만 이 루어 진 것 이 며 정적 공장 방법 에 대해 동기 화 를 사용 하여 다 중 스 레 드 병행 환경 을 처리 하 는 것 이다.이 두 가지 작법 에는 또 두 가지 매우 재 미 있 는 이름 이 있다. 첫 번 째 는 굶 주 린 한식 단 례, 두 번 째 는 게 으 른 한식 단 례 라 고 한다.굶 주 린 사람 식 사례 는 자신 이 로드 될 때 자신 을 예화 시 키 고 자원 이용 효율 적 인 측면 에서 볼 때 게 으 른 사람 식 사례 보다 조금 떨어진다.하지만 속도 와 반응 시간 측면 에 서 는 게으름뱅이 보다 조금 낫다.그러나 안 타 깝 게 도 게으름뱅이 식 단일 사례 도 물 려 받 을 수 없다.우 리 는 앞의 두 가지 단일 사례 가 계승 되 지 못 하 는 단점 을 극복 하고 우 리 는 또 다른 특수 화 된 단일 사례 모델 을 사용 할 수 있다. 그것 은 단일 레 지 스 트 라 고 불 린 다.
package spring;

import java.util.HashMap;

public class SingletonWW {
    private static HashMap registry = new HashMap();   
    public SingletonWW(){}    
    //          
    public synchronized static SingletonWW getInstance(String name){    
        if(name != null) {
            if(registry.get(name) == null) {
                try {
                    registry.put(name, Class.forName(name).newInstance());
                } catch(Exception ex) {
                    ex.printStackTrace();
                }  
            } else {
                return (SingletonWW) registry.get(name);
            }
        }
        return null;   
    }
}

다음은 Spring 의 단일 사례 를 살 펴 보 겠 습 니 다. Spring 용기 에서 특정한 인 스 턴 스 를 얻 으 려 고 할 때 기본 적 인 상황 에서 Spring 은 단일 모드 로 만 듭 니 다.
(Spring 2.0 만 지원)
상기 세 가지 대상 을 만 드 는 방식 은 똑 같 습 니 다. 용 기 는 모두 고객 에 게 Date 류 의 단일 예 를 되 돌려 줍 니 다.그렇다면 기본 적 인 단일 모드 를 사용 하고 싶 지 않다 면 매번 요청 할 때마다 새로운 대상 을 얻 고 싶다 면 어떻게 해 야 합 니까?간단 합 니 다. scope 속성 값 을 prototype (원형) 으로 설정 하면 됩 니 다.
위 설정 정 보 를 통 해 Spring 은 클 라 이언 트 에 게 매번 새로운 대상 인 스 턴 스 를 되 돌려 줍 니 다.
그렇다면 Spring 은 단 례 의 밑바닥 실현 에 대해 굶 주 린 한식 단 례 인가 게으름뱅이 식 단 례 인가?허허, 다 아니 야.Spring 프레임 워 크 가 단일 사례 에 대한 지원 은 단일 레 지 스 트 리 지 방식 으로 이 루어 집 니 다. 소스 코드 는 다음 과 같 습 니 다.
    public abstract class AbstractBeanFactory implements ConfigurableBeanFactory{  
       /** 
        *    Bean     ,             
        */  
       private final Map singletonCache=new HashMap();  
       public Object getBean(String name)throws BeansException{  
           return getBean(name,null,null);  
       }  
    ...  
       public Object getBean(String name,Class requiredType,Object[] args)throws BeansException{  
          //    Bean name    ,     Bean name      (     )  
          String beanName=transformedBeanName(name);  
          Object bean=null;  
          //           
          Object sharedInstance=null;  
          //          ,         ,            
          synchronized(this.singletonCache){  
             sharedInstance=this.singletonCache.get(beanName);  
           }  
          if(sharedInstance!=null){  
             ...  
             //       Bean    
             bean=getObjectForSharedInstance(name,sharedInstance);  
          }else{  
            ...  
            //  Bean     
            RootBeanDefinition mergedBeanDefinition=getMergedBeanDefinition(beanName,false);  
             ...  
            //  Bean    ,                         
            //  
            //
            if(mergedBeanDefinition.isSingleton()){  
               synchronized(this.singletonCache){  
                //           
                 sharedInstance=this.singletonCache.get(beanName);  
                 if(sharedInstance==null){  
                    ...  
                   try {  
                      //    Bean    
                      sharedInstance=createBean(beanName,mergedBeanDefinition,args);  
                      //        Bean    
                       addSingleton(beanName,sharedInstance);  
                   }catch (Exception ex) {  
                      ...  
                   }finally{  
                      ...  
                  }  
                 }  
               }  
              bean=getObjectForSharedInstance(name,sharedInstance);  
            }  
           //      , prototpye,         Bean    
           //  
           else{  
              bean=createBean(beanName,mergedBeanDefinition,args);  
           }  
    }  
    ...  
       return bean;  
    }  
    }   

방금 원본 코드 에서 여러분 이 진정 으로 기억 해 야 할 것 은 Spring 이 bean 인 스 턴 스 를 만 드 는 것 은 하나의 레 지 스 트 리 트 방식 으로 이 루어 진 것 입 니 다. 이 레 지 스 트 리 트 의 캐 시 는 HashMap 대상 입 니 다. 설정 파일 의 설정 정보 가 하나의 예 를 사용 하지 않 으 면 Spring 은 새로운 인 스 턴 스 방식 으로 대상 인 스 턴 스 를 되 돌려 줍 니 다.
 
Spring 의 AOP, IOC, ORM 에 관심 이 있다 면 제 가 쓴 경량급 프레임 워 크 swift - framework 프레임 워 크 를 보 세 요. 간단 하고 알 기 쉬 우 며 사용 할 수 있 습 니 다.스프링 의 기본 핵심 기능 을 담 았 다.
Git 주소:https://github.com/zwwjava/swift-framework
다음으로 전송:https://www.cnblogs.com/zhaww/p/8467196.html

좋은 웹페이지 즐겨찾기