Spring

2가지 싱글톤 bean등록 방법 @Configuration와 @Component

point_Man 2023. 2. 12. 19:43

방법1. 수동 빈 등록방법

@Configuration은 스프링 컨테이너에 bean객체를 싱글톤방식으로 등록해준다.

기본으로 싱글톤 방식을 제공하고 필요에 따라 설정할 수 있다.

@Configuration @Bean을 사용하여 빈을 스프링 컨테이너에 등록하였다. 

@Configuration
public class BeanCreate {

    @Bean
    public String bean1(){
        return new beanImpl().bean1();
    }
    @Bean
    public String bean2(){
        return new beanImpl().bean1();
    }
    @Bean
    public String bean3(){
        return new beanImpl().bean1();
    }
    @Bean
    public String bean4(){
        return new beanImpl().bean2();
    }
    @Bean
    public String bean5(){
        return new beanImpl().bean2();
    }
}

방법2. 자동 빈 등록방법

@Componet 애노테이션을 사용하면 스프링이 자동으로 bean을 등록해준다.

하지만 아래 코드를 보면 @Componet를 찾아 볼 수가 없다.

그 이유는 @Service 애노테이션을 들어가보면 @Component를 포함하고 있기 때문이다.

이런한 종류의 애노테이션이 존재한다 @Controller, @Repository @Service 등등은 내부에 @Component를 포함하여

자동으로 컨테이너에 bean을 등록해준다

@Service
public class beanImpl implements bean{

    @Override
    public String bean1(){
        System.out.println("bean1");
        return "bean1";
    }

    @Override
    public String bean2() {
        System.out.println("bean2");
        return "bean2";
    }

    @Override
    public String bean3() {
        return "bean3";
    }

    @Override
    public String bean4() {
        return "bean4";
    }

    @Override
    public String bean5() {
        return "bean5";
    }
}

 

 

/**
 * Indicates that an annotated class is a "Service", originally defined by Domain-Driven
 * Design (Evans, 2003) as "an operation offered as an interface that stands alone in the
 * model, with no encapsulated state."
 *
 * <p>May also indicate that a class is a "Business Service Facade" (in the Core J2EE
 * patterns sense), or something similar. This annotation is a general-purpose stereotype
 * and individual teams may narrow their semantics and use as appropriate.
 *
 * <p>This annotation serves as a specialization of {@link Component @Component},
 * allowing for implementation classes to be autodetected through classpath scanning.
 *
 * @author Juergen Hoeller
 * @since 2.5
 * @see Component
 * @see Repository
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}

 

 

 

싱글톤 패턴

스프링은 기본적으로 bean을 싱글톤으로 등록한다.

싱글톤은 단 하나의 객체를 생성하고 그 객체를 공유한다.

그 객체가 필요한 어떤 요청이든 단 하나의 객체 주소를 참조하여 사용한다.

그렇기 때문에 메모리에 불필요한 낭비를 막을 수 있다. 

 

등록된 bean을 조회해 보면 아래와 같이 중복 없이 생성 된 것을 볼 수 있다.

이것을 싱글톤 방식으로 객체를 중복 생성 하지않고 객체를 공유하여 사용한다