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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.