복붙노트

[SPRING] Spring 부트에서 애플리케이션 컨텍스트를 사용하여 Bean을 얻는 방법

SPRING

Spring 부트에서 애플리케이션 컨텍스트를 사용하여 Bean을 얻는 방법

SpringBoot 프로젝트를 개발 중이며 applicationContext를 사용하여 그 이름으로 bean을 가져 오려고합니다. 웹에서 많은 솔루션을 시도했지만 성공하지 못했습니다. 내 요구 사항은 컨트롤러가 있다는 것입니다.

ControllerA

컨트롤러 내부에는 getBean (String className) 메서드가 있습니다. 등록 된 빈의 인스턴스를 가져오고 싶습니다. 나는 최대 절전 엔티티를 가지고 있으며 getBean 메소드에서만 클래스의 이름을 전달하여 빈의 인스턴스를 얻고 싶다.

누군가가 해결책을 안다면 도와주세요.

해결법

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

    1.ApplicationContext를 필드로 Autowire 할 수 있습니다.

    ApplicationContext를 필드로 Autowire 할 수 있습니다.

    @Autowired
    private ApplicationContext context;
    

    또는 방법

    @Autowired
    public void context(ApplicationContext context) { this.context = context; }
    

    마지막으로 사용

    context.getBean(SomeClass.class)
    
  2. ==============================

    2.ApplicationContextAware를 사용할 수 있습니다.

    ApplicationContextAware를 사용할 수 있습니다.

    응용 프로그램 컨텍스트에 대한 참조를 얻기위한 몇 가지 방법이 있습니다. 다음 예제와 같이 ApplicationContextAware를 구현할 수 있습니다.

    package hello;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    @Component
    public class ApplicationContextProvider implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        } 
    
     public ApplicationContext getContext() {
            return applicationContext;
        }
    
    }
    

    최신 정보:

    Spring은 Bean을 인스턴스화 할 때 ApplicationContextAware 구현물을 찾고, 발견되면 setApplicationContext () 메소드가 호출된다.

    이런 식으로 Spring은 현재 applicationcontext를 설정하고 있습니다.

    Spring의 소스 코드에서 코드 스 니펫 :

    private void invokeAwareInterfaces(Object bean) {
            .....
            .....
     if (bean instanceof ApplicationContextAware) {                
      ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
       }
    }
    

    응용 프로그램 컨텍스트에 대한 참조를 얻으면 getBean ()을 사용하여 원하는대로 Bean을 가져옵니다.

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

    3.실제로 스프링 엔진에서 개체를 얻고 싶습니다.이 엔진은 스프링 응용 프로그램 시작 (Sprint 엔진의 초기화)에서 필요한 클래스의 개체를 이미 유지 관리합니다. 이제 그 개체를 가져와야합니다. 참조.

    실제로 스프링 엔진에서 개체를 얻고 싶습니다.이 엔진은 스프링 응용 프로그램 시작 (Sprint 엔진의 초기화)에서 필요한 클래스의 개체를 이미 유지 관리합니다. 이제 그 개체를 가져와야합니다. 참조.

    서비스 클래스에서

    @Autowired
    private ApplicationContext context;
    
    SomeClass sc = (SomeClass)context.getBean(SomeClass.class);
    

    지금 sc의 참조에서 당신은 객체를 가지고 있습니다. 희망은 잘 설명했다. 의심스러운 점이 있으면 알려주세요.

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

    4.Spring 빈 (이 경우 @Controller 빈) 내부에 있다면 Spring 컨텍스트 인스턴스를 전혀 사용하지 않아야한다. className bean을 직접 autowire하면된다.

    Spring 빈 (이 경우 @Controller 빈) 내부에 있다면 Spring 컨텍스트 인스턴스를 전혀 사용하지 않아야한다. className bean을 직접 autowire하면된다.

    BTW, 필드 인젝션은 나쁜 습관으로 간주되므로 피하십시오.

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

    5.ServiceLocatorFactoryBean을 사용할 수 있습니다. 먼저 클래스에 대한 인터페이스를 만들어야합니다.

    ServiceLocatorFactoryBean을 사용할 수 있습니다. 먼저 클래스에 대한 인터페이스를 만들어야합니다.

    public interface YourClassFactory {
        YourClass getClassByName(String name);
    }
    

    그런 다음 ServiceLocatorBean에 대한 설정 파일을 만들어야합니다.

    @Configuration
    @Component
    public class ServiceLocatorFactoryBeanConfig {
    
        @Bean
        public ServiceLocatorFactoryBean serviceLocatorBean(){
            ServiceLocatorFactoryBean bean = new ServiceLocatorFactoryBean();
            bean.setServiceLocatorInterface(YourClassFactory.class);
            return bean;
        }
    }
    

    이제 당신은 그 이름으로 수업을 찾을 수 있습니다.

    @Autowired
    private YourClassfactory factory;
    
    YourClass getYourClass(String name){
        return factory.getClassByName(name);
    }
    
  6. from https://stackoverflow.com/questions/34088780/how-to-get-bean-using-application-context-in-spring-boot by cc-by-sa and MIT license