Seize the day

POST : Android Dev Study

초간단 Bean inject하기

Bean 은 주로 모듈화된 Logic 클래스를 의미하는데 여기서는 Dao, Bo나 1개의 instance만으로 충분한 Model을 주로 Bean이라고 부르겠다. 


이런 클래스는 싱글톤으로 구현하는 경우가 있는데, 테스트 코드를 작성하기 어렵다. 그래서 싱글톤은 피하고, Instance는 하나만 생성하고자 한다.  Bean은 다른 Bean을 멤버로 가질 수 있다. 이런 상황에서 Bean을 적절히 초기화하는 것이  관건이다. 이미 http://dajkim76.tistory.com/419 에서 ModuleManager라는 간단한 싱글 인스턴스 매니저를 구현한 적이 있는데 이번에는 조금 더 개선해보겠다.  


InjectableBean은 Bean클래스를 위한 annotation이다. 




InjectableBean을 사용하고 싶다면 클래스 필드에 @Inject를 사용해 주면 된다. 




테스트를 위해서 A1, A2, A3는 


N1, N2, N3는 


N4클래스는 N3를 extend한 Bean이다. 



이제 사용법을 보자





구현시 고려한 점은 다음과 같다. 


1. Bean은 싱클톤 클래스가 아니지만(유닛 테스트를 위해서), 프로세스당 하나의 인스턴스만 생성한다.  (쓰레드 세이프), 생성자 구현이 없거나, 있다면 기본 생성자는 꼭 있어야 한다. 


2. injectBean이 실행되는 시점 즉  @Inject가 붙은 필드를 초기화하는 시점에 필요한 Bean만 초기화한다. (Lazy init)


3. InjectableBean을 가진 클래스를 초기활 때는 super class의 멤버 필드까지 @Inject가 있으면 bean을 생성하고 초기화한다. 사용하는 클래스(예 Test) 효율을 위해서 super class의 @Inject는 초기화하지 않는다. 


4. InjectableBean을 가지지 않는 클래스도 Bean으로 등록할 수 있다. 다만 injectBean을 호출하기 전에 registerBean으로 먼저 등록해야 한다. 



InjectionUtils.injectBean의 구현을 보자. 




top

posted at

2016. 11. 18. 22:12


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크