programing

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

i4 2023. 8. 24. 21:47
반응형

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

저는 저희 회사 제품 중 하나의 최종 사용자입니다.스프링에 통합하기에는 적합하지 않지만, 상황을 파악하고 필요한 콩을 이름으로 검색할 수 있습니다.하지만 Spring 자체에서 수업을 진행하지는 않지만 이 수업에 콩을 주입하는 것이 가능한지 알고 싶습니다.

명확화:일부 클래스 MyClass의 라이프사이클을 관리하는 동일한 애플리케이션이 Spring 컨텍스트의 라이프사이클도 관리합니다.Spring은 MyClass의 인스턴스에 대한 지식이 없으며 컨텍스트에 인스턴스를 제공하고 싶지만 컨텍스트 자체에서 인스턴스를 생성할 수 없습니다.

다음을 수행할 수 있습니다.

ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
    someBeanNotCreatedBySpring,
    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);

사용할 수 있습니다.@Autowired내부 등YourClass주입할 필드 등을 지정합니다.

콩의 제조가 외부임에도 불구하고 봄에 콩을 가져오는 한 가지 방법은 다음과 같이 표시된 도우미 클래스를 사용하는 것입니다.@Configuration방법(표시)이 있는 콩@Bean)는 실제로 인스턴스를 만들고 Spring을 통해 반환합니다(Spring은 해당 시점에서 속성 주입 및 프록시 생성을 수행합니다).

어떤 범위가 필요한지 잘 모르겠습니다.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();
    }
}

제조에 필요한 속성을 에 주입할 수 있습니다.@Configurationbean. (이를 사용하여 인스턴스화할 클래스의 이름이 런타임에 정의되는 인터페이스의 인스턴스를 만듭니다.)

다음과 같은 종속성 체인이 있다고 가정합니다.

A --> B --> C --> x --> y --> Z

A, B, C는 스프링 관리 콩(스프링 프레임워크에 의해 생성 및 관리됨) x, y는 스프링 지원 없이 애플리케이션에 의해 생성되는 정말 단순한 POJO입니다.

이제 y가 스프링을 사용하여 Z에 대한 참조를 얻으려면 스프링 Application Context에 대한 '핸들'이 있어야 합니다.

한 가지 방법은 ApplicationContextAware 인터페이스를 구현하는 것입니다.이 경우 A, B 또는 C 중 하나가 이 인터페이스를 구현하고 applicationContext 참조를 정적 멤버에 저장할 것을 제안합니다.

클래스 C를 예로 들어 보겠습니다.

class C implmenets ApplicationContextAware{
    public static ApplicationContex ac;
     void setApplicationContext(ApplicationContext applicationContext)  {
               ac = applicationContext;
     }
 .............
}

자, 수업시간에 당신은 다음을 가져야 합니다.

(Z)(C.ac.getBean("classZ")).doSomething()

HTH - 요나탄

이를 위한 또 다른 방법은 AspectJ를 사용하는 것입니다.이 방법은 Spring bean을 사용하여 생성된 관리되지 않는 개체에 주입하는 것이 좋습니다.new하십시오.자세한 내용은 다음을 참조하십시오.

http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html

끝없는 오토와이어 조합을 검색하는 것은 pojo 애플리케이션 컨텍스트 인식 비나웨어 등에 스프링빈을 주입하는 것과 같은 것들이 나를 여기로 돌게 했지만, 이것은 나에게 충분한 해결책을 제공하지 못했습니다.

이것은 이 IMO의 훨씬 더 나은 구현/튜토리얼입니다. 저는 그것이 마침내 저에게 도움이 된 것처럼 모두에게 도움이 되기를 바랍니다.

Spring 컨텍스트 외부에서 Spring Bean에 액세스

Spring의 가장 오래된 버전에서는 bean factory 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);

Spring 구성 클래스에서 비 Spring 클래스에 콩이 필요한 정적 필드를 설정합니다.

Liquibase 질문에 대한 답변에 예를 들어 보겠습니다. https://stackoverflow.com/a/71191546/5499391

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

반응형