Package com.easydesk.spring
Class SpringBeanFactoryHolder
java.lang.Object
com.easydesk.spring.SpringBeanFactoryHolder
- All Implemented Interfaces:
org.springframework.beans.factory.Aware,org.springframework.context.ApplicationContextAware
@Component
public class SpringBeanFactoryHolder
extends Object
implements org.springframework.context.ApplicationContextAware
예전엔 Turbine 컨테이너 밖에서(리플렉션으로) 만든 객체에
@TurbineService/@TurbineConfiguration
필드를 채워 넣을 때 org.apache.turbine.annotation.AnnotationProcessor#process(Object) 를 썼다. 이
클래스는 그 자리를 대체한다 - Turbine 의 AnnotationProcessor 는 Turbine 자신의 서비스
컨테이너(TurbineServices/ServiceManager)와 설정 부트스트랩(Turbine.getConfiguration())에 강하게 결합돼 있어서
Turbine 을 걷어내면 같이 사라지는데, 이미 이 프로젝트는 Spring 을 쓰고 있으므로 Spring 이 표준으로 제공하는
AutowireCapableBeanFactory.autowireBean(Object) 와 Environment 로 똑같은 역할(각각
@TurbineService 자리 / @TurbineConfiguration 자리)을 대신할 수 있다.
easydesk-spring-pipeline 의 XmlValveAdapter/DefaultPipelineService 는 이미 같은
목적으로 AutowireCapableBeanFactory 를 생성자로 주입받아 쓰고 있는데, 그건 그 객체들이 Spring 빈이라
생성자 주입이 가능하기 때문이다. 반면 WorkflowFactory.getInstance()/getInstanceImpl() 같은
static 진입점은 Spring 빈이 아니라서 생성자/필드로 주입받을 방법이 없다 - 이런 곳에서 쓰라고 만든 static
홀더다. autowire(Object) 는 @TurbineService 자리(이미 만들어진 일반 객체에 나중에
@Autowired 필드를 채워 넣는 것)를, getProperty(String, String) 는
@TurbineConfiguration 자리(설정값을 static 코드에서 읽는 것)를 대체한다.
주의: Spring 컨텍스트가 아직 뜨지 않은 상태(예: Spring 없이 순수 JUnit 단위 테스트에서 new 로 직접 생성해서
쓰는 경우)에서는 getBeanFactory()/getEnvironment() 가 null 을 반환한다 -
autowire(Object) 는 이 경우 조용히 스킵하고(no-op), getProperty(String, String) 는
호출자가 넘긴 기본값을 그대로 돌려준다 - 둘 다 예전 "AnnotationProcessor/@TurbineConfiguration 호출 자체가
주석 처리돼 있던 것"과 동일하게 안전한 폴백이다. 컨텍스트가 뜬 뒤에는 이 클래스 자신이 @Component
로 스캔되면서 setApplicationContext(org.springframework.context.ApplicationContext) 가 호출되어 채워진다 - 스캔 대상에
com.easydesk.spring 패키지가 포함되어야 하며, 현재는 SecurityServiceConfig 의
@ComponentScan 목록에 com.easydesk.pipeline 과 함께 추가해뒀다 (전자는 이 클래스 자신,
후자는 DefaultPipelineService 빈을 살리기 위함 - 둘 다 지금까지는 데모 앱의 실제 컴포넌트 스캔 범위
밖에 있었다).- Author:
- Youngho Cho
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidWorkflowFactory.getInstance(),AddItemValve/UpdateItemValve처럼 리플렉션으로 이미 만들어진 객체에@Autowired필드를 채워 넣을 때 쓴다.static org.springframework.beans.factory.config.AutowireCapableBeanFactorystatic org.springframework.core.env.Environmentstatic StringgetProperty(String key, String defaultValue) WorkflowFactory.EASYDESK_WORKFLOW_NAME_KEY처럼, static 코드에서 Spring 설정값(예: application.properties)을 읽어야 할 때 쓴다.voidsetApplicationContext(org.springframework.context.ApplicationContext applicationContext)
-
Constructor Details
-
SpringBeanFactoryHolder
public SpringBeanFactoryHolder()
-
-
Method Details
-
setApplicationContext
public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext) - Specified by:
setApplicationContextin interfaceorg.springframework.context.ApplicationContextAware
-
getBeanFactory
public static org.springframework.beans.factory.config.AutowireCapableBeanFactory getBeanFactory()- Returns:
- 현재 떠 있는 Spring 컨텍스트의
AutowireCapableBeanFactory. 컨텍스트가 아직 없으면 null.
-
getEnvironment
public static org.springframework.core.env.Environment getEnvironment()- Returns:
- 현재 떠 있는 Spring 컨텍스트의
Environment. 컨텍스트가 아직 없으면 null.
-
autowire
WorkflowFactory.getInstance(),AddItemValve/UpdateItemValve처럼 리플렉션으로 이미 만들어진 객체에@Autowired필드를 채워 넣을 때 쓴다. 예전AnnotationProcessor.process(object)호출을 그대로 대체하는 자리다.- Parameters:
target- 의존성을 채워 넣을, 이미 생성된 일반 객체 (null 이면 아무것도 하지 않는다)
-
getProperty
WorkflowFactory.EASYDESK_WORKFLOW_NAME_KEY처럼, static 코드에서 Spring 설정값(예: application.properties)을 읽어야 할 때 쓴다. 예전@TurbineConfiguration(key)필드 주입을 대체하는 자리다. Spring 컨텍스트가 없거나 키가 없으면defaultValue를 그대로 돌려준다.- Parameters:
key- SpringEnvironment에 등록된 property keydefaultValue- 컨텍스트가 없거나 키가 없을 때 돌려줄 기본값- Returns:
- 설정값, 없으면 defaultValue
-