스프링 Bean 생성할때 어 떻게 가져오는지 살펴봤다. 지금은 ModelAttribute를 어떻게 처리하는지 알아보고자 했는데, 그동안 무조건 기본생성자와 setter가 포함되어야 한다고 알고 있었는데 그게 아니었기 때문이다. 기본 생성자가 protected로 되거나, 심지어 없어도 인자를 넣어주는 생성자가 있다면 잘 동작했기 때문이다. 리플렉션을 사용하는 것은 알았는데, 당연히 기본생성자와 setter만으로 구성된줄 알았다. 하지만 직접 동작을 보니 과정은 다음과 같았다.
ModelAttributeMethodProcessor.constructAttribute에서 변환. 이 때 리플랙션 사용. 생성자 이용해서 만든 인스턴스가 attribute로 사용된다.
생성자를 이용한다고 표현했는데, 정확히 말하면 생성자에 정의된 필드를 직접 넣어준다. 넣어주는 것 자체는
ConsturctorAccessor
에 있는 네이티브 메소드를 이용한다.
프로퍼티를 채워준다. DataBinder의 applyPropertyValues에서 넣어준다. 넣어주기 위해 AbstractPropertyAccessor에 있는 setPropertyValues를 사용한다. 쭉쭉 타고 내려가면 BeanWrapperImpl
에서 최종적으로 setter를 invoke해준다.
이 때, JavaBeans의
PropertyDescriptor
를 사용한다. 여기에서 readMethod와 writeMethod를 가져올 수 있는데, 간단히 얘기하면 getter와 setter메소드를 가져오는 것이다.PropertyDescriptor
는Introspector
에서 만든다. 만들 때 여기에서 상수로 prefix를 설정해두고 메소드를 찾아준다.
생각했던 것과 다른 점이 각각의 상황마다 다르게 빈을 매핑하는 줄 알았는데, 아예 BeanUtils로 감싸서 사용하는 것을 보니 Bean으로 등록하는 과정이 대게 비슷하지 않을까 하는 생각이 들었다. 여기서 드는 의문점은 AutoWired를 넣어주면 기본 생성자를 기반으로 빈 등록을 할텐데 어떻게 넣어주는 것인지다. AutowiredAnnotationBeanPostProcessor
를 살펴보면 될 듯 한데, 다음에 한 번 봐야겠다.
Powered with by Gatsby 2.0