관리 메뉴

ChangHoon's IT Blog

Spring 디자인 패턴- 싱글톤 패턴 본문

Spring

Spring 디자인 패턴- 싱글톤 패턴

Hoonss 2020. 1. 13. 12:56

싱글턴 패턴
-> 전역변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를
어디에서든지 참조할수 있는 패턴

 


예시) 기본방법
Thread-Safe 보장해야됨.

public class Singleton { 
  	private Singleton() { 
		System.out.println("Hello singleton!!"); 
    } 
    private static Singleton singleton = new Singleton(); 
    public static Singleton getInstance() {
    	return singleton; 
    } 
 }



LazyHolder 기법
-> 순수하게 자바만 사용하는 경우 인기있는 방법
getInstance() 메서드를 호출시 LazyHolder 클래스를 로딩하고 Singleton 객체를 초기화

public class Singleton { 
	private Singleton() { 
    	System.out.println("Hello singleton!!");
    }
    private static class LazyHolder 
    {
    	public static final Singleton INSTANCE = new Singleton(); 
    } 
    public static Singleton getInstance() { 
    	return LazyHolder.INSTANCE; 
        } 
    } 




-> 싱글톤 패턴으로 클래스 구현하게되면 new Singleton으로 객체를 생성할수 없다.
public static void main(String[] arge) {
Singleton singleton = Singleton.getInstance();
}

public static void main(String[] arge) 
{ 
	Singleton singleton = Singleton.getInstance(); 
} 

 


------------Spring 환경에서 싱글톤 적용--------------
spring 개발환경에서는 static 기반의 싱글톤을 직접 구현하는것을 지양.
spring에서는 Bean 객체를 싱글톤 범위로 생성한다.
static 싱글톤과 다른 점은 Spring Container 안에서만 사용할수 있다.

@Component // Spring(IOC) Container에 Bean을 등록하도록 메타데이터 기입. 
public class Singleton { 

}

 

또는 
<bean id="singleton" class="com.example.demo.Singleton"/>

 

사용할 때는
@Autowired
private Singleton singleton;

 

 

-------------추가 정보------------------

* @Bean VS @Component

1.@Configuration
Configuration 어노테이션은 스프링 IOC Container 에게 해당 클래스를 Bean 구성 Class임을 
알려주는 것이다.

2. @Bean VS @Component
둘다 Spring(IOC) Container 에 Bean을 등록하도록 하는 메타데이터를 기입하는 어노테이션이다.
두개의 차이점은 용도가 다르다는 것이다.

@Bean
Bean 어노테이션의 경우 개발자가 직젭 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려
할 때 사용된다.

@Configuration
public class ApplicationConfig { 
	@Bean(name="myarray") // name이라는 값으로 직접 id값을 설정. 
    public ArrayList array(){
    	return new ArrayList(); 
    } 
  } 


Bean어노테이션에 name이라는 값을 사용하면 id로 Bean을 등록할수 있다.

@Component
Component 어노테이션의 경우 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션.

예제)

@Component 
public class student { 
	public Student() { 
    	System.out.println("hi"); 
     } 
 } 

 

 

Comments