Spring Package Private Bean

Spring Boot로 프로젝트 중 특정 클래스를 해당 package에서만 접근해서 사용하려고 아래처럼 package private으로 만들어서 사용하고 있었다. (보안상 클래스명등은 임의 네이밍)

class PackagePrivateHelper {
    public int sum(int a, int b) {
        return a + b;
    }
}

그런데 해당 클래스에 bean이 주입 되어야 하는 상황이 생겼다. method argument 로 넘길 수도 있지만 해당 클래스를 package private bean으로 만들어서 다른 bean을 그냥 주입 받을 수 있는지 궁금해 졌다. 그래서 아래처럼 그냥 @Component를 붙여 봤는데 원하는 동작을 하네???
(actuator bean 검색(/actuator/beans) 해보면 해당 bean이 생성 되어 있음을 바로 알 수 있다)

@Component
class PackagePrivateHelper {
    private final OtherBean otherBean;

    public PackagePrivateHelper(final OtherBean otherBean) {
        this.otherBean = otherBean;
    }

    public int sum(int a, int b) {
        return otherBean.sum(a, b);
    }
}

package private인데 bean이 어떻게 생성될 수 있는지 궁금해서 package private bean에 대해 구글링 해봤는데 관련된 내용이 잘 나오지 않았다. Spring 공식 문서에도 scope에 대한 내용(singleton, prototype, session, 등)만 검색되지 위와 같은 내용은 찾아 보기 어려웠다.

그러다가 같은 궁금증을 가진 사람이 있었던듯 하다. 아래 블로그에서 그 해답을 찾을 수 있었다.
참조 : http://sahits.ch/blog/blog/2014/02/16/package-private-beans/
내용을 해석해 보면, bean 생성을 담당하는 BeanUtils 이 녀석이 component scan에 걸린 bean들을 reflection으로 모두 생성하기 때문에 package private 임에도 불구하고 생성이 가능하다는 것 같다. 그러나 package private이라 다른 package에서 접근이 불가능하기 때문에 @Configuration에서 명시적인 bean 생서(@Bean)은 불가능 하다는 것.

딱 원했던 동작인데 되는거였구나~

댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명