DevBoi

[Spring] ObjectProvider에 대해서. 본문

Develop/[Spring]

[Spring] ObjectProvider에 대해서.

HiSmith 2023. 6. 20. 22:41
반응형

흔히 DL 관련, 사용으로 ObjectProvider를 많이 쓴다.

어떻게 구현되어있고, 어떤식으로 동작하는지 한번 알아보자

 

Spring 4.3에 추가가 되었다고 한다.

대부분 프로토타입빈과, 싱글톤 빈을 둘다 쓰고 싶을때 사용한다고 보면 된다.

 

싱글톤 빈에서, 프로토타입 빈을 사용하고자 한다고 가정해보자

프로토타입 빈은 빈을 요청할때마다 신규로 생성이 되는 타입이다.

싱글톤은 미리 생성해둔, 한개의 빈이 리턴되는 형태이다.

 

그런데, 싱글톤 내에서 프로토 타입빈을 호출하게 된다면?

프로토 타입빈은 변경되지 않고, 계속 같은 빈을 호출하게 된다.

이는 프로토 타입 빈이 알맞게 동작하지 않게 되는 것이다.

 

이를 극복하기 위해, ObjectProvider,ObjectFactory를 사용한다.

@Configuration
public class ObjectProviderConfig {

  @Bean("userComponent")
  public UseComponent useComponent(ObjectProvider<UseComponent> components){
    return new UserComponentImpl();
  }


}

이런 식으로 사용하게 되면, ObjecetProviderConfig 에서는, 싱글톤 빈이 되지만

하위 userComponent빈에서는 UseComponent를 프로토 타입으로 가져올 수 있다.

즉 내용을 변경할 수있다.

 

만약에, UserComponentImpl의 특정 메서드가 이벤트로 전달 된 파라미터에 따라서 다른 결과값을 줘야할때?

해당 케이스로 사용하면 된다.

 

해당 과 같이 프로토타입빈이 있다고 가정하면

@Scope("prototype")
    static class PrototypeBean {
        private int count=0;

        @PostConstruct
        void init() {
            System.out.println("PrototypeBean.init"+this);
        }

        @PreDestroy
        void preDestroy() {
            System.out.println("PrototypeBean.preDestroy"+this);
        }

        public void addCount() {
            count++;
        }

        public int getCount() {
            return count;
        }
    }

 

싱글 톤에서 사용할떄는 아래와 같이, 해당 ObjectProvider로 주입받아야 가능한 것이다.

만약에, 그냥 주입 받게 되면, 프로토 타입 빈이라고 하더라도, 빈이 생성되고 사라지지 않게 된다.(싱글톤 빈 내부에서 관리된다)

 @Scope("singleton")
    static class SingletonBean {

        @Autowired
        private ObjectProvider<PrototypeBean> provider;

        public int logic() {
            PrototypeBean prototypeBean = provider.getObject();
            System.out.println("사용할 prototypeBean 정보!: "+prototypeBean);

            prototypeBean.addCount();
            return prototypeBean.getCount();
        }

        @PostConstruct
        void init() {
            System.out.println("PrototypeBean.init"+this);
        }

        @PreDestroy
        void preDestroy() {
            System.out.println("PrototypeBean.preDestroy"+this);
        }

    }

 

이런 이유때문에, ObjectProvider를 쓴다.

 

쉽게 얘기하면, 싱글톤 빈에 주입받아야 하는 빈이 동적으로 변경되어야 할때 쓴다.

 

반응형

'Develop > [Spring]' 카테고리의 다른 글

[Spring] ObjectMapper 사용  (0) 2023.07.10
[Spring] ObjectProvider + FuntionalInterface  (0) 2023.06.22
[Spring] 멀티모듈의 개념  (0) 2023.06.18
[Spring] Fegin 잘 쓰기  (0) 2023.06.14
[Spring boot] 스케줄러  (0) 2023.06.10