Spring 관리 컨텍스트 외부의 클래스에 Bean 주입
저는 회사 제품 중 하나의 최종 사용자입니다. Spring과의 통합에는 적합하지 않지만 컨텍스트에 대한 핸들을 얻고 필요한 Bean을 이름으로 검색 할 수 있습니다. 그러나 클래스가 Spring 자체에서 관리되지 않더라도이 클래스에 빈을 주입 할 수 있는지 알고 싶습니다.
설명 : MyClass 클래스의 수명주기를 관리하는 동일한 애플리케이션이 Spring 컨텍스트의 수명 주기도 관리하고 있습니다. Spring은 MyClass의 인스턴스에 대한 지식이 없으며 컨텍스트에 인스턴스를 제공하는 방법을 알고 싶지만 컨텍스트 자체에서 인스턴스를 만들 수 없습니다.
다음과 같이 할 수 있습니다.
ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
someBeanNotCreatedBySpring,
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
당신은 사용할 수 있습니다 @Autowired
및 내부에 있도록 YourClass
필드를 주입하는 등 지정
빈의 제조가 외부 임에도 불구하고 Spring으로 가져 오는 한 가지 방법은 실제로 인스턴스를 만들고 Spring을 통해 다시 전달 @Configuration
하는 메서드 (로 표시됨 @Bean
) 가있는 빈으로 표시된 도우미 클래스를 사용하는 것입니다. 그 시점에서 세대).
어떤 범위가 필요한지 잘 모르겠습니다. 를 사용 prototype
하면 각 장소에서 신선한 콩을 얻을 수 있습니다.
@Configuration
public class FooBarMaker {
@Bean(autowire = Autowire.BY_TYPE)
@Scope("prototype")
public FooBar makeAFooBar() {
// You probably need to do some more work in here, I imagine
return new FooBar();
}
}
제조에 필요한 속성을 @Configuration
빈에 주입 할 수 있습니다 . (이를 사용하여 인스턴스화 할 클래스 이름이 런타임에 정의되는 인터페이스의 인스턴스를 만듭니다.)
u에 다음 종속성 체인이 있다고 가정합니다.
A-> B-> C-> x-> y-> Z
A, B, C는 스프링 관리 빈 (스프링 프레임 워크에 의해 구성되고 관리 됨) x, y는 스프링 지원없이 애플리케이션에 의해 생성 된 정말 간단한 POJO입니다.
이제 y가 스프링을 사용하여 Z에 대한 참조를 얻으려면 스프링 ApplicationContext에 대한 '핸들'이 필요합니다.
이를 수행하는 한 가지 방법은 ApplicationContextAware 인터페이스 를 구현하는 것입니다 . 이 경우 A, B 또는 C가이 인터페이스를 구현하고 applicationContext 참조를 정적 멤버에 저장할 것을 제안합니다.
예를 들어 클래스 C를 사용합니다.
class C implmenets ApplicationContextAware{
public static ApplicationContex ac;
void setApplicationContext(ApplicationContext applicationContext) {
ac = applicationContext;
}
.............
}
이제 클래스 y에는 다음이 있어야합니다.
(Z)(C.ac.getBean("classZ")).doSomething()
HTH-요나탄
autowire의 끝없는 콤보를 검색하여 pojo applicationcontextaware beanaware 등에 spring bean을 주입하면 여기로 돌아 왔지만 이것은 나에게 완전한 솔루션을 제공하지 못했습니다.
이것은이 IMO의 훨씬 더 나은 구현 / 튜토리얼입니다. 이것이 마침내 저와 같은 모든 사람들에게 도움이되기를 바랍니다.
Spring 컨텍스트 외부에서 Spring Bean에 액세스
이를 수행하는 또 다른 방법은 AspectJ를 사용하는 것입니다. 이것은 new
연산자 로 생성 된 관리되지 않는 객체에 Spring Bean을 주입하는 권장 방법입니다 . 자세한 내용은 다음을 참조하십시오.
http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
가장 오래된 Spring 버전에서는 빈 팩토리 http://jira.springframework.org/browse/SPR-4672에 스레드로부터 안전한 문제가 있음을주의하십시오.
당신이 개체를 만들려면 외부 Spring 컨텍스트를, 그리고 다른 콩에 주입을위한 객체를 사용할 수 있도록 되어 Spring 컨텍스트에, 당신의 단계를 수행 할 수 있습니다 이 문서를 .
기본적으로 부모 애플리케이션 컨텍스트를 만들고 외부 개체를이 부모 컨텍스트에 싱글 톤으로 푸시합니다. 그런 다음 상위 애플리케이션 컨텍스트를 상위로 사용하여 기본 애플리케이션 컨텍스트 (예 : xml 파일에서)를 작성합니다.
Object externalObject = ...
GenericApplicationContext parent = new StaticApplicationContext();
parent.getBeanFactory().registerSingleton( "externalObject", externalObject );
parent.refresh();
ApplicationContext appContext = new ClassPathXmlApplicationContext( ... , parent);
'programing' 카테고리의 다른 글
ref = 'string'이 "레거시"인 이유는 무엇입니까? (0) | 2021.01.15 |
---|---|
Angular CLI에서 피어 종속성 설치를 어떻게 처리합니까? (0) | 2021.01.15 |
호스트에 대한 pg_hba.conf 항목이 없습니다. (0) | 2021.01.15 |
타 일드 드로어 블이 때때로 늘어남 (0) | 2021.01.15 |
iOS 7 : 전체 앱에 대해 UINavigationBar 반투명 비활성화 (0) | 2021.01.15 |