복붙노트

[SPRING] Spring에서 현재 ApplicationContext 가져 오기

SPRING

Spring에서 현재 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. ==============================

    1.간단히 ..

    간단히 ..

    @Autowired
    private ApplicationContext appContext;
    

    또는이 인터페이스를 구현합니다. ApplicationContextAware

  2. ==============================

    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. ==============================

    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. ==============================

    4.Spring에 의해 인스턴스화되지 않은 클래스를 구현하고 있다면 JsonDeserializer처럼 다음을 사용할 수 있습니다 :

    Spring에 의해 인스턴스화되지 않은 클래스를 구현하고 있다면 JsonDeserializer처럼 다음을 사용할 수 있습니다 :

    WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
    MyClass myBean = context.getBean(MyClass.class);
    
  5. ==============================

    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. ==============================

    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. ==============================

    7.1 단계 : 클래스에서 다음 코드 삽입

    1 단계 : 클래스에서 다음 코드 삽입

    @Autowired
    private ApplicationContext _applicationContext;
    

    2 단계 : Getter 및 Setter 작성

    3 단계 : bean이 정의 된 xml 파일에 autowire = "byType"정의

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

    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. ==============================

    9.Spring 애플리케이션에서 애플리케이션 컨텍스트를 얻는 방법은 다양합니다. 그것들은 다음과 같다.

    Spring 애플리케이션에서 애플리케이션 컨텍스트를 얻는 방법은 다양합니다. 그것들은 다음과 같다.

    여기 setApplicationContext (ApplicationContext applicationContext) 메소드를 사용하면 applicationContext를 얻을 수있다.

    @Autowired 키워드는 applicationContext를 제공합니다.

    자세한 정보는이 스레드를 방문하십시오.

    감사 :)

  10. ==============================

    10.

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-servlet.xml");
    

    그런 다음 bean을 검색 할 수 있습니다.

    MyClass myClass = (MyClass) context.getBean("myClass");
    

    참조 : springbyexample.org

  11. from https://stackoverflow.com/questions/21827548/spring-get-current-applicationcontext by cc-by-sa and MIT license