복붙노트

[SPRING] 스프링 기본 범위는 싱글 톤인가 그렇지 않은가?

SPRING

스프링 기본 범위는 싱글 톤인가 그렇지 않은가?

기본적으로 spring default scope가 singleton이기 때문에 Spring이 아래에 보여지는 bean 환경 설정을위한 두 개의 객체를 생성하는 이유를 설명해 주시겠습니까?

Spring 구성은 다음과 같습니다.

<bean id="customer" class="jp.ne.goo.beans.Customer"> 
    <property name="custno" value="100"></property>
    <property name="custName" value="rajasekhar"> </property>
</bean>
<bean id="customer2" class="jp.ne.goo.beans.Customer"> 
    <property name="custno" value="200"></property> 
    <property name="custName" value="siva"></property> 
</bean>

해결법

  1. ==============================

    1.Spring의 기본 범위는 싱글 톤입니다. 싱글 톤이라는 것이 무엇을 의미하는지에 대한 아이디어는 스프링이 싱글 톤을 정의하는 방법과 일치하지 않습니다.

    Spring의 기본 범위는 싱글 톤입니다. 싱글 톤이라는 것이 무엇을 의미하는지에 대한 아이디어는 스프링이 싱글 톤을 정의하는 방법과 일치하지 않습니다.

    Spring에게 다른 id와 같은 클래스를 가진 두 개의 빈을 만들라고 말하면, 각각 하나의 범위를 가진 두 개의 빈을 얻는다. 모든 싱글 톤 스코프는 동일한 id를 가진 것을 참조 할 때 동일한 빈 인스턴스를 다시 얻는다는 것을 의미합니다.

    Spring 문서가 싱글 톤 범위를 정의하는 방법은 다음과 같습니다.

    싱글 톤 스코프는 동일한 id를 사용하면 같은 bean을 검색한다는 의미입니다. 동일한 클래스를 참조하는 두 개의 id가 없다는 것을 테스트하는 것은 맵을 bean으로 사용하는 방법에 영향을 미치며 BeanFactories로 프록시를 사용하면 복잡해집니다. 봄에 경찰에게 이것은 약간의 이익을위한 많은 작업을 필요로 할 것이고 대신 사용자가 자신이하는 일을 알기를 신뢰합니다.

    동일한 빈에 대해 두 개의 이름을 정의하는 방법은 별칭을 사용하는 것입니다.

    그래서 bean 환경에 이름을 추가하면 :

    <bean id="customer" name="customer2" 
        class="jp.ne.goo.beans.Customer">
    </bean>
    

    또는 다른 곳에서 정의 된 bean에 대한 별명을 작성하십시오.

    <alias name="customer" alias="customer2"/>
    

    "customer"와 "customer2"는 같은 bean 인스턴스를 참조 할 것이다.

  2. ==============================

    2.스프링 기본 범위는 싱글 톤이며 명시 적으로 범위를 프로토 타입으로 지정하지 않는 한 모든 인스턴스에 대해 하나의 객체를 만듭니다. 스프링 구성을 게시하지 않았습니다. 게시 해주십시오. 더 좋은 아이디어를 줄 것입니다.

    스프링 기본 범위는 싱글 톤이며 명시 적으로 범위를 프로토 타입으로 지정하지 않는 한 모든 인스턴스에 대해 하나의 객체를 만듭니다. 스프링 구성을 게시하지 않았습니다. 게시 해주십시오. 더 좋은 아이디어를 줄 것입니다.

  3. ==============================

    3.당신은 같은 클래스의 두 콩을 선언하고 있습니다. 그것은 동일하지 않습니다.

    당신은 같은 클래스의 두 콩을 선언하고 있습니다. 그것은 동일하지 않습니다.

    @Component("springTestClass")
    public class SpringTestClass{
         private int randomNumber = 0;
         public SpringTestClass(){
           randomNumber = new Random().nextInt(2000);
         }
    
         public int getRandomNumber(){
           return this.randomNumber;
         }
    
    }
    

    그리고이 콩을 두 곳에서 접근하려고 시도하면 숫자는 같을 것입니다. 그러나 당신이 한 일은 두 개의 빈을 만드는 것입니다.

    이 작동하는지 확인하려면 다음을 시도하십시오.

    public class Main{
       public static void main(String[] args){
         ApplicationContext ctx = ....;
         SpringTestClass testObject1 = (SpringTestClass)ctx.getBean("springTestClass");
         SpringTestClass testObject2 = (SpringTestClass)ctx.getBean("springTestClass");
    
        System.out.println(testObject1.getRandomNumber() == testObject2.getRandomNumber());
       }
    }
    

    이 코드는 동일한 인스턴스 인 경우 true를 반환해야합니다. 하지만 SpringTestClass에서는 @Scope ( "prototype") 주석을 추가 할 수 있습니다. 출력은 false가됩니다.

  4. ==============================

    4.다른 사람들이 언급 한 것처럼, 게시 한 코드에서 두 개의 빈을 만들어야합니다. 싱글 톤은 다음과 같이 정의됩니다 (Spring 문서 : Singleton Scope)

    다른 사람들이 언급 한 것처럼, 게시 한 코드에서 두 개의 빈을 만들어야합니다. 싱글 톤은 다음과 같이 정의됩니다 (Spring 문서 : Singleton Scope)

    이를 명확히하기 위해 "공유 인스턴스"의 의미는 위의 단락에 설명되어 있습니다.

    싱글 톤 빈이 생성되면 하나의 빈 객체 만이 인스턴스화되어 캐시됩니다. 이것은 bean 만 참조하며 bean이 어떤 클래스의 인스턴스가 될 수는 없습니다. 예를 들어,

    <bean id="myBean" class="myPackage.myClass" />
    
    <bean id="myOtherBean1 class="myPackage.myOtherClass1">
        <property name="beanReference1" ref="myBean" />
    </bean>
    <bean id="myOtherBean2 class="myPackage.myOtherClass2">
        <property name="beanReference2" ref="myBean" />
    </bean>
    

    이렇게 구성된 구성에서 "myOtherBean1"및 "myOtherBean2"는 동일한 "myBean"bean을 참조하므로 동일한 "myPackage.myClass"인스턴스를 갖습니다. 두 번째 "myPackage.myClass"빈을 추가하도록 코드를 변경하면 "myBean"과 구별됩니다.

    이것을 완전히 이해하려면 다른 스프링 범위 인 프로토 타입을 참조하십시오. Prototype Scope에 대한 Spring 문서에서 :

    즉, 위와 같은 스프링 XML을 사용하면 "myOtherBean1"과 "myOtherBean2"는 각각 "myBean"이라는 고유 한 사본을 받게되며 이는 여전히 "myPackage.myClass"의 인스턴스입니다.

  5. ==============================

    5.두 가지 다른 개념을 혼란스럽게합니다.

    두 가지 다른 개념을 혼란스럽게합니다.

    봄의 singleton이라는 단어는 빈 범위에 사용되며, 이는 빈이 전체 애플리케이션에 대해 단 한 번만 생성된다는 것을 의미합니다.

    싱글 톤의 일반적인 의미는 GOF 패턴을 나타냅니다. 클래스의 인스턴스가 하나만 존재한다는 것을 보장하는 객체 지향 패턴입니다 (적어도 classLoader의 범위 내에서).

  6. ==============================

    6.

    @Configuration
    public class AppConfig {
    
        @Bean
        public ClientService clientService1() {
            ClientServiceImpl clientService = new ClientServiceImpl();
            clientService.setClientDao(clientDao());
            return clientService;
        }
    
        @Bean
        public ClientService clientService2() {
            ClientServiceImpl clientService = new ClientServiceImpl();
            clientService.setClientDao(clientDao());
            return clientService;
        }
    
        @Bean
        public ClientDao clientDao() {
            return new ClientDaoImpl();
        }
    
    }
    
  7. from https://stackoverflow.com/questions/31629993/is-spring-default-scope-singleton-or-not by cc-by-sa and MIT license