[SPRING] Spring 부트에서 애플리케이션 컨텍스트를 사용하여 Bean을 얻는 방법
SPRINGSpring 부트에서 애플리케이션 컨텍스트를 사용하여 Bean을 얻는 방법
SpringBoot 프로젝트를 개발 중이며 applicationContext를 사용하여 그 이름으로 bean을 가져 오려고합니다. 웹에서 많은 솔루션을 시도했지만 성공하지 못했습니다. 내 요구 사항은 컨트롤러가 있다는 것입니다.
ControllerA
컨트롤러 내부에는 getBean (String className) 메서드가 있습니다. 등록 된 빈의 인스턴스를 가져오고 싶습니다. 나는 최대 절전 엔티티를 가지고 있으며 getBean 메소드에서만 클래스의 이름을 전달하여 빈의 인스턴스를 얻고 싶다.
누군가가 해결책을 안다면 도와주세요.
해결법
-
==============================
1.ApplicationContext를 필드로 Autowire 할 수 있습니다.
ApplicationContext를 필드로 Autowire 할 수 있습니다.
@Autowired private ApplicationContext context;
또는 방법
@Autowired public void context(ApplicationContext context) { this.context = context; }
마지막으로 사용
context.getBean(SomeClass.class)
-
==============================
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.실제로 스프링 엔진에서 개체를 얻고 싶습니다.이 엔진은 스프링 응용 프로그램 시작 (Sprint 엔진의 초기화)에서 필요한 클래스의 개체를 이미 유지 관리합니다. 이제 그 개체를 가져와야합니다. 참조.
실제로 스프링 엔진에서 개체를 얻고 싶습니다.이 엔진은 스프링 응용 프로그램 시작 (Sprint 엔진의 초기화)에서 필요한 클래스의 개체를 이미 유지 관리합니다. 이제 그 개체를 가져와야합니다. 참조.
서비스 클래스에서
@Autowired private ApplicationContext context; SomeClass sc = (SomeClass)context.getBean(SomeClass.class);
지금 sc의 참조에서 당신은 객체를 가지고 있습니다. 희망은 잘 설명했다. 의심스러운 점이 있으면 알려주세요.
-
==============================
4.Spring 빈 (이 경우 @Controller 빈) 내부에 있다면 Spring 컨텍스트 인스턴스를 전혀 사용하지 않아야한다. className bean을 직접 autowire하면된다.
Spring 빈 (이 경우 @Controller 빈) 내부에 있다면 Spring 컨텍스트 인스턴스를 전혀 사용하지 않아야한다. className bean을 직접 autowire하면된다.
BTW, 필드 인젝션은 나쁜 습관으로 간주되므로 피하십시오.
-
==============================
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); }
from https://stackoverflow.com/questions/34088780/how-to-get-bean-using-application-context-in-spring-boot by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 비어있는 Java / Spring 양식 입력을 null 문자열로 변환하는 쉬운 방법이 있습니까? (0) | 2019.01.14 |
---|---|
[SPRING] Spring Validator 구현을위한 JUnit 테스트 작성하기 (0) | 2019.01.14 |
[SPRING] 일반 ResponseEntity <T>를 가져올 수 없습니다. 여기서 T는 제네릭 클래스 "SomeClass <SomeGenericType>"입니다. (0) | 2019.01.14 |
[SPRING] 맞춤법 봄 유효성 검사 오류 (0) | 2019.01.14 |
[SPRING] 2 개의 트랜잭션 관리자로 @EnableTransactionManagement 주석 (0) | 2019.01.14 |