88

Tôi đang sử dụng Spring MVC cho ứng dụng web của mình. Đậu của tôi được viết trong spring-servlet.xmltập tin ""

Bây giờ tôi có một lớp MyClassvà tôi muốn truy cập lớp này bằng cách sử dụng đậu mùa xuân

Trong spring-servlet.xmltôi đã viết như sau

<bean id="myClass" class="com.lynas.MyClass" />

Bây giờ tôi cần truy cập bằng cách sử dụng ApplicationContext

ApplicationContext context = ??

Để tôi có thể làm

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

Làm như thế nào??

|
135

Đơn giản chỉ cần tiêm nó ..

@Autowired
private ApplicationContext appContext;

hoặc thực hiện giao diện này: ApplicationContextAware

|
76

Tôi nghĩ rằng liên kết này thể hiện cách tốt nhất để có được bối cảnh ứng dụng ở bất cứ đâu, ngay cả trong lớp không phải là bean. Tôi thấy nó rất hữu ích. Hy vọng nó giống nhau cho bạn. Dưới đây là mã trừu tượng của nó

Tạo một lớp mới 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;
    }
}

Thêm một mục trong ứng dụng-bối cảnh

<bean id="applicationContextProvider"
                        class="com.java2novice.spring.ApplicationContextProvider"/>

Trong trường hợp chú thích (thay vì ứng dụng-bối cảnh)

@Component
public class ApplicationContextProvider implements ApplicationContextAware{
...
}

Lấy bối cảnh như thế này

TestBean tb = ApplicationContextProvider.getApplicationContext().getBean("testBean", TestBean.class);

Chúc mừng !!

|
  • 1

    Tôi đã mã hóa tương tự như Vivek. Nhưng tôi tránh tạo ApplicationContextProvider () mới mỗi lần tôi cần gọi getBean () từ ngữ cảnh. Những gì tôi đã làm là có phương pháp tĩnh ApplicationContextProvider.getApplicationContext() . Sau đó, khi đến lúc cần bối cảnh ứng dụng hiện tại, tôi gọi:ApplicationContextProvider appContext = ApplicationContextProvider.getApplicationContext()

    – Trịnh Ngọc Trâm 19:47:55 26/03/2015
  • 1

    Có Panini trưa, điều đó vẫn sẽ tốt. Theo đề nghị của bạn, tôi sẽ thay đổi nó theo cách đó. :)

    – Võ Lục Bình 10:23:24 07/04/2015
  • 1

    Thêm @Componentvào ApplicationContextProvidercó thể tránh cấu hình trongaplication-context.xml

    – Trịnh Trường Vinh 15:56:11 07/11/2016
  • 1

    Lưu ý: getter và setter của bối cảnh nên được đồng bộ hóa. Bạn sẽ tránh được rất nhiều vấn đề đau đầu đặc biệt cho các bài kiểm tra đơn vị / tích hợp. Trong trường hợp của tôi, ApplicationContextProvider tương tự giữ bối cảnh cũ (từ thử nghiệm tích hợp trước đó) đã gây ra rất nhiều lỗi khó khăn.

    – Ngô Duy Khánh 19:54:16 26/06/2018
38

Trong trường hợp bạn cần truy cập vào ngữ cảnh từ bên trong một HTTPServlet mà bản thân nó không được khởi tạo bởi Spring (và do đó, cả @Autowire và ApplicationContextAware đều không hoạt động) ...

WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

hoặc là

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

Đối với một số câu trả lời khác, hãy suy nghĩ kỹ trước khi bạn làm điều này:

new ClassPathXmlApplicationContext("..."); // are you sure?

... vì điều này không cung cấp cho bạn bối cảnh hiện tại, thay vào đó nó tạo ra một ví dụ khác cho nó. Có nghĩa là 1) khối đáng kể của bộ nhớ và 2) đậu không được chia sẻ giữa hai bối cảnh ứng dụng này.

|
  • 1

    SpringBeanAutowiresSupport. ProcessInjectionBasingOnCiverseContext (this) - đã thực hiện công việc cho tôi trong phương thức init () của bộ lọc hành động portlet Liferay.

    – Trịnh Ngọc Trâm 12:08:55 06/04/2016
  • 1

    Thật tuyệt vời, processInjectionBasingOnCiverseContext đã làm tất cả công việc tôi cần. Rất cám ơn @Jar Tư

    – Võ Lục Bình 08:56:24 02/01/2018
  • 1

    ApplicationContextAware DOES hoạt động với tôi, khi nó được chú thích bằng @Component như trong giải pháp của Vivek (Tôi đang khởi tạo bối cảnh Spring theo cách thủ công thông qua việc mở rộng AbstractContextLoaderInitializer / createdRootApplicationContext)

    – Trịnh Trường Vinh 14:45:29 29/01/2019
24

Nếu bạn đang triển khai một lớp không được khởi tạo bởi Spring, như JsonDeserializer, bạn có thể sử dụng:

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
MyClass myBean = context.getBean(MyClass.class);
|
  • 1

    Nó không hoạt động với tôi. Lớp tôi ra khỏi bối cảnh mùa xuân. Tôi đã cố gắng sử dụng mã của bạn nhưng nó cho tôi một phản hồi vô giá trị . Tôi đang nói vềContextLoader.getCurrentWebApplicationContext()

    – Trịnh Ngọc Trâm 20:37:28 08/11/2016
8

Thêm mã này vào mã của bạn

@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;

Điều này chỉ đơn giản là tiêm myClass vào ứng dụng của bạn

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

Sau đó, bạn có thể lấy đậu:

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

Tham khảo: springbyexample.org

|
4

dựa trên câu trả lời của Vivek, nhưng tôi nghĩ những điều sau sẽ tốt hơn:

@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);
    }
}

Viết từ một phương thức cá thể sang một trường tĩnh là một thực tiễn xấu và nguy hiểm nếu nhiều trường hợp đang bị thao túng.

|
1

Bước 1 : Tiêm mã sau vào lớp

@Autowired
private ApplicationContext _applicationContext;

Bước 2 : Viết Getter & Setter

Bước 3 : xác định autowire = "byType" trong tệp xml trong đó bean được xác định

|
0

Có nhiều cách để có được bối cảnh ứng dụng trong ứng dụng Spring. Những người được đưa ra dưới đây:

  1. Thông qua ApplicationContextAware :

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    public class AppContextProvider implements ApplicationContextAware {
    
    private ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    }

Ở đây setApplicationContext(ApplicationContext applicationContext)phương thức bạn sẽ nhận được applicationContext

  1. Qua Autowired :

    @Autowired
    private ApplicationContext applicationContext;

Ở đây @Autowiredtừ khóa sẽ cung cấp applicationContext.

Để biết thêm thông tin truy cập chủ đề này

Cảm ơn :)

|
0

Một cách khác là tiêm applicationContext thông qua servlet.

Đây là một ví dụ về cách tiêm phụ thuộc khi sử dụng dịch vụ web 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>

Cách khác là thêm Bối cảnh ứng dụng trong tệp web của bạn như được hiển thị bên dưới

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

Về cơ bản, bạn đang cố gắng nói với servlet rằng nó sẽ tìm các bean được định nghĩa trong các tệp ngữ cảnh này.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.