[SPRING] Spring에서 현재 ApplicationContext 가져 오기
SPRINGSpring에서 현재 ApplicationContext 가져 오기
내 웹 애플리케이션에 Spring MVC를 사용하고있다. 내 콩은 "spring-servlet.xml"파일에 기록됩니다.
이제 클래스 MyClass 있고 봄 콩을 사용하여이 클래스에 액세스 할 싶어요.
spring-servlet.xml에서 나는 다음과 같이 기술했다.
<bean id="myClass" class="com.lynas.MyClass" />
이제 내가 ApplicationContext를 사용하여 액세스해야합니다.
ApplicationContext context = ??
내가 할 수있게
MyClass myClass = (MyClass) context.getBean("myClass");
이 작업을 수행하는 방법 ??
해결법
-
==============================
1.간단히 ..
간단히 ..
@Autowired private ApplicationContext appContext;
또는이 인터페이스를 구현합니다. ApplicationContextAware
-
==============================
2.이 링크는 비 Bean 클래스에서도 애플리케이션 컨텍스트를 어디서나 얻을 수있는 가장 좋은 방법임을 보여줍니다. 나는 그것을 매우 유용하다고 느낀다. 당신을 위해 그 같은 희망. 아래는 그것의 추상 코드입니다.
이 링크는 비 Bean 클래스에서도 애플리케이션 컨텍스트를 어디서나 얻을 수있는 가장 좋은 방법임을 보여줍니다. 나는 그것을 매우 유용하다고 느낀다. 당신을 위해 그 같은 희망. 아래는 그것의 추상 코드입니다.
새로운 클래스 인 ApplicationContextProvider.java를 생성하십시오.
package com.java2novice.spring; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ApplicationContextProvider implements ApplicationContextAware{ private static ApplicationContext context; public static ApplicationContext getApplicationContext() { return context; } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; } }
application-context.xml에 항목 추가
<bean id="applicationContextProvder" class="com.java2novice.spring.ApplicationContextProvider"/>
이런 문맥을 잡아라.
TestBean tb = ApplicationContextProvider.getApplicationContext().getBean("testBean", TestBean.class);
건배!!
-
==============================
3.Spring에서 인스턴스화되지 않은 HttpServlet 내에서 컨텍스트에 액세스해야하는 경우 (@Autowire 또는 ApplicationContextAware도 작동하지 않음) ...
Spring에서 인스턴스화되지 않은 HttpServlet 내에서 컨텍스트에 액세스해야하는 경우 (@Autowire 또는 ApplicationContextAware도 작동하지 않음) ...
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
또는
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
다른 답장 중 일부는 다음과 같이 두 번 생각하십시오.
new ClassPathXmlApplicationContext("..."); // are you sure?
... 이것은 현재 컨텍스트를 제공하지 않으므로 대신 컨텍스트를 작성합니다. 즉, 1) 의미있는 메모리 덩어리와 2) 빈은이 두 응용 프로그램 컨텍스트간에 공유되지 않습니다.
-
==============================
4.Spring에 의해 인스턴스화되지 않은 클래스를 구현하고 있다면 JsonDeserializer처럼 다음을 사용할 수 있습니다 :
Spring에 의해 인스턴스화되지 않은 클래스를 구현하고 있다면 JsonDeserializer처럼 다음을 사용할 수 있습니다 :
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); MyClass myBean = context.getBean(MyClass.class);
-
==============================
5.이것을 코드에 추가하십시오.
이것을 코드에 추가하십시오.
@Autowired private ApplicationContext _applicationContext; //Add below line in your calling method MyClass class = (MyClass) _applicationContext.getBean("myClass"); // Or you can simply use this, put the below code in your controller data member declaration part. @Autowired private MyClass myClass;
이렇게하면 응용 프로그램에 myClass가 삽입됩니다.
-
==============================
6.Vivek의 대답을 바탕으로,하지만 다음과 같은 것이 더 좋을 것이라고 생각합니다 :
Vivek의 대답을 바탕으로,하지만 다음과 같은 것이 더 좋을 것이라고 생각합니다 :
@Component("applicationContextProvider") public class ApplicationContextProvider implements ApplicationContextAware { private static class AplicationContextHolder{ private static final InnerContextResource CONTEXT_PROV = new InnerContextResource(); private AplicationContextHolder() { super(); } } private static final class InnerContextResource { private ApplicationContext context; private InnerContextResource(){ super(); } private void setContext(ApplicationContext context){ this.context = context; } } public static ApplicationContext getApplicationContext() { return AplicationContextHolder.CONTEXT_PROV.context; } @Override public void setApplicationContext(ApplicationContext ac) { AplicationContextHolder.CONTEXT_PROV.setContext(ac); } }
인스턴스 메소드에서 정적 필드로 작성하는 것은 나쁜 관행이며 여러 인스턴스가 조작되는 경우 위험합니다.
-
==============================
7.1 단계 : 클래스에서 다음 코드 삽입
1 단계 : 클래스에서 다음 코드 삽입
@Autowired private ApplicationContext _applicationContext;
2 단계 : Getter 및 Setter 작성
3 단계 : bean이 정의 된 xml 파일에 autowire = "byType"정의
-
==============================
8.또 다른 방법은 서블릿을 통해 applicationContext를 삽입하는 것입니다.
또 다른 방법은 서블릿을 통해 applicationContext를 삽입하는 것입니다.
이것은 Spring 웹 서비스를 사용할 때 종속성을 주입하는 방법의 예이다.
<servlet> <servlet-name>my-soap-ws</servlet-name> <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> <init-param> <param-name>transformWsdlLocations</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:my-applicationContext.xml</param-value> </init-param> <load-on-startup>5</load-on-startup> </servlet>
다른 방법은 아래와 같이 web.xml에 Context를 추가하는 것입니다.
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/my-another-applicationContext.xml classpath:my-second-context.xml </param-value> </context-param>
기본적으로 서블릿이이 컨텍스트 파일에 정의 된 bean을 찾아야한다고 알려주려고한다.
-
==============================
9.Spring 애플리케이션에서 애플리케이션 컨텍스트를 얻는 방법은 다양합니다. 그것들은 다음과 같다.
Spring 애플리케이션에서 애플리케이션 컨텍스트를 얻는 방법은 다양합니다. 그것들은 다음과 같다.
여기 setApplicationContext (ApplicationContext applicationContext) 메소드를 사용하면 applicationContext를 얻을 수있다.
@Autowired 키워드는 applicationContext를 제공합니다.
자세한 정보는이 스레드를 방문하십시오.
감사 :)
-
==============================
10.
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-servlet.xml");
그런 다음 bean을 검색 할 수 있습니다.
MyClass myClass = (MyClass) context.getBean("myClass");
참조 : springbyexample.org
from https://stackoverflow.com/questions/21827548/spring-get-current-applicationcontext by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] log4j : WARN web.xml에서 logger에 대한 appender를 찾을 수 없습니다. (0) | 2018.12.22 |
---|---|
[SPRING] @Transactional 어노테이션없이 다른 메소드를 호출하는 트랜잭션 메소드? (0) | 2018.12.22 |
[SPRING] 데이터베이스에 의존하지 않고 스프링 - 부트 응용 프로그램을 시작하는 방법은 무엇입니까? (0) | 2018.12.22 |
[SPRING] 스프링 부트 : 뚱뚱한 항아리가있는 임의의 디렉토리에서 외부 application.properties 파일을 사용할 수 있습니까? (0) | 2018.12.22 |
[SPRING] Thymeleaf를 사용하여 Spring 모델에서 javascript 변수 설정하기 (0) | 2018.12.22 |