Bean Scope

빈의 범위

객체를 만들때 컨테이너가 객체를 한번만 호출하는지, 객체를 호출받을때마다 생성하는지를 정의

singleton, prototype을 주로 많이 쓰임

Singleton : 객체를 한번만 생성 (동일성을 보장)

<bean id="A" class="kr.co.fastcampus.cli.A" scope="singleton"></bean>

prototype : 객체를 계속 새로 만듬

<bean id="A" class="kr.co.fastcampus.cli.A" scope="prototype"></bean>

Scope Description
singleton (Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
prototype Scopes a single bean definition to any number of object instances.
request Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
session Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
application Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
websocket Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.

동일성과 동등성

동일성 : 객체 주소가 같다.

동등성 : 객체의 값이 같다.

동일성

@Test
public void testIdentity(){
  //동일성 (identity) : 객체 주소 가 같다. (object1==object2==object3) 는 동일한 주소 값을 가질 수 있다.
  //동등성 (eqauls) : 객체의 값이 같다. (object1.equals(object2) ==true )

  A a1 = new A();
  A a2 = new A();
  Assert.assertFalse(a1==a2); //a1과 a2의 주소값이 같은지 ? 다르다

  A a3 = a1;
  Assert.assertTrue(a3==a1);

}
class A{

}

동등성

Object 의 equals 는 아래와 같이 동일성 체크를 한다.

public boolean equals(Object obj) {
            return (this == obj);
}



@Test
public void testEquals(){

  A a1 = new A(10,"Hello world");
  A a2 = new A(10,"Hello world");
  A a3 = new A(5,"Hello world");


  Assert.assertTrue(a1.equals(a2));
  Assert.assertFalse(a1.equals(a3));

}

코드

class A{
    private int a1 ;
    private String a2;

    public A(int a1, String a2) {
        this.a1 = a1;
        this.a2 = a2;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof A)) return false;
        A a = (A) o;
        return a1 == a.a1 &&
                Objects.equals(a2, a.a2);
    }

    @Override
    public int hashCode() {
        return Objects.hash(a1,a2);
    }
}

lombok을 응용하여 사용하면 아래와 같이 쉽게 만들 수 있다.

@EqualsAndHashCode
@AllArgsConstructor
class A{
    private int a1 ;
    private String a2;
}

TestCode

https://junit.org/junit5/docs/current/user-guide/#running-tests

https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-scopes

+ Recent posts