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)은 불가능 하다는 것.
딱 원했던 동작인데 되는거였구나~
댓글
댓글 쓰기