스프링 부팅에서 애플리케이션 컨텍스트를 사용하여 빈을 얻는 방법
SpringBoot 프로젝트를 개발 중인데 다음 방법으로 빈을 가져오고 싶습니다.applicationContext
웹에서 많은 솔루션을 시도했지만 성공하지 못했습니다.컨트롤러가 있어야 합니다.
ControllerA
그리고 컨트롤러 안에 방법이 있습니다.getBean(String className)
등록된 콩의 인스턴스를 얻고 싶습니다.휴지 중인 엔티티가 있으며 클래스 이름을 전달하여 빈 인스턴스를 가져오려고 합니다.getBean
방법.
해결책을 아는 사람이 있으면 도와주세요.
Application Context는 필드 중 하나로 자동 연결할 수 있습니다.
@Autowired
private ApplicationContext context;
또는 방법
@Autowired
public void context(ApplicationContext context) { this.context = context; }
최종 사용
context.getBean(SomeClass.class)
ApplicationContextAware를 사용할 수 있습니다.
Application Context Aware:
실행 중인 ApplicationContext에 대한 알림을 받는 개체에 의해 구현되는 인터페이스.이 인터페이스를 구현하는 것은 예를 들어 객체가 일련의 공동작업 콩에 대한 액세스를 필요로 하는 경우에 적합합니다.
애플리케이션 컨텍스트에 대한 참조를 얻기 위한 몇 가지 방법이 있습니다.다음 예시와 같이 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은 콩을 인스턴스화할 때 ApplicationContextAware 구현을 찾습니다.실장이 발견되면 setApplicationContext() 메서드가 호출됩니다.
이와 같이 Spring은 현재 어플리케이션 컨텍스트를 설정합니다.
Spring's 코드 조각source code
:
private void invokeAwareInterfaces(Object bean) {
.....
.....
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
}
}
어플리케이션 컨텍스트에 대한 참조를 얻으면 getBean()을 사용하여 원하는 빈을 가져옵니다.
실제로 스프링 엔진에서 객체를 가져오려고 합니다. 스프링 엔진에서는 스프링 애플리케이션(스프링 엔진 초기화)이 시작될 때 이미 필요한 클래스의 객체를 유지하고 있습니다.중요한 건 그 대상을 참고만 하면 된다는 거죠.
서비스 클래스에서
@Autowired
private ApplicationContext context;
SomeClass sc = (SomeClass)context.getBean(SomeClass.class);
이제 SC의 참조에서 객체를 가지게 되었습니다.호프가 설명을 잘 해줬어요.의문 사항이 있으면 알려주세요.
@Autowire를 추가한 후에도 클래스가 RestController 또는 Configuration클래스가 아닌 경우 applicationContext 객체가 null로 반환되었습니다.아래 항목에서 새 클래스를 만들어 보았지만 정상적으로 작동합니다.
@Component
public class SpringContext implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws
BeansException {
this.applicationContext=applicationContext;
}
}
그런 다음 빈을 구해야 하는 것과 동일한 클래스에서 getter 메서드를 구현할 수 있습니다.예를 들어 다음과 같습니다.
applicationContext.getBean(String serviceName,Interface.Class)
「」를 사용합니다.SpringApplication.run(Class<?> primarySource, String... arg)
나를 위해 일했다. §:
@SpringBootApplication
public class YourApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(YourApplication.class, args);
}
}
으로는 「」를 사용할 수 .ConfigurableApplicationContext
주석을 달 수 있는 어떤 종류의 콩도 손에 넣다@Component
,@Repository
★★★★★★★★★★★★★★★★★」@Service
.
Base Component 클래스의 bean을 취득한다고 합니다.
@Service
public class BaseComponent {
public String getMessage() {
return "hello world";
}
}
, 그럼 에는 '어울릴 수 .ConfigurableApplicationContext
「 」 「 」:
@Component
public class DemoComponent {
@Autowired
ConfigurableApplicationContext applicationContext;
public BaseComponent getBeanOfBaseComponent() {
return applicationContext.getBean(BaseComponent.class);
}
}
응용 프로그램 컨텍스트를 제공할 수 있는 ApplicationContextAware 클래스를 사용할 수 있습니다.
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx = null;
public static ApplicationContext getApplicationContext() {
return ctx;
}
@Override
public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
ApplicationContextProvider.ctx = ctx;
}
/**
* Tries to autowire the specified instance of the class if one of the specified
* beans which need to be autowired are null.
*
* @param classToAutowire the instance of the class which holds @Autowire
* annotations
* @param beansToAutowireInClass the beans which have the @Autowire annotation
* in the specified {#classToAutowire}
*/
public static void autowire(Object classToAutowire, Object... beansToAutowireInClass) {
for (Object bean : beansToAutowireInClass) {
if (bean == null) {
ctx.getAutowireCapableBeanFactory().autowireBean(classToAutowire);
}
}
}
}
bean 경우) 안에 있는 @Controller
하지 마십시오.bean) Spring 콘텍스트인스턴스는 . autowire (자동 배선)className
접접콩콩콩만만
그나저나 현장주사 사용은 좋지 않은 관행으로 간주되므로 피하십시오.
때 중 org.springframework.beans.factory.ListableBeanFactory#getBeanNamesForType(java.lang.Class<?>)
클래스 타입으로 간단하게 전달하면, 콩의 리스트를 취득할 수 있습니다.그 할 수 를 들어, 「콩」은 「콩」의 종류와 서브 타입에 관련지어져 있습니다. 예
@Autowired
ApplicationContext ctx
...
SomeController controller = ctx.getBeanNamesForType(SomeController)
컨피규레이션클래스에서 BEAN 어노티드메서드를 호출하는 간단한 방법입니다.네, 제대로 들었습니다.---:P가 SpringBoot @Beanannated 메서드를 호출하면 Config에서 같은 빈이 반환됩니다.config 클래스의 @predestroy 메서드로 로그아웃을 bean에서 호출하려고 했는데 method를 호출하여 같은 bean을 취득하려고 했습니다.P.S. : @bean 주석 메서드로 debug를 추가했는데 호출해도 메서드가 입력되지 않았습니다.반드시 -------> Spring Magic <-----------
Service Locator Factory Bean 을 사용할 수 있습니다.먼저 클래스용 인터페이스를 만들어야 합니다.
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);
}
사용방법:
org. springframework.콩류.Bean Factory #get Bean(java.lang).클래스)
예:
@Component
public class Example {
@Autowired
private ApplicationContext context;
public MyService getMyServiceBean() {
return context.getBean(MyService.class);
}
// your code uses getMyServiceBean()
}
언급URL : https://stackoverflow.com/questions/34088780/how-to-get-bean-using-application-context-in-spring-boot
'source' 카테고리의 다른 글
태플은 어떻게 JSON과 시리얼화 및 시리얼화 해제합니까? (0) | 2023.02.17 |
---|---|
Javascript Object와 JSON Object의 차이점은 무엇입니까? (0) | 2023.02.13 |
불필요한 이스케이프 문자 비활성화: \/ no-use-escape (0) | 2023.02.13 |
jQuery XML 오류 ' 요청된 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다. (0) | 2023.02.13 |
Angular ui-router에서 중첩된 상태의 URL이 변경되었지만 템플릿이 로드되지 않습니다. (0) | 2023.02.13 |