복붙노트

[SPRING] 비 스프링 관리 클래스에서 작동하지 않는 스프링 자동 와이어 링

SPRING

비 스프링 관리 클래스에서 작동하지 않는 스프링 자동 와이어 링

나는 생성자를 호출하여 인스턴스화 된 클래스 (클래스 ABC)가 있습니다. 클래스 ABC는 차례로 자동 배선을 사용하여 주입 된 도우미 클래스 (클래스 XYZ)를가집니다.

우리는 스프링 MVC 기반 애플리케이션이며 서버를 시작하는 동안 어떤 예외도 보이지 않습니다.

그러나 클래스 XYZ가 null로 계속 표시됩니다. Class ABC가 Spring Container에 의해 인스턴스화되지 않았기 때문입니까?

이러한 시나리오에서 어떻게 자동 배선을 사용합니까?

감사.

해결법

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

    1.이 방법으로 비 스프링 빈 클래스에서 스프링 빈을 사용할 수있다.

    이 방법으로 비 스프링 빈 클래스에서 스프링 빈을 사용할 수있다.

        public class ApplicationContextUtils implements ApplicationContextAware {
    
      private static ApplicationContext ctx;
    
      @Override
      public void setApplicationContext(ApplicationContext appContext)
          throws BeansException {
        ctx = appContext;
    
      }
    
      public static ApplicationContext getApplicationContext() {
        return ctx;
      }
    }
    

    이제이 메소드 getApplicationContext ()를 사용하여 applicationcontext 객체를 가져올 수 있습니다.

    applicationcontext에서 스프링 빈 객체를 다음과 같이 얻을 수 있습니다 :

     ApplicationContext appCtx = ApplicationContextUtils
        .getApplicationContext();
    String strFromContext = (String) appCtx.getBean(beanName);
    
  2. ==============================

    2.ABC 클래스는 Spring에서 관리하지 않기 때문에 자동 와이어 링이 작동하지 않습니다. Spring이 ABC를 @Component 주석 (@Component, @Service, @Controller 등) 중 하나를 클래스 정의 위에 사용하고 응용 프로그램 컨텍스트 XML에서 context : component-scan을 사용하거나 오래된 학교로 이동하여 애플리케이션 컨텍스트에서 바로 빈을 정의하면된다.

    ABC 클래스는 Spring에서 관리하지 않기 때문에 자동 와이어 링이 작동하지 않습니다. Spring이 ABC를 @Component 주석 (@Component, @Service, @Controller 등) 중 하나를 클래스 정의 위에 사용하고 응용 프로그램 컨텍스트 XML에서 context : component-scan을 사용하거나 오래된 학교로 이동하여 애플리케이션 컨텍스트에서 바로 빈을 정의하면된다.

    어떤 이유로 Spring에서 ABC 클래스를 관리 할 수없는 경우 다음과 같은 방법으로 ABC에서 응용 프로그램 컨텍스트를로드 할 수 있습니다.

    다음을 사용하십시오.

    빈 값을 수동으로 설정합니다.

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

    3.올바른 : 클래스에 new를 호출하여 모든 클래스를 유선으로 만들 수는 없습니다. Spring은 모든 마술을 수행하기 위해 bean을 관리해야합니다.

    올바른 : 클래스에 new를 호출하여 모든 클래스를 유선으로 만들 수는 없습니다. Spring은 모든 마술을 수행하기 위해 bean을 관리해야합니다.

    유스 케이스에 대한 자세한 내용을 게시 할 수 있다면 유용한 옵션을 제안 할 수 있습니다.

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

    4.다른 bean을 autowire하고자하는 클래스에서 Spring의 @Configurable 어노테이션을 사용할 수있다. 또한 @EnableSpringConfigured를 사용하여 구성 Bean에 주석을 달아 Spring이 구성 가능한 Bean을 인식하도록해야합니다.

    다른 bean을 autowire하고자하는 클래스에서 Spring의 @Configurable 어노테이션을 사용할 수있다. 또한 @EnableSpringConfigured를 사용하여 구성 Bean에 주석을 달아 Spring이 구성 가능한 Bean을 인식하도록해야합니다.

    @EnableSpringConfigured 문서

    @Configurable(autowire = Autowire.BY_TYPE)
    public class ABC {
        @Autowire private XYZ xyz;
        ...
    }
    
    @Configuration
    @EnableSpringConfigured
    public class Application {
        ...
    }
    
    public class MyClass {
        public void doSomething() {
            ABC abc = new ABC(); // XYZ is successfully autowired
            ...
        }
    }
    
  5. ==============================

    5.즉, 봄이 ABC를 관리하지 않기 때문에 ABC는 XYZ를 주입하지 않습니다. Spring은 알지 못하는 객체를 설정할 수 없다.

    즉, 봄이 ABC를 관리하지 않기 때문에 ABC는 XYZ를 주입하지 않습니다. Spring은 알지 못하는 객체를 설정할 수 없다.

    @Service 또는 @Component로 주석을 달아 ABC를 관리 할 수 ​​있습니다. Spring이 이러한 어노테이션에서 픽업하기 위해서는 Spring이 자동 스캐닝을 켜야한다 :

    <context:component-scan base-package="com.mypackage.awesomeproject" />
    
  6. ==============================

    6.첫 번째 질문 - 클래스가 봄으로 시작되지 않으므로 네가 null을가집니다. 두 번째 질문 - aspectj 지원을 사용할 수 있다고 생각합니다. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-using-aspectj

    첫 번째 질문 - 클래스가 봄으로 시작되지 않으므로 네가 null을가집니다. 두 번째 질문 - aspectj 지원을 사용할 수 있다고 생각합니다. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-using-aspectj

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

    7.@Configurable 주석으로 ABC 클래스에 주석을 추가 할 수 있습니다. 그런 다음 Spring IOC는 XYZ 인스턴스를 ABC 클래스에 삽입합니다. 일반적으로 AspectJ AnnotationBeanConfigurerAspect와 함께 사용됩니다.

    @Configurable 주석으로 ABC 클래스에 주석을 추가 할 수 있습니다. 그런 다음 Spring IOC는 XYZ 인스턴스를 ABC 클래스에 삽입합니다. 일반적으로 AspectJ AnnotationBeanConfigurerAspect와 함께 사용됩니다.

  8. ==============================

    8.기본 스프링 부트를하고 나에게 익숙하지 않은 나 같은 멍청한 녀석들에게는 :

    기본 스프링 부트를하고 나에게 익숙하지 않은 나 같은 멍청한 녀석들에게는 :

    Ashish의 대답은 저에게 효과적이지만,이 기사는 좀 더 자세한 설명을 제공합니다.

    원하는 콩의 이름을 모르는 경우이 배열을 살펴보십시오.

    String[] names = context.getBeanDefinitionNames();
    

    '구성 요소 검사'및 구성 파일에 대해 혼란 스러우면 @Configuration 및 @ComponentScan을 암시 적으로 호출하는 @SpringBootApplication 주석 (main () 메서드 근처에서 찾을 수 있음)을 알 수 있습니다.

    이것은 (메인 클래스의 맨 위에 선언 된) 그 패키지의 모든 파일들이 Spring에 의해 선택된다는 것을 의미하며, 추가하고자하는 모든 bean은 main ()

  9. from https://stackoverflow.com/questions/18347518/spring-autowiring-not-working-from-a-non-spring-managed-class by cc-by-sa and MIT license