ChangHoon's IT Blog
Spring 디자인 패턴- 싱글톤 패턴 본문
싱글턴 패턴
-> 전역변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를
어디에서든지 참조할수 있는 패턴
예시) 기본방법
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");
}
}