programing

Spring 관리 컨텍스트 외부의 클래스에 Bean 주입

yoursource 2021. 1. 15. 19:51
반응형

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);

참조 URL : https://stackoverflow.com/questions/310271/injecting-beans-into-a-class-outside-the-spring-managed-context

반응형