복붙노트

[SPRING] Spring 관리 컨텍스트 외부의 클래스에 bean 삽입

SPRING

Spring 관리 컨텍스트 외부의 클래스에 bean 삽입

나는 내 회사 제품 중 하나의 최종 사용자입니다. Spring과의 통합에는 그다지 적합하지 않지만 컨텍스트에 대한 핸들을 얻고 필요한 bean을 이름으로 검색 할 수 있습니다. 그러나, 비록 클래스가 Spring 자체에 의해 관리되지는 않지만,이 클래스에 bean을 삽입 할 수 있는지를 알고 싶습니다.

설명 : 일부 클래스 MyClass의 라이프 사이클을 관리하는 동일한 응용 프로그램은 Spring 컨텍스트의 수명 주기도 관리합니다. Spring은 MyClass의 인스턴스에 대한 지식이 없으며 컨텍스트에 인스턴스를 제공하는 방법을 원하지만 컨텍스트 자체에서는 인스턴스를 만들 수 없습니다.

해결법

  1. ==============================

    1.당신은 이것을 할 수 있습니다 :

    당신은 이것을 할 수 있습니다 :

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

    YourClass 내에서 @Autowired 등을 사용하여 주입 할 필드 등을 지정할 수 있습니다.

  2. ==============================

    2.bean을 Spring으로 가져 오는 데있어 Spring을 외부로 가져 오는 한 가지 방법은 @Configuration Bean으로 표시된 helper 클래스를 사용하는 것입니다. @ Bean으로 표시되는 메소드는 실제로 인스턴스를 만들고 Spring을 통해 다시 가져 오는 메소드입니다. 속성 삽입 및 프록시 생성).

    bean을 Spring으로 가져 오는 데있어 Spring을 외부로 가져 오는 한 가지 방법은 @Configuration Bean으로 표시된 helper 클래스를 사용하는 것입니다. @ Bean으로 표시되는 메소드는 실제로 인스턴스를 만들고 Spring을 통해 다시 가져 오는 메소드입니다. 속성 삽입 및 프록시 생성).

    나는 당신이 어떤 범위를 필요로하는지 잘 모르겠습니다. 프로토 타입을 사용하면 각 장소에서 신선한 콩을 얻을 수 있습니다.

    @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 빈으로 제조에 필요한 특성을 주입 할 수 있습니다. (인스턴스화 할 클래스의 이름이 런타임에 정의되는 인터페이스 인스턴스를 만들 때이 메서드를 사용합니다.)

  3. ==============================

    3.당신이 다음의 종속성 체인을 가지고 있다고 가정 해보십시오 :

    당신이 다음의 종속성 체인을 가지고 있다고 가정 해보십시오 :

    A → B → C → x → y → Z

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

    이제 당신이 원한다면 Spring을 사용하는 Z에 대한 참조를 얻을 것이다. Spring에 'handle'을 가져야 할 필요가있다. 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 - 요나탄

  4. ==============================

    4.끝없이 이어지는 autowire 콤보를 찾아 봄 콩을 pojo applicationcontextaware beanaware 등에 넣으십시오. 여기에서 다시 동그라미를 치지 만,이 완벽한 해결책은 제게는 충분합니다.

    끝없이 이어지는 autowire 콤보를 찾아 봄 콩을 pojo applicationcontextaware beanaware 등에 넣으십시오. 여기에서 다시 동그라미를 치지 만,이 완벽한 해결책은 제게는 충분합니다.

    이것은이 IMO의 훨씬 나은 구현 / 튜토리얼입니다 : 나는 그것이 모두가 마침내 나를 도왔던 것처럼 그것이 도울 수 있기를 바란다.

    스프링 컨텍스트 외부에서 스프링 빈 액세스

  5. ==============================

    5.이를 수행하는 또 다른 방법은 AspectJ를 사용하는 것이다. 이것은 new 연산자로 생성 된 관리되지 않는 객체에 스프링 빈을 주입 할 때 권장되는 방법입니다. 자세한 내용은 다음을 참조하십시오.

    이를 수행하는 또 다른 방법은 AspectJ를 사용하는 것이다. 이것은 new 연산자로 생성 된 관리되지 않는 객체에 스프링 빈을 주입 할 때 권장되는 방법입니다. 자세한 내용은 다음을 참조하십시오.

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

  6. ==============================

    6.Spring의 가장 오래된 버젼에는 bean factory http://jira.springframework.org/browse/SPR-4672에 thread-safe 문제가 있음을주의하라.

    Spring의 가장 오래된 버젼에는 bean factory http://jira.springframework.org/browse/SPR-4672에 thread-safe 문제가 있음을주의하라.

  7. ==============================

    7.Spring 컨텍스트 외부에 개체를 만들고 해당 개체를 Spring 컨텍스트에있는 다른 Bean에 삽입 할 수있게하려면이 문서의 단계를 수행하면됩니다.

    Spring 컨텍스트 외부에 개체를 만들고 해당 개체를 Spring 컨텍스트에있는 다른 Bean에 삽입 할 수있게하려면이 문서의 단계를 수행하면됩니다.

    기본적으로 부모 응용 프로그램 컨텍스트를 만들고이 부모 컨텍스트에 외부 개체를 단일 개체로 푸시합니다. 그런 다음 상위 응용 프로그램 컨텍스트 (예 : xml 파일)를 상위 응용 프로그램 컨텍스트와 함께 부모로 만듭니다.

    Object externalObject = ...
    GenericApplicationContext parent = new StaticApplicationContext();
    parent.getBeanFactory().registerSingleton( "externalObject", externalObject );
    parent.refresh();
    ApplicationContext appContext = new ClassPathXmlApplicationContext( ... , parent);
    
  8. from https://stackoverflow.com/questions/310271/injecting-beans-into-a-class-outside-the-spring-managed-context by cc-by-sa and MIT license